chrome_network_delegate_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/net/chrome_network_delegate.h"
6
7#include "base/memory/ref_counted.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/message_loop.h"
10#include "base/prefs/pref_member.h"
11#include "chrome/browser/extensions/event_router_forwarder.h"
12#include "chrome/common/pref_names.h"
13#include "chrome/common/url_constants.h"
14#include "chrome/test/base/testing_pref_service_syncable.h"
15#include "chrome/test/base/testing_profile.h"
16#include "content/public/test/test_browser_thread.h"
17#include "net/base/completion_callback.h"
18#include "net/url_request/url_request.h"
19#include "net/url_request/url_request_test_util.h"
20#include "testing/gtest/include/gtest/gtest.h"
21
22class ChromeNetworkDelegateTest : public testing::Test {
23 protected:
24  ChromeNetworkDelegateTest()
25      : forwarder_(new extensions::EventRouterForwarder()) {
26  }
27
28  virtual void SetUp() OVERRIDE {
29    never_throttle_requests_original_value_ =
30        ChromeNetworkDelegate::g_never_throttle_requests_;
31    ChromeNetworkDelegate::g_never_throttle_requests_ = false;
32  }
33
34  virtual void TearDown() OVERRIDE {
35    ChromeNetworkDelegate::g_never_throttle_requests_ =
36        never_throttle_requests_original_value_;
37  }
38
39  scoped_ptr<ChromeNetworkDelegate> CreateNetworkDelegate() {
40    return make_scoped_ptr(
41        new ChromeNetworkDelegate(forwarder_.get(), &pref_member_));
42  }
43
44  // Implementation moved here for access to private bits.
45  void NeverThrottleLogicImpl() {
46    scoped_ptr<ChromeNetworkDelegate> delegate(CreateNetworkDelegate());
47
48    net::TestURLRequestContext context;
49    net::TestURLRequest extension_request(
50        GURL("http://example.com/"), NULL, &context, NULL);
51    extension_request.set_first_party_for_cookies(
52        GURL("chrome-extension://abcdef/bingo.html"));
53    net::TestURLRequest web_page_request(
54        GURL("http://example.com/"), NULL, &context, NULL);
55    web_page_request.set_first_party_for_cookies(
56        GURL("http://example.com/helloworld.html"));
57
58    ASSERT_TRUE(delegate->OnCanThrottleRequest(extension_request));
59    ASSERT_FALSE(delegate->OnCanThrottleRequest(web_page_request));
60
61    delegate->NeverThrottleRequests();
62    ASSERT_TRUE(ChromeNetworkDelegate::g_never_throttle_requests_);
63    ASSERT_FALSE(delegate->OnCanThrottleRequest(extension_request));
64    ASSERT_FALSE(delegate->OnCanThrottleRequest(web_page_request));
65
66    // Verify that the flag applies to later instances of the
67    // ChromeNetworkDelegate.
68    //
69    // We test the side effects of the flag rather than just the flag
70    // itself (which we did above) to help ensure that a changed
71    // implementation would show the same behavior, i.e. all instances
72    // of ChromeNetworkDelegate after the flag is set obey the flag.
73    scoped_ptr<ChromeNetworkDelegate> second_delegate(CreateNetworkDelegate());
74    ASSERT_FALSE(delegate->OnCanThrottleRequest(extension_request));
75    ASSERT_FALSE(delegate->OnCanThrottleRequest(web_page_request));
76  }
77
78 private:
79  bool never_throttle_requests_original_value_;
80  MessageLoopForIO message_loop_;
81
82  scoped_refptr<extensions::EventRouterForwarder> forwarder_;
83  BooleanPrefMember pref_member_;
84};
85
86TEST_F(ChromeNetworkDelegateTest, NeverThrottleLogic) {
87  NeverThrottleLogicImpl();
88}
89
90class ChromeNetworkDelegateSafeSearchTest : public testing::Test {
91 public:
92  ChromeNetworkDelegateSafeSearchTest()
93      : ui_thread_(content::BrowserThread::UI, &message_loop_),
94        io_thread_(content::BrowserThread::IO, &message_loop_),
95        forwarder_(new extensions::EventRouterForwarder()) {
96  }
97
98  virtual void SetUp() OVERRIDE {
99    ChromeNetworkDelegate::InitializePrefsOnUIThread(
100        &enable_referrers_, NULL, &force_google_safe_search_,
101        profile_.GetTestingPrefService());
102  }
103
104 protected:
105  scoped_ptr<net::NetworkDelegate> CreateNetworkDelegate() {
106    scoped_ptr<ChromeNetworkDelegate> network_delegate(
107        new ChromeNetworkDelegate(forwarder_.get(), &enable_referrers_));
108    network_delegate->set_force_google_safe_search(&force_google_safe_search_);
109    return network_delegate.PassAs<net::NetworkDelegate>();
110  }
111
112  void SetSafeSearch(bool value) {
113    force_google_safe_search_.SetValue(value);
114  }
115
116  void SetDelegate(net::NetworkDelegate* delegate) {
117    network_delegate_ = delegate;
118    context_.set_network_delegate(network_delegate_);
119  }
120
121  // Does a request using the |url_string| URL and verifies that the expected
122  // string is equal to the query part (between ? and #) of the final url of
123  // that request.
124  void CheckAddedParameters(const std::string& url_string,
125                            const std::string& expected_query_parameters) {
126    // Show the URL in the trace so we know where we failed.
127    SCOPED_TRACE(url_string);
128
129    net::TestURLRequest request(
130        GURL(url_string), &delegate_, &context_, network_delegate_);
131
132    request.Start();
133    MessageLoop::current()->RunUntilIdle();
134
135    EXPECT_EQ(expected_query_parameters, request.url().query());
136  }
137
138 private:
139  MessageLoopForIO message_loop_;
140  content::TestBrowserThread ui_thread_;
141  content::TestBrowserThread io_thread_;
142  scoped_refptr<extensions::EventRouterForwarder> forwarder_;
143  TestingProfile profile_;
144  BooleanPrefMember enable_referrers_;
145  BooleanPrefMember force_google_safe_search_;
146  scoped_ptr<net::URLRequest> request_;
147  net::TestURLRequestContext context_;
148  net::NetworkDelegate* network_delegate_;
149  net::TestDelegate delegate_;
150};
151
152TEST_F(ChromeNetworkDelegateSafeSearchTest, SafeSearchOn) {
153  // Tests with SafeSearch on, request parameters should be rewritten.
154  const std::string kSafeParameter = chrome::kSafeSearchSafeParameter;
155  const std::string kSsuiParameter = chrome::kSafeSearchSsuiParameter;
156  const std::string kBothParameters = kSafeParameter + "&" + kSsuiParameter;
157  SetSafeSearch(true);
158  scoped_ptr<net::NetworkDelegate> delegate(CreateNetworkDelegate());
159  SetDelegate(delegate.get());
160
161  // Test the home page.
162  CheckAddedParameters("http://google.com/", kBothParameters);
163
164  // Test the search home page.
165  CheckAddedParameters("http://google.com/webhp",
166                       kBothParameters);
167
168  // Test different valid search pages with parameters.
169  CheckAddedParameters("http://google.com/search?q=google",
170                       "q=google&" + kBothParameters);
171
172  CheckAddedParameters("http://google.com/?q=google",
173                       "q=google&" + kBothParameters);
174
175  CheckAddedParameters("http://google.com/webhp?q=google",
176                       "q=google&" + kBothParameters);
177
178  // Test the valid pages with safe set to off.
179  CheckAddedParameters("http://google.com/search?q=google&safe=off",
180                       "q=google&" + kBothParameters);
181
182  CheckAddedParameters("http://google.com/?q=google&safe=off",
183                       "q=google&" + kBothParameters);
184
185  CheckAddedParameters("http://google.com/webhp?q=google&safe=off",
186                       "q=google&" + kBothParameters);
187
188  CheckAddedParameters("http://google.com/webhp?q=google&%73afe=off",
189                       "q=google&%73afe=off&" + kBothParameters);
190
191  // Test the home page, different TLDs.
192  CheckAddedParameters("http://google.de/", kBothParameters);
193  CheckAddedParameters("http://google.ro/", kBothParameters);
194  CheckAddedParameters("http://google.nl/", kBothParameters);
195
196  // Test the search home page, different TLD.
197  CheckAddedParameters("http://google.de/webhp", kBothParameters);
198
199  // Test the search page with parameters, different TLD.
200  CheckAddedParameters("http://google.de/search?q=google",
201                       "q=google&" + kBothParameters);
202
203  // Test the home page with parameters, different TLD.
204  CheckAddedParameters("http://google.de/?q=google",
205                       "q=google&" + kBothParameters);
206
207  // Test the search page with the parameters set.
208  CheckAddedParameters("http://google.de/?q=google&" + kBothParameters,
209                       "q=google&" + kBothParameters);
210
211  // Test some possibly tricky combinations.
212  CheckAddedParameters("http://google.com/?q=goog&" + kSafeParameter +
213                       "&ssui=one",
214                       "q=goog&" + kBothParameters);
215
216  CheckAddedParameters("http://google.de/?q=goog&unsafe=active&" +
217                       kSsuiParameter,
218                       "q=goog&unsafe=active&" + kBothParameters);
219
220  CheckAddedParameters("http://google.de/?q=goog&safe=off&ssui=off",
221                       "q=goog&" + kBothParameters);
222
223  // Test various combinations where we should not add anything.
224  CheckAddedParameters("http://google.com/?q=goog&" + kSsuiParameter + "&" +
225                       kSafeParameter,
226                       "q=goog&" + kBothParameters);
227
228  CheckAddedParameters("http://google.com/?" + kSsuiParameter + "&q=goog&" +
229                       kSafeParameter,
230                       "q=goog&" + kBothParameters);
231
232  CheckAddedParameters("http://google.com/?" + kSsuiParameter + "&" +
233                       kSafeParameter + "&q=goog",
234                       "q=goog&" + kBothParameters);
235
236  // Test that another website is not affected, without parameters.
237  CheckAddedParameters("http://google.com/finance", "");
238
239  // Test that another website is not affected, with parameters.
240  CheckAddedParameters("http://google.com/finance?q=goog", "q=goog");
241
242  // Test that another website is not affected with redirects, with parameters.
243  CheckAddedParameters("http://finance.google.com/?q=goog", "q=goog");
244
245  // Test with percent-encoded data (%26 is &)
246  CheckAddedParameters("http://google.com/?q=%26%26%26&" + kSsuiParameter +
247                       "&" + kSafeParameter + "&param=%26%26%26",
248                       "q=%26%26%26&param=%26%26%26&" + kBothParameters);
249}
250
251TEST_F(ChromeNetworkDelegateSafeSearchTest, SafeSearchOff) {
252  // Tests with SafeSearch settings off, delegate should not alter requests.
253  SetSafeSearch(false);
254  scoped_ptr<net::NetworkDelegate> delegate(CreateNetworkDelegate());
255  SetDelegate(delegate.get());
256
257  // Test the home page.
258  CheckAddedParameters("http://google.com/", "");
259
260  // Test the search home page.
261  CheckAddedParameters("http://google.com/webhp", "");
262
263  // Test the home page with parameters.
264  CheckAddedParameters("http://google.com/search?q=google",
265                       "q=google");
266
267  // Test the search page with parameters.
268  CheckAddedParameters("http://google.com/?q=google",
269                       "q=google");
270
271  // Test the search webhp page with parameters.
272  CheckAddedParameters("http://google.com/webhp?q=google",
273                       "q=google");
274
275  // Test the home page with parameters and safe set to off.
276  CheckAddedParameters("http://google.com/search?q=google&safe=off",
277                       "q=google&safe=off");
278
279  // Test the home page with parameters and safe set to active.
280  CheckAddedParameters("http://google.com/search?q=google&safe=active",
281                       "q=google&safe=active");
282}
283