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 + "¶m=%26%26%26", 248 "q=%26%26%26¶m=%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