OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/proxy/proxy_resolver_v8_tracing.h" | 5 #include "net/proxy/proxy_resolver_v8_tracing.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
11 #include "base/path_service.h" | 11 #include "base/path_service.h" |
12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "base/synchronization/waitable_event.h" | 14 #include "base/synchronization/waitable_event.h" |
15 #include "base/test/histogram_tester.h" | |
16 #include "base/threading/platform_thread.h" | 15 #include "base/threading/platform_thread.h" |
17 #include "base/threading/thread_checker.h" | 16 #include "base/threading/thread_checker.h" |
18 #include "base/values.h" | 17 #include "base/values.h" |
19 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
20 #include "net/base/test_completion_callback.h" | 19 #include "net/base/test_completion_callback.h" |
21 #include "net/dns/host_cache.h" | 20 #include "net/dns/host_cache.h" |
22 #include "net/dns/mock_host_resolver.h" | 21 #include "net/dns/mock_host_resolver.h" |
23 #include "net/log/net_log.h" | 22 #include "net/log/net_log.h" |
24 #include "net/proxy/proxy_info.h" | 23 #include "net/proxy/proxy_info.h" |
25 #include "net/test/event_waiter.h" | 24 #include "net/test/event_waiter.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
27 #include "url/gurl.h" | 26 #include "url/gurl.h" |
28 | 27 |
29 namespace net { | 28 namespace net { |
30 | 29 |
31 namespace { | 30 namespace { |
32 | 31 |
33 class ProxyResolverV8TracingTest : public testing::Test { | 32 class ProxyResolverV8TracingTest : public testing::Test { |
34 public: | 33 public: |
35 void TearDown() override { | 34 void TearDown() override { |
36 // Drain any pending messages, which may be left over from cancellation. | 35 // Drain any pending messages, which may be left over from cancellation. |
37 // This way they get reliably run as part of the current test, rather than | 36 // This way they get reliably run as part of the current test, rather than |
38 // spilling into the next test's execution. | 37 // spilling into the next test's execution. |
39 base::RunLoop().RunUntilIdle(); | 38 base::RunLoop().RunUntilIdle(); |
40 } | 39 } |
41 | |
42 protected: | |
43 // TODO(eroman): Remove when done gathering data for crbug.com/593759 | |
44 void ExpectHistogramBucketCount(PacResultForStrippedUrl bucket, | |
45 size_t expected_total) { | |
46 histograms_.ExpectUniqueSample(kHistogramPacResultForStrippedUrl, | |
47 static_cast<int>(bucket), expected_total); | |
48 } | |
49 | |
50 // TODO(eroman): Remove when done gathering data for crbug.com/593759 | |
51 void ExpectHistogramTotal(size_t expected_total) { | |
52 histograms_.ExpectTotalCount(kHistogramPacResultForStrippedUrl, | |
53 expected_total); | |
54 } | |
55 | |
56 private: | |
57 base::HistogramTester histograms_; | |
58 }; | 40 }; |
59 | 41 |
60 scoped_refptr<ProxyResolverScriptData> LoadScriptData(const char* filename) { | 42 scoped_refptr<ProxyResolverScriptData> LoadScriptData(const char* filename) { |
61 base::FilePath path; | 43 base::FilePath path; |
62 PathService::Get(base::DIR_SOURCE_ROOT, &path); | 44 PathService::Get(base::DIR_SOURCE_ROOT, &path); |
63 path = path.AppendASCII("net"); | 45 path = path.AppendASCII("net"); |
64 path = path.AppendASCII("data"); | 46 path = path.AppendASCII("data"); |
65 path = path.AppendASCII("proxy_resolver_v8_tracing_unittest"); | 47 path = path.AppendASCII("proxy_resolver_v8_tracing_unittest"); |
66 path = path.AppendASCII(filename); | 48 path = path.AppendASCII(filename); |
67 | 49 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 TEST_F(ProxyResolverV8TracingTest, Simple) { | 153 TEST_F(ProxyResolverV8TracingTest, Simple) { |
172 MockCachingHostResolver host_resolver; | 154 MockCachingHostResolver host_resolver; |
173 MockBindings mock_bindings(&host_resolver); | 155 MockBindings mock_bindings(&host_resolver); |
174 | 156 |
175 scoped_ptr<ProxyResolverV8Tracing> resolver = | 157 scoped_ptr<ProxyResolverV8Tracing> resolver = |
176 CreateResolver(mock_bindings.CreateBindings(), "simple.js"); | 158 CreateResolver(mock_bindings.CreateBindings(), "simple.js"); |
177 | 159 |
178 TestCompletionCallback callback; | 160 TestCompletionCallback callback; |
179 ProxyInfo proxy_info; | 161 ProxyInfo proxy_info; |
180 | 162 |
181 resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, | 163 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
182 callback.callback(), NULL, | 164 callback.callback(), NULL, |
183 mock_bindings.CreateBindings()); | 165 mock_bindings.CreateBindings()); |
184 | 166 |
185 EXPECT_EQ(OK, callback.WaitForResult()); | 167 EXPECT_EQ(OK, callback.WaitForResult()); |
186 | 168 |
187 ExpectHistogramBucketCount(PacResultForStrippedUrl::SUCCESS, 1); | |
188 ExpectHistogramTotal(1); | |
189 | |
190 EXPECT_EQ("foo:99", proxy_info.proxy_server().ToURI()); | 169 EXPECT_EQ("foo:99", proxy_info.proxy_server().ToURI()); |
191 | 170 |
192 EXPECT_EQ(0u, host_resolver.num_resolve()); | 171 EXPECT_EQ(0u, host_resolver.num_resolve()); |
193 | 172 |
194 // There were no alerts or errors. | 173 // There were no alerts or errors. |
195 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); | 174 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); |
196 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 175 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
197 } | 176 } |
198 | 177 |
199 TEST_F(ProxyResolverV8TracingTest, AlertUrl) { | |
200 MockCachingHostResolver host_resolver; | |
201 MockBindings mock_bindings(&host_resolver); | |
202 | |
203 scoped_ptr<ProxyResolverV8Tracing> resolver = | |
204 CreateResolver(mock_bindings.CreateBindings(), "alert_url.js"); | |
205 | |
206 TestCompletionCallback callback; | |
207 ProxyInfo proxy_info; | |
208 | |
209 resolver->GetProxyForURL(GURL("https://foo/path"), &proxy_info, | |
210 callback.callback(), NULL, | |
211 mock_bindings.CreateBindings()); | |
212 | |
213 EXPECT_EQ(OK, callback.WaitForResult()); | |
214 | |
215 ExpectHistogramBucketCount(PacResultForStrippedUrl::SUCCESS_DIFFERENT_ALERTS, | |
216 1); | |
217 ExpectHistogramTotal(1); | |
218 | |
219 EXPECT_EQ("foobar:99", proxy_info.proxy_server().ToURI()); | |
220 | |
221 EXPECT_EQ(0u, host_resolver.num_resolve()); | |
222 | |
223 // There was 1 alerts and no errors. | |
224 EXPECT_EQ(1u, mock_bindings.GetAlerts().size()); | |
225 EXPECT_EQ("https://foo/path", mock_bindings.GetAlerts()[0]); | |
226 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | |
227 } | |
228 | |
229 TEST_F(ProxyResolverV8TracingTest, JavascriptError) { | 178 TEST_F(ProxyResolverV8TracingTest, JavascriptError) { |
230 MockCachingHostResolver host_resolver; | 179 MockCachingHostResolver host_resolver; |
231 MockBindings mock_bindings(&host_resolver); | 180 MockBindings mock_bindings(&host_resolver); |
232 | 181 |
233 scoped_ptr<ProxyResolverV8Tracing> resolver = | 182 scoped_ptr<ProxyResolverV8Tracing> resolver = |
234 CreateResolver(mock_bindings.CreateBindings(), "error.js"); | 183 CreateResolver(mock_bindings.CreateBindings(), "error.js"); |
235 | 184 |
236 TestCompletionCallback callback; | 185 TestCompletionCallback callback; |
237 ProxyInfo proxy_info; | 186 ProxyInfo proxy_info; |
238 | 187 |
239 resolver->GetProxyForURL(GURL("https://throw-an-error/"), &proxy_info, | 188 resolver->GetProxyForURL(GURL("http://throw-an-error/"), &proxy_info, |
240 callback.callback(), NULL, | 189 callback.callback(), NULL, |
241 mock_bindings.CreateBindings()); | 190 mock_bindings.CreateBindings()); |
242 | 191 |
243 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult()); | 192 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult()); |
244 | 193 |
245 ExpectHistogramTotal(0); | |
246 | |
247 EXPECT_EQ(0u, host_resolver.num_resolve()); | 194 EXPECT_EQ(0u, host_resolver.num_resolve()); |
248 | 195 |
249 // Check the output -- there was 1 alert and 1 javascript error. | 196 // Check the output -- there was 1 alert and 1 javascript error. |
250 ASSERT_EQ(1u, mock_bindings.GetAlerts().size()); | 197 ASSERT_EQ(1u, mock_bindings.GetAlerts().size()); |
251 EXPECT_EQ("Prepare to DIE!", mock_bindings.GetAlerts()[0]); | 198 EXPECT_EQ("Prepare to DIE!", mock_bindings.GetAlerts()[0]); |
252 ASSERT_EQ(1u, mock_bindings.GetErrors().size()); | 199 ASSERT_EQ(1u, mock_bindings.GetErrors().size()); |
253 EXPECT_EQ(5, mock_bindings.GetErrors()[0].first); | 200 EXPECT_EQ(5, mock_bindings.GetErrors()[0].first); |
254 EXPECT_EQ("Uncaught TypeError: Cannot read property 'split' of null", | 201 EXPECT_EQ("Uncaught TypeError: Cannot read property 'split' of null", |
255 mock_bindings.GetErrors()[0].second); | 202 mock_bindings.GetErrors()[0].second); |
256 } | 203 } |
257 | 204 |
258 TEST_F(ProxyResolverV8TracingTest, TooManyAlerts) { | 205 TEST_F(ProxyResolverV8TracingTest, TooManyAlerts) { |
259 MockCachingHostResolver host_resolver; | 206 MockCachingHostResolver host_resolver; |
260 MockBindings mock_bindings(&host_resolver); | 207 MockBindings mock_bindings(&host_resolver); |
261 | 208 |
262 scoped_ptr<ProxyResolverV8Tracing> resolver = | 209 scoped_ptr<ProxyResolverV8Tracing> resolver = |
263 CreateResolver(mock_bindings.CreateBindings(), "too_many_alerts.js"); | 210 CreateResolver(mock_bindings.CreateBindings(), "too_many_alerts.js"); |
264 | 211 |
265 TestCompletionCallback callback; | 212 TestCompletionCallback callback; |
266 ProxyInfo proxy_info; | 213 ProxyInfo proxy_info; |
267 | 214 |
268 resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, | 215 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
269 callback.callback(), NULL, | 216 callback.callback(), NULL, |
270 mock_bindings.CreateBindings()); | 217 mock_bindings.CreateBindings()); |
271 | 218 |
272 EXPECT_EQ(OK, callback.WaitForResult()); | 219 EXPECT_EQ(OK, callback.WaitForResult()); |
273 | 220 |
274 ExpectHistogramBucketCount( | |
275 PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); | |
276 ExpectHistogramTotal(1); | |
277 | |
278 // Iteration1 does a DNS resolve | 221 // Iteration1 does a DNS resolve |
279 // Iteration2 exceeds the alert buffer | 222 // Iteration2 exceeds the alert buffer |
280 // Iteration3 runs in blocking mode and completes | 223 // Iteration3 runs in blocking mode and completes |
281 EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); | 224 EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); |
282 | 225 |
283 EXPECT_EQ(1u, host_resolver.num_resolve()); | 226 EXPECT_EQ(1u, host_resolver.num_resolve()); |
284 | 227 |
285 // No errors. | 228 // No errors. |
286 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 229 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
287 | 230 |
(...skipping 10 matching lines...) Expand all Loading... |
298 TEST_F(ProxyResolverV8TracingTest, TooManyEmptyAlerts) { | 241 TEST_F(ProxyResolverV8TracingTest, TooManyEmptyAlerts) { |
299 MockCachingHostResolver host_resolver; | 242 MockCachingHostResolver host_resolver; |
300 MockBindings mock_bindings(&host_resolver); | 243 MockBindings mock_bindings(&host_resolver); |
301 | 244 |
302 scoped_ptr<ProxyResolverV8Tracing> resolver = CreateResolver( | 245 scoped_ptr<ProxyResolverV8Tracing> resolver = CreateResolver( |
303 mock_bindings.CreateBindings(), "too_many_empty_alerts.js"); | 246 mock_bindings.CreateBindings(), "too_many_empty_alerts.js"); |
304 | 247 |
305 TestCompletionCallback callback; | 248 TestCompletionCallback callback; |
306 ProxyInfo proxy_info; | 249 ProxyInfo proxy_info; |
307 | 250 |
308 resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, | 251 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
309 callback.callback(), NULL, | 252 callback.callback(), NULL, |
310 mock_bindings.CreateBindings()); | 253 mock_bindings.CreateBindings()); |
311 | 254 |
312 EXPECT_EQ(OK, callback.WaitForResult()); | 255 EXPECT_EQ(OK, callback.WaitForResult()); |
313 | 256 |
314 ExpectHistogramBucketCount( | |
315 PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); | |
316 ExpectHistogramTotal(1); | |
317 | |
318 EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); | 257 EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI()); |
319 | 258 |
320 EXPECT_EQ(1u, host_resolver.num_resolve()); | 259 EXPECT_EQ(1u, host_resolver.num_resolve()); |
321 | 260 |
322 // No errors. | 261 // No errors. |
323 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 262 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
324 | 263 |
325 // Check the alerts -- the script generated 1000 alerts. | 264 // Check the alerts -- the script generated 1000 alerts. |
326 std::vector<std::string> alerts = mock_bindings.GetAlerts(); | 265 std::vector<std::string> alerts = mock_bindings.GetAlerts(); |
327 ASSERT_EQ(1000u, alerts.size()); | 266 ASSERT_EQ(1000u, alerts.size()); |
(...skipping 20 matching lines...) Expand all Loading... |
348 host_resolver.rules()->AddRuleForAddressFamily( | 287 host_resolver.rules()->AddRuleForAddressFamily( |
349 "*", ADDRESS_FAMILY_IPV4, "122.133.144.155"); | 288 "*", ADDRESS_FAMILY_IPV4, "122.133.144.155"); |
350 host_resolver.rules()->AddRule("*", "133.122.100.200"); | 289 host_resolver.rules()->AddRule("*", "133.122.100.200"); |
351 | 290 |
352 scoped_ptr<ProxyResolverV8Tracing> resolver = | 291 scoped_ptr<ProxyResolverV8Tracing> resolver = |
353 CreateResolver(mock_bindings.CreateBindings(), "dns.js"); | 292 CreateResolver(mock_bindings.CreateBindings(), "dns.js"); |
354 | 293 |
355 TestCompletionCallback callback; | 294 TestCompletionCallback callback; |
356 ProxyInfo proxy_info; | 295 ProxyInfo proxy_info; |
357 | 296 |
358 resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, | 297 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
359 callback.callback(), NULL, | 298 callback.callback(), NULL, |
360 mock_bindings.CreateBindings()); | 299 mock_bindings.CreateBindings()); |
361 | 300 |
362 EXPECT_EQ(OK, callback.WaitForResult()); | 301 EXPECT_EQ(OK, callback.WaitForResult()); |
363 | 302 |
364 ExpectHistogramBucketCount(PacResultForStrippedUrl::SUCCESS, 1); | |
365 ExpectHistogramTotal(1); | |
366 | |
367 // The test does 13 DNS resolution, however only 7 of them are unique. | 303 // The test does 13 DNS resolution, however only 7 of them are unique. |
368 EXPECT_EQ(7u, host_resolver.num_resolve()); | 304 EXPECT_EQ(7u, host_resolver.num_resolve()); |
369 | 305 |
370 const char* kExpectedResult = | 306 const char* kExpectedResult = |
371 "122.133.144.155-" // myIpAddress() | 307 "122.133.144.155-" // myIpAddress() |
372 "null-" // dnsResolve('') | 308 "null-" // dnsResolve('') |
373 "__1_192.168.1.1-" // dnsResolveEx('host1') | 309 "__1_192.168.1.1-" // dnsResolveEx('host1') |
374 "null-" // dnsResolve('host2') | 310 "null-" // dnsResolve('host2') |
375 "166.155.144.33-" // dnsResolve('host3') | 311 "166.155.144.33-" // dnsResolve('host3') |
376 "122.133.144.155-" // myIpAddress() | 312 "122.133.144.155-" // myIpAddress() |
(...skipping 26 matching lines...) Expand all Loading... |
403 host_resolver.rules()->AddRule("foopy", "166.155.144.11"); | 339 host_resolver.rules()->AddRule("foopy", "166.155.144.11"); |
404 host_resolver.rules()->AddRule("*", "122.133.144.155"); | 340 host_resolver.rules()->AddRule("*", "122.133.144.155"); |
405 | 341 |
406 scoped_ptr<ProxyResolverV8Tracing> resolver = | 342 scoped_ptr<ProxyResolverV8Tracing> resolver = |
407 CreateResolver(mock_bindings.CreateBindings(), "simple_dns.js"); | 343 CreateResolver(mock_bindings.CreateBindings(), "simple_dns.js"); |
408 | 344 |
409 TestCompletionCallback callback1; | 345 TestCompletionCallback callback1; |
410 TestCompletionCallback callback2; | 346 TestCompletionCallback callback2; |
411 ProxyInfo proxy_info; | 347 ProxyInfo proxy_info; |
412 | 348 |
413 resolver->GetProxyForURL(GURL("https://foopy/req1"), &proxy_info, | 349 resolver->GetProxyForURL(GURL("http://foopy/req1"), &proxy_info, |
414 callback1.callback(), NULL, | 350 callback1.callback(), NULL, |
415 mock_bindings.CreateBindings()); | 351 mock_bindings.CreateBindings()); |
416 | 352 |
417 EXPECT_EQ(OK, callback1.WaitForResult()); | 353 EXPECT_EQ(OK, callback1.WaitForResult()); |
418 | 354 |
419 // This fails because executing FindProxyForURL() PAC script modifies global | |
420 // state each time, changing the result that is returned. | |
421 ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_DIFFERENT_PROXY_LIST, | |
422 1); | |
423 ExpectHistogramTotal(1); | |
424 | |
425 // The test does 2 DNS resolutions. | 355 // The test does 2 DNS resolutions. |
426 EXPECT_EQ(2u, host_resolver.num_resolve()); | 356 EXPECT_EQ(2u, host_resolver.num_resolve()); |
427 | 357 |
428 // The first request took 2 restarts, hence on g_iteration=3. | 358 // The first request took 2 restarts, hence on g_iteration=3. |
429 EXPECT_EQ("166.155.144.11:3", proxy_info.proxy_server().ToURI()); | 359 EXPECT_EQ("166.155.144.11:3", proxy_info.proxy_server().ToURI()); |
430 | 360 |
431 resolver->GetProxyForURL(GURL("http://foopy/req2"), &proxy_info, | 361 resolver->GetProxyForURL(GURL("http://foopy/req2"), &proxy_info, |
432 callback2.callback(), NULL, | 362 callback2.callback(), NULL, |
433 mock_bindings.CreateBindings()); | 363 mock_bindings.CreateBindings()); |
434 | 364 |
435 EXPECT_EQ(OK, callback2.WaitForResult()); | 365 EXPECT_EQ(OK, callback2.WaitForResult()); |
436 | 366 |
437 // The histograms are unchanged because the second invocation is for an | |
438 // http:// URL. | |
439 ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_DIFFERENT_PROXY_LIST, | |
440 1); | |
441 ExpectHistogramTotal(1); | |
442 | |
443 EXPECT_EQ(4u, host_resolver.num_resolve()); | 367 EXPECT_EQ(4u, host_resolver.num_resolve()); |
444 | 368 |
445 // This time no restarts were required, so g_iteration incremented by 1. | 369 // This time no restarts were required, so g_iteration incremented by 1. |
446 // TODO(eroman): Additionally the counter was incremented once by the | 370 EXPECT_EQ("166.155.144.11:4", proxy_info.proxy_server().ToURI()); |
447 // diagnostics code that ran FindProxyForURL() with a stripped URL | |
448 // (should really be :4 and not :5). | |
449 EXPECT_EQ("166.155.144.11:5", proxy_info.proxy_server().ToURI()); | |
450 | 371 |
451 // There were no alerts or errors. | 372 // There were no alerts or errors. |
452 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); | 373 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); |
453 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 374 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
454 } | 375 } |
455 | 376 |
456 // This test runs a weird PAC script that was designed to defeat the DNS tracing | 377 // This test runs a weird PAC script that was designed to defeat the DNS tracing |
457 // optimization. The proxy resolver should detect the inconsistency and | 378 // optimization. The proxy resolver should detect the inconsistency and |
458 // fall-back to synchronous mode execution. | 379 // fall-back to synchronous mode execution. |
459 TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous1) { | 380 TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous1) { |
460 MockCachingHostResolver host_resolver; | 381 MockCachingHostResolver host_resolver; |
461 MockBindings mock_bindings(&host_resolver); | 382 MockBindings mock_bindings(&host_resolver); |
462 | 383 |
463 host_resolver.rules()->AddRule("host1", "166.155.144.11"); | 384 host_resolver.rules()->AddRule("host1", "166.155.144.11"); |
464 host_resolver.rules()->AddRule("crazy4", "133.199.111.4"); | 385 host_resolver.rules()->AddRule("crazy4", "133.199.111.4"); |
465 host_resolver.rules()->AddRule("*", "122.133.144.155"); | 386 host_resolver.rules()->AddRule("*", "122.133.144.155"); |
466 | 387 |
467 scoped_ptr<ProxyResolverV8Tracing> resolver = | 388 scoped_ptr<ProxyResolverV8Tracing> resolver = |
468 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects1.js"); | 389 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects1.js"); |
469 | 390 |
470 TestCompletionCallback callback; | 391 TestCompletionCallback callback; |
471 ProxyInfo proxy_info; | 392 ProxyInfo proxy_info; |
472 | 393 |
473 resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, | 394 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
474 callback.callback(), NULL, | 395 callback.callback(), NULL, |
475 mock_bindings.CreateBindings()); | 396 mock_bindings.CreateBindings()); |
476 EXPECT_EQ(OK, callback.WaitForResult()); | 397 EXPECT_EQ(OK, callback.WaitForResult()); |
477 | 398 |
478 ExpectHistogramBucketCount( | |
479 PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); | |
480 ExpectHistogramTotal(1); | |
481 | |
482 // The script itself only does 2 DNS resolves per execution, however it | 399 // The script itself only does 2 DNS resolves per execution, however it |
483 // constructs the hostname using a global counter which changes on each | 400 // constructs the hostname using a global counter which changes on each |
484 // invocation. | 401 // invocation. |
485 EXPECT_EQ(3u, host_resolver.num_resolve()); | 402 EXPECT_EQ(3u, host_resolver.num_resolve()); |
486 | 403 |
487 EXPECT_EQ("166.155.144.11-133.199.111.4:100", | 404 EXPECT_EQ("166.155.144.11-133.199.111.4:100", |
488 proxy_info.proxy_server().ToURI()); | 405 proxy_info.proxy_server().ToURI()); |
489 | 406 |
490 // No errors. | 407 // No errors. |
491 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 408 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
(...skipping 14 matching lines...) Expand all Loading... |
506 host_resolver.rules()->AddRule("host3", "166.155.144.33"); | 423 host_resolver.rules()->AddRule("host3", "166.155.144.33"); |
507 host_resolver.rules()->AddRule("host4", "166.155.144.44"); | 424 host_resolver.rules()->AddRule("host4", "166.155.144.44"); |
508 host_resolver.rules()->AddRule("*", "122.133.144.155"); | 425 host_resolver.rules()->AddRule("*", "122.133.144.155"); |
509 | 426 |
510 scoped_ptr<ProxyResolverV8Tracing> resolver = | 427 scoped_ptr<ProxyResolverV8Tracing> resolver = |
511 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects2.js"); | 428 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects2.js"); |
512 | 429 |
513 TestCompletionCallback callback; | 430 TestCompletionCallback callback; |
514 ProxyInfo proxy_info; | 431 ProxyInfo proxy_info; |
515 | 432 |
516 resolver->GetProxyForURL(GURL("https://foo/"), &proxy_info, | 433 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
517 callback.callback(), NULL, | 434 callback.callback(), NULL, |
518 mock_bindings.CreateBindings()); | 435 mock_bindings.CreateBindings()); |
519 EXPECT_EQ(OK, callback.WaitForResult()); | 436 EXPECT_EQ(OK, callback.WaitForResult()); |
520 | 437 |
521 ExpectHistogramBucketCount( | |
522 PacResultForStrippedUrl::SKIPPED_FALLBACK_BLOCKING_DNS, 1); | |
523 ExpectHistogramTotal(1); | |
524 | |
525 EXPECT_EQ(3u, host_resolver.num_resolve()); | 438 EXPECT_EQ(3u, host_resolver.num_resolve()); |
526 | 439 |
527 EXPECT_EQ("166.155.144.44:100", proxy_info.proxy_server().ToURI()); | 440 EXPECT_EQ("166.155.144.44:100", proxy_info.proxy_server().ToURI()); |
528 | 441 |
529 // There were no alerts or errors. | 442 // There were no alerts or errors. |
530 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); | 443 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); |
531 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 444 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
532 } | 445 } |
533 | 446 |
534 // This test runs a weird PAC script that yields a never ending sequence | 447 // This test runs a weird PAC script that yields a never ending sequence |
(...skipping 11 matching lines...) Expand all Loading... |
546 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects3.js"); | 459 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects3.js"); |
547 | 460 |
548 TestCompletionCallback callback; | 461 TestCompletionCallback callback; |
549 ProxyInfo proxy_info; | 462 ProxyInfo proxy_info; |
550 | 463 |
551 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, | 464 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
552 callback.callback(), NULL, | 465 callback.callback(), NULL, |
553 mock_bindings.CreateBindings()); | 466 mock_bindings.CreateBindings()); |
554 EXPECT_EQ(OK, callback.WaitForResult()); | 467 EXPECT_EQ(OK, callback.WaitForResult()); |
555 | 468 |
556 // Was not called because this is an http:// URL. | |
557 ExpectHistogramTotal(0); | |
558 | |
559 EXPECT_EQ(20u, host_resolver.num_resolve()); | 469 EXPECT_EQ(20u, host_resolver.num_resolve()); |
560 | 470 |
561 EXPECT_EQ( | 471 EXPECT_EQ( |
562 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" | 472 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" |
563 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" | 473 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" |
564 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" | 474 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" |
565 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" | 475 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" |
566 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" | 476 "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-" |
567 "null:21", proxy_info.proxy_server().ToURI()); | 477 "null:21", proxy_info.proxy_server().ToURI()); |
568 | 478 |
(...skipping 20 matching lines...) Expand all Loading... |
589 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects4.js"); | 499 CreateResolver(mock_bindings.CreateBindings(), "global_sideffects4.js"); |
590 | 500 |
591 TestCompletionCallback callback; | 501 TestCompletionCallback callback; |
592 ProxyInfo proxy_info; | 502 ProxyInfo proxy_info; |
593 | 503 |
594 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, | 504 resolver->GetProxyForURL(GURL("http://foo/"), &proxy_info, |
595 callback.callback(), NULL, | 505 callback.callback(), NULL, |
596 mock_bindings.CreateBindings()); | 506 mock_bindings.CreateBindings()); |
597 EXPECT_EQ(OK, callback.WaitForResult()); | 507 EXPECT_EQ(OK, callback.WaitForResult()); |
598 | 508 |
599 // Was not called because this is an http:// URL. | |
600 ExpectHistogramTotal(0); | |
601 | |
602 EXPECT_EQ(20u, host_resolver.num_resolve()); | 509 EXPECT_EQ(20u, host_resolver.num_resolve()); |
603 | 510 |
604 EXPECT_EQ("null21:34", proxy_info.proxy_server().ToURI()); | 511 EXPECT_EQ("null21:34", proxy_info.proxy_server().ToURI()); |
605 | 512 |
606 // No errors. | 513 // No errors. |
607 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | 514 EXPECT_TRUE(mock_bindings.GetErrors().empty()); |
608 | 515 |
609 // 1 alert. | 516 // 1 alert. |
610 EXPECT_EQ(1u, mock_bindings.GetAlerts().size()); | 517 EXPECT_EQ(1u, mock_bindings.GetAlerts().size()); |
611 EXPECT_EQ("iteration: 21", mock_bindings.GetAlerts()[0]); | 518 EXPECT_EQ("iteration: 21", mock_bindings.GetAlerts()[0]); |
612 } | 519 } |
613 | 520 |
614 TEST_F(ProxyResolverV8TracingTest, DifferentResultBasedOnUrl) { | |
615 MockCachingHostResolver host_resolver; | |
616 MockBindings mock_bindings(&host_resolver); | |
617 | |
618 scoped_ptr<ProxyResolverV8Tracing> resolver = | |
619 CreateResolver(mock_bindings.CreateBindings(), "return_url_as_proxy.js"); | |
620 | |
621 TestCompletionCallback callback; | |
622 ProxyInfo proxy_info; | |
623 | |
624 resolver->GetProxyForURL(GURL("https://foo/path1"), &proxy_info, | |
625 callback.callback(), NULL, | |
626 mock_bindings.CreateBindings()); | |
627 | |
628 EXPECT_EQ(OK, callback.WaitForResult()); | |
629 | |
630 ExpectHistogramTotal(1); | |
631 ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_DIFFERENT_PROXY_LIST, | |
632 1); | |
633 | |
634 EXPECT_EQ("httpsx3Ax2Fx2Ffoox2Fpath1:99", proxy_info.proxy_server().ToURI()); | |
635 | |
636 EXPECT_EQ(0u, host_resolver.num_resolve()); | |
637 | |
638 // There were no alerts or errors. | |
639 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); | |
640 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | |
641 } | |
642 | |
643 TEST_F(ProxyResolverV8TracingTest, ErrorDependingOnUrl) { | |
644 MockCachingHostResolver host_resolver; | |
645 MockBindings mock_bindings(&host_resolver); | |
646 | |
647 scoped_ptr<ProxyResolverV8Tracing> resolver = CreateResolver( | |
648 mock_bindings.CreateBindings(), "error_depending_on_url.js"); | |
649 | |
650 TestCompletionCallback callback; | |
651 ProxyInfo proxy_info; | |
652 | |
653 resolver->GetProxyForURL(GURL("https://foo/DontThrowError"), &proxy_info, | |
654 callback.callback(), NULL, | |
655 mock_bindings.CreateBindings()); | |
656 | |
657 EXPECT_EQ(OK, callback.WaitForResult()); | |
658 | |
659 ExpectHistogramTotal(1); | |
660 ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_ERROR, 1); | |
661 | |
662 EXPECT_EQ("foopy:42", proxy_info.proxy_server().ToURI()); | |
663 | |
664 EXPECT_EQ(0u, host_resolver.num_resolve()); | |
665 | |
666 // There were no alerts or errors. | |
667 EXPECT_TRUE(mock_bindings.GetAlerts().empty()); | |
668 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | |
669 } | |
670 | |
671 TEST_F(ProxyResolverV8TracingTest, DnsDependingOnUrl) { | |
672 MockCachingHostResolver host_resolver; | |
673 MockBindings mock_bindings(&host_resolver); | |
674 | |
675 host_resolver.rules()->AddRule("host", "166.155.144.55"); | |
676 | |
677 // Catch-all that will be used for myIpAddress(). | |
678 host_resolver.rules()->AddRule("*", "133.122.100.200"); | |
679 | |
680 scoped_ptr<ProxyResolverV8Tracing> resolver = | |
681 CreateResolver(mock_bindings.CreateBindings(), "dns_depending_on_url.js"); | |
682 | |
683 TestCompletionCallback callback; | |
684 ProxyInfo proxy_info; | |
685 | |
686 resolver->GetProxyForURL(GURL("https://foo/UseMyIpAddress"), &proxy_info, | |
687 callback.callback(), NULL, | |
688 mock_bindings.CreateBindings()); | |
689 | |
690 EXPECT_EQ(OK, callback.WaitForResult()); | |
691 | |
692 ExpectHistogramBucketCount(PacResultForStrippedUrl::FAIL_ABANDONED, 1); | |
693 ExpectHistogramTotal(1); | |
694 | |
695 EXPECT_EQ("foopy:47", proxy_info.proxy_server().ToURI()); | |
696 | |
697 // No errors. | |
698 EXPECT_TRUE(mock_bindings.GetErrors().empty()); | |
699 ASSERT_EQ(0u, mock_bindings.GetAlerts().size()); | |
700 } | |
701 | |
702 void DnsDuringInitHelper(bool synchronous_host_resolver) { | 521 void DnsDuringInitHelper(bool synchronous_host_resolver) { |
703 MockCachingHostResolver host_resolver; | 522 MockCachingHostResolver host_resolver; |
704 MockBindings mock_bindings(&host_resolver); | 523 MockBindings mock_bindings(&host_resolver); |
705 host_resolver.set_synchronous_mode(synchronous_host_resolver); | 524 host_resolver.set_synchronous_mode(synchronous_host_resolver); |
706 | 525 |
707 host_resolver.rules()->AddRule("host1", "91.13.12.1"); | 526 host_resolver.rules()->AddRule("host1", "91.13.12.1"); |
708 host_resolver.rules()->AddRule("host2", "91.13.12.2"); | 527 host_resolver.rules()->AddRule("host2", "91.13.12.2"); |
709 | 528 |
710 scoped_ptr<ProxyResolverV8Tracing> resolver = | 529 scoped_ptr<ProxyResolverV8Tracing> resolver = |
711 CreateResolver(mock_bindings.CreateBindings(), "dns_during_init.js"); | 530 CreateResolver(mock_bindings.CreateBindings(), "dns_during_init.js"); |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1196 proxy_uri.substr(0, proxy_uri.find(':') + 1)); | 1015 proxy_uri.substr(0, proxy_uri.find(':') + 1)); |
1197 } else { | 1016 } else { |
1198 NOTREACHED(); | 1017 NOTREACHED(); |
1199 } | 1018 } |
1200 } | 1019 } |
1201 } | 1020 } |
1202 | 1021 |
1203 } // namespace | 1022 } // namespace |
1204 | 1023 |
1205 } // namespace net | 1024 } // namespace net |
OLD | NEW |