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