blob: 0b1e8a52f9be0b624699e5a34ec545bfc4242772 [file] [log] [blame]
[email protected]c6efbc62009-08-06 12:52:191// Copyright (c) 2009 The Chromium Authors. All rights reserved.
[email protected]550dd1ae2009-08-06 05:42:112// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]c6efbc62009-08-06 12:52:195#ifndef NET_PROXY_MOCK_PROXY_RESOLVER_H_
6#define NET_PROXY_MOCK_PROXY_RESOLVER_H_
7
[email protected]550dd1ae2009-08-06 05:42:118#include <vector>
9
10#include "base/logging.h"
11#include "googleurl/src/gurl.h"
12#include "net/base/net_errors.h"
13#include "net/proxy/proxy_resolver.h"
14
15namespace net {
16
17// Asynchronous mock proxy resolver. All requests complete asynchronously,
18// user must call Request::CompleteNow() on a pending request to signal it.
19class MockAsyncProxyResolverBase : public ProxyResolver {
20 public:
21 class Request : public base::RefCounted<Request> {
22 public:
23 Request(MockAsyncProxyResolverBase* resolver,
24 const GURL& url,
25 ProxyInfo* results,
26 CompletionCallback* callback)
27 : resolver_(resolver),
28 url_(url),
29 results_(results),
30 callback_(callback),
31 origin_loop_(MessageLoop::current()) {
32 }
33
34 const GURL& url() const { return url_; }
35 ProxyInfo* results() const { return results_; }
36 CompletionCallback* callback() const { return callback_; }
37
38 void CompleteNow(int rv) {
39 CompletionCallback* callback = callback_;
40
41 // May delete |this|.
42 resolver_->RemovePendingRequest(this);
43
44 callback->Run(rv);
45 }
46
47 private:
48 MockAsyncProxyResolverBase* resolver_;
49 const GURL url_;
50 ProxyInfo* results_;
51 CompletionCallback* callback_;
52 MessageLoop* origin_loop_;
53 };
54
55 class SetPacScriptRequest {
56 public:
57 SetPacScriptRequest(MockAsyncProxyResolverBase* resolver,
58 const GURL& pac_url,
59 const std::string& pac_bytes,
60 CompletionCallback* callback)
61 : resolver_(resolver),
62 pac_url_(pac_url),
63 pac_bytes_(pac_bytes),
64 callback_(callback),
65 origin_loop_(MessageLoop::current()) {
66 }
67
68 const GURL& pac_url() const { return pac_url_; }
69 const std::string& pac_bytes() const { return pac_bytes_; }
70
71 void CompleteNow(int rv) {
72 CompletionCallback* callback = callback_;
73
74 // Will delete |this|.
75 resolver_->RemovePendingSetPacScriptRequest(this);
76
77 callback->Run(rv);
78 }
79
80 private:
81 MockAsyncProxyResolverBase* resolver_;
82 const GURL pac_url_;
83 const std::string pac_bytes_;
84 CompletionCallback* callback_;
85 MessageLoop* origin_loop_;
86 };
87
88 typedef std::vector<scoped_refptr<Request> > RequestsList;
89
90 // ProxyResolver implementation:
91 virtual int GetProxyForURL(const GURL& url,
92 ProxyInfo* results,
93 CompletionCallback* callback,
94 RequestHandle* request_handle) {
95 scoped_refptr<Request> request = new Request(this, url, results, callback);
96 pending_requests_.push_back(request);
97
98 if (request_handle)
99 *request_handle = reinterpret_cast<RequestHandle>(request.get());
100
101 // Test code completes the request by calling request->CompleteNow().
102 return ERR_IO_PENDING;
103 }
104
105 virtual void CancelRequest(RequestHandle request_handle) {
106 scoped_refptr<Request> request = reinterpret_cast<Request*>(request_handle);
107 cancelled_requests_.push_back(request);
108 RemovePendingRequest(request);
109 }
110
111 virtual int SetPacScript(const GURL& pac_url,
112 const std::string& pac_bytes,
113 CompletionCallback* callback) {
[email protected]c6efbc62009-08-06 12:52:19114 DCHECK(!pending_set_pac_script_request_.get());
[email protected]550dd1ae2009-08-06 05:42:11115 pending_set_pac_script_request_.reset(
116 new SetPacScriptRequest(this, pac_url, pac_bytes, callback));
117 // Finished when user calls SetPacScriptRequest::CompleteNow().
118 return ERR_IO_PENDING;
119 }
120
121 const RequestsList& pending_requests() const {
122 return pending_requests_;
123 }
124
125 const RequestsList& cancelled_requests() const {
126 return cancelled_requests_;
127 }
128
129 SetPacScriptRequest* pending_set_pac_script_request() const {
130 return pending_set_pac_script_request_.get();
131 }
132
133 void RemovePendingRequest(Request* request) {
134 RequestsList::iterator it = std::find(
135 pending_requests_.begin(), pending_requests_.end(), request);
136 DCHECK(it != pending_requests_.end());
137 pending_requests_.erase(it);
138 }
139
140 void RemovePendingSetPacScriptRequest(SetPacScriptRequest* request) {
[email protected]c6efbc62009-08-06 12:52:19141 DCHECK_EQ(request, pending_set_pac_script_request());
[email protected]550dd1ae2009-08-06 05:42:11142 pending_set_pac_script_request_.reset();
143 }
144
145 protected:
146 explicit MockAsyncProxyResolverBase(bool expects_pac_bytes)
147 : ProxyResolver(expects_pac_bytes) {}
148
149 private:
150 RequestsList pending_requests_;
151 RequestsList cancelled_requests_;
152 scoped_ptr<SetPacScriptRequest> pending_set_pac_script_request_;
153};
154
155class MockAsyncProxyResolver : public MockAsyncProxyResolverBase {
156 public:
157 MockAsyncProxyResolver()
158 : MockAsyncProxyResolverBase(false /*expects_pac_bytes*/) {}
159};
160
161class MockAsyncProxyResolverExpectsBytes : public MockAsyncProxyResolverBase {
162 public:
163 MockAsyncProxyResolverExpectsBytes()
164 : MockAsyncProxyResolverBase(true /*expects_pac_bytes*/) {}
165};
166
[email protected]a692c6f2009-08-06 12:11:05167} // namespace net
[email protected]c6efbc62009-08-06 12:52:19168
169#endif // NET_PROXY_MOCK_PROXY_RESOLVER_H_