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