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

Unified Diff: net/proxy/proxy_service_unittest.cc

Issue 160510: Better match IE's proxy settings.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix merge conflict Created 11 years, 4 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') | net/proxy/single_threaded_proxy_resolver.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/proxy/proxy_service_unittest.cc
===================================================================
--- net/proxy/proxy_service_unittest.cc (revision 22399)
+++ net/proxy/proxy_service_unittest.cc (working copy)
@@ -15,6 +15,8 @@
#include "net/proxy/proxy_service.h"
#include "testing/gtest/include/gtest/gtest.h"
+// TODO(eroman): Write a test which exercises
+// ProxyService::SuspendAllPendingRequests().
namespace net {
namespace {
@@ -72,6 +74,39 @@
MessageLoop* origin_loop_;
};
+ class SetPacScriptRequest {
+ public:
+ SetPacScriptRequest(MockAsyncProxyResolverBase* resolver,
+ const GURL& pac_url,
+ const std::string& pac_bytes,
+ CompletionCallback* callback)
+ : resolver_(resolver),
+ pac_url_(pac_url),
+ pac_bytes_(pac_bytes),
+ callback_(callback),
+ origin_loop_(MessageLoop::current()) {
+ }
+
+ const GURL& pac_url() const { return pac_url_; }
+ const std::string& pac_bytes() const { return pac_bytes_; }
+
+ void CompleteNow(int rv) {
+ CompletionCallback* callback = callback_;
+
+ // Will delete |this|.
+ resolver_->RemovePendingSetPacScriptRequest(this);
+
+ callback->Run(rv);
+ }
+
+ private:
+ MockAsyncProxyResolverBase* resolver_;
+ const GURL pac_url_;
+ const std::string pac_bytes_;
+ CompletionCallback* callback_;
+ MessageLoop* origin_loop_;
+ };
+
typedef std::vector<scoped_refptr<Request> > RequestsList;
// ProxyResolver implementation:
@@ -95,14 +130,16 @@
RemovePendingRequest(request);
}
- virtual void SetPacScriptByUrlInternal(const GURL& pac_url) {
- pac_url_ = pac_url;
+ virtual int SetPacScript(const GURL& pac_url,
+ const std::string& pac_bytes,
+ CompletionCallback* callback) {
+ EXPECT_EQ(NULL, pending_set_pac_script_request_.get());
+ pending_set_pac_script_request_.reset(
+ new SetPacScriptRequest(this, pac_url, pac_bytes, callback));
+ // Finished when user calls SetPacScriptRequest::CompleteNow().
+ return ERR_IO_PENDING;
}
- virtual void SetPacScriptByDataInternal(const std::string& bytes) {
- pac_bytes_ = bytes;
- }
-
const RequestsList& pending_requests() const {
return pending_requests_;
}
@@ -111,14 +148,10 @@
return cancelled_requests_;
}
- const GURL& pac_url() const {
- return pac_url_;
+ SetPacScriptRequest* pending_set_pac_script_request() const {
+ return pending_set_pac_script_request_.get();
}
- const std::string& pac_bytes() const {
- return pac_bytes_;
- }
-
void RemovePendingRequest(Request* request) {
RequestsList::iterator it = std::find(
pending_requests_.begin(), pending_requests_.end(), request);
@@ -126,6 +159,11 @@
pending_requests_.erase(it);
}
+ void RemovePendingSetPacScriptRequest(SetPacScriptRequest* request) {
+ EXPECT_EQ(request, pending_set_pac_script_request());
+ pending_set_pac_script_request_.reset();
+ }
+
protected:
explicit MockAsyncProxyResolverBase(bool expects_pac_bytes)
: ProxyResolver(expects_pac_bytes) {}
@@ -133,8 +171,7 @@
private:
RequestsList pending_requests_;
RequestsList cancelled_requests_;
- GURL pac_url_;
- std::string pac_bytes_;
+ scoped_ptr<SetPacScriptRequest> pending_set_pac_script_request_;
};
class MockAsyncProxyResolver : public MockAsyncProxyResolverBase {
@@ -160,21 +197,24 @@
}
// ProxyScriptFetcher implementation.
- virtual void Fetch(const GURL& url,
- std::string* bytes,
- CompletionCallback* callback) {
+ virtual int Fetch(const GURL& url,
+ std::string* bytes,
+ CompletionCallback* callback) {
DCHECK(!has_pending_request());
// Save the caller's information, and have them wait.
pending_request_url_ = url;
pending_request_callback_ = callback;
pending_request_bytes_ = bytes;
+ return ERR_IO_PENDING;
}
void NotifyFetchCompletion(int result, const std::string& bytes) {
DCHECK(has_pending_request());
*pending_request_bytes_ = bytes;
- pending_request_callback_->Run(result);
+ CompletionCallback* callback = pending_request_callback_;
+ pending_request_callback_ = NULL;
+ callback->Run(result);
}
virtual void Cancel() {}
@@ -223,7 +263,10 @@
int rv = service.ResolveProxy(url, &info, &callback, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -253,7 +296,10 @@
int rv = service.ResolveProxy(url, &info, &callback, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
// The URL should have been simplified, stripping the username/password/hash.
EXPECT_EQ(GURL("http://www.google.com/?ref"),
@@ -277,7 +323,10 @@
int rv = service.ResolveProxy(url, &info, &callback1, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -300,6 +349,7 @@
// Test what happens when the ProxyResolver fails (this could represent
// a failure to download the PAC script in the case of ProxyResolvers which
// do the fetch internally.)
+ // TODO(eroman): change this comment.
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
@@ -315,7 +365,10 @@
int rv = service.ResolveProxy(url, &info, &callback1, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -369,7 +422,10 @@
int rv = service.ResolveProxy(url, &info, &callback1, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -446,7 +502,10 @@
int rv = service.ResolveProxy(url, &info, &callback1, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -468,7 +527,10 @@
rv = service.ReconsiderProxyAfterError(url, &info, &callback2, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy-new/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy-new/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -495,7 +557,10 @@
rv = service.ReconsiderProxyAfterError(url, &info, &callback4, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy-new2/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy-new2/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -525,7 +590,9 @@
int rv = service.ResolveProxy(url, &info, &callback1, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
- EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(url, resolver->pending_requests()[0]->url());
@@ -702,7 +769,7 @@
config.proxy_bypass.push_back("*.example.com:99");
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
{
GURL test_url("http://www.example.com:99");
TestCompletionCallback callback;
@@ -730,7 +797,7 @@
config.proxy_bypass.push_back("*.example.com:80");
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("http://www.example.com");
TestCompletionCallback callback;
int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
@@ -742,7 +809,7 @@
config.proxy_bypass.push_back("*.example.com");
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("http://www.example.com:99");
TestCompletionCallback callback;
int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
@@ -755,7 +822,7 @@
config.proxy_bypass.push_back("[3ffe:2a00:100:7031::1]:99");
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
{
GURL test_url("http://[3ffe:2a00:100:7031::1]:99/");
TestCompletionCallback callback;
@@ -779,7 +846,7 @@
config.proxy_bypass.push_back("[3ffe:2a00:100:7031::1]");
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
{
GURL test_url("http://[3ffe:2a00:100:7031::1]:99/");
TestCompletionCallback callback;
@@ -803,7 +870,7 @@
config.auto_detect = false;
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("http://www.msn.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -814,7 +881,7 @@
}
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("ftp://ftp.google.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -825,7 +892,7 @@
}
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("https://webbranch.techcu.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -837,7 +904,7 @@
{
config.proxy_rules.ParseFromString("foopy1:8080");
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("http://www.microsoft.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -859,7 +926,7 @@
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("http://www.msn.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -870,7 +937,7 @@
}
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("ftp://ftp.google.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -881,7 +948,7 @@
}
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("https://webbranch.techcu.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -892,7 +959,7 @@
}
{
ProxyService service(new MockProxyConfigService(config),
- new MockAsyncProxyResolver);
+ new MockAsyncProxyResolver);
GURL test_url("unknown://www.microsoft.com");
ProxyInfo info;
TestCompletionCallback callback;
@@ -919,6 +986,16 @@
int rv = service.ResolveProxy(
GURL("http://request1"), &info1, &callback1, NULL);
EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Nothing has been sent to the proxy resolver yet, since the proxy
+ // resolver has not been configured yet.
+ ASSERT_EQ(0u, resolver->pending_requests().size());
+
+ // Successfully initialize the PAC script.
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"),
+ resolver->pending_set_pac_script_request()->pac_url());
+ 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());
@@ -1011,9 +1088,11 @@
// PAC script download completion.
fetcher->NotifyFetchCompletion(OK, "pac-v1");
- // Now that the PAC script is downloaded, everything should have been sent
- // over to the proxy resolver.
- EXPECT_EQ("pac-v1", resolver->pac_bytes());
+ // Now that the PAC script is downloaded, it will have been sent to the proxy
+ // resolver.
+ EXPECT_EQ("pac-v1", resolver->pending_set_pac_script_request()->pac_bytes());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(3u, resolver->pending_requests().size());
EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[1]->url());
@@ -1092,9 +1171,11 @@
// PAC script download completion.
fetcher->NotifyFetchCompletion(OK, "pac-v1");
- // Now that the PAC script is downloaded, everything should have been sent
- // over to the proxy resolver.
- EXPECT_EQ("pac-v1", resolver->pac_bytes());
+ // Now that the PAC script is downloaded, it will have been sent to the
+ // proxy resolver.
+ EXPECT_EQ("pac-v1", resolver->pending_set_pac_script_request()->pac_bytes());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
ASSERT_EQ(1u, resolver->pending_requests().size());
EXPECT_EQ(GURL("http://request3"), resolver->pending_requests()[0]->url());
@@ -1111,12 +1192,280 @@
EXPECT_FALSE(callback2.have_result()); // Cancelled.
}
+// Test that if auto-detect fails, we fall-back to the custom pac.
+TEST(ProxyServiceTest, FallbackFromAutodetectToCustomPac) {
+ ProxyConfig config;
+ config.auto_detect = true;
+ config.pac_url = GURL("http://foopy/proxy.pac");
+ config.proxy_rules.ParseFromString("http=foopy:80"); // Won't be used.
+
+ MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+ ProxyService service(config_service, resolver);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetcher(fetcher);
+
+ // Start 2 requests.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, &callback1, NULL);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ ProxyService::PacRequest* request2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, &callback2, &request2);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that nothing has been sent to the proxy resolver yet.
+ ASSERT_EQ(0u, resolver->pending_requests().size());
+
+ // It should be trying to auto-detect first -- FAIL the autodetect during
+ // the script download.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(ERR_FAILED, "");
+
+ // Next it should be trying the custom PAC url.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, "custom-pac-script");
+
+ EXPECT_EQ("custom-pac-script",
+ resolver->pending_set_pac_script_request()->pac_bytes());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ // Now finally, the pending requests should have been sent to the resolver
+ // (which was initialized with custom PAC script).
+
+ ASSERT_EQ(2u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
+ EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[1]->url());
+
+ // Complete the pending requests.
+ resolver->pending_requests()[1]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[1]->CompleteNow(OK);
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Verify that requests ran as expected.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+}
+
+// This is the same test as FallbackFromAutodetectToCustomPac, except
+// the auto-detect script fails parsing rather than downloading.
+TEST(ProxyServiceTest, FallbackFromAutodetectToCustomPac2) {
+ ProxyConfig config;
+ config.auto_detect = true;
+ config.pac_url = GURL("http://foopy/proxy.pac");
+ config.proxy_rules.ParseFromString("http=foopy:80"); // Won't be used.
+
+ MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+ ProxyService service(config_service, resolver);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetcher(fetcher);
+
+ // Start 2 requests.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, &callback1, NULL);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ ProxyService::PacRequest* request2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, &callback2, &request2);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that nothing has been sent to the proxy resolver yet.
+ ASSERT_EQ(0u, resolver->pending_requests().size());
+
+ // It should be trying to auto-detect first -- succeed the download.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, "invalid-script-contents");
+
+ // Simulate a parse error.
+ EXPECT_EQ("invalid-script-contents",
+ resolver->pending_set_pac_script_request()->pac_bytes());
+ resolver->pending_set_pac_script_request()->CompleteNow(
+ ERR_PAC_SCRIPT_FAILED);
+
+ // Next it should be trying the custom PAC url.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, "custom-pac-script");
+
+ EXPECT_EQ("custom-pac-script",
+ resolver->pending_set_pac_script_request()->pac_bytes());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ // Now finally, the pending requests should have been sent to the resolver
+ // (which was initialized with custom PAC script).
+
+ ASSERT_EQ(2u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
+ EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[1]->url());
+
+ // Complete the pending requests.
+ resolver->pending_requests()[1]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[1]->CompleteNow(OK);
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Verify that requests ran as expected.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+}
+
+// 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) {
+ ProxyConfig config;
+ config.auto_detect = true;
+ config.pac_url = GURL("http://foopy/proxy.pac");
+ config.proxy_rules.ParseFromString("http=foopy:80");
+
+ MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+ ProxyService service(config_service, resolver);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetcher(fetcher);
+
+ // Start 2 requests.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, &callback1, NULL);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ ProxyService::PacRequest* request2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, &callback2, &request2);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that nothing has been sent to the proxy resolver yet.
+ ASSERT_EQ(0u, resolver->pending_requests().size());
+
+ // It should be trying to auto-detect first -- fail the download.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(ERR_FAILED, "");
+
+ // Next it should be trying the custom PAC url -- fail the download.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(ERR_FAILED, "");
+
+ // Since we never managed to initialize a ProxyResolver, nothing should have
+ // been sent to it.
+ ASSERT_EQ(0u, resolver->pending_requests().size());
+
+ // Verify that requests ran as expected -- they should have fallen back to
+ // the manual proxy configuration for HTTP urls.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("foopy:80", info1.proxy_server().ToURI());
+
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("foopy:80", info2.proxy_server().ToURI());
+}
+
+// Test that the bypass rules are NOT applied when using autodetect.
+TEST(ProxyServiceTest, BypassDoesntApplyToPac) {
+ ProxyConfig config;
+ config.auto_detect = true;
+ config.pac_url = GURL("http://foopy/proxy.pac");
+ config.proxy_rules.ParseFromString("http=foopy:80"); // Not used.
+ config.proxy_bypass.push_back("www.google.com");
+
+ MockProxyConfigService* config_service = new MockProxyConfigService(config);
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
+ ProxyService service(config_service, resolver);
+
+ MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
+ service.SetProxyScriptFetcher(fetcher);
+
+ // Start 1 requests.
+
+ ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://www.google.com"), &info1, &callback1, NULL);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ // Check that nothing has been sent to the proxy resolver yet.
+ ASSERT_EQ(0u, resolver->pending_requests().size());
+
+ // It should be trying to auto-detect first -- succeed the download.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://wpad/wpad.dat"), fetcher->pending_request_url());
+ fetcher->NotifyFetchCompletion(OK, "auto-detect");
+
+ EXPECT_EQ("auto-detect",
+ resolver->pending_set_pac_script_request()->pac_bytes());
+ resolver->pending_set_pac_script_request()->CompleteNow(OK);
+
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://www.google.com"),
+ resolver->pending_requests()[0]->url());
+
+ // Complete the pending request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ // Verify that request ran as expected.
+ EXPECT_EQ(OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ // Start another request, it should pickup the bypass item.
+ ProxyInfo info2;
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(
+ GURL("http://www.google.com"), &info2, &callback2, NULL);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://www.google.com"),
+ resolver->pending_requests()[0]->url());
+
+ // Complete the pending request.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[0]->CompleteNow(OK);
+
+ EXPECT_EQ(OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+}
+
TEST(ProxyServiceTest, ResetProxyConfigService) {
ProxyConfig config1;
config1.proxy_rules.ParseFromString("foopy1:8080");
config1.auto_detect = false;
ProxyService service(new MockProxyConfigService(config1),
- new MockAsyncProxyResolverExpectsBytes);
+ new MockAsyncProxyResolverExpectsBytes);
ProxyInfo info;
TestCompletionCallback callback1;
@@ -1136,7 +1485,7 @@
}
TEST(ProxyServiceTest, IsLocalName) {
- const struct {
+ const struct {
const char* url;
bool expected_is_local;
} tests[] = {
« no previous file with comments | « net/proxy/proxy_service.cc ('k') | net/proxy/single_threaded_proxy_resolver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698