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

Unified Diff: net/proxy/proxy_service_unittest.cc

Issue 9078003: Poll PAC scripts for content changes. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: fix dcheck reached on bot Created 8 years, 12 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/proxy/proxy_service.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/proxy/proxy_service_unittest.cc
diff --git a/net/proxy/proxy_service_unittest.cc b/net/proxy/proxy_service_unittest.cc
index 271dfc4476323e8dc99c5aa453ae757bde0f45f5..a7d0ca06d60ff1696cf4818fb9785eb872e1181a 100644
--- a/net/proxy/proxy_service_unittest.cc
+++ b/net/proxy/proxy_service_unittest.cc
@@ -28,6 +28,38 @@
namespace net {
namespace {
+// This test fixture is used to partially disable the background polling done by
+// the ProxyService (which it uses to detect whenever its PAC script contents or
+// WPAD results have changed).
+//
+// We disable the feature by setting the poll interval to something really
+// large, so it will never actually be reached even on the slowest bots that run
+// these tests.
+//
+// We disable the polling in order to avoid any timing dependencies in the
+// tests. If the bot were to run the tests very slowly and we hadn't disabled
+// polling, then it might start a background re-try in the middle of our test
+// and confuse our expectations leading to flaky failures.
+//
+// The tests which verify the polling code re-enable the polling behavior but
+// are careful to avoid timing problems.
+class ProxyServiceTest : public testing::Test {
+ protected:
+ virtual void SetUp() OVERRIDE {
+ testing::Test::SetUp();
+ previous_policy_ = ProxyService::set_pac_script_poll_policy(
+ ProxyService::POLL_POLICY_NEVER);
+ }
+
+ virtual void TearDown() OVERRIDE {
+ // Restore the original policy.
+ ProxyService::set_pac_script_poll_policy(previous_policy_);
+ testing::Test::TearDown();
+ }
+
+ ProxyService::PollPolicy previous_policy_;
+};
+
const char kValidPacScript1[] = "pac-script-v1-FindProxyForURL";
const char kValidPacScript2[] = "pac-script-v2-FindProxyForURL";
@@ -73,7 +105,7 @@ class MockProxyConfigService: public ProxyConfigService {
} // namespace
-TEST(ProxyServiceTest, Direct) {
+TEST_F(ProxyServiceTest, Direct) {
MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
ProxyService service(new MockProxyConfigService(
ProxyConfig::CreateDirect()), resolver, NULL);
@@ -104,7 +136,7 @@ TEST(ProxyServiceTest, Direct) {
entries, 2, NetLog::TYPE_PROXY_SERVICE));
}
-TEST(ProxyServiceTest, PAC) {
+TEST_F(ProxyServiceTest, PAC) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -154,7 +186,7 @@ TEST(ProxyServiceTest, PAC) {
// Test that the proxy resolver does not see the URL's username/password
// or its reference section.
-TEST(ProxyServiceTest, PAC_NoIdentityOrHash) {
+TEST_F(ProxyServiceTest, PAC_NoIdentityOrHash) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -183,7 +215,7 @@ TEST(ProxyServiceTest, PAC_NoIdentityOrHash) {
// ProxyService will cancel the outstanding request.
}
-TEST(ProxyServiceTest, PAC_FailoverWithoutDirect) {
+TEST_F(ProxyServiceTest, PAC_FailoverWithoutDirect) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
@@ -241,7 +273,7 @@ TEST(ProxyServiceTest, PAC_FailoverWithoutDirect) {
//
// The important check of this test is to make sure that DIRECT is not somehow
// cached as being a bad proxy.
-TEST(ProxyServiceTest, PAC_FailoverAfterDirect) {
+TEST_F(ProxyServiceTest, PAC_FailoverAfterDirect) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
@@ -302,7 +334,7 @@ TEST(ProxyServiceTest, PAC_FailoverAfterDirect) {
EXPECT_TRUE(info.is_empty());
}
-TEST(ProxyServiceTest, ProxyResolverFails) {
+TEST_F(ProxyServiceTest, ProxyResolverFails) {
// Test what happens when the ProxyResolver fails. The download and setting
// of the PAC script have already succeeded, so this corresponds with a
// javascript runtime error while calling FindProxyForURL().
@@ -357,7 +389,7 @@ TEST(ProxyServiceTest, ProxyResolverFails) {
EXPECT_EQ("foopy_valid:8080", info.proxy_server().ToURI());
}
-TEST(ProxyServiceTest, ProxyScriptFetcherFailsDownloadingMandatoryPac) {
+TEST_F(ProxyServiceTest, ProxyScriptFetcherFailsDownloadingMandatoryPac) {
// Test what happens when the ProxyScriptResolver fails to download a
// mandatory PAC script.
@@ -400,7 +432,7 @@ TEST(ProxyServiceTest, ProxyScriptFetcherFailsDownloadingMandatoryPac) {
EXPECT_FALSE(info.is_direct());
}
-TEST(ProxyServiceTest, ProxyResolverFailsParsingJavaScriptMandatoryPac) {
+TEST_F(ProxyServiceTest, ProxyResolverFailsParsingJavaScriptMandatoryPac) {
// Test what happens when the ProxyResolver fails that is configured to use a
// mandatory PAC script. The download of the PAC script has already
// succeeded but the PAC script contains no valid javascript.
@@ -447,7 +479,7 @@ TEST(ProxyServiceTest, ProxyResolverFailsParsingJavaScriptMandatoryPac) {
EXPECT_FALSE(info.is_direct());
}
-TEST(ProxyServiceTest, ProxyResolverFailsInJavaScriptMandatoryPac) {
+TEST_F(ProxyServiceTest, ProxyResolverFailsInJavaScriptMandatoryPac) {
// Test what happens when the ProxyResolver fails that is configured to use a
// mandatory PAC script. The download and setting of the PAC script have
// already succeeded, so this corresponds with a javascript runtime error
@@ -507,7 +539,7 @@ TEST(ProxyServiceTest, ProxyResolverFailsInJavaScriptMandatoryPac) {
EXPECT_EQ("foopy_valid:8080", info.proxy_server().ToURI());
}
-TEST(ProxyServiceTest, ProxyFallback) {
+TEST_F(ProxyServiceTest, ProxyFallback) {
// Test what happens when we specify multiple proxy servers and some of them
// are bad.
@@ -624,7 +656,7 @@ TEST(ProxyServiceTest, ProxyFallback) {
// This test is similar to ProxyFallback, but this time we have an explicit
// fallback choice to DIRECT.
-TEST(ProxyServiceTest, ProxyFallbackToDirect) {
+TEST_F(ProxyServiceTest, ProxyFallbackToDirect) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -685,7 +717,7 @@ TEST(ProxyServiceTest, ProxyFallbackToDirect) {
EXPECT_EQ(ERR_FAILED, rv);
}
-TEST(ProxyServiceTest, ProxyFallback_NewSettings) {
+TEST_F(ProxyServiceTest, ProxyFallback_NewSettings) {
// Test proxy failover when new settings are available.
MockProxyConfigService* config_service =
@@ -778,7 +810,7 @@ TEST(ProxyServiceTest, ProxyFallback_NewSettings) {
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
}
-TEST(ProxyServiceTest, ProxyFallback_BadConfig) {
+TEST_F(ProxyServiceTest, ProxyFallback_BadConfig) {
// Test proxy failover when the configuration is bad.
MockProxyConfigService* config_service =
@@ -864,7 +896,7 @@ TEST(ProxyServiceTest, ProxyFallback_BadConfig) {
EXPECT_EQ("foopy1:8080", info3.proxy_server().ToURI());
}
-TEST(ProxyServiceTest, ProxyFallback_BadConfigMandatory) {
+TEST_F(ProxyServiceTest, ProxyFallback_BadConfigMandatory) {
// Test proxy failover when the configuration is bad.
ProxyConfig config(
@@ -954,7 +986,7 @@ TEST(ProxyServiceTest, ProxyFallback_BadConfigMandatory) {
EXPECT_EQ("foopy1:8080", info3.proxy_server().ToURI());
}
-TEST(ProxyServiceTest, ProxyBypassList) {
+TEST_F(ProxyServiceTest, ProxyBypassList) {
// Test that the proxy bypass rules are consulted.
TestCompletionCallback callback[2];
@@ -985,7 +1017,7 @@ TEST(ProxyServiceTest, ProxyBypassList) {
}
-TEST(ProxyServiceTest, PerProtocolProxyTests) {
+TEST_F(ProxyServiceTest, PerProtocolProxyTests) {
ProxyConfig config;
config.proxy_rules().ParseFromString("http=foopy1:8080;https=foopy2:8080");
config.set_auto_detect(false);
@@ -1042,7 +1074,7 @@ TEST(ProxyServiceTest, PerProtocolProxyTests) {
// If only HTTP and a SOCKS proxy are specified, check if ftp/https queries
// fall back to the SOCKS proxy.
-TEST(ProxyServiceTest, DefaultProxyFallbackToSOCKS) {
+TEST_F(ProxyServiceTest, DefaultProxyFallbackToSOCKS) {
ProxyConfig config;
config.proxy_rules().ParseFromString("http=foopy1:8080;socks=foopy2:1080");
config.set_auto_detect(false);
@@ -1100,7 +1132,7 @@ TEST(ProxyServiceTest, DefaultProxyFallbackToSOCKS) {
}
// Test cancellation of an in-progress request.
-TEST(ProxyServiceTest, CancelInProgressRequest) {
+TEST_F(ProxyServiceTest, CancelInProgressRequest) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -1173,7 +1205,7 @@ TEST(ProxyServiceTest, CancelInProgressRequest) {
}
// Test the initial PAC download for resolver that expects bytes.
-TEST(ProxyServiceTest, InitialPACScriptDownload) {
+TEST_F(ProxyServiceTest, InitialPACScriptDownload) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -1253,7 +1285,7 @@ TEST(ProxyServiceTest, InitialPACScriptDownload) {
}
// Test changing the ProxyScriptFetcher while PAC download is in progress.
-TEST(ProxyServiceTest, ChangeScriptFetcherWhilePACDownloadInProgress) {
+TEST_F(ProxyServiceTest, ChangeScriptFetcherWhilePACDownloadInProgress) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -1312,7 +1344,7 @@ TEST(ProxyServiceTest, ChangeScriptFetcherWhilePACDownloadInProgress) {
}
// Test cancellation of a request, while the PAC script is being fetched.
-TEST(ProxyServiceTest, CancelWhilePACFetching) {
+TEST_F(ProxyServiceTest, CancelWhilePACFetching) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -1402,7 +1434,7 @@ TEST(ProxyServiceTest, CancelWhilePACFetching) {
}
// Test that if auto-detect fails, we fall-back to the custom pac.
-TEST(ProxyServiceTest, FallbackFromAutodetectToCustomPac) {
+TEST_F(ProxyServiceTest, FallbackFromAutodetectToCustomPac) {
ProxyConfig config;
config.set_auto_detect(true);
config.set_pac_url(GURL("http://foopy/proxy.pac"));
@@ -1473,7 +1505,7 @@ TEST(ProxyServiceTest, FallbackFromAutodetectToCustomPac) {
// This is the same test as FallbackFromAutodetectToCustomPac, except
// the auto-detect script fails parsing rather than downloading.
-TEST(ProxyServiceTest, FallbackFromAutodetectToCustomPac2) {
+TEST_F(ProxyServiceTest, FallbackFromAutodetectToCustomPac2) {
ProxyConfig config;
config.set_auto_detect(true);
config.set_pac_url(GURL("http://foopy/proxy.pac"));
@@ -1546,7 +1578,7 @@ TEST(ProxyServiceTest, FallbackFromAutodetectToCustomPac2) {
// Test that if all of auto-detect, a custom PAC script, and manual settings
// are given, then we will try them in that order.
-TEST(ProxyServiceTest, FallbackFromAutodetectToCustomToManual) {
+TEST_F(ProxyServiceTest, FallbackFromAutodetectToCustomToManual) {
ProxyConfig config;
config.set_auto_detect(true);
config.set_pac_url(GURL("http://foopy/proxy.pac"));
@@ -1603,7 +1635,7 @@ TEST(ProxyServiceTest, FallbackFromAutodetectToCustomToManual) {
}
// Test that the bypass rules are NOT applied when using autodetect.
-TEST(ProxyServiceTest, BypassDoesntApplyToPac) {
+TEST_F(ProxyServiceTest, BypassDoesntApplyToPac) {
ProxyConfig config;
config.set_auto_detect(true);
config.set_pac_url(GURL("http://foopy/proxy.pac"));
@@ -1624,7 +1656,8 @@ TEST(ProxyServiceTest, BypassDoesntApplyToPac) {
ProxyInfo info1;
TestCompletionCallback callback1;
int rv = service.ResolveProxy(
- GURL("http://www.google.com"), &info1, callback1.callback(), NULL, BoundNetLog());
+ GURL("http://www.google.com"), &info1, callback1.callback(), NULL,
+ BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
// Check that nothing has been sent to the proxy resolver yet.
@@ -1674,7 +1707,7 @@ TEST(ProxyServiceTest, BypassDoesntApplyToPac) {
// request to the script fetcher. When run under valgrind, should not
// have any memory errors (used to be that the ProxyScriptFetcher was
// being deleted prior to the InitProxyResolver).
-TEST(ProxyServiceTest, DeleteWhileInitProxyResolverHasOutstandingFetch) {
+TEST_F(ProxyServiceTest, DeleteWhileInitProxyResolverHasOutstandingFetch) {
ProxyConfig config =
ProxyConfig::CreateFromCustomPacURL(GURL("http://foopy/proxy.pac"));
@@ -1708,7 +1741,7 @@ TEST(ProxyServiceTest, DeleteWhileInitProxyResolverHasOutstandingFetch) {
// request to the proxy resolver. When run under valgrind, should not
// have any memory errors (used to be that the ProxyResolver was
// being deleted prior to the InitProxyResolver).
-TEST(ProxyServiceTest, DeleteWhileInitProxyResolverHasOutstandingSet) {
+TEST_F(ProxyServiceTest, DeleteWhileInitProxyResolverHasOutstandingSet) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -1728,7 +1761,7 @@ TEST(ProxyServiceTest, DeleteWhileInitProxyResolverHasOutstandingSet) {
resolver->pending_set_pac_script_request()->script_data()->url());
}
-TEST(ProxyServiceTest, ResetProxyConfigService) {
+TEST_F(ProxyServiceTest, ResetProxyConfigService) {
ProxyConfig config1;
config1.proxy_rules().ParseFromString("foopy1:8080");
config1.set_auto_detect(false);
@@ -1756,7 +1789,7 @@ TEST(ProxyServiceTest, ResetProxyConfigService) {
// Test that when going from a configuration that required PAC to one
// that does NOT, we unset the variable |should_use_proxy_resolver_|.
-TEST(ProxyServiceTest, UpdateConfigFromPACToDirect) {
+TEST_F(ProxyServiceTest, UpdateConfigFromPACToDirect) {
ProxyConfig config = ProxyConfig::CreateAutoDetect();
MockProxyConfigService* config_service = new MockProxyConfigService(config);
@@ -1805,7 +1838,7 @@ TEST(ProxyServiceTest, UpdateConfigFromPACToDirect) {
EXPECT_TRUE(info2.is_direct());
}
-TEST(ProxyServiceTest, NetworkChangeTriggersPacRefetch) {
+TEST_F(ProxyServiceTest, NetworkChangeTriggersPacRefetch) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -1916,4 +1949,426 @@ TEST(ProxyServiceTest, NetworkChangeTriggersPacRefetch) {
EXPECT_NE(NetLog::TYPE_PROXY_CONFIG_CHANGED, entries[i].type);
}
+// This test verifies that the PAC script specified by the settings is
+// periodically polled for changes. Specifically, if the initial fetch fails due
+// to a network error, we will eventually re-configure the service to use the
+// script once it becomes available.
+TEST_F(ProxyServiceTest, PACScriptRefetchAfterFailure) {
+ // Change the retry policy to wait a mere 1 ms before retrying, so the test
+ // runs quickly.
+ ProxyService::set_pac_script_poll_policy(
+ ProxyService::POLL_POLICY_IMMEDIATE);
+
+ MockProxyConfigService* config_service =
+ new MockProxyConfigService("http://foopy/proxy.pac");
+
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+
+ CapturingNetLog log(CapturingNetLog::kUnbounded);
+
+ ProxyService service(config_service, resolver, &log);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetchers(fetcher,
+ new DoNothingDhcpProxyScriptFetcher());
+
+ // Start 1 request.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, callback1.callback(),
+ NULL, BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // The first request should have triggered initial download of PAC script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+
+ // Nothing has been sent to the resolver yet.
+ EXPECT_TRUE(resolver->pending_requests().empty());
+
+ // At this point the ProxyService should be waiting for the
+ // ProxyScriptFetcher to invoke its completion callback, notifying it of
+ // PAC script download completion.
+ //
+ // We simulate a failed download attempt, the proxy service should now
+ // fall-back to DIRECT connections.
+ fetcher->NotifyFetchCompletion(ERR_FAILED, "");
+
+ ASSERT_TRUE(resolver->pending_requests().empty());
+
+ // Wait for completion callback, and verify it used DIRECT.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_TRUE(info1.is_direct());
+
+ // At this point we have initialized the proxy service using a PAC script,
+ // however it failed and fell-back to DIRECT.
+ //
+ // A background task to periodically re-check the PAC script for validity will
+ // have been started. We will now wait for the next download attempt to start.
+ //
+ // Note that we shouldn't have to wait long here, since our test enables a
+ // special unit-test mode.
+ fetcher->WaitUntilFetch();
+
+ ASSERT_TRUE(resolver->pending_requests().empty());
+
+ // Make sure that our background checker is trying to download the expected
+ // PAC script (same one as before). This time we will simulate a successful
+ // download of the script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+
+ MessageLoop::current()->RunAllPending();
+
+ // Now that the PAC script is downloaded, it should be used to initialize the
+ // ProxyResolver. Simulate a successful parse.
+ EXPECT_EQ(ASCIIToUTF16(kValidPacScript1),
+ resolver->pending_set_pac_script_request()->script_data()->utf16());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ // At this point the ProxyService should have re-configured itself to use the
+ // PAC script (thereby recovering from the initial fetch failure). We will
+ // verify that the next Resolve request uses the resolver rather than
+ // DIRECT.
+
+ // Start a second request.
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, callback2.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that it was sent to the resolver.
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[0]->url());
+
+ // Complete the pending second request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Wait for completion callback, and verify that the request ran as expected.
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+}
+
+// This test verifies that the PAC script specified by the settings is
+// periodically polled for changes. Specifically, if the initial fetch succeeds,
+// however at a later time its *contents* change, we will eventually
+// re-configure the service to use the new script.
+TEST_F(ProxyServiceTest, PACScriptRefetchAfterContentChange) {
+ // Change the retry policy to wait a mere 1 ms before retrying, so the test
+ // runs quickly.
+ ProxyService::set_pac_script_poll_policy(
+ ProxyService::POLL_POLICY_IMMEDIATE);
+
+ MockProxyConfigService* config_service =
+ new MockProxyConfigService("http://foopy/proxy.pac");
+
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+
+ CapturingNetLog log(CapturingNetLog::kUnbounded);
+
+ ProxyService service(config_service, resolver, &log);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetchers(fetcher,
+ new DoNothingDhcpProxyScriptFetcher());
+
+ // Start 1 request.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, callback1.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // The first request should have triggered initial download of PAC script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+
+ // Nothing has been sent to the resolver yet.
+ EXPECT_TRUE(resolver->pending_requests().empty());
+
+ // At this point the ProxyService should be waiting for the
+ // ProxyScriptFetcher to invoke its completion callback, notifying it of
+ // PAC script download completion.
+ fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+
+ // Now that the PAC script is downloaded, the request will have been sent to
+ // the proxy resolver.
+ EXPECT_EQ(ASCIIToUTF16(kValidPacScript1),
+ resolver->pending_set_pac_script_request()->script_data()->utf16());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
+
+ // Complete the pending request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Wait for completion callback, and verify that the request ran as expected.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ // At this point we have initialized the proxy service using a PAC script.
+ //
+ // A background task to periodically re-check the PAC script for validity will
+ // have been started. We will now wait for the next download attempt to start.
+ //
+ // Note that we shouldn't have to wait long here, since our test enables a
+ // special unit-test mode.
+ fetcher->WaitUntilFetch();
+
+ ASSERT_TRUE(resolver->pending_requests().empty());
+
+ // Make sure that our background checker is trying to download the expected
+ // PAC script (same one as before). This time we will simulate a successful
+ // download of a DIFFERENT script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, kValidPacScript2);
+
+ MessageLoop::current()->RunAllPending();
+
+ // Now that the PAC script is downloaded, it should be used to initialize the
+ // ProxyResolver. Simulate a successful parse.
+ EXPECT_EQ(ASCIIToUTF16(kValidPacScript2),
+ resolver->pending_set_pac_script_request()->script_data()->utf16());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ // At this point the ProxyService should have re-configured itself to use the
+ // new PAC script.
+
+ // Start a second request.
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, callback2.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that it was sent to the resolver.
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[0]->url());
+
+ // Complete the pending second request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Wait for completion callback, and verify that the request ran as expected.
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+}
+
+// This test verifies that the PAC script specified by the settings is
+// periodically polled for changes. Specifically, if the initial fetch succeeds
+// and so does the next poll, however the contents of the downloaded script
+// have NOT changed, then we do not bother to re-initialize the proxy resolver.
+TEST_F(ProxyServiceTest, PACScriptRefetchAfterContentUnchanged) {
+ // Change the retry policy to wait a mere 1 ms before retrying, so the test
+ // runs quickly.
+ ProxyService::set_pac_script_poll_policy(
+ ProxyService::POLL_POLICY_IMMEDIATE);
+
+ MockProxyConfigService* config_service =
+ new MockProxyConfigService("http://foopy/proxy.pac");
+
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+
+ CapturingNetLog log(CapturingNetLog::kUnbounded);
+
+ ProxyService service(config_service, resolver, &log);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetchers(fetcher,
+ new DoNothingDhcpProxyScriptFetcher());
+
+ // Start 1 request.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, callback1.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // The first request should have triggered initial download of PAC script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+
+ // Nothing has been sent to the resolver yet.
+ EXPECT_TRUE(resolver->pending_requests().empty());
+
+ // At this point the ProxyService should be waiting for the
+ // ProxyScriptFetcher to invoke its completion callback, notifying it of
+ // PAC script download completion.
+ fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+
+ // Now that the PAC script is downloaded, the request will have been sent to
+ // the proxy resolver.
+ EXPECT_EQ(ASCIIToUTF16(kValidPacScript1),
+ resolver->pending_set_pac_script_request()->script_data()->utf16());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
+
+ // Complete the pending request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Wait for completion callback, and verify that the request ran as expected.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ // At this point we have initialized the proxy service using a PAC script.
+ //
+ // A background task to periodically re-check the PAC script for validity will
+ // have been started. We will now wait for the next download attempt to start.
+ //
+ // Note that we shouldn't have to wait long here, since our test enables a
+ // special unit-test mode.
+ fetcher->WaitUntilFetch();
+
+ ASSERT_TRUE(resolver->pending_requests().empty());
+
+ // Make sure that our background checker is trying to download the expected
+ // PAC script (same one as before). We will simulate the same response as
+ // last time (i.e. the script is unchanged).
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+
+ MessageLoop::current()->RunAllPending();
+
+ ASSERT_FALSE(resolver->has_pending_set_pac_script_request());
+
+ // At this point the ProxyService is still running the same PAC script as
+ // before.
+
+ // Start a second request.
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, callback2.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that it was sent to the resolver.
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[0]->url());
+
+ // Complete the pending second request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Wait for completion callback, and verify that the request ran as expected.
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+}
+
+// This test verifies that the PAC script specified by the settings is
+// periodically polled for changes. Specifically, if the initial fetch succeeds,
+// however at a later time it starts to fail, we should re-configure the
+// ProxyService to stop using that PAC script.
+TEST_F(ProxyServiceTest, PACScriptRefetchAfterSuccess) {
+ // Change the retry policy to wait a mere 1 ms before retrying, so the test
+ // runs quickly.
+ ProxyService::set_pac_script_poll_policy(
+ ProxyService::POLL_POLICY_IMMEDIATE);
+
+ MockProxyConfigService* config_service =
+ new MockProxyConfigService("http://foopy/proxy.pac");
+
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+
+ CapturingNetLog log(CapturingNetLog::kUnbounded);
+
+ ProxyService service(config_service, resolver, &log);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetchers(fetcher,
+ new DoNothingDhcpProxyScriptFetcher());
+
+ // Start 1 request.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, callback1.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // The first request should have triggered initial download of PAC script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+
+ // Nothing has been sent to the resolver yet.
+ EXPECT_TRUE(resolver->pending_requests().empty());
+
+ // At this point the ProxyService should be waiting for the
+ // ProxyScriptFetcher to invoke its completion callback, notifying it of
+ // PAC script download completion.
+ fetcher->NotifyFetchCompletion(OK, kValidPacScript1);
+
+ // Now that the PAC script is downloaded, the request will have been sent to
+ // the proxy resolver.
+ EXPECT_EQ(ASCIIToUTF16(kValidPacScript1),
+ resolver->pending_set_pac_script_request()->script_data()->utf16());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
+
+ // Complete the pending request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Wait for completion callback, and verify that the request ran as expected.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ // At this point we have initialized the proxy service using a PAC script.
+ //
+ // A background task to periodically re-check the PAC script for validity will
+ // have been started. We will now wait for the next download attempt to start.
+ //
+ // Note that we shouldn't have to wait long here, since our test enables a
+ // special unit-test mode.
+ fetcher->WaitUntilFetch();
+
+ ASSERT_TRUE(resolver->pending_requests().empty());
+
+ // Make sure that our background checker is trying to download the expected
+ // PAC script (same one as before). This time we will simulate a failure
+ // to download the script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(ERR_FAILED, "");
+
+ MessageLoop::current()->RunAllPending();
+
+ // At this point the ProxyService should have re-configured itself to use
+ // DIRECT connections rather than the given proxy resolver.
+
+ // Start a second request.
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, callback2.callback(), NULL,
+ BoundNetLog());
+ EXPECT_EQ(OK, rv);
+ EXPECT_TRUE(info2.is_direct());
+}
+
} // namespace net
« no previous file with comments | « net/proxy/proxy_service.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698