1eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// Use of this source code is governed by a BSD-style license that can be 3eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi// found in the LICENSE file. 4eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 5eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#ifndef NET_PROXY_MOCK_PROXY_RESOLVER_H_ 6eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#define NET_PROXY_MOCK_PROXY_RESOLVER_H_ 7eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 8eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include <vector> 9eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 10eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "base/memory/scoped_ptr.h" 11eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "net/base/net_errors.h" 12eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "net/proxy/proxy_resolver.h" 13eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi#include "url/gurl.h" 14eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 15eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivinamespace base { 16eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Triviclass MessageLoop; 17eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi} 18eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 19eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivinamespace net { 20eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 21e7bfcdc183454ec959ff51342f0973cabba219b2Jean-Michel Trivi// Asynchronous mock proxy resolver. All requests complete asynchronously, 22581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi// user must call Request::CompleteNow() on a pending request to signal it. 23581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Triviclass MockAsyncProxyResolverBase : public ProxyResolver { 24581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi public: 25581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi class Request : public base::RefCounted<Request> { 26581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi public: 27581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi Request(MockAsyncProxyResolverBase* resolver, 28581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi const GURL& url, 29581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ProxyInfo* results, 30581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi const net::CompletionCallback& callback); 31581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 32581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi const GURL& url() const { return url_; } 33581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ProxyInfo* results() const { return results_; } 3468d56b8ebaf60184a3aef988e3d2b09ed8b88c05Jean-Michel Trivi const net::CompletionCallback& callback() const { return callback_; } 35581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 36581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi void CompleteNow(int rv); 37581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 38581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi private: 39581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi friend class base::RefCounted<Request>; 40581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 41581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi virtual ~Request(); 42581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 43581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi MockAsyncProxyResolverBase* resolver_; 44581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi const GURL url_; 45581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi ProxyInfo* results_; 46581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi net::CompletionCallback callback_; 47581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi base::MessageLoop* origin_loop_; 48581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi }; 49581a0f550f15f6fc22199cb85775a220f668b480Jean-Michel Trivi 50eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi class SetPacScriptRequest { 51eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi public: 52d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi SetPacScriptRequest( 53d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi MockAsyncProxyResolverBase* resolver, 54d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const scoped_refptr<ProxyResolverScriptData>& script_data, 55d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const net::CompletionCallback& callback); 56d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi ~SetPacScriptRequest(); 57d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 58d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const ProxyResolverScriptData* script_data() const { 59d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi return script_data_.get(); 60d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 61d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 62d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi void CompleteNow(int rv); 63d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 64d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi private: 65d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi MockAsyncProxyResolverBase* resolver_; 66d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const scoped_refptr<ProxyResolverScriptData> script_data_; 67d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi net::CompletionCallback callback_; 68d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi base::MessageLoop* origin_loop_; 69d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi }; 70d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 71d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi typedef std::vector<scoped_refptr<Request> > RequestsList; 72d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 73d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi virtual ~MockAsyncProxyResolverBase(); 74d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 75d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi // ProxyResolver implementation. 76d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi virtual int GetProxyForURL(const GURL& url, 77d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi ProxyInfo* results, 78d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const net::CompletionCallback& callback, 79d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi RequestHandle* request_handle, 80d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const BoundNetLog& /*net_log*/) OVERRIDE; 81d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi virtual void CancelRequest(RequestHandle request_handle) OVERRIDE; 82d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi virtual LoadState GetLoadState(RequestHandle request_handle) const OVERRIDE; 83d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi virtual int SetPacScript( 84d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const scoped_refptr<ProxyResolverScriptData>& script_data, 85d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const net::CompletionCallback& callback) OVERRIDE; 86d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi virtual void CancelSetPacScript() OVERRIDE; 87d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 88d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const RequestsList& pending_requests() const { 89d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi return pending_requests_; 90d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 91d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 92d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi const RequestsList& cancelled_requests() const { 93d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi return cancelled_requests_; 94d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 95d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 96d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi SetPacScriptRequest* pending_set_pac_script_request() const; 97d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 98d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi bool has_pending_set_pac_script_request() const { 99d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi return pending_set_pac_script_request_.get() != NULL; 100d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi } 101d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 102d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi void RemovePendingRequest(Request* request); 103d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 104d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi void RemovePendingSetPacScriptRequest(SetPacScriptRequest* request); 105d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 106d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi protected: 107d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi explicit MockAsyncProxyResolverBase(bool expects_pac_bytes); 108d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi 109d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi private: 110d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi RequestsList pending_requests_; 111d158d31a6bbb06426b71c3d097b7768bc3fb79a3Jean-Michel Trivi RequestsList cancelled_requests_; 112eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi scoped_ptr<SetPacScriptRequest> pending_set_pac_script_request_; 113eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}; 114eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 115eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Triviclass MockAsyncProxyResolver : public MockAsyncProxyResolverBase { 116eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi public: 117eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi MockAsyncProxyResolver() 118eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi : MockAsyncProxyResolverBase(false /*expects_pac_bytes*/) {} 119eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi}; 120eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 121eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Triviclass MockAsyncProxyResolverExpectsBytes : public MockAsyncProxyResolverBase { 122eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi public: 12397876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi MockAsyncProxyResolverExpectsBytes() 124eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi : MockAsyncProxyResolverBase(true /*expects_pac_bytes*/) {} 12597876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi}; 126f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi 127f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi} // namespace net 128eae4df541ba1d46f65d37e959baf2127aa632c93Jean-Michel Trivi 129f271eea20f9fff6c101213b34652399f457bcd50Jean-Michel Trivi#endif // NET_PROXY_MOCK_PROXY_RESOLVER_H_ 13097876858aa17c7f24c6a1d60be09a57bc1824ba3Jean-Michel Trivi