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 |