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

Unified Diff: net/proxy/proxy_service_unittest.cc

Issue 160155: Clean-up proxy_service_unittest.cc, to remove dependency on SingleThreadedPro... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fixe header order Created 11 years, 5 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 | « no previous file | 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
===================================================================
--- net/proxy/proxy_service_unittest.cc (revision 21631)
+++ net/proxy/proxy_service_unittest.cc (working copy)
@@ -2,14 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/compiler_specific.h"
+#include <vector>
+
+#include "base/logging.h"
#include "googleurl/src/gurl.h"
#include "net/base/net_errors.h"
+#include "net/base/test_completion_callback.h"
#include "net/proxy/proxy_config_service.h"
#include "net/proxy/proxy_resolver.h"
#include "net/proxy/proxy_script_fetcher.h"
#include "net/proxy/proxy_service.h"
-#include "net/proxy/single_threaded_proxy_resolver.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
@@ -30,469 +32,160 @@
net::ProxyConfig config;
};
-class SyncMockProxyResolver : public net::ProxyResolver {
+// Asynchronous mock proxy resolver. All requests complete asynchronously,
+// user must call Request::CompleteNow() on a pending request to signal it.
+class MockAsyncProxyResolverBase : public net::ProxyResolver {
public:
- SyncMockProxyResolver() : net::ProxyResolver(false /*expects_pac_bytes*/),
- fail_get_proxy_for_url(false) {
- }
-
- // ProxyResolver implementation:
- virtual int GetProxyForURL(const GURL& query_url,
- net::ProxyInfo* results,
- net::CompletionCallback* callback,
- RequestHandle* request) {
- if (fail_get_proxy_for_url)
- return net::ERR_FAILED;
- if (GURL(query_url).host() == info_predicate_query_host) {
- results->Use(info);
- } else {
- results->UseDirect();
+ class Request : public base::RefCounted<Request> {
+ public:
+ Request(MockAsyncProxyResolverBase* resolver,
+ const GURL& url,
+ net::ProxyInfo* results,
+ net::CompletionCallback* callback)
+ : resolver_(resolver),
+ url_(url),
+ results_(results),
+ callback_(callback),
+ origin_loop_(MessageLoop::current()) {
}
- return net::OK;
- }
- virtual void CancelRequest(RequestHandle request) {
- NOTREACHED();
- }
+ const GURL& url() const { return url_; }
+ net::ProxyInfo* results() const { return results_; }
+ net::CompletionCallback* callback() const { return callback_; }
- virtual void SetPacScriptByUrlInternal(const GURL& pac_url) {}
+ void CompleteNow(int rv) {
+ net::CompletionCallback* callback = callback_;
+ // May delete |this|.
+ resolver_->RemovePendingRequest(this);
- net::ProxyInfo info;
-
- // info is only returned if query_url in GetProxyForURL matches this:
- std::string info_predicate_query_host;
-
- // If true, then GetProxyForURL will fail, which simulates failure to
- // download or execute the PAC file.
- bool fail_get_proxy_for_url;
-};
-
-class MockProxyResolver : public net::SingleThreadedProxyResolver {
- public:
- MockProxyResolver()
- : net::SingleThreadedProxyResolver(new SyncMockProxyResolver) {
- x = reinterpret_cast<SyncMockProxyResolver*>(resolver());
- }
-
- // TODO(eroman): cleanup.
- SyncMockProxyResolver* x;
-};
-
-// ResultFuture is a handle to get at the result from
-// ProxyService::ResolveProxyForURL() that ran on another thread.
-class ResultFuture : public base::RefCountedThreadSafe<ResultFuture> {
- public:
- // |service| is the ProxyService to issue requests on, and |io_message_loop|
- // is the message loop where ProxyService lives.
- ResultFuture(MessageLoop* io_message_loop,
- net::ProxyService* service)
- : io_message_loop_(io_message_loop),
- service_(service),
- request_(NULL),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- callback_(this, &ResultFuture::OnCompletion)),
- completion_(true, false),
- cancelled_(false, false),
- started_(false, false),
- did_complete_(false) {
- }
-
- // Block until the request has completed, then return the result.
- int GetResultCode() {
- DCHECK(MessageLoop::current() != io_message_loop_);
- WaitUntilCompleted();
- return result_code_;
- }
-
- // Block until the request has completed, then return the result.
- const net::ProxyInfo& GetProxyInfo() {
- DCHECK(MessageLoop::current() != io_message_loop_);
- WaitUntilCompleted();
- return proxy_info_;
- }
-
- // Cancel this request (wait until the cancel has been issued before
- // returning).
- void Cancel() {
- DCHECK(MessageLoop::current() != io_message_loop_);
- io_message_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &ResultFuture::DoCancel));
- cancelled_.Wait();
- }
-
- // Return true if the request has already completed.
- bool IsCompleted() {
- DCHECK(MessageLoop::current() != io_message_loop_);
- return did_complete_;
- }
-
- // Wait until the ProxyService completes this request.
- void WaitUntilCompleted() {
- DCHECK(MessageLoop::current() != io_message_loop_);
- completion_.Wait();
- DCHECK(did_complete_);
- }
-
- private:
- friend class ProxyServiceWithFutures;
-
- typedef int (net::ProxyService::*RequestMethod)(const GURL&, net::ProxyInfo*,
- net::CompletionCallback*, net::ProxyService::PacRequest**);
-
- void StartResolve(const GURL& url) {
- StartRequest(url, &net::ProxyService::ResolveProxy);
- }
-
- // |proxy_info| is the *previous* result (that we are reconsidering).
- void StartReconsider(const GURL& url, const net::ProxyInfo& proxy_info) {
- proxy_info_ = proxy_info;
- StartRequest(url, &net::ProxyService::ReconsiderProxyAfterError);
- }
-
- // Start the request. Return once ProxyService::GetProxyForURL() or
- // ProxyService::ReconsiderProxyAfterError() returns.
- void StartRequest(const GURL& url, RequestMethod method) {
- DCHECK(MessageLoop::current() != io_message_loop_);
- io_message_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &ResultFuture::DoStartRequest, url, method));
- started_.Wait();
- }
-
- void StartResetConfigService(
- net::ProxyConfigService* new_proxy_config_service) {
- DCHECK(MessageLoop::current() != io_message_loop_);
- io_message_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &ResultFuture::DoResetConfigService, new_proxy_config_service));
- started_.Wait();
- }
-
- // Called on |io_message_loop_|.
- void DoStartRequest(const GURL& url, RequestMethod method) {
- DCHECK(MessageLoop::current() == io_message_loop_);
- int rv = (service_->*method)(url, &proxy_info_, &callback_, &request_);
- if (rv != net::ERR_IO_PENDING) {
- // Completed synchronously.
- OnCompletion(rv);
+ callback->Run(rv);
}
- started_.Signal();
- }
- // Called on |io_message_loop_|.
- void DoResetConfigService(net::ProxyConfigService* new_proxy_config_service) {
- DCHECK(MessageLoop::current() == io_message_loop_);
- service_->ResetConfigService(new_proxy_config_service);
- started_.Signal();
- OnCompletion(0);
- }
+ private:
+ MockAsyncProxyResolverBase* resolver_;
+ const GURL url_;
+ net::ProxyInfo* results_;
+ net::CompletionCallback* callback_;
+ MessageLoop* origin_loop_;
+ };
- // Called on |io_message_loop_|.
- void DoCancel() {
- DCHECK(MessageLoop::current() == io_message_loop_);
- if (!did_complete_)
- service_->CancelPacRequest(request_);
- cancelled_.Signal();
- }
+ typedef std::vector<scoped_refptr<Request> > RequestsList;
- // Called on |io_message_loop_|.
- void OnCompletion(int result) {
- DCHECK(MessageLoop::current() == io_message_loop_);
- DCHECK(!did_complete_);
- did_complete_ = true;
- result_code_ = result;
- request_ = NULL;
- completion_.Signal();
- }
+ // ProxyResolver implementation:
+ virtual int GetProxyForURL(const GURL& url,
+ net::ProxyInfo* results,
+ net::CompletionCallback* callback,
+ RequestHandle* request_handle) {
+ scoped_refptr<Request> request = new Request(this, url, results, callback);
+ pending_requests_.push_back(request);
- // The message loop where the ProxyService lives.
- MessageLoop* io_message_loop_;
+ if (request_handle)
+ *request_handle = reinterpret_cast<RequestHandle>(request.get());
- // The proxy service that started this request.
- net::ProxyService* service_;
-
- // The in-progress request.
- net::ProxyService::PacRequest* request_;
-
- net::CompletionCallbackImpl<ResultFuture> callback_;
- base::WaitableEvent completion_;
- base::WaitableEvent cancelled_;
- base::WaitableEvent started_;
- bool did_complete_;
-
- // Results from the request.
- int result_code_;
- net::ProxyInfo proxy_info_;
-};
-
-// Wraps a ProxyService running on its own IO thread.
-class ProxyServiceWithFutures {
- public:
- ProxyServiceWithFutures(net::ProxyConfigService* config_service,
- net::ProxyResolver* resolver)
- : io_thread_("IO_Thread"),
- io_thread_state_(new IOThreadState) {
- base::Thread::Options options;
- options.message_loop_type = MessageLoop::TYPE_IO;
- io_thread_.StartWithOptions(options);
-
- // Initialize state that lives on |io_thread_|.
- io_thread_.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
- io_thread_state_.get(), &IOThreadState::DoInit,
- config_service, resolver));
- io_thread_state_->event.Wait();
+ // Test code completes the request by calling request->CompleteNow().
+ return net::ERR_IO_PENDING;
}
- ~ProxyServiceWithFutures() {
- // Destroy state that lives on |io_thread_|.
- io_thread_.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
- io_thread_state_.get(), &IOThreadState::DoDestroy));
- io_thread_state_->event.Wait();
+ virtual void CancelRequest(RequestHandle request_handle) {
+ scoped_refptr<Request> request = reinterpret_cast<Request*>(request_handle);
+ cancelled_requests_.push_back(request);
+ RemovePendingRequest(request);
}
- // Start the request on |io_thread_|, and return a handle that can be
- // used to access the results. The caller is responsible for freeing
- // the ResultFuture.
- void ResolveProxy(scoped_refptr<ResultFuture>* result, const GURL& url) {
- *result = new ResultFuture(io_thread_.message_loop(),
- io_thread_state_->service);
- (*result)->StartResolve(url);
+ virtual void SetPacScriptByUrlInternal(const GURL& pac_url) {
+ pac_url_ = pac_url;
}
- // Same as above, but for "ReconsiderProxyAfterError()".
- void ReconsiderProxyAfterError(scoped_refptr<ResultFuture>* result,
- const GURL& url,
- const net::ProxyInfo& proxy_info) {
- *result = new ResultFuture(io_thread_.message_loop(),
- io_thread_state_->service);
- (*result)->StartReconsider(url, proxy_info);
+ virtual void SetPacScriptByDataInternal(const std::string& bytes) {
+ pac_bytes_ = bytes;
}
- void ResetConfigService(scoped_refptr<ResultFuture>* result,
- net::ProxyConfigService* new_proxy_config_service) {
- *result = new ResultFuture(io_thread_.message_loop(),
- io_thread_state_->service);
- (*result)->StartResetConfigService(new_proxy_config_service);
+ const RequestsList& pending_requests() const {
+ return pending_requests_;
}
- void SetProxyScriptFetcher(net::ProxyScriptFetcher* proxy_script_fetcher) {
- io_thread_.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
- io_thread_state_.get(), &IOThreadState::DoSetProxyScriptFetcher,
- proxy_script_fetcher));
- io_thread_state_->event.Wait();
+ const RequestsList& cancelled_requests() const {
+ return cancelled_requests_;
}
- private:
- // Class that encapsulates the state living on IO thread. It needs to be
- // ref-counted for posting tasks.
- class IOThreadState : public base::RefCountedThreadSafe<IOThreadState> {
- public:
- IOThreadState() : event(false, false), service(NULL) {}
-
- void DoInit(net::ProxyConfigService* config_service,
- net::ProxyResolver* resolver) {
- service = new net::ProxyService(config_service, resolver);
- event.Signal();
- }
-
- void DoDestroy() {
- delete service;
- service = NULL;
- event.Signal();
- }
-
- void DoSetProxyScriptFetcher(
- net::ProxyScriptFetcher* proxy_script_fetcher) {
- service->SetProxyScriptFetcher(proxy_script_fetcher);
- event.Signal();
- }
-
- base::WaitableEvent event;
- net::ProxyService* service;
- };
-
- base::Thread io_thread_;
- scoped_refptr<IOThreadState> io_thread_state_; // Lives on |io_thread_|.
-};
-
-// Wrapper around ProxyServiceWithFutures to do one request at a time.
-class SyncProxyService {
- public:
- SyncProxyService(net::ProxyConfigService* config_service,
- net::ProxyResolver* resolver)
- : service_(config_service, resolver) {
+ const GURL& pac_url() const {
+ return pac_url_;
}
- int ResolveProxy(const GURL& url, net::ProxyInfo* proxy_info) {
- scoped_refptr<ResultFuture> result;
- service_.ResolveProxy(&result, url);
- *proxy_info = result->GetProxyInfo();
- return result->GetResultCode();
+ const std::string& pac_bytes() const {
+ return pac_bytes_;
}
- int ReconsiderProxyAfterError(const GURL& url, net::ProxyInfo* proxy_info) {
- scoped_refptr<ResultFuture> result;
- service_.ReconsiderProxyAfterError(&result, url, *proxy_info);
- *proxy_info = result->GetProxyInfo();
- return result->GetResultCode();
+ void RemovePendingRequest(Request* request) {
+ RequestsList::iterator it = std::find(
+ pending_requests_.begin(), pending_requests_.end(), request);
+ DCHECK(it != pending_requests_.end());
+ pending_requests_.erase(it);
}
- int ResetConfigService(net::ProxyConfigService* new_proxy_config_service) {
- scoped_refptr<ResultFuture> result;
- service_.ResetConfigService(&result, new_proxy_config_service);
- return result->GetResultCode();
- }
+ protected:
+ explicit MockAsyncProxyResolverBase(bool expects_pac_bytes)
+ : net::ProxyResolver(expects_pac_bytes) {}
private:
- ProxyServiceWithFutures service_;
+ RequestsList pending_requests_;
+ RequestsList cancelled_requests_;
+ GURL pac_url_;
+ std::string pac_bytes_;
};
-// A ProxyResolver which can be set to block upon reaching GetProxyForURL.
-class SyncBlockableProxyResolver : public net::ProxyResolver {
+class MockAsyncProxyResolver : public MockAsyncProxyResolverBase {
public:
- SyncBlockableProxyResolver()
- : net::ProxyResolver(false /*expects_pac_bytes*/),
- should_block_(false),
- unblocked_(true, true),
- blocked_(true, false) {
- }
-
- void Block() {
- should_block_ = true;
- unblocked_.Reset();
- }
-
- void Unblock() {
- should_block_ = false;
- blocked_.Reset();
- unblocked_.Signal();
- }
-
- void WaitUntilBlocked() {
- blocked_.Wait();
- }
-
- // net::ProxyResolver implementation:
- virtual int GetProxyForURL(const GURL& query_url,
- net::ProxyInfo* results,
- net::CompletionCallback* callback,
- RequestHandle* request) {
- if (should_block_) {
- blocked_.Signal();
- unblocked_.Wait();
- }
-
- results->UseNamedProxy(query_url.host());
- return net::OK;
- }
-
- virtual void CancelRequest(RequestHandle request) {
- NOTREACHED();
- }
-
- virtual void SetPacScriptByUrlInternal(const GURL& pac_url) {}
-
- private:
- bool should_block_;
- base::WaitableEvent unblocked_;
- base::WaitableEvent blocked_;
+ MockAsyncProxyResolver()
+ : MockAsyncProxyResolverBase(false /*expects_pac_bytes*/) {}
};
-class BlockableProxyResolver : public net::SingleThreadedProxyResolver {
+class MockAsyncProxyResolverExpectsBytes : public MockAsyncProxyResolverBase {
public:
- BlockableProxyResolver()
- : net::SingleThreadedProxyResolver(new SyncBlockableProxyResolver) {
- x = reinterpret_cast<SyncBlockableProxyResolver*>(resolver());
- }
-
- // TODO(eroman): cleanup.
- SyncBlockableProxyResolver* x;
+ MockAsyncProxyResolverExpectsBytes()
+ : MockAsyncProxyResolverBase(true /*expects_pac_bytes*/) {}
};
-// A mock ProxyResolverWithoutFetch which concatenates the query's host with
-// the last download PAC contents. This way the result describes what the last
-// downloaded PAC script's contents were, in addition to the query url itself.
-class SyncMockProxyResolverWithoutFetch : public net::ProxyResolver {
- public:
- SyncMockProxyResolverWithoutFetch()
- : net::ProxyResolver(true /*expects_pac_bytes*/),
- last_pac_contents_("NONE") {}
-
- // net::ProxyResolver implementation:
- virtual int GetProxyForURL(const GURL& query_url,
- net::ProxyInfo* results,
- net::CompletionCallback* callback,
- RequestHandle* request) {
- results->UseNamedProxy(last_pac_contents_ + "." + query_url.host());
- return net::OK;
- }
-
- virtual void SetPacScriptByDataInternal(const std::string& bytes) {
- last_pac_contents_ = bytes;
- }
-
- virtual void CancelRequest(RequestHandle request) {
- NOTREACHED();
- }
-
- private:
- std::string last_pac_contents_;
-};
-
-class MockProxyResolverWithoutFetch : public net::SingleThreadedProxyResolver {
- public:
- MockProxyResolverWithoutFetch()
- : net::SingleThreadedProxyResolver(
- new SyncMockProxyResolverWithoutFetch) {
- x = reinterpret_cast<SyncMockProxyResolverWithoutFetch*>(resolver());
- }
-
- // TODO(eroman): cleanup.
- SyncMockProxyResolverWithoutFetch* x;
-};
-
-
} // namespace
// A mock ProxyScriptFetcher. No result will be returned to the fetch client
// until we call NotifyFetchCompletion() to set the results.
class MockProxyScriptFetcher : public net::ProxyScriptFetcher {
public:
- MockProxyScriptFetcher() : pending_request_loop_(NULL),
- pending_request_callback_(NULL), pending_request_bytes_(NULL) {}
+ MockProxyScriptFetcher()
+ : pending_request_callback_(NULL), pending_request_bytes_(NULL) {
+ }
// net::ProxyScriptFetcher implementation.
- virtual void Fetch(const GURL& url, std::string* bytes,
+ virtual void Fetch(const GURL& url,
+ std::string* bytes,
net::CompletionCallback* callback) {
- DCHECK(!HasPendingRequest());
+ DCHECK(!has_pending_request());
// Save the caller's information, and have them wait.
- pending_request_loop_ = MessageLoop::current();
pending_request_url_ = url;
pending_request_callback_ = callback;
pending_request_bytes_ = bytes;
}
void NotifyFetchCompletion(int result, const std::string& bytes) {
- DCHECK(HasPendingRequest());
- pending_request_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- this, &MockProxyScriptFetcher::DoNotifyFetchCompletion, result, bytes));
+ DCHECK(has_pending_request());
+ *pending_request_bytes_ = bytes;
+ pending_request_callback_->Run(result);
}
virtual void Cancel() {}
- private:
- // Runs on |pending_request_loop_|.
- void DoNotifyFetchCompletion(int result, const std::string& bytes) {
- DCHECK(HasPendingRequest());
- *pending_request_bytes_ = bytes;
- pending_request_callback_->Run(result);
+ const GURL& pending_request_url() const {
+ return pending_request_url_;
}
- bool HasPendingRequest() const {
- return pending_request_loop_ != NULL;
+ bool has_pending_request() const {
+ return pending_request_callback_ != NULL;
}
- MessageLoop* pending_request_loop_;
+ private:
GURL pending_request_url_;
net::CompletionCallback* pending_request_callback_;
std::string* pending_request_bytes_;
@@ -508,14 +201,17 @@
MockProxyScriptFetcher* remover) {}
TEST(ProxyServiceTest, Direct) {
- SyncProxyService service(new MockProxyConfigService,
- new MockProxyResolver);
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
+ net::ProxyService service(new MockProxyConfigService, resolver);
GURL url("http://www.google.com/");
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_TRUE(resolver->pending_requests().empty());
+
EXPECT_TRUE(info.is_direct());
}
@@ -523,17 +219,26 @@
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolver* resolver = new MockProxyResolver;
- resolver->x->info.UseNamedProxy("foopy");
- resolver->x->info_predicate_query_host = "www.google.com";
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- SyncProxyService service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
GURL url("http://www.google.com/");
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(url, &info, &callback, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Set the result in proxy resolver.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("foopy");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ EXPECT_EQ(net::OK, callback.WaitForResult());
EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy:80", info.proxy_server().ToURI());
}
@@ -541,59 +246,86 @@
TEST(ProxyServiceTest, PAC_FailoverToDirect) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- MockProxyResolver* resolver = new MockProxyResolver;
- resolver->x->info.UseNamedProxy("foopy:8080");
- resolver->x->info_predicate_query_host = "www.google.com";
+ net::ProxyService service(config_service, resolver);
- SyncProxyService service(config_service, resolver);
-
GURL url("http://www.google.com/");
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(url, &info, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Set the result in proxy resolver.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("foopy:8080");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ EXPECT_EQ(net::OK, callback1.WaitForResult());
EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy:8080", info.proxy_server().ToURI());
// Now, imagine that connecting to foopy:8080 fails.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback2;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback2, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
-TEST(ProxyServiceTest, PAC_FailsToDownload) {
- // Test what happens when we fail to download the PAC URL.
+TEST(ProxyServiceTest, ProxyResolverFails) {
+ // 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.)
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolver* resolver = new MockProxyResolver;
- resolver->x->info.UseNamedProxy("foopy:8080");
- resolver->x->info_predicate_query_host = "www.google.com";
- resolver->x->fail_get_proxy_for_url = true;
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- SyncProxyService service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
- // The first resolve fails in the MockProxyResolver.
+ // Start first resolve request.
GURL url("http://www.google.com/");
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::ERR_FAILED);
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(url, &info, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Fail the first resolve request in MockAsyncProxyResolver.
+ resolver->pending_requests()[0]->CompleteNow(net::ERR_FAILED);
+
+ EXPECT_EQ(net::ERR_FAILED, callback1.WaitForResult());
+
// The second resolve request will automatically select direct connect,
// because it has cached the configuration as being bad.
- rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(url, &info, &callback2, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
+ EXPECT_TRUE(resolver->pending_requests().empty());
- resolver->x->fail_get_proxy_for_url = false;
- resolver->x->info.UseNamedProxy("foopy_valid:8080");
-
// But, if that fails, then we should give the proxy config another shot
// since we have never tried it with this URL before.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback3;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback3, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Set the result in proxy resolver.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("foopy_valid:8080");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ EXPECT_EQ(net::OK, callback3.WaitForResult());
EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy_valid:8080", info.proxy_server().ToURI());
}
@@ -605,56 +337,73 @@
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolver* resolver = new MockProxyResolver;
- resolver->x->info.UseNamedProxy("foopy1:8080;foopy2:9090");
- resolver->x->info_predicate_query_host = "www.google.com";
- resolver->x->fail_get_proxy_for_url = false;
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- SyncProxyService service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
GURL url("http://www.google.com/");
// Get the proxy information.
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
- EXPECT_FALSE(info.is_direct());
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(url, &info, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Set the result in proxy resolver.
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
// The first item is valid.
+ EXPECT_EQ(net::OK, callback1.WaitForResult());
+ EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
// Fake an error on the proxy.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback2;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback2, NULL);
+ EXPECT_EQ(net::OK, rv);
// The second proxy should be specified.
EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI());
- // Create a new resolver that returns 3 proxies. The second one is already
- // known to be bad.
- config_service->config.pac_url = GURL("http://foopy/proxy.pac");
- resolver->x->info.UseNamedProxy("foopy3:7070;foopy1:8080;foopy2:9090");
- resolver->x->info_predicate_query_host = "www.google.com";
- resolver->x->fail_get_proxy_for_url = false;
+ TestCompletionCallback callback3;
+ rv = service.ResolveProxy(url, &info, &callback3, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
- rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Set the result in proxy resolver -- the second result is already known
+ // to be bad.
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy3:7070;foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ EXPECT_EQ(net::OK, callback3.WaitForResult());
EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy3:7070", info.proxy_server().ToURI());
// We fake another error. It should now try the third one.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback4;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback4, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI());
// Fake another error, the last proxy is gone, the list should now be empty.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK); // We try direct.
+ TestCompletionCallback callback5;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback5, NULL);
+ EXPECT_EQ(net::OK, rv); // We try direct.
EXPECT_TRUE(info.is_direct());
// If it fails again, we don't have anything else to try.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::ERR_FAILED); // We try direct.
+ TestCompletionCallback callback6;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback6, NULL);
+ EXPECT_EQ(net::ERR_FAILED, rv);
// TODO(nsylvain): Test that the proxy can be retried after the delay.
}
@@ -665,46 +414,76 @@
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolver* resolver = new MockProxyResolver;
- resolver->x->info.UseNamedProxy("foopy1:8080;foopy2:9090");
- resolver->x->info_predicate_query_host = "www.google.com";
- resolver->x->fail_get_proxy_for_url = false;
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- SyncProxyService service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
GURL url("http://www.google.com/");
// Get the proxy information.
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
- EXPECT_FALSE(info.is_direct());
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(url, &info, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ // Set the result in proxy resolver.
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
// The first item is valid.
+ EXPECT_EQ(net::OK, callback1.WaitForResult());
+ EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
// Fake an error on the proxy, and also a new configuration on the proxy.
config_service->config = net::ProxyConfig();
config_service->config.pac_url = GURL("http://foopy-new/proxy.pac");
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback2;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback2, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ EXPECT_EQ(GURL("http://foopy-new/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
// The first proxy is still there since the configuration changed.
+ EXPECT_EQ(net::OK, callback2.WaitForResult());
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
// We fake another error. It should now ignore the first one.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback3;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback3, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_EQ("foopy2:9090", info.proxy_server().ToURI());
// We simulate a new configuration.
config_service->config = net::ProxyConfig();
config_service->config.pac_url = GURL("http://foopy-new2/proxy.pac");
- // We fake anothe error. It should go back to the first proxy.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ // We fake another error. It should go back to the first proxy.
+ TestCompletionCallback callback4;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback4, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ EXPECT_EQ(GURL("http://foopy-new2/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ EXPECT_EQ(net::OK, callback4.WaitForResult());
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
}
@@ -714,27 +493,35 @@
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolver* resolver = new MockProxyResolver;
- resolver->x->info.UseNamedProxy("foopy1:8080;foopy2:9090");
- resolver->x->info_predicate_query_host = "www.google.com";
- resolver->x->fail_get_proxy_for_url = false;
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- SyncProxyService service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
GURL url("http://www.google.com/");
// Get the proxy information.
net::ProxyInfo info;
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
- EXPECT_FALSE(info.is_direct());
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(url, &info, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), resolver->pac_url());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
// The first item is valid.
+ EXPECT_EQ(net::OK, callback1.WaitForResult());
+ EXPECT_FALSE(info.is_direct());
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
// Fake a proxy error.
- rv = service.ReconsiderProxyAfterError(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback2;
+ rv = service.ReconsiderProxyAfterError(url, &info, &callback2, NULL);
+ EXPECT_EQ(net::OK, rv);
// The first proxy is ignored, and the second one is selected.
EXPECT_FALSE(info.is_direct());
@@ -742,31 +529,46 @@
// Fake a PAC failure.
net::ProxyInfo info2;
- resolver->x->fail_get_proxy_for_url = true;
- rv = service.ResolveProxy(url, &info2);
- EXPECT_EQ(rv, net::ERR_FAILED);
+ TestCompletionCallback callback3;
+ rv = service.ResolveProxy(url, &info2, &callback3, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ resolver->pending_requests()[0]->CompleteNow(net::ERR_FAILED);
+
// No proxy servers are returned. It's a direct connection.
+ EXPECT_EQ(net::ERR_FAILED, callback3.WaitForResult());
EXPECT_TRUE(info2.is_direct());
- // The PAC is now fixed and will return a proxy server.
+ // The PAC will now be fixed and will return a proxy server.
// It should also clear the list of bad proxies.
- resolver->x->fail_get_proxy_for_url = false;
// Try to resolve, it will still return "direct" because we have no reason
// to check the config since everything works.
net::ProxyInfo info3;
- rv = service.ResolveProxy(url, &info3);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback4;
+ rv = service.ResolveProxy(url, &info3, &callback4, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info3.is_direct());
// But if the direct connection fails, we check if the ProxyInfo tried to
// resolve the proxy before, and if not (like in this case), we give the
// PAC another try.
- rv = service.ReconsiderProxyAfterError(url, &info3);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback5;
+ rv = service.ReconsiderProxyAfterError(url, &info3, &callback5, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(url, resolver->pending_requests()[0]->url());
+
+ resolver->pending_requests()[0]->results()->UseNamedProxy(
+ "foopy1:8080;foopy2:9090");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
// The first proxy is still there since the list of bad proxies got cleared.
+ EXPECT_EQ(net::OK, callback5.WaitForResult());
EXPECT_FALSE(info3.is_direct());
EXPECT_EQ("foopy1:8080", info3.proxy_server().ToURI());
}
@@ -781,21 +583,23 @@
config.proxy_bypass_local_names = true;
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver());
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver());
GURL url("http://www.google.com/");
// Get the proxy information.
- int rv = service.ResolveProxy(url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_FALSE(info.is_direct());
}
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver());
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver());
GURL test_url("local");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
@@ -803,11 +607,12 @@
config.proxy_bypass.push_back("*.org");
config.proxy_bypass_local_names = true;
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("http://www.webkit.org");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
@@ -816,11 +621,12 @@
config.proxy_bypass.push_back("7*");
config.proxy_bypass_local_names = true;
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("http://74.125.19.147");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
@@ -828,11 +634,12 @@
config.proxy_bypass.push_back("*.org");
config.proxy_bypass_local_names = true;
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("http://www.msn.com");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_FALSE(info.is_direct());
}
@@ -840,11 +647,12 @@
config.proxy_bypass.push_back("*.MSN.COM");
config.proxy_bypass_local_names = true;
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("http://www.msnbc.msn.com");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
@@ -852,11 +660,12 @@
config.proxy_bypass.push_back("*.msn.com");
config.proxy_bypass_local_names = true;
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("HTTP://WWW.MSNBC.MSN.COM");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
}
@@ -872,24 +681,27 @@
config.proxy_bypass.clear();
config.proxy_bypass.push_back("*.example.com:99");
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
{
GURL test_url("http://www.example.com:99");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
{
GURL test_url("http://www.example.com:100");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_FALSE(info.is_direct());
}
{
GURL test_url("http://www.example.com");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_FALSE(info.is_direct());
}
}
@@ -897,22 +709,24 @@
config.proxy_bypass.clear();
config.proxy_bypass.push_back("*.example.com:80");
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("http://www.example.com");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
config.proxy_bypass.clear();
config.proxy_bypass.push_back("*.example.com");
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
GURL test_url("http://www.example.com:99");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
@@ -920,18 +734,20 @@
config.proxy_bypass.clear();
config.proxy_bypass.push_back("[3ffe:2a00:100:7031::1]:99");
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
{
GURL test_url("http://[3ffe:2a00:100:7031::1]:99/");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
{
GURL test_url("http://[3ffe:2a00:100:7031::1]/");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_FALSE(info.is_direct());
}
}
@@ -942,18 +758,20 @@
config.proxy_bypass.clear();
config.proxy_bypass.push_back("[3ffe:2a00:100:7031::1]");
{
- SyncProxyService service(new MockProxyConfigService(config),
- new MockProxyResolver);
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
{
GURL test_url("http://[3ffe:2a00:100:7031::1]:99/");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
{
GURL test_url("http://[3ffe:2a00:100:7031::1]/");
- int rv = service.ResolveProxy(test_url, &info);
- EXPECT_EQ(rv, net::OK);
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(info.is_direct());
}
}
@@ -963,43 +781,51 @@
net::ProxyConfig config;
config.proxy_rules.ParseFromString("http=foopy1:8080;https=foopy2:8080");
config.auto_detect = false;
-
- SyncProxyService service1(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url1("http://www.msn.com");
- net::ProxyInfo info1;
- int rv = service1.ResolveProxy(test_url1, &info1);
- EXPECT_EQ(rv, net::OK);
- EXPECT_FALSE(info1.is_direct());
- EXPECT_EQ("foopy1:8080", info1.proxy_server().ToURI());
-
- SyncProxyService service2(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url2("ftp://ftp.google.com");
- net::ProxyInfo info2;
- rv = service2.ResolveProxy(test_url2, &info2);
- EXPECT_EQ(rv, net::OK);
- EXPECT_TRUE(info2.is_direct());
- EXPECT_EQ("direct://", info2.proxy_server().ToURI());
-
- SyncProxyService service3(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url3("https://webbranch.techcu.com");
- net::ProxyInfo info3;
- rv = service3.ResolveProxy(test_url3, &info3);
- EXPECT_EQ(rv, net::OK);
- EXPECT_FALSE(info3.is_direct());
- EXPECT_EQ("foopy2:8080", info3.proxy_server().ToURI());
-
- config.proxy_rules.ParseFromString("foopy1:8080");
- SyncProxyService service4(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url4("www.microsoft.com");
- net::ProxyInfo info4;
- rv = service4.ResolveProxy(test_url4, &info4);
- EXPECT_EQ(rv, net::OK);
- EXPECT_FALSE(info4.is_direct());
- EXPECT_EQ("foopy1:8080", info4.proxy_server().ToURI());
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("http://www.msn.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
+ }
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("ftp://ftp.google.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_TRUE(info.is_direct());
+ EXPECT_EQ("direct://", info.proxy_server().ToURI());
+ }
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("https://webbranch.techcu.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("foopy2:8080", info.proxy_server().ToURI());
+ }
+ {
+ config.proxy_rules.ParseFromString("foopy1:8080");
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("www.microsoft.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
+ }
}
// If only HTTP and a SOCKS proxy are specified, check if ftp/https queries
@@ -1011,181 +837,189 @@
EXPECT_EQ(net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME,
config.proxy_rules.type);
- SyncProxyService service1(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url1("http://www.msn.com");
- net::ProxyInfo info1;
- int rv = service1.ResolveProxy(test_url1, &info1);
- EXPECT_EQ(net::OK, rv);
- EXPECT_FALSE(info1.is_direct());
- EXPECT_EQ("foopy1:8080", info1.proxy_server().ToURI());
-
- SyncProxyService service2(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url2("ftp://ftp.google.com");
- net::ProxyInfo info2;
- rv = service2.ResolveProxy(test_url2, &info2);
- EXPECT_EQ(net::OK, rv);
- EXPECT_FALSE(info2.is_direct());
- EXPECT_EQ("socks4://foopy2:1080", info2.proxy_server().ToURI());
-
- SyncProxyService service3(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url3("https://webbranch.techcu.com");
- net::ProxyInfo info3;
- rv = service3.ResolveProxy(test_url3, &info3);
- EXPECT_EQ(net::OK, rv);
- EXPECT_FALSE(info3.is_direct());
- EXPECT_EQ("socks4://foopy2:1080", info3.proxy_server().ToURI());
-
- SyncProxyService service4(new MockProxyConfigService(config),
- new MockProxyResolver);
- GURL test_url4("www.microsoft.com");
- net::ProxyInfo info4;
- rv = service4.ResolveProxy(test_url4, &info4);
- EXPECT_EQ(net::OK, rv);
- EXPECT_FALSE(info4.is_direct());
- EXPECT_EQ("socks4://foopy2:1080", info4.proxy_server().ToURI());
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("http://www.msn.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
+ }
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("ftp://ftp.google.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("socks4://foopy2:1080", info.proxy_server().ToURI());
+ }
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("https://webbranch.techcu.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("socks4://foopy2:1080", info.proxy_server().ToURI());
+ }
+ {
+ net::ProxyService service(new MockProxyConfigService(config),
+ new MockAsyncProxyResolver);
+ GURL test_url("www.microsoft.com");
+ net::ProxyInfo info;
+ TestCompletionCallback callback;
+ int rv = service.ResolveProxy(test_url, &info, &callback, NULL);
+ EXPECT_EQ(net::OK, rv);
+ EXPECT_FALSE(info.is_direct());
+ EXPECT_EQ("socks4://foopy2:1080", info.proxy_server().ToURI());
+ }
}
-// Test cancellation of a queued request.
-TEST(ProxyServiceTest, CancelQueuedRequest) {
+// Test cancellation of an in-progress request.
+TEST(ProxyServiceTest, CancelInProgressRequest) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- BlockableProxyResolver* resolver = new BlockableProxyResolver;
+ MockAsyncProxyResolver* resolver = new MockAsyncProxyResolver;
- ProxyServiceWithFutures service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
- // Cause requests to pile up, by having them block in the PAC thread.
- resolver->x->Block();
-
// Start 3 requests.
- scoped_refptr<ResultFuture> result1;
- service.ResolveProxy(&result1, GURL("http://request1"));
- scoped_refptr<ResultFuture> result2;
- service.ResolveProxy(&result2, GURL("http://request2"));
+ net::ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
- scoped_refptr<ResultFuture> result3;
- service.ResolveProxy(&result3, GURL("http://request3"));
+ net::ProxyInfo info2;
+ TestCompletionCallback callback2;
+ net::ProxyService::PacRequest* request2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, &callback2, &request2);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ ASSERT_EQ(2u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request2"), resolver->pending_requests()[1]->url());
- // Wait until the first request has become blocked in the PAC thread.
- resolver->x->WaitUntilBlocked();
+ net::ProxyInfo info3;
+ TestCompletionCallback callback3;
+ rv = service.ResolveProxy(
+ GURL("http://request3"), &info3, &callback3, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ ASSERT_EQ(3u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request3"), resolver->pending_requests()[2]->url());
// Cancel the second request
- result2->Cancel();
+ service.CancelPacRequest(request2);
- // Unblock the PAC thread.
- resolver->x->Unblock();
+ ASSERT_EQ(2u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request1"), resolver->pending_requests()[0]->url());
+ EXPECT_EQ(GURL("http://request3"), resolver->pending_requests()[1]->url());
- // Wait for the final request to complete.
- result3->WaitUntilCompleted();
+ // Complete the two un-cancelled requests.
+ // We complete the last one first, just to mix it up a bit.
+ resolver->pending_requests()[1]->results()->UseNamedProxy("request3:80");
+ resolver->pending_requests()[1]->CompleteNow(net::OK);
- // Verify that requests ran as expected.
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
- EXPECT_TRUE(result1->IsCompleted());
- EXPECT_EQ(net::OK, result1->GetResultCode());
- EXPECT_EQ("request1:80", result1->GetProxyInfo().proxy_server().ToURI());
+ // Complete and verify that requests ran as expected.
+ EXPECT_EQ(net::OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
- EXPECT_FALSE(result2->IsCompleted()); // Cancelled.
+ EXPECT_FALSE(callback2.have_result()); // Cancelled.
+ ASSERT_EQ(1u, resolver->cancelled_requests().size());
+ EXPECT_EQ(GURL("http://request2"), resolver->cancelled_requests()[0]->url());
- EXPECT_TRUE(result3->IsCompleted());
- EXPECT_EQ(net::OK, result3->GetResultCode());
- EXPECT_EQ("request3:80", result3->GetProxyInfo().proxy_server().ToURI());
+ EXPECT_EQ(net::OK, callback3.WaitForResult());
+ EXPECT_EQ("request3:80", info3.proxy_server().ToURI());
}
-// Test cancellation of an in-progress request.
-TEST(ProxyServiceTest, CancelInprogressRequest) {
- MockProxyConfigService* config_service =
- new MockProxyConfigService("http://foopy/proxy.pac");
-
- BlockableProxyResolver* resolver = new BlockableProxyResolver;
-
- ProxyServiceWithFutures service(config_service, resolver);
-
- // Cause requests to pile up, by having them block in the PAC thread.
- resolver->x->Block();
-
- // Start 3 requests.
- scoped_refptr<ResultFuture> result1;
- service.ResolveProxy(&result1, GURL("http://request1"));
-
- scoped_refptr<ResultFuture> result2;
- service.ResolveProxy(&result2, GURL("http://request2"));
-
- scoped_refptr<ResultFuture> result3;
- service.ResolveProxy(&result3, GURL("http://request3"));
-
- // Wait until the first request has become blocked in the PAC thread.
- resolver->x->WaitUntilBlocked();
-
- // Cancel the first request
- result1->Cancel();
-
- // Unblock the PAC thread.
- resolver->x->Unblock();
-
- // Wait for the final request to complete.
- result3->WaitUntilCompleted();
-
- // Verify that requests ran as expected.
-
- EXPECT_FALSE(result1->IsCompleted()); // Cancelled.
-
- EXPECT_TRUE(result2->IsCompleted());
- EXPECT_EQ(net::OK, result2->GetResultCode());
- EXPECT_EQ("request2:80", result2->GetProxyInfo().proxy_server().ToURI());
-
- EXPECT_TRUE(result3->IsCompleted());
- EXPECT_EQ(net::OK, result3->GetResultCode());
- EXPECT_EQ("request3:80", result3->GetProxyInfo().proxy_server().ToURI());
-}
-
// Test the initial PAC download for ProxyResolverWithoutFetch.
TEST(ProxyServiceTest, InitialPACScriptDownload) {
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolverWithoutFetch* resolver = new MockProxyResolverWithoutFetch;
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
- ProxyServiceWithFutures service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
service.SetProxyScriptFetcher(fetcher);
// Start 3 requests.
- scoped_refptr<ResultFuture> result1;
- service.ResolveProxy(&result1, GURL("http://request1"));
- scoped_refptr<ResultFuture> result2;
- service.ResolveProxy(&result2, GURL("http://request2"));
+ net::ProxyInfo info1;
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, &callback1, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
- scoped_refptr<ResultFuture> result3;
- service.ResolveProxy(&result3, GURL("http://request3"));
+ // The first request should have triggered download of PAC script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
+ net::ProxyInfo info2;
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, &callback2, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ net::ProxyInfo info3;
+ TestCompletionCallback callback3;
+ rv = service.ResolveProxy(
+ GURL("http://request3"), &info3, &callback3, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ // 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(net::OK, "pac-v1");
- // Complete all the requests.
- result3->WaitUntilCompleted();
+ // Now that the PAC script is downloaded, everything should have been sent
+ // over to the proxy resolver.
+ EXPECT_EQ("pac-v1", resolver->pac_bytes());
+ 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());
+ EXPECT_EQ(GURL("http://request3"), resolver->pending_requests()[2]->url());
- EXPECT_TRUE(result1->IsCompleted());
- EXPECT_EQ(net::OK, result1->GetResultCode());
- EXPECT_EQ("pac-v1.request1:80",
- result1->GetProxyInfo().proxy_server().ToURI());
+ // Complete all the requests (in some order).
+ // Note that as we complete requests, they shift up in |pending_requests()|.
- EXPECT_TRUE(result2->IsCompleted());
- EXPECT_EQ(net::OK, result2->GetResultCode());
- EXPECT_EQ("pac-v1.request2:80",
- result2->GetProxyInfo().proxy_server().ToURI());
+ resolver->pending_requests()[2]->results()->UseNamedProxy("request3:80");
+ resolver->pending_requests()[2]->CompleteNow(net::OK);
- EXPECT_TRUE(result3->IsCompleted());
- EXPECT_EQ(net::OK, result3->GetResultCode());
- EXPECT_EQ("pac-v1.request3:80",
- result3->GetProxyInfo().proxy_server().ToURI());
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request1:80");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request2:80");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
+
+ // Complete and verify that requests ran as expected.
+ EXPECT_EQ(net::OK, callback1.WaitForResult());
+ EXPECT_EQ("request1:80", info1.proxy_server().ToURI());
+
+ EXPECT_EQ(net::OK, callback2.WaitForResult());
+ EXPECT_EQ("request2:80", info2.proxy_server().ToURI());
+
+ EXPECT_EQ(net::OK, callback3.WaitForResult());
+ EXPECT_EQ("request3:80", info3.proxy_server().ToURI());
}
// Test cancellation of a request, while the PAC script is being fetched.
@@ -1193,61 +1027,90 @@
MockProxyConfigService* config_service =
new MockProxyConfigService("http://foopy/proxy.pac");
- MockProxyResolverWithoutFetch* resolver = new MockProxyResolverWithoutFetch;
+ MockAsyncProxyResolverExpectsBytes* resolver =
+ new MockAsyncProxyResolverExpectsBytes;
- ProxyServiceWithFutures service(config_service, resolver);
+ net::ProxyService service(config_service, resolver);
MockProxyScriptFetcher* fetcher = new MockProxyScriptFetcher;
service.SetProxyScriptFetcher(fetcher);
// Start 3 requests.
- scoped_refptr<ResultFuture> result1;
- service.ResolveProxy(&result1, GURL("http://request1"));
+ net::ProxyInfo info1;
+ TestCompletionCallback callback1;
+ net::ProxyService::PacRequest* request1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info1, &callback1, &request1);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
- scoped_refptr<ResultFuture> result2;
- service.ResolveProxy(&result2, GURL("http://request2"));
+ // The first request should have triggered download of PAC script.
+ EXPECT_TRUE(fetcher->has_pending_request());
+ EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url());
- scoped_refptr<ResultFuture> result3;
- service.ResolveProxy(&result3, GURL("http://request3"));
+ net::ProxyInfo info2;
+ TestCompletionCallback callback2;
+ net::ProxyService::PacRequest* request2;
+ rv = service.ResolveProxy(
+ GURL("http://request2"), &info2, &callback2, &request2);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+ net::ProxyInfo info3;
+ TestCompletionCallback callback3;
+ rv = service.ResolveProxy(
+ GURL("http://request3"), &info3, &callback3, NULL);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
+
+ // Nothing has been sent to the resolver yet.
+ EXPECT_TRUE(resolver->pending_requests().empty());
+
// Cancel the first 2 requests.
- result1->Cancel();
- result2->Cancel();
+ service.CancelPacRequest(request1);
+ service.CancelPacRequest(request2);
// 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(net::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());
+ ASSERT_EQ(1u, resolver->pending_requests().size());
+ EXPECT_EQ(GURL("http://request3"), resolver->pending_requests()[0]->url());
+
// Complete all the requests.
- result3->WaitUntilCompleted();
+ resolver->pending_requests()[0]->results()->UseNamedProxy("request3:80");
+ resolver->pending_requests()[0]->CompleteNow(net::OK);
- EXPECT_FALSE(result1->IsCompleted()); // Cancelled.
- EXPECT_FALSE(result2->IsCompleted()); // Cancelled.
+ EXPECT_EQ(net::OK, callback3.WaitForResult());
+ EXPECT_EQ("request3:80", info3.proxy_server().ToURI());
- EXPECT_TRUE(result3->IsCompleted());
- EXPECT_EQ(net::OK, result3->GetResultCode());
- EXPECT_EQ("pac-v1.request3:80",
- result3->GetProxyInfo().proxy_server().ToURI());
+ EXPECT_TRUE(resolver->cancelled_requests().empty());
+
+ EXPECT_FALSE(callback1.have_result()); // Cancelled.
+ EXPECT_FALSE(callback2.have_result()); // Cancelled.
}
TEST(ProxyServiceTest, ResetProxyConfigService) {
net::ProxyConfig config1;
config1.proxy_rules.ParseFromString("foopy1:8080");
config1.auto_detect = false;
- scoped_ptr<SyncProxyService> service(
- new SyncProxyService(new MockProxyConfigService(config1),
- new MockProxyResolverWithoutFetch));
+ net::ProxyService service(new MockProxyConfigService(config1),
+ new MockAsyncProxyResolverExpectsBytes);
net::ProxyInfo info;
- service->ResolveProxy(GURL("http://request1"), &info);
+ TestCompletionCallback callback1;
+ int rv = service.ResolveProxy(
+ GURL("http://request1"), &info, &callback1, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_EQ("foopy1:8080", info.proxy_server().ToURI());
net::ProxyConfig config2;
config2.proxy_rules.ParseFromString("foopy2:8080");
config2.auto_detect = false;
- int result = service->ResetConfigService(new MockProxyConfigService(config2));
- DCHECK(result == 0);
- service->ResolveProxy(GURL("http://request2"), &info);
+ service.ResetConfigService(new MockProxyConfigService(config2));
+ TestCompletionCallback callback2;
+ rv = service.ResolveProxy(GURL("http://request2"), &info, &callback2, NULL);
+ EXPECT_EQ(net::OK, rv);
EXPECT_EQ("foopy2:8080", info.proxy_server().ToURI());
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698