OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2010 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 "base/command_line.h" | |
6 #include "base/file_path.h" | |
7 #include "chrome/browser/net/chrome_url_request_context.h" | |
8 #include "chrome/browser/net/pref_proxy_config_service.h" | |
eroman
2010/11/20 03:19:07
nit: please put this at the top of the file.
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
9 #include "chrome/common/chrome_switches.h" | |
10 #include "chrome/common/pref_names.h" | |
11 #include "chrome/test/testing_pref_service.h" | |
12 #include "net/proxy/proxy_config_service_fixed.h" | |
13 #include "net/proxy/proxy_config_service_common_unittest.h" | |
14 #include "testing/gmock/include/gmock/gmock.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 | |
17 using testing::_; | |
eroman
2010/11/20 03:19:07
What is this?
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
This is gmock's "any value" argument matcher for s
| |
18 using testing::Mock; | |
19 | |
20 namespace { | |
21 | |
22 const char kFixedPACURL[] = "http://chromium.org/fixed_pac_url"; | |
23 | |
24 // Testing proxy config service that allows us to fire notifications at will. | |
25 class TestProxyConfigService : public net::ProxyConfigServiceFixed { | |
eroman
2010/11/20 03:19:07
ProxyConfigServiceFixed is so small, that I don't
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
26 public: | |
27 explicit TestProxyConfigService(const net::ProxyConfig& config) | |
28 : net::ProxyConfigServiceFixed(config) { | |
29 } | |
30 | |
31 void FireObservers() { | |
eroman
2010/11/20 03:19:07
What is a weird about this, is the config didn't a
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
32 net::ProxyConfig config; | |
33 GetLatestProxyConfig(&config); | |
34 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, | |
35 OnProxyConfigChanged(config)); | |
36 } | |
37 | |
38 private: | |
39 virtual void AddObserver(net::ProxyConfigService::Observer* observer) { | |
40 observers_.AddObserver(observer); | |
41 } | |
42 | |
43 virtual void RemoveObserver(net::ProxyConfigService::Observer* observer) { | |
44 observers_.RemoveObserver(observer); | |
45 } | |
46 | |
47 ObserverList<net::ProxyConfigService::Observer> observers_; | |
eroman
2010/11/20 03:19:07
I recommend adding the ", true" to template trait,
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
48 }; | |
49 | |
50 // A mock observer for capturing callbacks. | |
51 class MockObserver : public net::ProxyConfigService::Observer { | |
52 public: | |
53 MOCK_METHOD1(OnProxyConfigChanged, void(const net::ProxyConfig&)); | |
54 }; | |
55 | |
56 template<typename TESTBASE> | |
57 class PrefProxyConfigServiceTestBase : public TESTBASE { | |
58 protected: | |
59 PrefProxyConfigServiceTestBase() | |
60 : ui_thread_(BrowserThread::UI, &loop_), | |
61 io_thread_(BrowserThread::IO, &loop_) {} | |
62 | |
63 virtual void SetUp() { | |
64 ASSERT_TRUE(pref_service_.get()); | |
65 ChromeURLRequestContextGetter::RegisterUserPrefs(pref_service_.get()); | |
66 fixed_config_.set_pac_url(GURL(kFixedPACURL)); | |
67 fixed_config_.set_id(42); | |
68 delegate_service_ = new TestProxyConfigService(fixed_config_); | |
69 proxy_config_tracker_ = new PrefProxyConfigTracker(pref_service_.get()); | |
70 proxy_config_service_.reset( | |
71 new PrefProxyConfigService(proxy_config_tracker_.get(), | |
72 delegate_service_)); | |
73 } | |
74 | |
75 virtual void TearDown() { | |
76 proxy_config_tracker_->Shutdown(); | |
77 loop_.RunAllPending(); | |
78 proxy_config_service_.reset(); | |
79 pref_service_.reset(); | |
80 } | |
81 | |
82 MessageLoop loop_; | |
83 TestProxyConfigService* delegate_service_; // weak | |
84 scoped_ptr<PrefProxyConfigService> proxy_config_service_; | |
85 scoped_ptr<TestingPrefService> pref_service_; | |
eroman
2010/11/20 03:19:07
nit: I suggest ordering this above proxy_config_se
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
86 net::ProxyConfig fixed_config_; | |
87 | |
88 private: | |
89 scoped_refptr<PrefProxyConfigTracker> proxy_config_tracker_; | |
90 BrowserThread ui_thread_; | |
91 BrowserThread io_thread_; | |
92 }; | |
93 | |
94 class PrefProxyConfigServiceTest : | |
eroman
2010/11/20 03:19:07
style nit: put the colon on the next line (and ind
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
95 public PrefProxyConfigServiceTestBase<testing::Test> { | |
96 protected: | |
97 virtual void SetUp() { | |
98 pref_service_.reset(new TestingPrefService); | |
99 PrefProxyConfigServiceTestBase<testing::Test>::SetUp(); | |
100 } | |
101 }; | |
102 | |
103 TEST_F(PrefProxyConfigServiceTest, BaseConfiguration) { | |
104 net::ProxyConfig actual_config; | |
105 proxy_config_service_->GetLatestProxyConfig(&actual_config); | |
106 EXPECT_EQ(GURL(kFixedPACURL), actual_config.pac_url()); | |
107 } | |
108 | |
109 TEST_F(PrefProxyConfigServiceTest, DynamicPrefOverrides) { | |
110 pref_service_->SetManagedPref( | |
111 prefs::kProxyServer, Value::CreateStringValue("http://example.com:3128")); | |
112 loop_.RunAllPending(); | |
113 | |
114 net::ProxyConfig actual_config; | |
115 proxy_config_service_->GetLatestProxyConfig(&actual_config); | |
116 EXPECT_FALSE(actual_config.auto_detect()); | |
117 EXPECT_EQ(net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY, | |
118 actual_config.proxy_rules().type); | |
119 EXPECT_EQ(actual_config.proxy_rules().single_proxy, | |
120 net::ProxyServer::FromURI("http://example.com:3128", | |
121 net::ProxyServer::SCHEME_HTTP)); | |
122 | |
123 pref_service_->SetManagedPref( | |
124 prefs::kProxyAutoDetect, Value::CreateBooleanValue(true)); | |
125 loop_.RunAllPending(); | |
126 | |
127 proxy_config_service_->GetLatestProxyConfig(&actual_config); | |
128 EXPECT_TRUE(actual_config.auto_detect()); | |
129 } | |
130 | |
131 // Compares proxy configurations, but allows different identifiers. | |
132 MATCHER_P(ProxyConfigMatches, config, "") { | |
133 net::ProxyConfig reference(config); | |
134 reference.set_id(arg.id()); | |
135 return reference.Equals(arg); | |
136 } | |
137 | |
138 TEST_F(PrefProxyConfigServiceTest, Observers) { | |
eroman
2010/11/20 03:19:07
Thanks for adding extensive tests!
| |
139 MockObserver observer; | |
140 proxy_config_service_->AddObserver(&observer); | |
141 | |
142 // Firing the observers in the delegate should trigger a notification. | |
143 EXPECT_CALL(observer, | |
eroman
2010/11/20 03:19:07
I'll give this a more careful re-read later, I mus
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
It declares that the subsequent code will generate
| |
144 OnProxyConfigChanged(ProxyConfigMatches(fixed_config_))).Times(1); | |
145 delegate_service_->FireObservers(); | |
146 loop_.RunAllPending(); | |
147 Mock::VerifyAndClearExpectations(&observer); | |
148 | |
149 // Override configuration, this should trigger a notification. | |
150 net::ProxyConfig pref_config; | |
151 pref_config.set_auto_detect(true); | |
152 EXPECT_CALL(observer, | |
153 OnProxyConfigChanged(ProxyConfigMatches(pref_config))).Times(1); | |
154 pref_service_->SetManagedPref( | |
155 prefs::kProxyAutoDetect, Value::CreateBooleanValue(true)); | |
156 loop_.RunAllPending(); | |
157 Mock::VerifyAndClearExpectations(&observer); | |
158 | |
159 // Since there are pref overrides, delegate changes should be ignored. | |
160 EXPECT_CALL(observer, OnProxyConfigChanged(_)).Times(0); | |
161 delegate_service_->FireObservers(); | |
162 loop_.RunAllPending(); | |
163 Mock::VerifyAndClearExpectations(&observer); | |
164 | |
165 // Clear the override should switch back to the fixed configuration. | |
166 EXPECT_CALL(observer, | |
167 OnProxyConfigChanged(ProxyConfigMatches(fixed_config_))).Times(1); | |
168 pref_service_->RemoveManagedPref(prefs::kProxyAutoDetect); | |
169 loop_.RunAllPending(); | |
170 Mock::VerifyAndClearExpectations(&observer); | |
171 | |
172 // Delegate service notifications should show up again. | |
173 EXPECT_CALL(observer, | |
174 OnProxyConfigChanged(ProxyConfigMatches(fixed_config_))).Times(1); | |
175 delegate_service_->FireObservers(); | |
176 loop_.RunAllPending(); | |
177 Mock::VerifyAndClearExpectations(&observer); | |
178 | |
179 proxy_config_service_->RemoveObserver(&observer); | |
180 } | |
181 | |
182 // Test parameter object for testing command line proxy configuration. | |
183 struct CommandLineTestParams { | |
184 // Explicit assignment operator, so testing::TestWithParam works with MSVC. | |
185 CommandLineTestParams& operator=(const CommandLineTestParams& other) { | |
186 description = other.description; | |
187 for (unsigned int i = 0; i < arraysize(switches); i++) | |
188 switches[i] = other.switches[i]; | |
189 is_null = other.is_null; | |
190 auto_detect = other.auto_detect; | |
191 pac_url = other.pac_url; | |
192 proxy_rules = other.proxy_rules; | |
193 return *this; | |
194 } | |
195 | |
196 // Short description to identify the test. | |
197 const char* description; | |
198 | |
199 // The command line to build a ProxyConfig from. | |
200 struct SwitchValue { | |
201 const char* name; | |
202 const char* value; | |
203 } switches[2]; | |
204 | |
205 // Expected outputs (fields of the ProxyConfig). | |
206 bool is_null; | |
207 bool auto_detect; | |
208 GURL pac_url; | |
209 net::ProxyRulesExpectation proxy_rules; | |
210 }; | |
211 | |
212 void PrintTo(const CommandLineTestParams& params, std::ostream* os) { | |
213 *os << params.description; | |
214 } | |
215 | |
216 class PrefProxyConfigServiceCommandLineTest | |
217 : public PrefProxyConfigServiceTestBase< | |
218 testing::TestWithParam<CommandLineTestParams> > { | |
219 protected: | |
220 PrefProxyConfigServiceCommandLineTest() | |
221 : command_line_(CommandLine::NO_PROGRAM) {} | |
222 | |
223 virtual void SetUp() { | |
224 for (unsigned int i = 0; i < arraysize(GetParam().switches); i++) { | |
eroman
2010/11/20 03:19:07
nit: I have typically seen size_t used for such lo
Mattias Nissler (ping if slow)
2010/11/21 22:49:14
Done.
| |
225 const char* name = GetParam().switches[i].name; | |
226 const char* value = GetParam().switches[i].value; | |
227 if (name && value) | |
228 command_line_.AppendSwitchASCII(name, value); | |
229 else if (name) | |
230 command_line_.AppendSwitch(name); | |
231 } | |
232 pref_service_.reset(new TestingPrefService(NULL, &command_line_)); | |
233 PrefProxyConfigServiceTestBase< | |
234 testing::TestWithParam<CommandLineTestParams> >::SetUp(); | |
235 } | |
236 | |
237 private: | |
238 CommandLine command_line_; | |
239 }; | |
240 | |
241 TEST_P(PrefProxyConfigServiceCommandLineTest, CommandLine) { | |
242 net::ProxyConfig config; | |
243 proxy_config_service_->GetLatestProxyConfig(&config); | |
244 | |
245 if (GetParam().is_null) { | |
246 EXPECT_EQ(GURL(kFixedPACURL), config.pac_url()); | |
247 } else { | |
248 EXPECT_NE(GURL(kFixedPACURL), config.pac_url()); | |
249 EXPECT_EQ(GetParam().auto_detect, config.auto_detect()); | |
250 EXPECT_EQ(GetParam().pac_url, config.pac_url()); | |
251 EXPECT_TRUE(GetParam().proxy_rules.Matches(config.proxy_rules())); | |
252 } | |
253 } | |
254 | |
255 static const CommandLineTestParams kCommandLineTestParams[] = { | |
256 { | |
257 "Empty command line", | |
258 // Input | |
259 { }, | |
260 // Expected result | |
261 true, // is_null | |
262 false, // auto_detect | |
263 GURL(), // pac_url | |
264 net::ProxyRulesExpectation::Empty(), | |
265 }, | |
266 { | |
267 "No proxy", | |
268 // Input | |
269 { | |
270 { switches::kNoProxyServer, NULL }, | |
271 }, | |
272 // Expected result | |
273 false, // is_null | |
274 false, // auto_detect | |
275 GURL(), // pac_url | |
276 net::ProxyRulesExpectation::Empty(), | |
277 }, | |
278 { | |
279 "No proxy with extra parameters.", | |
280 // Input | |
281 { | |
282 { switches::kNoProxyServer, NULL }, | |
283 { switches::kProxyServer, "http://proxy:8888" }, | |
284 }, | |
285 // Expected result | |
286 false, // is_null | |
287 false, // auto_detect | |
288 GURL(), // pac_url | |
289 net::ProxyRulesExpectation::Empty(), | |
290 }, | |
291 { | |
292 "Single proxy.", | |
293 // Input | |
294 { | |
295 { switches::kProxyServer, "http://proxy:8888" }, | |
296 }, | |
297 // Expected result | |
298 false, // is_null | |
299 false, // auto_detect | |
300 GURL(), // pac_url | |
301 net::ProxyRulesExpectation::Single( | |
302 "proxy:8888", // single proxy | |
303 ""), // bypass rules | |
304 }, | |
305 { | |
306 "Per scheme proxy.", | |
307 // Input | |
308 { | |
309 { switches::kProxyServer, "http=httpproxy:8888;ftp=ftpproxy:8889" }, | |
310 }, | |
311 // Expected result | |
312 false, // is_null | |
313 false, // auto_detect | |
314 GURL(), // pac_url | |
315 net::ProxyRulesExpectation::PerScheme( | |
316 "httpproxy:8888", // http | |
317 "", // https | |
318 "ftpproxy:8889", // ftp | |
319 ""), // bypass rules | |
320 }, | |
321 { | |
322 "Per scheme proxy with bypass URLs.", | |
323 // Input | |
324 { | |
325 { switches::kProxyServer, "http=httpproxy:8888;ftp=ftpproxy:8889" }, | |
326 { switches::kProxyBypassList, | |
327 ".google.com, foo.com:99, 1.2.3.4:22, 127.0.0.1/8" }, | |
328 }, | |
329 // Expected result | |
330 false, // is_null | |
331 false, // auto_detect | |
332 GURL(), // pac_url | |
333 net::ProxyRulesExpectation::PerScheme( | |
334 "httpproxy:8888", // http | |
335 "", // https | |
336 "ftpproxy:8889", // ftp | |
337 "*.google.com,foo.com:99,1.2.3.4:22,127.0.0.1/8"), | |
338 }, | |
339 { | |
340 "Pac URL with proxy bypass URLs", | |
341 // Input | |
342 { | |
343 { switches::kProxyPacUrl, "http://wpad/wpad.dat" }, | |
344 { switches::kProxyBypassList, | |
345 ".google.com, foo.com:99, 1.2.3.4:22, 127.0.0.1/8" }, | |
346 }, | |
347 // Expected result | |
348 false, // is_null | |
349 false, // auto_detect | |
350 GURL("http://wpad/wpad.dat"), // pac_url | |
351 net::ProxyRulesExpectation::EmptyWithBypass( | |
352 "*.google.com,foo.com:99,1.2.3.4:22,127.0.0.1/8"), | |
353 }, | |
354 { | |
355 "Autodetect", | |
356 // Input | |
357 { | |
358 { switches::kProxyAutoDetect, NULL }, | |
359 }, | |
360 // Expected result | |
361 false, // is_null | |
362 true, // auto_detect | |
363 GURL(), // pac_url | |
364 net::ProxyRulesExpectation::Empty(), | |
365 }, | |
366 }; | |
367 | |
368 INSTANTIATE_TEST_CASE_P( | |
369 PrefProxyConfigServiceCommandLineTestInstance, | |
370 PrefProxyConfigServiceCommandLineTest, | |
371 testing::ValuesIn(kCommandLineTestParams)); | |
372 | |
373 } // namespace | |
OLD | NEW |