Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(863)

Side by Side Diff: net/proxy/proxy_resolver_v8_tracing_unittest.cc

Issue 1797313003: Add a histogram (Net.PacResultForStrippedUrl) that estimates how often PAC scripts depend on the UR… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update some more comments per mpearson's feedback. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/proxy/proxy_resolver_v8_tracing.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/proxy/proxy_resolver_v8_tracing.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698