| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_service.h" | 5 #include "net/proxy/proxy_service.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 bool add_proxy_; | 200 bool add_proxy_; |
| 201 bool remove_proxy_; | 201 bool remove_proxy_; |
| 202 const ProxyService* proxy_service_; | 202 const ProxyService* proxy_service_; |
| 203 }; | 203 }; |
| 204 | 204 |
| 205 // A test network delegate that exercises the OnProxyFallback callback. | 205 // A test network delegate that exercises the OnProxyFallback callback. |
| 206 class TestProxyFallbackNetworkDelegate : public NetworkDelegate { | 206 class TestProxyFallbackNetworkDelegate : public NetworkDelegate { |
| 207 public: | 207 public: |
| 208 TestProxyFallbackNetworkDelegate() | 208 TestProxyFallbackNetworkDelegate() |
| 209 : on_proxy_fallback_called_(false), | 209 : on_proxy_fallback_called_(false), |
| 210 proxy_fallback_net_error_(0), | 210 proxy_fallback_net_error_(OK) { |
| 211 proxy_did_fallback_(false) { | |
| 212 } | 211 } |
| 213 | 212 |
| 214 virtual void OnProxyFallback( | 213 virtual void OnProxyFallback(const ProxyServer& proxy_server, |
| 215 const ProxyServer& proxy_server, | 214 int net_error) OVERRIDE { |
| 216 int net_error, | |
| 217 bool did_fallback) OVERRIDE { | |
| 218 proxy_server_ = proxy_server; | 215 proxy_server_ = proxy_server; |
| 219 proxy_fallback_net_error_ = net_error; | 216 proxy_fallback_net_error_ = net_error; |
| 220 proxy_did_fallback_ = did_fallback; | |
| 221 on_proxy_fallback_called_ = true; | 217 on_proxy_fallback_called_ = true; |
| 222 } | 218 } |
| 223 | 219 |
| 224 bool on_proxy_fallback_called() const { | 220 bool on_proxy_fallback_called() const { |
| 225 return on_proxy_fallback_called_; | 221 return on_proxy_fallback_called_; |
| 226 } | 222 } |
| 227 | 223 |
| 228 const ProxyServer& proxy_server() const { | 224 const ProxyServer& proxy_server() const { |
| 229 return proxy_server_; | 225 return proxy_server_; |
| 230 } | 226 } |
| 231 | 227 |
| 232 int proxy_fallback_net_error() const { | 228 int proxy_fallback_net_error() const { |
| 233 return proxy_fallback_net_error_; | 229 return proxy_fallback_net_error_; |
| 234 } | 230 } |
| 235 | 231 |
| 236 bool proxy_did_fallback() const { | |
| 237 return proxy_did_fallback_; | |
| 238 } | |
| 239 | |
| 240 private: | 232 private: |
| 241 bool on_proxy_fallback_called_; | 233 bool on_proxy_fallback_called_; |
| 242 ProxyServer proxy_server_; | 234 ProxyServer proxy_server_; |
| 243 int proxy_fallback_net_error_; | 235 int proxy_fallback_net_error_; |
| 244 bool proxy_did_fallback_; | |
| 245 }; | 236 }; |
| 246 | 237 |
| 247 } // namespace | 238 } // namespace |
| 248 | 239 |
| 249 TEST_F(ProxyServiceTest, Direct) { | 240 TEST_F(ProxyServiceTest, Direct) { |
| 250 MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver; | 241 MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver; |
| 251 ProxyService service(new MockProxyConfigService( | 242 ProxyService service(new MockProxyConfigService( |
| 252 ProxyConfig::CreateDirect()), resolver, NULL); | 243 ProxyConfig::CreateDirect()), resolver, NULL); |
| 253 | 244 |
| 254 GURL url("http://www.google.com/"); | 245 GURL url("http://www.google.com/"); |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 EXPECT_EQ("foopy:8080", info.proxy_server().ToURI()); | 498 EXPECT_EQ("foopy:8080", info.proxy_server().ToURI()); |
| 508 EXPECT_TRUE(info.did_use_pac_script()); | 499 EXPECT_TRUE(info.did_use_pac_script()); |
| 509 | 500 |
| 510 EXPECT_FALSE(info.proxy_resolve_start_time().is_null()); | 501 EXPECT_FALSE(info.proxy_resolve_start_time().is_null()); |
| 511 EXPECT_FALSE(info.proxy_resolve_end_time().is_null()); | 502 EXPECT_FALSE(info.proxy_resolve_end_time().is_null()); |
| 512 EXPECT_LE(info.proxy_resolve_start_time(), info.proxy_resolve_end_time()); | 503 EXPECT_LE(info.proxy_resolve_start_time(), info.proxy_resolve_end_time()); |
| 513 | 504 |
| 514 // Now, imagine that connecting to foopy:8080 fails: there is nothing | 505 // Now, imagine that connecting to foopy:8080 fails: there is nothing |
| 515 // left to fallback to, since our proxy list was NOT terminated by | 506 // left to fallback to, since our proxy list was NOT terminated by |
| 516 // DIRECT. | 507 // DIRECT. |
| 517 TestProxyFallbackNetworkDelegate network_delegate; | 508 NetworkDelegate network_delegate; |
| 518 TestCompletionCallback callback2; | 509 TestCompletionCallback callback2; |
| 519 ProxyServer expected_proxy_server = info.proxy_server(); | 510 ProxyServer expected_proxy_server = info.proxy_server(); |
| 520 rv = service.ReconsiderProxyAfterError( | 511 rv = service.ReconsiderProxyAfterError( |
| 521 url, net::LOAD_NORMAL, net::ERR_PROXY_CONNECTION_FAILED, | 512 url, net::LOAD_NORMAL, net::ERR_PROXY_CONNECTION_FAILED, |
| 522 &info, callback2.callback(), NULL, &network_delegate, BoundNetLog()); | 513 &info, callback2.callback(), NULL, &network_delegate, BoundNetLog()); |
| 523 // ReconsiderProxyAfterError returns error indicating nothing left. | 514 // ReconsiderProxyAfterError returns error indicating nothing left. |
| 524 EXPECT_EQ(ERR_FAILED, rv); | 515 EXPECT_EQ(ERR_FAILED, rv); |
| 525 EXPECT_TRUE(info.is_empty()); | 516 EXPECT_TRUE(info.is_empty()); |
| 526 EXPECT_TRUE(network_delegate.on_proxy_fallback_called()); | |
| 527 EXPECT_EQ(expected_proxy_server, network_delegate.proxy_server()); | |
| 528 EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, | |
| 529 network_delegate.proxy_fallback_net_error()); | |
| 530 EXPECT_FALSE(network_delegate.proxy_did_fallback()); | |
| 531 } | 517 } |
| 532 | 518 |
| 533 // Test that if the execution of the PAC script fails (i.e. javascript runtime | 519 // Test that if the execution of the PAC script fails (i.e. javascript runtime |
| 534 // error), and the PAC settings are non-mandatory, that we fall-back to direct. | 520 // error), and the PAC settings are non-mandatory, that we fall-back to direct. |
| 535 TEST_F(ProxyServiceTest, PAC_RuntimeError) { | 521 TEST_F(ProxyServiceTest, PAC_RuntimeError) { |
| 536 MockProxyConfigService* config_service = | 522 MockProxyConfigService* config_service = |
| 537 new MockProxyConfigService("http://foopy/proxy.pac"); | 523 new MockProxyConfigService("http://foopy/proxy.pac"); |
| 538 MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver; | 524 MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver; |
| 539 | 525 |
| 540 ProxyService service(config_service, resolver, NULL); | 526 ProxyService service(config_service, resolver, NULL); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 | 599 |
| 614 // Set the result in proxy resolver. | 600 // Set the result in proxy resolver. |
| 615 resolver->pending_requests()[0]->results()->UsePacString( | 601 resolver->pending_requests()[0]->results()->UsePacString( |
| 616 "DIRECT ; PROXY foobar:10 ; DIRECT ; PROXY foobar:20"); | 602 "DIRECT ; PROXY foobar:10 ; DIRECT ; PROXY foobar:20"); |
| 617 resolver->pending_requests()[0]->CompleteNow(OK); | 603 resolver->pending_requests()[0]->CompleteNow(OK); |
| 618 | 604 |
| 619 EXPECT_EQ(OK, callback1.WaitForResult()); | 605 EXPECT_EQ(OK, callback1.WaitForResult()); |
| 620 EXPECT_TRUE(info.is_direct()); | 606 EXPECT_TRUE(info.is_direct()); |
| 621 | 607 |
| 622 // Fallback 1. | 608 // Fallback 1. |
| 623 TestProxyFallbackNetworkDelegate network_delegate2; | |
| 624 TestCompletionCallback callback2; | 609 TestCompletionCallback callback2; |
| 625 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, | 610 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, |
| 626 net::ERR_PROXY_CONNECTION_FAILED, | 611 net::ERR_PROXY_CONNECTION_FAILED, |
| 627 &info, callback2.callback(), NULL, | 612 &info, callback2.callback(), NULL, |
| 628 NULL, BoundNetLog()); | 613 NULL, BoundNetLog()); |
| 629 EXPECT_EQ(OK, rv); | 614 EXPECT_EQ(OK, rv); |
| 630 EXPECT_FALSE(info.is_direct()); | 615 EXPECT_FALSE(info.is_direct()); |
| 631 EXPECT_EQ("foobar:10", info.proxy_server().ToURI()); | 616 EXPECT_EQ("foobar:10", info.proxy_server().ToURI()); |
| 632 // No network delegate provided. | |
| 633 EXPECT_FALSE(network_delegate2.on_proxy_fallback_called()); | |
| 634 | 617 |
| 635 // Fallback 2. | 618 // Fallback 2. |
| 636 TestProxyFallbackNetworkDelegate network_delegate3; | 619 NetworkDelegate network_delegate; |
| 637 ProxyServer expected_proxy_server3 = info.proxy_server(); | 620 ProxyServer expected_proxy_server3 = info.proxy_server(); |
| 638 TestCompletionCallback callback3; | 621 TestCompletionCallback callback3; |
| 639 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, | 622 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, |
| 640 net::ERR_PROXY_CONNECTION_FAILED, | 623 net::ERR_PROXY_CONNECTION_FAILED, |
| 641 &info, callback3.callback(), NULL, | 624 &info, callback3.callback(), NULL, |
| 642 &network_delegate3, BoundNetLog()); | 625 &network_delegate, BoundNetLog()); |
| 643 EXPECT_EQ(OK, rv); | 626 EXPECT_EQ(OK, rv); |
| 644 EXPECT_TRUE(info.is_direct()); | 627 EXPECT_TRUE(info.is_direct()); |
| 645 EXPECT_TRUE(network_delegate3.on_proxy_fallback_called()); | |
| 646 EXPECT_EQ(expected_proxy_server3, network_delegate3.proxy_server()); | |
| 647 EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, | |
| 648 network_delegate3.proxy_fallback_net_error()); | |
| 649 EXPECT_TRUE(network_delegate3.proxy_did_fallback()); | |
| 650 | 628 |
| 651 // Fallback 3. | 629 // Fallback 3. |
| 652 TestProxyFallbackNetworkDelegate network_delegate4; | |
| 653 ProxyServer expected_proxy_server4 = info.proxy_server(); | 630 ProxyServer expected_proxy_server4 = info.proxy_server(); |
| 654 TestCompletionCallback callback4; | 631 TestCompletionCallback callback4; |
| 655 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, | 632 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, |
| 656 net::ERR_PROXY_CONNECTION_FAILED, | 633 net::ERR_PROXY_CONNECTION_FAILED, |
| 657 &info, callback4.callback(), NULL, | 634 &info, callback4.callback(), NULL, |
| 658 &network_delegate4, BoundNetLog()); | 635 &network_delegate, BoundNetLog()); |
| 659 EXPECT_EQ(OK, rv); | 636 EXPECT_EQ(OK, rv); |
| 660 EXPECT_FALSE(info.is_direct()); | 637 EXPECT_FALSE(info.is_direct()); |
| 661 EXPECT_EQ("foobar:20", info.proxy_server().ToURI()); | 638 EXPECT_EQ("foobar:20", info.proxy_server().ToURI()); |
| 662 EXPECT_TRUE(network_delegate4.on_proxy_fallback_called()); | |
| 663 EXPECT_EQ(expected_proxy_server4, network_delegate4.proxy_server()); | |
| 664 EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, | |
| 665 network_delegate4.proxy_fallback_net_error()); | |
| 666 EXPECT_TRUE(network_delegate4.proxy_did_fallback()); | |
| 667 | 639 |
| 668 // Fallback 4 -- Nothing to fall back to! | 640 // Fallback 4 -- Nothing to fall back to! |
| 669 TestProxyFallbackNetworkDelegate network_delegate5; | |
| 670 ProxyServer expected_proxy_server5 = info.proxy_server(); | 641 ProxyServer expected_proxy_server5 = info.proxy_server(); |
| 671 TestCompletionCallback callback5; | 642 TestCompletionCallback callback5; |
| 672 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, | 643 rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL, |
| 673 net::ERR_PROXY_CONNECTION_FAILED, | 644 net::ERR_PROXY_CONNECTION_FAILED, |
| 674 &info, callback5.callback(), NULL, | 645 &info, callback5.callback(), NULL, |
| 675 &network_delegate5, BoundNetLog()); | 646 &network_delegate, BoundNetLog()); |
| 676 EXPECT_EQ(ERR_FAILED, rv); | 647 EXPECT_EQ(ERR_FAILED, rv); |
| 677 EXPECT_TRUE(info.is_empty()); | 648 EXPECT_TRUE(info.is_empty()); |
| 678 EXPECT_TRUE(network_delegate5.on_proxy_fallback_called()); | |
| 679 EXPECT_EQ(expected_proxy_server5, network_delegate5.proxy_server()); | |
| 680 EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, | |
| 681 network_delegate5.proxy_fallback_net_error()); | |
| 682 EXPECT_FALSE(network_delegate5.proxy_did_fallback()); | |
| 683 } | 649 } |
| 684 | 650 |
| 685 TEST_F(ProxyServiceTest, PAC_ConfigSourcePropagates) { | 651 TEST_F(ProxyServiceTest, PAC_ConfigSourcePropagates) { |
| 686 // Test whether the ProxyConfigSource set by the ProxyConfigService is applied | 652 // Test whether the ProxyConfigSource set by the ProxyConfigService is applied |
| 687 // to ProxyInfo after the proxy is resolved via a PAC script. | 653 // to ProxyInfo after the proxy is resolved via a PAC script. |
| 688 ProxyConfig config = | 654 ProxyConfig config = |
| 689 ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac")); | 655 ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac")); |
| 690 config.set_source(PROXY_CONFIG_SOURCE_TEST); | 656 config.set_source(PROXY_CONFIG_SOURCE_TEST); |
| 691 | 657 |
| 692 MockProxyConfigService* config_service = new MockProxyConfigService(config); | 658 MockProxyConfigService* config_service = new MockProxyConfigService(config); |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 EXPECT_EQ(OK, rv); | 953 EXPECT_EQ(OK, rv); |
| 988 | 954 |
| 989 // Proxy times should not have been modified by fallback. | 955 // Proxy times should not have been modified by fallback. |
| 990 EXPECT_EQ(proxy_resolve_start_time, info.proxy_resolve_start_time()); | 956 EXPECT_EQ(proxy_resolve_start_time, info.proxy_resolve_start_time()); |
| 991 EXPECT_EQ(proxy_resolve_end_time, info.proxy_resolve_end_time()); | 957 EXPECT_EQ(proxy_resolve_end_time, info.proxy_resolve_end_time()); |
| 992 | 958 |
| 993 // The second proxy should be specified. | 959 // The second proxy should be specified. |
| 994 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); | 960 EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI()); |
| 995 // Report back that the second proxy worked. This will globally mark the | 961 // Report back that the second proxy worked. This will globally mark the |
| 996 // first proxy as bad. | 962 // first proxy as bad. |
| 997 service.ReportSuccess(info); | 963 TestProxyFallbackNetworkDelegate test_delegate; |
| 964 service.ReportSuccess(info, &test_delegate); |
| 965 EXPECT_EQ(info.proxy_server(), test_delegate.proxy_server()); |
| 966 EXPECT_EQ(net::ERR_PROXY_CONNECTION_FAILED, |
| 967 test_delegate.proxy_fallback_net_error()); |
| 998 | 968 |
| 999 TestCompletionCallback callback3; | 969 TestCompletionCallback callback3; |
| 1000 rv = service.ResolveProxy( | 970 rv = service.ResolveProxy( |
| 1001 url, net::LOAD_NORMAL, &info, callback3.callback(), NULL, NULL, | 971 url, net::LOAD_NORMAL, &info, callback3.callback(), NULL, NULL, |
| 1002 BoundNetLog()); | 972 BoundNetLog()); |
| 1003 EXPECT_EQ(ERR_IO_PENDING, rv); | 973 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1004 | 974 |
| 1005 ASSERT_EQ(1u, resolver->pending_requests().size()); | 975 ASSERT_EQ(1u, resolver->pending_requests().size()); |
| 1006 EXPECT_EQ(url, resolver->pending_requests()[0]->url()); | 976 EXPECT_EQ(url, resolver->pending_requests()[0]->url()); |
| 1007 | 977 |
| (...skipping 2097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3105 ProxyInfo info3; | 3075 ProxyInfo info3; |
| 3106 TestCompletionCallback callback3; | 3076 TestCompletionCallback callback3; |
| 3107 rv = service.ResolveProxy( | 3077 rv = service.ResolveProxy( |
| 3108 GURL("http://request3"), net::LOAD_NORMAL, &info3, callback3.callback(), | 3078 GURL("http://request3"), net::LOAD_NORMAL, &info3, callback3.callback(), |
| 3109 NULL, NULL, BoundNetLog()); | 3079 NULL, NULL, BoundNetLog()); |
| 3110 EXPECT_EQ(OK, rv); | 3080 EXPECT_EQ(OK, rv); |
| 3111 EXPECT_TRUE(info3.is_direct()); | 3081 EXPECT_TRUE(info3.is_direct()); |
| 3112 } | 3082 } |
| 3113 | 3083 |
| 3114 } // namespace net | 3084 } // namespace net |
| OLD | NEW |