OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "googleurl/src/gurl.h" | 9 #include "googleurl/src/gurl.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
11 #include "net/base/test_completion_callback.h" | 11 #include "net/base/test_completion_callback.h" |
| 12 #include "net/proxy/mock_proxy_resolver.h" |
12 #include "net/proxy/proxy_config_service.h" | 13 #include "net/proxy/proxy_config_service.h" |
13 #include "net/proxy/proxy_resolver.h" | 14 #include "net/proxy/proxy_resolver.h" |
14 #include "net/proxy/proxy_script_fetcher.h" | 15 #include "net/proxy/proxy_script_fetcher.h" |
15 #include "net/proxy/proxy_service.h" | 16 #include "net/proxy/proxy_service.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
17 | 18 |
18 // TODO(eroman): Write a test which exercises | 19 // TODO(eroman): Write a test which exercises |
19 // ProxyService::SuspendAllPendingRequests(). | 20 // ProxyService::SuspendAllPendingRequests(). |
20 namespace net { | 21 namespace net { |
21 namespace { | 22 namespace { |
22 | 23 |
23 class MockProxyConfigService: public ProxyConfigService { | 24 class MockProxyConfigService: public ProxyConfigService { |
24 public: | 25 public: |
25 MockProxyConfigService() {} // Direct connect. | 26 MockProxyConfigService() {} // Direct connect. |
26 explicit MockProxyConfigService(const ProxyConfig& pc) : config(pc) {} | 27 explicit MockProxyConfigService(const ProxyConfig& pc) : config(pc) {} |
27 explicit MockProxyConfigService(const std::string& pac_url) { | 28 explicit MockProxyConfigService(const std::string& pac_url) { |
28 config.pac_url = GURL(pac_url); | 29 config.pac_url = GURL(pac_url); |
29 } | 30 } |
30 | 31 |
31 virtual int GetProxyConfig(ProxyConfig* results) { | 32 virtual int GetProxyConfig(ProxyConfig* results) { |
32 *results = config; | 33 *results = config; |
33 return OK; | 34 return OK; |
34 } | 35 } |
35 | 36 |
36 ProxyConfig config; | 37 ProxyConfig config; |
37 }; | 38 }; |
38 | 39 |
39 // Asynchronous mock proxy resolver. All requests complete asynchronously, | |
40 // user must call Request::CompleteNow() on a pending request to signal it. | |
41 class MockAsyncProxyResolverBase : public ProxyResolver { | |
42 public: | |
43 class Request : public base::RefCounted<Request> { | |
44 public: | |
45 Request(MockAsyncProxyResolverBase* resolver, | |
46 const GURL& url, | |
47 ProxyInfo* results, | |
48 CompletionCallback* callback) | |
49 : resolver_(resolver), | |
50 url_(url), | |
51 results_(results), | |
52 callback_(callback), | |
53 origin_loop_(MessageLoop::current()) { | |
54 } | |
55 | |
56 const GURL& url() const { return url_; } | |
57 ProxyInfo* results() const { return results_; } | |
58 CompletionCallback* callback() const { return callback_; } | |
59 | |
60 void CompleteNow(int rv) { | |
61 CompletionCallback* callback = callback_; | |
62 | |
63 // May delete |this|. | |
64 resolver_->RemovePendingRequest(this); | |
65 | |
66 callback->Run(rv); | |
67 } | |
68 | |
69 private: | |
70 MockAsyncProxyResolverBase* resolver_; | |
71 const GURL url_; | |
72 ProxyInfo* results_; | |
73 CompletionCallback* callback_; | |
74 MessageLoop* origin_loop_; | |
75 }; | |
76 | |
77 class SetPacScriptRequest { | |
78 public: | |
79 SetPacScriptRequest(MockAsyncProxyResolverBase* resolver, | |
80 const GURL& pac_url, | |
81 const std::string& pac_bytes, | |
82 CompletionCallback* callback) | |
83 : resolver_(resolver), | |
84 pac_url_(pac_url), | |
85 pac_bytes_(pac_bytes), | |
86 callback_(callback), | |
87 origin_loop_(MessageLoop::current()) { | |
88 } | |
89 | |
90 const GURL& pac_url() const { return pac_url_; } | |
91 const std::string& pac_bytes() const { return pac_bytes_; } | |
92 | |
93 void CompleteNow(int rv) { | |
94 CompletionCallback* callback = callback_; | |
95 | |
96 // Will delete |this|. | |
97 resolver_->RemovePendingSetPacScriptRequest(this); | |
98 | |
99 callback->Run(rv); | |
100 } | |
101 | |
102 private: | |
103 MockAsyncProxyResolverBase* resolver_; | |
104 const GURL pac_url_; | |
105 const std::string pac_bytes_; | |
106 CompletionCallback* callback_; | |
107 MessageLoop* origin_loop_; | |
108 }; | |
109 | |
110 typedef std::vector<scoped_refptr<Request> > RequestsList; | |
111 | |
112 // ProxyResolver implementation: | |
113 virtual int GetProxyForURL(const GURL& url, | |
114 ProxyInfo* results, | |
115 CompletionCallback* callback, | |
116 RequestHandle* request_handle) { | |
117 scoped_refptr<Request> request = new Request(this, url, results, callback); | |
118 pending_requests_.push_back(request); | |
119 | |
120 if (request_handle) | |
121 *request_handle = reinterpret_cast<RequestHandle>(request.get()); | |
122 | |
123 // Test code completes the request by calling request->CompleteNow(). | |
124 return ERR_IO_PENDING; | |
125 } | |
126 | |
127 virtual void CancelRequest(RequestHandle request_handle) { | |
128 scoped_refptr<Request> request = reinterpret_cast<Request*>(request_handle); | |
129 cancelled_requests_.push_back(request); | |
130 RemovePendingRequest(request); | |
131 } | |
132 | |
133 virtual int SetPacScript(const GURL& pac_url, | |
134 const std::string& pac_bytes, | |
135 CompletionCallback* callback) { | |
136 EXPECT_EQ(NULL, pending_set_pac_script_request_.get()); | |
137 pending_set_pac_script_request_.reset( | |
138 new SetPacScriptRequest(this, pac_url, pac_bytes, callback)); | |
139 // Finished when user calls SetPacScriptRequest::CompleteNow(). | |
140 return ERR_IO_PENDING; | |
141 } | |
142 | |
143 const RequestsList& pending_requests() const { | |
144 return pending_requests_; | |
145 } | |
146 | |
147 const RequestsList& cancelled_requests() const { | |
148 return cancelled_requests_; | |
149 } | |
150 | |
151 SetPacScriptRequest* pending_set_pac_script_request() const { | |
152 return pending_set_pac_script_request_.get(); | |
153 } | |
154 | |
155 void RemovePendingRequest(Request* request) { | |
156 RequestsList::iterator it = std::find( | |
157 pending_requests_.begin(), pending_requests_.end(), request); | |
158 DCHECK(it != pending_requests_.end()); | |
159 pending_requests_.erase(it); | |
160 } | |
161 | |
162 void RemovePendingSetPacScriptRequest(SetPacScriptRequest* request) { | |
163 EXPECT_EQ(request, pending_set_pac_script_request()); | |
164 pending_set_pac_script_request_.reset(); | |
165 } | |
166 | |
167 protected: | |
168 explicit MockAsyncProxyResolverBase(bool expects_pac_bytes) | |
169 : ProxyResolver(expects_pac_bytes) {} | |
170 | |
171 private: | |
172 RequestsList pending_requests_; | |
173 RequestsList cancelled_requests_; | |
174 scoped_ptr<SetPacScriptRequest> pending_set_pac_script_request_; | |
175 }; | |
176 | |
177 class MockAsyncProxyResolver : public MockAsyncProxyResolverBase { | |
178 public: | |
179 MockAsyncProxyResolver() | |
180 : MockAsyncProxyResolverBase(false /*expects_pac_bytes*/) {} | |
181 }; | |
182 | |
183 class MockAsyncProxyResolverExpectsBytes : public MockAsyncProxyResolverBase { | |
184 public: | |
185 MockAsyncProxyResolverExpectsBytes() | |
186 : MockAsyncProxyResolverBase(true /*expects_pac_bytes*/) {} | |
187 }; | |
188 | |
189 } // namespace | 40 } // namespace |
190 | 41 |
191 // A mock ProxyScriptFetcher. No result will be returned to the fetch client | 42 // A mock ProxyScriptFetcher. No result will be returned to the fetch client |
192 // until we call NotifyFetchCompletion() to set the results. | 43 // until we call NotifyFetchCompletion() to set the results. |
193 class MockProxyScriptFetcher : public ProxyScriptFetcher { | 44 class MockProxyScriptFetcher : public ProxyScriptFetcher { |
194 public: | 45 public: |
195 MockProxyScriptFetcher() | 46 MockProxyScriptFetcher() |
196 : pending_request_callback_(NULL), pending_request_bytes_(NULL) { | 47 : pending_request_callback_(NULL), pending_request_bytes_(NULL) { |
197 } | 48 } |
198 | 49 |
(...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1620 ProxyInfo info2; | 1471 ProxyInfo info2; |
1621 TestCompletionCallback callback2; | 1472 TestCompletionCallback callback2; |
1622 rv = service.ResolveProxy( | 1473 rv = service.ResolveProxy( |
1623 GURL("http://www.google.com"), &info2, &callback2, NULL); | 1474 GURL("http://www.google.com"), &info2, &callback2, NULL); |
1624 EXPECT_EQ(OK, rv); | 1475 EXPECT_EQ(OK, rv); |
1625 | 1476 |
1626 EXPECT_TRUE(info2.is_direct()); | 1477 EXPECT_TRUE(info2.is_direct()); |
1627 } | 1478 } |
1628 | 1479 |
1629 } // namespace net | 1480 } // namespace net |
OLD | NEW |