| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "base/compiler_specific.h" | 5 #include "base/compiler_specific.h" |
| 6 #include "googleurl/src/gurl.h" | 6 #include "googleurl/src/gurl.h" |
| 7 #include "net/base/net_errors.h" | 7 #include "net/base/net_errors.h" |
| 8 #include "net/proxy/single_threaded_proxy_resolver.h" |
| 8 #include "net/proxy/proxy_config_service.h" | 9 #include "net/proxy/proxy_config_service.h" |
| 9 #include "net/proxy/proxy_resolver.h" | 10 #include "net/proxy/proxy_resolver.h" |
| 10 #include "net/proxy/proxy_script_fetcher.h" | 11 #include "net/proxy/proxy_script_fetcher.h" |
| 11 #include "net/proxy/proxy_service.h" | 12 #include "net/proxy/proxy_service.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 namespace { | 15 namespace { |
| 15 | 16 |
| 16 class MockProxyConfigService: public net::ProxyConfigService { | 17 class MockProxyConfigService: public net::ProxyConfigService { |
| 17 public: | 18 public: |
| 18 MockProxyConfigService() {} // Direct connect. | 19 MockProxyConfigService() {} // Direct connect. |
| 19 explicit MockProxyConfigService(const net::ProxyConfig& pc) : config(pc) {} | 20 explicit MockProxyConfigService(const net::ProxyConfig& pc) : config(pc) {} |
| 20 explicit MockProxyConfigService(const std::string& pac_url) { | 21 explicit MockProxyConfigService(const std::string& pac_url) { |
| 21 config.pac_url = GURL(pac_url); | 22 config.pac_url = GURL(pac_url); |
| 22 } | 23 } |
| 23 | 24 |
| 24 virtual int GetProxyConfig(net::ProxyConfig* results) { | 25 virtual int GetProxyConfig(net::ProxyConfig* results) { |
| 25 *results = config; | 26 *results = config; |
| 26 return net::OK; | 27 return net::OK; |
| 27 } | 28 } |
| 28 | 29 |
| 29 net::ProxyConfig config; | 30 net::ProxyConfig config; |
| 30 }; | 31 }; |
| 31 | 32 |
| 32 class MockProxyResolver : public net::ProxyResolver { | 33 class SyncMockProxyResolver : public net::ProxyResolver { |
| 33 public: | 34 public: |
| 34 MockProxyResolver() : net::ProxyResolver(true), | 35 SyncMockProxyResolver() : net::ProxyResolver(false /*expects_pac_bytes*/), |
| 35 fail_get_proxy_for_url(false) { | 36 fail_get_proxy_for_url(false) { |
| 36 } | 37 } |
| 37 | 38 |
| 39 // ProxyResolver implementation: |
| 38 virtual int GetProxyForURL(const GURL& query_url, | 40 virtual int GetProxyForURL(const GURL& query_url, |
| 39 const GURL& pac_url, | 41 net::ProxyInfo* results, |
| 40 net::ProxyInfo* results) { | 42 net::CompletionCallback* callback, |
| 43 RequestHandle* request) { |
| 41 if (fail_get_proxy_for_url) | 44 if (fail_get_proxy_for_url) |
| 42 return net::ERR_FAILED; | 45 return net::ERR_FAILED; |
| 43 if (GURL(query_url).host() == info_predicate_query_host) { | 46 if (GURL(query_url).host() == info_predicate_query_host) { |
| 44 results->Use(info); | 47 results->Use(info); |
| 45 } else { | 48 } else { |
| 46 results->UseDirect(); | 49 results->UseDirect(); |
| 47 } | 50 } |
| 48 return net::OK; | 51 return net::OK; |
| 49 } | 52 } |
| 50 | 53 |
| 54 virtual void CancelRequest(RequestHandle request) { |
| 55 NOTREACHED(); |
| 56 } |
| 57 |
| 58 virtual void SetPacScriptByUrlInternal(const GURL& pac_url) {} |
| 59 |
| 60 |
| 51 net::ProxyInfo info; | 61 net::ProxyInfo info; |
| 52 | 62 |
| 53 // info is only returned if query_url in GetProxyForURL matches this: | 63 // info is only returned if query_url in GetProxyForURL matches this: |
| 54 std::string info_predicate_query_host; | 64 std::string info_predicate_query_host; |
| 55 | 65 |
| 56 // If true, then GetProxyForURL will fail, which simulates failure to | 66 // If true, then GetProxyForURL will fail, which simulates failure to |
| 57 // download or execute the PAC file. | 67 // download or execute the PAC file. |
| 58 bool fail_get_proxy_for_url; | 68 bool fail_get_proxy_for_url; |
| 59 }; | 69 }; |
| 60 | 70 |
| 71 class MockProxyResolver : public net::SingleThreadedProxyResolver { |
| 72 public: |
| 73 MockProxyResolver() |
| 74 : net::SingleThreadedProxyResolver(new SyncMockProxyResolver) { |
| 75 x = reinterpret_cast<SyncMockProxyResolver*>(resolver()); |
| 76 } |
| 77 |
| 78 // TODO(eroman): cleanup. |
| 79 SyncMockProxyResolver* x; |
| 80 }; |
| 81 |
| 61 // ResultFuture is a handle to get at the result from | 82 // ResultFuture is a handle to get at the result from |
| 62 // ProxyService::ResolveProxyForURL() that ran on another thread. | 83 // ProxyService::ResolveProxyForURL() that ran on another thread. |
| 63 class ResultFuture : public base::RefCountedThreadSafe<ResultFuture> { | 84 class ResultFuture : public base::RefCountedThreadSafe<ResultFuture> { |
| 64 public: | 85 public: |
| 65 // |service| is the ProxyService to issue requests on, and |io_message_loop| | 86 // |service| is the ProxyService to issue requests on, and |io_message_loop| |
| 66 // is the message loop where ProxyService lives. | 87 // is the message loop where ProxyService lives. |
| 67 ResultFuture(MessageLoop* io_message_loop, | 88 ResultFuture(MessageLoop* io_message_loop, |
| 68 net::ProxyService* service) | 89 net::ProxyService* service) |
| 69 : io_message_loop_(io_message_loop), | 90 : io_message_loop_(io_message_loop), |
| 70 service_(service), | 91 service_(service), |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 scoped_refptr<ResultFuture> result; | 340 scoped_refptr<ResultFuture> result; |
| 320 service_.ResetConfigService(&result, new_proxy_config_service); | 341 service_.ResetConfigService(&result, new_proxy_config_service); |
| 321 return result->GetResultCode(); | 342 return result->GetResultCode(); |
| 322 } | 343 } |
| 323 | 344 |
| 324 private: | 345 private: |
| 325 ProxyServiceWithFutures service_; | 346 ProxyServiceWithFutures service_; |
| 326 }; | 347 }; |
| 327 | 348 |
| 328 // A ProxyResolver which can be set to block upon reaching GetProxyForURL. | 349 // A ProxyResolver which can be set to block upon reaching GetProxyForURL. |
| 329 class BlockableProxyResolver : public net::ProxyResolver { | 350 class SyncBlockableProxyResolver : public net::ProxyResolver { |
| 330 public: | 351 public: |
| 331 BlockableProxyResolver() : net::ProxyResolver(true), | 352 SyncBlockableProxyResolver() |
| 332 should_block_(false), | 353 : net::ProxyResolver(false /*expects_pac_bytes*/), |
| 333 unblocked_(true, true), | 354 should_block_(false), |
| 334 blocked_(true, false) { | 355 unblocked_(true, true), |
| 356 blocked_(true, false) { |
| 335 } | 357 } |
| 336 | 358 |
| 337 void Block() { | 359 void Block() { |
| 338 should_block_ = true; | 360 should_block_ = true; |
| 339 unblocked_.Reset(); | 361 unblocked_.Reset(); |
| 340 } | 362 } |
| 341 | 363 |
| 342 void Unblock() { | 364 void Unblock() { |
| 343 should_block_ = false; | 365 should_block_ = false; |
| 344 blocked_.Reset(); | 366 blocked_.Reset(); |
| 345 unblocked_.Signal(); | 367 unblocked_.Signal(); |
| 346 } | 368 } |
| 347 | 369 |
| 348 void WaitUntilBlocked() { | 370 void WaitUntilBlocked() { |
| 349 blocked_.Wait(); | 371 blocked_.Wait(); |
| 350 } | 372 } |
| 351 | 373 |
| 352 // net::ProxyResolver implementation: | 374 // net::ProxyResolver implementation: |
| 353 virtual int GetProxyForURL(const GURL& query_url, | 375 virtual int GetProxyForURL(const GURL& query_url, |
| 354 const GURL& pac_url, | 376 net::ProxyInfo* results, |
| 355 net::ProxyInfo* results) { | 377 net::CompletionCallback* callback, |
| 378 RequestHandle* request) { |
| 356 if (should_block_) { | 379 if (should_block_) { |
| 357 blocked_.Signal(); | 380 blocked_.Signal(); |
| 358 unblocked_.Wait(); | 381 unblocked_.Wait(); |
| 359 } | 382 } |
| 360 | 383 |
| 361 results->UseNamedProxy(query_url.host()); | 384 results->UseNamedProxy(query_url.host()); |
| 362 return net::OK; | 385 return net::OK; |
| 363 } | 386 } |
| 364 | 387 |
| 388 virtual void CancelRequest(RequestHandle request) { |
| 389 NOTREACHED(); |
| 390 } |
| 391 |
| 392 virtual void SetPacScriptByUrlInternal(const GURL& pac_url) {} |
| 393 |
| 365 private: | 394 private: |
| 366 bool should_block_; | 395 bool should_block_; |
| 367 base::WaitableEvent unblocked_; | 396 base::WaitableEvent unblocked_; |
| 368 base::WaitableEvent blocked_; | 397 base::WaitableEvent blocked_; |
| 369 }; | 398 }; |
| 370 | 399 |
| 400 class BlockableProxyResolver : public net::SingleThreadedProxyResolver { |
| 401 public: |
| 402 BlockableProxyResolver() |
| 403 : net::SingleThreadedProxyResolver(new SyncBlockableProxyResolver) { |
| 404 x = reinterpret_cast<SyncBlockableProxyResolver*>(resolver()); |
| 405 } |
| 406 |
| 407 // TODO(eroman): cleanup. |
| 408 SyncBlockableProxyResolver* x; |
| 409 }; |
| 410 |
| 371 // A mock ProxyResolverWithoutFetch which concatenates the query's host with | 411 // A mock ProxyResolverWithoutFetch which concatenates the query's host with |
| 372 // the last download PAC contents. This way the result describes what the last | 412 // the last download PAC contents. This way the result describes what the last |
| 373 // downloaded PAC script's contents were, in addition to the query url itself. | 413 // downloaded PAC script's contents were, in addition to the query url itself. |
| 374 class MockProxyResolverWithoutFetch : public net::ProxyResolver { | 414 class SyncMockProxyResolverWithoutFetch : public net::ProxyResolver { |
| 375 public: | 415 public: |
| 376 MockProxyResolverWithoutFetch() : net::ProxyResolver(false), | 416 SyncMockProxyResolverWithoutFetch() |
| 377 last_pac_contents_("NONE") {} | 417 : net::ProxyResolver(true /*expects_pac_bytes*/), |
| 418 last_pac_contents_("NONE") {} |
| 378 | 419 |
| 379 // net::ProxyResolver implementation: | 420 // net::ProxyResolver implementation: |
| 380 virtual int GetProxyForURL(const GURL& query_url, | 421 virtual int GetProxyForURL(const GURL& query_url, |
| 381 const GURL& pac_url, | 422 net::ProxyInfo* results, |
| 382 net::ProxyInfo* results) { | 423 net::CompletionCallback* callback, |
| 424 RequestHandle* request) { |
| 383 results->UseNamedProxy(last_pac_contents_ + "." + query_url.host()); | 425 results->UseNamedProxy(last_pac_contents_ + "." + query_url.host()); |
| 384 return net::OK; | 426 return net::OK; |
| 385 } | 427 } |
| 386 | 428 |
| 387 virtual void SetPacScript(const std::string& bytes) { | 429 virtual void SetPacScriptByDataInternal(const std::string& bytes) { |
| 388 last_pac_contents_ = bytes; | 430 last_pac_contents_ = bytes; |
| 389 } | 431 } |
| 390 | 432 |
| 433 virtual void CancelRequest(RequestHandle request) { |
| 434 NOTREACHED(); |
| 435 } |
| 436 |
| 391 private: | 437 private: |
| 392 std::string last_pac_contents_; | 438 std::string last_pac_contents_; |
| 393 }; | 439 }; |
| 394 | 440 |
| 441 class MockProxyResolverWithoutFetch : public net::SingleThreadedProxyResolver { |
| 442 public: |
| 443 MockProxyResolverWithoutFetch() |
| 444 : net::SingleThreadedProxyResolver( |
| 445 new SyncMockProxyResolverWithoutFetch) { |
| 446 x = reinterpret_cast<SyncMockProxyResolverWithoutFetch*>(resolver()); |
| 447 } |
| 448 |
| 449 // TODO(eroman): cleanup. |
| 450 SyncMockProxyResolverWithoutFetch* x; |
| 451 }; |
| 452 |
| 453 |
| 395 } // namespace | 454 } // namespace |
| 396 | 455 |
| 397 // A mock ProxyScriptFetcher. No result will be returned to the fetch client | 456 // A mock ProxyScriptFetcher. No result will be returned to the fetch client |
| 398 // until we call NotifyFetchCompletion() to set the results. | 457 // until we call NotifyFetchCompletion() to set the results. |
| 399 class MockProxyScriptFetcher : public net::ProxyScriptFetcher { | 458 class MockProxyScriptFetcher : public net::ProxyScriptFetcher { |
| 400 public: | 459 public: |
| 401 MockProxyScriptFetcher() : pending_request_loop_(NULL), | 460 MockProxyScriptFetcher() : pending_request_loop_(NULL), |
| 402 pending_request_callback_(NULL), pending_request_bytes_(NULL) {} | 461 pending_request_callback_(NULL), pending_request_bytes_(NULL) {} |
| 403 | 462 |
| 404 // net::ProxyScriptFetcher implementation. | 463 // net::ProxyScriptFetcher implementation. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 int rv = service.ResolveProxy(url, &info); | 517 int rv = service.ResolveProxy(url, &info); |
| 459 EXPECT_EQ(rv, net::OK); | 518 EXPECT_EQ(rv, net::OK); |
| 460 EXPECT_TRUE(info.is_direct()); | 519 EXPECT_TRUE(info.is_direct()); |
| 461 } | 520 } |
| 462 | 521 |
| 463 TEST(ProxyServiceTest, PAC) { | 522 TEST(ProxyServiceTest, PAC) { |
| 464 MockProxyConfigService* config_service = | 523 MockProxyConfigService* config_service = |
| 465 new MockProxyConfigService("http://foopy/proxy.pac"); | 524 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 466 | 525 |
| 467 MockProxyResolver* resolver = new MockProxyResolver; | 526 MockProxyResolver* resolver = new MockProxyResolver; |
| 468 resolver->info.UseNamedProxy("foopy"); | 527 resolver->x->info.UseNamedProxy("foopy"); |
| 469 resolver->info_predicate_query_host = "www.google.com"; | 528 resolver->x->info_predicate_query_host = "www.google.com"; |
| 470 | 529 |
| 471 SyncProxyService service(config_service, resolver); | 530 SyncProxyService service(config_service, resolver); |
| 472 | 531 |
| 473 GURL url("http://www.google.com/"); | 532 GURL url("http://www.google.com/"); |
| 474 | 533 |
| 475 net::ProxyInfo info; | 534 net::ProxyInfo info; |
| 476 int rv = service.ResolveProxy(url, &info); | 535 int rv = service.ResolveProxy(url, &info); |
| 477 EXPECT_EQ(rv, net::OK); | 536 EXPECT_EQ(rv, net::OK); |
| 478 EXPECT_FALSE(info.is_direct()); | 537 EXPECT_FALSE(info.is_direct()); |
| 479 EXPECT_EQ("foopy:80", info.proxy_server().ToURI()); | 538 EXPECT_EQ("foopy:80", info.proxy_server().ToURI()); |
| 480 } | 539 } |
| 481 | 540 |
| 482 TEST(ProxyServiceTest, PAC_FailoverToDirect) { | 541 TEST(ProxyServiceTest, PAC_FailoverToDirect) { |
| 483 MockProxyConfigService* config_service = | 542 MockProxyConfigService* config_service = |
| 484 new MockProxyConfigService("http://foopy/proxy.pac"); | 543 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 485 | 544 |
| 486 MockProxyResolver* resolver = new MockProxyResolver; | 545 MockProxyResolver* resolver = new MockProxyResolver; |
| 487 resolver->info.UseNamedProxy("foopy:8080"); | 546 resolver->x->info.UseNamedProxy("foopy:8080"); |
| 488 resolver->info_predicate_query_host = "www.google.com"; | 547 resolver->x->info_predicate_query_host = "www.google.com"; |
| 489 | 548 |
| 490 SyncProxyService service(config_service, resolver); | 549 SyncProxyService service(config_service, resolver); |
| 491 | 550 |
| 492 GURL url("http://www.google.com/"); | 551 GURL url("http://www.google.com/"); |
| 493 | 552 |
| 494 net::ProxyInfo info; | 553 net::ProxyInfo info; |
| 495 int rv = service.ResolveProxy(url, &info); | 554 int rv = service.ResolveProxy(url, &info); |
| 496 EXPECT_EQ(rv, net::OK); | 555 EXPECT_EQ(rv, net::OK); |
| 497 EXPECT_FALSE(info.is_direct()); | 556 EXPECT_FALSE(info.is_direct()); |
| 498 EXPECT_EQ("foopy:8080", info.proxy_server().ToURI()); | 557 EXPECT_EQ("foopy:8080", info.proxy_server().ToURI()); |
| 499 | 558 |
| 500 // Now, imagine that connecting to foopy:8080 fails. | 559 // Now, imagine that connecting to foopy:8080 fails. |
| 501 rv = service.ReconsiderProxyAfterError(url, &info); | 560 rv = service.ReconsiderProxyAfterError(url, &info); |
| 502 EXPECT_EQ(rv, net::OK); | 561 EXPECT_EQ(rv, net::OK); |
| 503 EXPECT_TRUE(info.is_direct()); | 562 EXPECT_TRUE(info.is_direct()); |
| 504 } | 563 } |
| 505 | 564 |
| 506 TEST(ProxyServiceTest, PAC_FailsToDownload) { | 565 TEST(ProxyServiceTest, PAC_FailsToDownload) { |
| 507 // Test what happens when we fail to download the PAC URL. | 566 // Test what happens when we fail to download the PAC URL. |
| 508 | 567 |
| 509 MockProxyConfigService* config_service = | 568 MockProxyConfigService* config_service = |
| 510 new MockProxyConfigService("http://foopy/proxy.pac"); | 569 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 511 | 570 |
| 512 MockProxyResolver* resolver = new MockProxyResolver; | 571 MockProxyResolver* resolver = new MockProxyResolver; |
| 513 resolver->info.UseNamedProxy("foopy:8080"); | 572 resolver->x->info.UseNamedProxy("foopy:8080"); |
| 514 resolver->info_predicate_query_host = "www.google.com"; | 573 resolver->x->info_predicate_query_host = "www.google.com"; |
| 515 resolver->fail_get_proxy_for_url = true; | 574 resolver->x->fail_get_proxy_for_url = true; |
| 516 | 575 |
| 517 SyncProxyService service(config_service, resolver); | 576 SyncProxyService service(config_service, resolver); |
| 518 | 577 |
| 519 // The first resolve fails in the MockProxyResolver. | 578 // The first resolve fails in the MockProxyResolver. |
| 520 GURL url("http://www.google.com/"); | 579 GURL url("http://www.google.com/"); |
| 521 net::ProxyInfo info; | 580 net::ProxyInfo info; |
| 522 int rv = service.ResolveProxy(url, &info); | 581 int rv = service.ResolveProxy(url, &info); |
| 523 EXPECT_EQ(rv, net::ERR_FAILED); | 582 EXPECT_EQ(rv, net::ERR_FAILED); |
| 524 | 583 |
| 525 // The second resolve request will automatically select direct connect, | 584 // The second resolve request will automatically select direct connect, |
| 526 // because it has cached the configuration as being bad. | 585 // because it has cached the configuration as being bad. |
| 527 rv = service.ResolveProxy(url, &info); | 586 rv = service.ResolveProxy(url, &info); |
| 528 EXPECT_EQ(rv, net::OK); | 587 EXPECT_EQ(rv, net::OK); |
| 529 EXPECT_TRUE(info.is_direct()); | 588 EXPECT_TRUE(info.is_direct()); |
| 530 | 589 |
| 531 resolver->fail_get_proxy_for_url = false; | 590 resolver->x->fail_get_proxy_for_url = false; |
| 532 resolver->info.UseNamedProxy("foopy_valid:8080"); | 591 resolver->x->info.UseNamedProxy("foopy_valid:8080"); |
| 533 | 592 |
| 534 // But, if that fails, then we should give the proxy config another shot | 593 // But, if that fails, then we should give the proxy config another shot |
| 535 // since we have never tried it with this URL before. | 594 // since we have never tried it with this URL before. |
| 536 rv = service.ReconsiderProxyAfterError(url, &info); | 595 rv = service.ReconsiderProxyAfterError(url, &info); |
| 537 EXPECT_EQ(rv, net::OK); | 596 EXPECT_EQ(rv, net::OK); |
| 538 EXPECT_FALSE(info.is_direct()); | 597 EXPECT_FALSE(info.is_direct()); |
| 539 EXPECT_EQ("foopy_valid:8080", info.proxy_server().ToURI()); | 598 EXPECT_EQ("foopy_valid:8080", info.proxy_server().ToURI()); |
| 540 } | 599 } |
| 541 | 600 |
| 542 TEST(ProxyServiceTest, ProxyFallback) { | 601 TEST(ProxyServiceTest, ProxyFallback) { |
| 543 // Test what happens when we specify multiple proxy servers and some of them | 602 // Test what happens when we specify multiple proxy servers and some of them |
| 544 // are bad. | 603 // are bad. |
| 545 | 604 |
| 546 MockProxyConfigService* config_service = | 605 MockProxyConfigService* config_service = |
| 547 new MockProxyConfigService("http://foopy/proxy.pac"); | 606 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 548 | 607 |
| 549 MockProxyResolver* resolver = new MockProxyResolver; | 608 MockProxyResolver* resolver = new MockProxyResolver; |
| 550 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); | 609 resolver->x->info.UseNamedProxy("foopy1:8080;foopy2:9090"); |
| 551 resolver->info_predicate_query_host = "www.google.com"; | 610 resolver->x->info_predicate_query_host = "www.google.com"; |
| 552 resolver->fail_get_proxy_for_url = false; | 611 resolver->x->fail_get_proxy_for_url = false; |
| 553 | 612 |
| 554 SyncProxyService service(config_service, resolver); | 613 SyncProxyService service(config_service, resolver); |
| 555 | 614 |
| 556 GURL url("http://www.google.com/"); | 615 GURL url("http://www.google.com/"); |
| 557 | 616 |
| 558 // Get the proxy information. | 617 // Get the proxy information. |
| 559 net::ProxyInfo info; | 618 net::ProxyInfo info; |
| 560 int rv = service.ResolveProxy(url, &info); | 619 int rv = service.ResolveProxy(url, &info); |
| 561 EXPECT_EQ(rv, net::OK); | 620 EXPECT_EQ(rv, net::OK); |
| 562 EXPECT_FALSE(info.is_direct()); | 621 EXPECT_FALSE(info.is_direct()); |
| 563 | 622 |
| 564 // The first item is valid. | 623 // The first item is valid. |
| 565 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); | 624 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); |
| 566 | 625 |
| 567 // Fake an error on the proxy. | 626 // Fake an error on the proxy. |
| 568 rv = service.ReconsiderProxyAfterError(url, &info); | 627 rv = service.ReconsiderProxyAfterError(url, &info); |
| 569 EXPECT_EQ(rv, net::OK); | 628 EXPECT_EQ(rv, net::OK); |
| 570 | 629 |
| 571 // The second proxy should be specified. | 630 // The second proxy should be specified. |
| 572 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); | 631 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); |
| 573 | 632 |
| 574 // Create a new resolver that returns 3 proxies. The second one is already | 633 // Create a new resolver that returns 3 proxies. The second one is already |
| 575 // known to be bad. | 634 // known to be bad. |
| 576 config_service->config.pac_url = GURL("http://foopy/proxy.pac"); | 635 config_service->config.pac_url = GURL("http://foopy/proxy.pac"); |
| 577 resolver->info.UseNamedProxy("foopy3:7070;foopy1:8080;foopy2:9090"); | 636 resolver->x->info.UseNamedProxy("foopy3:7070;foopy1:8080;foopy2:9090"); |
| 578 resolver->info_predicate_query_host = "www.google.com"; | 637 resolver->x->info_predicate_query_host = "www.google.com"; |
| 579 resolver->fail_get_proxy_for_url = false; | 638 resolver->x->fail_get_proxy_for_url = false; |
| 580 | 639 |
| 581 rv = service.ResolveProxy(url, &info); | 640 rv = service.ResolveProxy(url, &info); |
| 582 EXPECT_EQ(rv, net::OK); | 641 EXPECT_EQ(rv, net::OK); |
| 583 EXPECT_FALSE(info.is_direct()); | 642 EXPECT_FALSE(info.is_direct()); |
| 584 EXPECT_EQ("foopy3:7070", info.proxy_server().ToURI()); | 643 EXPECT_EQ("foopy3:7070", info.proxy_server().ToURI()); |
| 585 | 644 |
| 586 // We fake another error. It should now try the third one. | 645 // We fake another error. It should now try the third one. |
| 587 rv = service.ReconsiderProxyAfterError(url, &info); | 646 rv = service.ReconsiderProxyAfterError(url, &info); |
| 588 EXPECT_EQ(rv, net::OK); | 647 EXPECT_EQ(rv, net::OK); |
| 589 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); | 648 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 600 // TODO(nsylvain): Test that the proxy can be retried after the delay. | 659 // TODO(nsylvain): Test that the proxy can be retried after the delay. |
| 601 } | 660 } |
| 602 | 661 |
| 603 TEST(ProxyServiceTest, ProxyFallback_NewSettings) { | 662 TEST(ProxyServiceTest, ProxyFallback_NewSettings) { |
| 604 // Test proxy failover when new settings are available. | 663 // Test proxy failover when new settings are available. |
| 605 | 664 |
| 606 MockProxyConfigService* config_service = | 665 MockProxyConfigService* config_service = |
| 607 new MockProxyConfigService("http://foopy/proxy.pac"); | 666 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 608 | 667 |
| 609 MockProxyResolver* resolver = new MockProxyResolver; | 668 MockProxyResolver* resolver = new MockProxyResolver; |
| 610 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); | 669 resolver->x->info.UseNamedProxy("foopy1:8080;foopy2:9090"); |
| 611 resolver->info_predicate_query_host = "www.google.com"; | 670 resolver->x->info_predicate_query_host = "www.google.com"; |
| 612 resolver->fail_get_proxy_for_url = false; | 671 resolver->x->fail_get_proxy_for_url = false; |
| 613 | 672 |
| 614 SyncProxyService service(config_service, resolver); | 673 SyncProxyService service(config_service, resolver); |
| 615 | 674 |
| 616 GURL url("http://www.google.com/"); | 675 GURL url("http://www.google.com/"); |
| 617 | 676 |
| 618 // Get the proxy information. | 677 // Get the proxy information. |
| 619 net::ProxyInfo info; | 678 net::ProxyInfo info; |
| 620 int rv = service.ResolveProxy(url, &info); | 679 int rv = service.ResolveProxy(url, &info); |
| 621 EXPECT_EQ(rv, net::OK); | 680 EXPECT_EQ(rv, net::OK); |
| 622 EXPECT_FALSE(info.is_direct()); | 681 EXPECT_FALSE(info.is_direct()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 649 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); | 708 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); |
| 650 } | 709 } |
| 651 | 710 |
| 652 TEST(ProxyServiceTest, ProxyFallback_BadConfig) { | 711 TEST(ProxyServiceTest, ProxyFallback_BadConfig) { |
| 653 // Test proxy failover when the configuration is bad. | 712 // Test proxy failover when the configuration is bad. |
| 654 | 713 |
| 655 MockProxyConfigService* config_service = | 714 MockProxyConfigService* config_service = |
| 656 new MockProxyConfigService("http://foopy/proxy.pac"); | 715 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 657 | 716 |
| 658 MockProxyResolver* resolver = new MockProxyResolver; | 717 MockProxyResolver* resolver = new MockProxyResolver; |
| 659 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); | 718 resolver->x->info.UseNamedProxy("foopy1:8080;foopy2:9090"); |
| 660 resolver->info_predicate_query_host = "www.google.com"; | 719 resolver->x->info_predicate_query_host = "www.google.com"; |
| 661 resolver->fail_get_proxy_for_url = false; | 720 resolver->x->fail_get_proxy_for_url = false; |
| 662 | 721 |
| 663 SyncProxyService service(config_service, resolver); | 722 SyncProxyService service(config_service, resolver); |
| 664 | 723 |
| 665 GURL url("http://www.google.com/"); | 724 GURL url("http://www.google.com/"); |
| 666 | 725 |
| 667 // Get the proxy information. | 726 // Get the proxy information. |
| 668 net::ProxyInfo info; | 727 net::ProxyInfo info; |
| 669 int rv = service.ResolveProxy(url, &info); | 728 int rv = service.ResolveProxy(url, &info); |
| 670 EXPECT_EQ(rv, net::OK); | 729 EXPECT_EQ(rv, net::OK); |
| 671 EXPECT_FALSE(info.is_direct()); | 730 EXPECT_FALSE(info.is_direct()); |
| 672 | 731 |
| 673 // The first item is valid. | 732 // The first item is valid. |
| 674 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); | 733 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); |
| 675 | 734 |
| 676 // Fake a proxy error. | 735 // Fake a proxy error. |
| 677 rv = service.ReconsiderProxyAfterError(url, &info); | 736 rv = service.ReconsiderProxyAfterError(url, &info); |
| 678 EXPECT_EQ(rv, net::OK); | 737 EXPECT_EQ(rv, net::OK); |
| 679 | 738 |
| 680 // The first proxy is ignored, and the second one is selected. | 739 // The first proxy is ignored, and the second one is selected. |
| 681 EXPECT_FALSE(info.is_direct()); | 740 EXPECT_FALSE(info.is_direct()); |
| 682 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); | 741 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); |
| 683 | 742 |
| 684 // Fake a PAC failure. | 743 // Fake a PAC failure. |
| 685 net::ProxyInfo info2; | 744 net::ProxyInfo info2; |
| 686 resolver->fail_get_proxy_for_url = true; | 745 resolver->x->fail_get_proxy_for_url = true; |
| 687 rv = service.ResolveProxy(url, &info2); | 746 rv = service.ResolveProxy(url, &info2); |
| 688 EXPECT_EQ(rv, net::ERR_FAILED); | 747 EXPECT_EQ(rv, net::ERR_FAILED); |
| 689 | 748 |
| 690 // No proxy servers are returned. It's a direct connection. | 749 // No proxy servers are returned. It's a direct connection. |
| 691 EXPECT_TRUE(info2.is_direct()); | 750 EXPECT_TRUE(info2.is_direct()); |
| 692 | 751 |
| 693 // The PAC is now fixed and will return a proxy server. | 752 // The PAC is now fixed and will return a proxy server. |
| 694 // It should also clear the list of bad proxies. | 753 // It should also clear the list of bad proxies. |
| 695 resolver->fail_get_proxy_for_url = false; | 754 resolver->x->fail_get_proxy_for_url = false; |
| 696 | 755 |
| 697 // Try to resolve, it will still return "direct" because we have no reason | 756 // Try to resolve, it will still return "direct" because we have no reason |
| 698 // to check the config since everything works. | 757 // to check the config since everything works. |
| 699 net::ProxyInfo info3; | 758 net::ProxyInfo info3; |
| 700 rv = service.ResolveProxy(url, &info3); | 759 rv = service.ResolveProxy(url, &info3); |
| 701 EXPECT_EQ(rv, net::OK); | 760 EXPECT_EQ(rv, net::OK); |
| 702 EXPECT_TRUE(info3.is_direct()); | 761 EXPECT_TRUE(info3.is_direct()); |
| 703 | 762 |
| 704 // But if the direct connection fails, we check if the ProxyInfo tried to | 763 // But if the direct connection fails, we check if the ProxyInfo tried to |
| 705 // resolve the proxy before, and if not (like in this case), we give the | 764 // resolve the proxy before, and if not (like in this case), we give the |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 // Test cancellation of a queued request. | 1051 // Test cancellation of a queued request. |
| 993 TEST(ProxyServiceTest, CancelQueuedRequest) { | 1052 TEST(ProxyServiceTest, CancelQueuedRequest) { |
| 994 MockProxyConfigService* config_service = | 1053 MockProxyConfigService* config_service = |
| 995 new MockProxyConfigService("http://foopy/proxy.pac"); | 1054 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 996 | 1055 |
| 997 BlockableProxyResolver* resolver = new BlockableProxyResolver; | 1056 BlockableProxyResolver* resolver = new BlockableProxyResolver; |
| 998 | 1057 |
| 999 ProxyServiceWithFutures service(config_service, resolver); | 1058 ProxyServiceWithFutures service(config_service, resolver); |
| 1000 | 1059 |
| 1001 // Cause requests to pile up, by having them block in the PAC thread. | 1060 // Cause requests to pile up, by having them block in the PAC thread. |
| 1002 resolver->Block(); | 1061 resolver->x->Block(); |
| 1003 | 1062 |
| 1004 // Start 3 requests. | 1063 // Start 3 requests. |
| 1005 scoped_refptr<ResultFuture> result1; | 1064 scoped_refptr<ResultFuture> result1; |
| 1006 service.ResolveProxy(&result1, GURL("http://request1")); | 1065 service.ResolveProxy(&result1, GURL("http://request1")); |
| 1007 | 1066 |
| 1008 scoped_refptr<ResultFuture> result2; | 1067 scoped_refptr<ResultFuture> result2; |
| 1009 service.ResolveProxy(&result2, GURL("http://request2")); | 1068 service.ResolveProxy(&result2, GURL("http://request2")); |
| 1010 | 1069 |
| 1011 scoped_refptr<ResultFuture> result3; | 1070 scoped_refptr<ResultFuture> result3; |
| 1012 service.ResolveProxy(&result3, GURL("http://request3")); | 1071 service.ResolveProxy(&result3, GURL("http://request3")); |
| 1013 | 1072 |
| 1014 // Wait until the first request has become blocked in the PAC thread. | 1073 // Wait until the first request has become blocked in the PAC thread. |
| 1015 resolver->WaitUntilBlocked(); | 1074 resolver->x->WaitUntilBlocked(); |
| 1016 | 1075 |
| 1017 // Cancel the second request | 1076 // Cancel the second request |
| 1018 result2->Cancel(); | 1077 result2->Cancel(); |
| 1019 | 1078 |
| 1020 // Unblock the PAC thread. | 1079 // Unblock the PAC thread. |
| 1021 resolver->Unblock(); | 1080 resolver->x->Unblock(); |
| 1022 | 1081 |
| 1023 // Wait for the final request to complete. | 1082 // Wait for the final request to complete. |
| 1024 result3->WaitUntilCompleted(); | 1083 result3->WaitUntilCompleted(); |
| 1025 | 1084 |
| 1026 // Verify that requests ran as expected. | 1085 // Verify that requests ran as expected. |
| 1027 | 1086 |
| 1028 EXPECT_TRUE(result1->IsCompleted()); | 1087 EXPECT_TRUE(result1->IsCompleted()); |
| 1029 EXPECT_EQ(net::OK, result1->GetResultCode()); | 1088 EXPECT_EQ(net::OK, result1->GetResultCode()); |
| 1030 EXPECT_EQ("request1:80", result1->GetProxyInfo().proxy_server().ToURI()); | 1089 EXPECT_EQ("request1:80", result1->GetProxyInfo().proxy_server().ToURI()); |
| 1031 | 1090 |
| 1032 EXPECT_FALSE(result2->IsCompleted()); // Cancelled. | 1091 EXPECT_FALSE(result2->IsCompleted()); // Cancelled. |
| 1033 | 1092 |
| 1034 EXPECT_TRUE(result3->IsCompleted()); | 1093 EXPECT_TRUE(result3->IsCompleted()); |
| 1035 EXPECT_EQ(net::OK, result3->GetResultCode()); | 1094 EXPECT_EQ(net::OK, result3->GetResultCode()); |
| 1036 EXPECT_EQ("request3:80", result3->GetProxyInfo().proxy_server().ToURI()); | 1095 EXPECT_EQ("request3:80", result3->GetProxyInfo().proxy_server().ToURI()); |
| 1037 } | 1096 } |
| 1038 | 1097 |
| 1039 // Test cancellation of an in-progress request. | 1098 // Test cancellation of an in-progress request. |
| 1040 TEST(ProxyServiceTest, CancelInprogressRequest) { | 1099 TEST(ProxyServiceTest, CancelInprogressRequest) { |
| 1041 MockProxyConfigService* config_service = | 1100 MockProxyConfigService* config_service = |
| 1042 new MockProxyConfigService("http://foopy/proxy.pac"); | 1101 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 1043 | 1102 |
| 1044 BlockableProxyResolver* resolver = new BlockableProxyResolver; | 1103 BlockableProxyResolver* resolver = new BlockableProxyResolver; |
| 1045 | 1104 |
| 1046 ProxyServiceWithFutures service(config_service, resolver); | 1105 ProxyServiceWithFutures service(config_service, resolver); |
| 1047 | 1106 |
| 1048 // Cause requests to pile up, by having them block in the PAC thread. | 1107 // Cause requests to pile up, by having them block in the PAC thread. |
| 1049 resolver->Block(); | 1108 resolver->x->Block(); |
| 1050 | 1109 |
| 1051 // Start 3 requests. | 1110 // Start 3 requests. |
| 1052 scoped_refptr<ResultFuture> result1; | 1111 scoped_refptr<ResultFuture> result1; |
| 1053 service.ResolveProxy(&result1, GURL("http://request1")); | 1112 service.ResolveProxy(&result1, GURL("http://request1")); |
| 1054 | 1113 |
| 1055 scoped_refptr<ResultFuture> result2; | 1114 scoped_refptr<ResultFuture> result2; |
| 1056 service.ResolveProxy(&result2, GURL("http://request2")); | 1115 service.ResolveProxy(&result2, GURL("http://request2")); |
| 1057 | 1116 |
| 1058 scoped_refptr<ResultFuture> result3; | 1117 scoped_refptr<ResultFuture> result3; |
| 1059 service.ResolveProxy(&result3, GURL("http://request3")); | 1118 service.ResolveProxy(&result3, GURL("http://request3")); |
| 1060 | 1119 |
| 1061 // Wait until the first request has become blocked in the PAC thread. | 1120 // Wait until the first request has become blocked in the PAC thread. |
| 1062 resolver->WaitUntilBlocked(); | 1121 resolver->x->WaitUntilBlocked(); |
| 1063 | 1122 |
| 1064 // Cancel the first request | 1123 // Cancel the first request |
| 1065 result1->Cancel(); | 1124 result1->Cancel(); |
| 1066 | 1125 |
| 1067 // Unblock the PAC thread. | 1126 // Unblock the PAC thread. |
| 1068 resolver->Unblock(); | 1127 resolver->x->Unblock(); |
| 1069 | 1128 |
| 1070 // Wait for the final request to complete. | 1129 // Wait for the final request to complete. |
| 1071 result3->WaitUntilCompleted(); | 1130 result3->WaitUntilCompleted(); |
| 1072 | 1131 |
| 1073 // Verify that requests ran as expected. | 1132 // Verify that requests ran as expected. |
| 1074 | 1133 |
| 1075 EXPECT_FALSE(result1->IsCompleted()); // Cancelled. | 1134 EXPECT_FALSE(result1->IsCompleted()); // Cancelled. |
| 1076 | 1135 |
| 1077 EXPECT_TRUE(result2->IsCompleted()); | 1136 EXPECT_TRUE(result2->IsCompleted()); |
| 1078 EXPECT_EQ(net::OK, result2->GetResultCode()); | 1137 EXPECT_EQ(net::OK, result2->GetResultCode()); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1185 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); | 1244 EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI()); |
| 1186 | 1245 |
| 1187 net::ProxyConfig config2; | 1246 net::ProxyConfig config2; |
| 1188 config2.proxy_rules.ParseFromString("foopy2:8080"); | 1247 config2.proxy_rules.ParseFromString("foopy2:8080"); |
| 1189 config2.auto_detect = false; | 1248 config2.auto_detect = false; |
| 1190 int result = service->ResetConfigService(new MockProxyConfigService(config2)); | 1249 int result = service->ResetConfigService(new MockProxyConfigService(config2)); |
| 1191 DCHECK(result == 0); | 1250 DCHECK(result == 0); |
| 1192 service->ResolveProxy(GURL("http://request2"), &info); | 1251 service->ResolveProxy(GURL("http://request2"), &info); |
| 1193 EXPECT_EQ("foopy2:8080", info.proxy_server().ToURI()); | 1252 EXPECT_EQ("foopy2:8080", info.proxy_server().ToURI()); |
| 1194 } | 1253 } |
| OLD | NEW |