Chromium Code Reviews

Side by Side Diff: net/http/http_proxy_client_socket_pool_unittest.cc

Issue 2870030: Implement SSLClientSocketPool. (Closed)
Patch Set: Rebase and fix mac compile error Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "net/http/http_proxy_client_socket_pool.h" 5 #include "net/http/http_proxy_client_socket_pool.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/time.h"
10 #include "net/base/auth.h"
11 #include "net/base/mock_host_resolver.h"
12 #include "net/base/net_errors.h" 9 #include "net/base/net_errors.h"
13 #include "net/base/test_completion_callback.h" 10 #include "net/base/test_completion_callback.h"
14 #include "net/http/http_auth_controller.h" 11 #include "net/http/http_proxy_client_socket.h"
15 #include "net/http/http_network_session.h"
16 #include "net/http/http_request_headers.h"
17 #include "net/http/http_response_headers.h"
18 #include "net/socket/client_socket_factory.h"
19 #include "net/socket/client_socket_handle.h" 12 #include "net/socket/client_socket_handle.h"
20 #include "net/socket/client_socket_pool_histograms.h" 13 #include "net/socket/client_socket_pool_histograms.h"
21 #include "net/socket/socket_test_util.h" 14 #include "net/socket/socket_test_util.h"
22 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
23 16
24 namespace net { 17 namespace net {
25 18
26 namespace { 19 namespace {
27 20
28 const int kMaxSockets = 32; 21 const int kMaxSockets = 32;
29 const int kMaxSocketsPerGroup = 6; 22 const int kMaxSocketsPerGroup = 6;
30 23
31 struct MockHttpAuthControllerData {
32 MockHttpAuthControllerData(std::string header) : auth_header(header) {}
33
34 std::string auth_header;
35 };
36
37 class MockHttpAuthController : public HttpAuthController {
38 public:
39 MockHttpAuthController()
40 : HttpAuthController(HttpAuth::AUTH_PROXY, GURL(),
41 scoped_refptr<HttpNetworkSession>(NULL)),
42 data_(NULL),
43 data_index_(0),
44 data_count_(0) {
45 }
46
47 void SetMockAuthControllerData(struct MockHttpAuthControllerData* data,
48 size_t data_length) {
49 data_ = data;
50 data_count_ = data_length;
51 }
52
53 // HttpAuthController methods.
54 virtual int MaybeGenerateAuthToken(const HttpRequestInfo* request,
55 CompletionCallback* callback,
56 const BoundNetLog& net_log) {
57 return OK;
58 }
59 virtual void AddAuthorizationHeader(
60 HttpRequestHeaders* authorization_headers) {
61 authorization_headers->AddHeadersFromString(CurrentData().auth_header);
62 }
63 virtual int HandleAuthChallenge(scoped_refptr<HttpResponseHeaders> headers,
64 bool do_not_send_server_auth,
65 bool establishing_tunnel,
66 const BoundNetLog& net_log) {
67 return OK;
68 }
69 virtual bool HaveAuthHandler() const { return HaveAuth(); }
70 virtual bool HaveAuth() const {
71 return CurrentData().auth_header.size() != 0; }
72
73 private:
74 virtual ~MockHttpAuthController() {}
75 const struct MockHttpAuthControllerData& CurrentData() const {
76 DCHECK(data_index_ < data_count_);
77 return data_[data_index_];
78 }
79
80 MockHttpAuthControllerData* data_;
81 size_t data_index_;
82 size_t data_count_;
83 };
84
85 class HttpProxyClientSocketPoolTest : public ClientSocketPoolTest { 24 class HttpProxyClientSocketPoolTest : public ClientSocketPoolTest {
86 protected: 25 protected:
87 HttpProxyClientSocketPoolTest() 26 HttpProxyClientSocketPoolTest()
88 : ignored_tcp_socket_params_(new TCPSocketParams( 27 : ignored_tcp_socket_params_(new TCPSocketParams(
89 HostPortPair("proxy", 80), MEDIUM, GURL(), false)), 28 HostPortPair("proxy", 80), MEDIUM, GURL(), false)),
90 tcp_histograms_(new ClientSocketPoolHistograms("MockTCP")), 29 tcp_histograms_(new ClientSocketPoolHistograms("MockTCP")),
91 tcp_socket_pool_(new MockTCPClientSocketPool(kMaxSockets, 30 tcp_socket_pool_(new MockTCPClientSocketPool(kMaxSockets,
92 kMaxSocketsPerGroup, tcp_histograms_, &tcp_client_socket_factory_)), 31 kMaxSocketsPerGroup, tcp_histograms_, &tcp_client_socket_factory_)),
93 notunnel_socket_params_(new HttpProxySocketParams( 32 notunnel_socket_params_(new HttpProxySocketParams(
94 ignored_tcp_socket_params_, GURL("http://host"), 33 ignored_tcp_socket_params_, GURL("http://host"),
(...skipping 29 matching lines...)
124 StaticSocketDataProvider data; 63 StaticSocketDataProvider data;
125 data.set_connect_data(MockConnect(false, 0)); 64 data.set_connect_data(MockConnect(false, 0));
126 tcp_client_socket_factory_.AddSocketDataProvider(&data); 65 tcp_client_socket_factory_.AddSocketDataProvider(&data);
127 66
128 ClientSocketHandle handle; 67 ClientSocketHandle handle;
129 int rv = handle.Init("a", notunnel_socket_params_, LOW, NULL, pool_, 68 int rv = handle.Init("a", notunnel_socket_params_, LOW, NULL, pool_,
130 BoundNetLog()); 69 BoundNetLog());
131 EXPECT_EQ(OK, rv); 70 EXPECT_EQ(OK, rv);
132 EXPECT_TRUE(handle.is_initialized()); 71 EXPECT_TRUE(handle.is_initialized());
133 EXPECT_TRUE(handle.socket()); 72 EXPECT_TRUE(handle.socket());
73 HttpProxyClientSocket* tunnel_socket =
74 static_cast<HttpProxyClientSocket*>(handle.socket());
75 EXPECT_FALSE(tunnel_socket->NeedsRestartWithAuth());
134 } 76 }
135 77
136 TEST_F(HttpProxyClientSocketPoolTest, NeedAuth) { 78 TEST_F(HttpProxyClientSocketPoolTest, NeedAuth) {
137 MockWrite writes[] = { 79 MockWrite writes[] = {
138 MockWrite("CONNECT host:80 HTTP/1.1\r\n" 80 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
139 "Host: host\r\n" 81 "Host: host\r\n"
140 "Proxy-Connection: keep-alive\r\n\r\n"), 82 "Proxy-Connection: keep-alive\r\n\r\n"),
141 }; 83 };
142 MockRead reads[] = { 84 MockRead reads[] = {
143 // No credentials. 85 // No credentials.
(...skipping 15 matching lines...)
159 TestCompletionCallback callback; 101 TestCompletionCallback callback;
160 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, 102 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_,
161 BoundNetLog()); 103 BoundNetLog());
162 EXPECT_EQ(ERR_IO_PENDING, rv); 104 EXPECT_EQ(ERR_IO_PENDING, rv);
163 EXPECT_FALSE(handle.is_initialized()); 105 EXPECT_FALSE(handle.is_initialized());
164 EXPECT_FALSE(handle.socket()); 106 EXPECT_FALSE(handle.socket());
165 107
166 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); 108 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
167 EXPECT_TRUE(handle.is_initialized()); 109 EXPECT_TRUE(handle.is_initialized());
168 EXPECT_TRUE(handle.socket()); 110 EXPECT_TRUE(handle.socket());
111 HttpProxyClientSocket* tunnel_socket =
112 static_cast<HttpProxyClientSocket*>(handle.socket());
113 EXPECT_TRUE(tunnel_socket->NeedsRestartWithAuth());
169 } 114 }
170 115
171 TEST_F(HttpProxyClientSocketPoolTest, HaveAuth) { 116 TEST_F(HttpProxyClientSocketPoolTest, HaveAuth) {
172 MockWrite writes[] = { 117 MockWrite writes[] = {
173 MockWrite(false, 118 MockWrite(false,
174 "CONNECT host:80 HTTP/1.1\r\n" 119 "CONNECT host:80 HTTP/1.1\r\n"
175 "Host: host\r\n" 120 "Host: host\r\n"
176 "Proxy-Connection: keep-alive\r\n" 121 "Proxy-Connection: keep-alive\r\n"
177 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), 122 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
178 }; 123 };
(...skipping 10 matching lines...)
189 }; 134 };
190 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); 135 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data));
191 136
192 ClientSocketHandle handle; 137 ClientSocketHandle handle;
193 TestCompletionCallback callback; 138 TestCompletionCallback callback;
194 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, 139 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_,
195 BoundNetLog()); 140 BoundNetLog());
196 EXPECT_EQ(OK, rv); 141 EXPECT_EQ(OK, rv);
197 EXPECT_TRUE(handle.is_initialized()); 142 EXPECT_TRUE(handle.is_initialized());
198 EXPECT_TRUE(handle.socket()); 143 EXPECT_TRUE(handle.socket());
144 HttpProxyClientSocket* tunnel_socket =
145 static_cast<HttpProxyClientSocket*>(handle.socket());
146 EXPECT_FALSE(tunnel_socket->NeedsRestartWithAuth());
199 } 147 }
200 148
201 TEST_F(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { 149 TEST_F(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
202 MockWrite writes[] = { 150 MockWrite writes[] = {
203 MockWrite("CONNECT host:80 HTTP/1.1\r\n" 151 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
204 "Host: host\r\n" 152 "Host: host\r\n"
205 "Proxy-Connection: keep-alive\r\n" 153 "Proxy-Connection: keep-alive\r\n"
206 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), 154 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
207 }; 155 };
208 MockRead reads[] = { 156 MockRead reads[] = {
(...skipping 12 matching lines...)
221 TestCompletionCallback callback; 169 TestCompletionCallback callback;
222 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, 170 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_,
223 BoundNetLog()); 171 BoundNetLog());
224 EXPECT_EQ(ERR_IO_PENDING, rv); 172 EXPECT_EQ(ERR_IO_PENDING, rv);
225 EXPECT_FALSE(handle.is_initialized()); 173 EXPECT_FALSE(handle.is_initialized());
226 EXPECT_FALSE(handle.socket()); 174 EXPECT_FALSE(handle.socket());
227 175
228 EXPECT_EQ(OK, callback.WaitForResult()); 176 EXPECT_EQ(OK, callback.WaitForResult());
229 EXPECT_TRUE(handle.is_initialized()); 177 EXPECT_TRUE(handle.is_initialized());
230 EXPECT_TRUE(handle.socket()); 178 EXPECT_TRUE(handle.socket());
179 HttpProxyClientSocket* tunnel_socket =
180 static_cast<HttpProxyClientSocket*>(handle.socket());
181 EXPECT_FALSE(tunnel_socket->NeedsRestartWithAuth());
231 } 182 }
232 183
233 TEST_F(HttpProxyClientSocketPoolTest, TCPError) { 184 TEST_F(HttpProxyClientSocketPoolTest, TCPError) {
234 StaticSocketDataProvider data; 185 StaticSocketDataProvider data;
235 data.set_connect_data(MockConnect(true, ERR_CONNECTION_CLOSED)); 186 data.set_connect_data(MockConnect(true, ERR_CONNECTION_CLOSED));
236 187
237 tcp_client_socket_factory_.AddSocketDataProvider(&data); 188 tcp_client_socket_factory_.AddSocketDataProvider(&data);
238 189
239 ClientSocketHandle handle; 190 ClientSocketHandle handle;
240 TestCompletionCallback callback; 191 TestCompletionCallback callback;
(...skipping 29 matching lines...)
270 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data)); 221 auth_controller_->SetMockAuthControllerData(auth_data, arraysize(auth_data));
271 222
272 ClientSocketHandle handle; 223 ClientSocketHandle handle;
273 TestCompletionCallback callback; 224 TestCompletionCallback callback;
274 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_, 225 int rv = handle.Init("a", tunnel_socket_params_, LOW, &callback, pool_,
275 BoundNetLog()); 226 BoundNetLog());
276 EXPECT_EQ(ERR_IO_PENDING, rv); 227 EXPECT_EQ(ERR_IO_PENDING, rv);
277 EXPECT_FALSE(handle.is_initialized()); 228 EXPECT_FALSE(handle.is_initialized());
278 EXPECT_FALSE(handle.socket()); 229 EXPECT_FALSE(handle.socket());
279 230
280 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback.WaitForResult()); 231 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
281 EXPECT_FALSE(handle.is_initialized()); 232 EXPECT_FALSE(handle.is_initialized());
282 EXPECT_FALSE(handle.socket()); 233 EXPECT_FALSE(handle.socket());
283 } 234 }
284 235
285 TEST_F(HttpProxyClientSocketPoolTest, TunnelSetupError) { 236 TEST_F(HttpProxyClientSocketPoolTest, TunnelSetupError) {
286 MockWrite writes[] = { 237 MockWrite writes[] = {
287 MockWrite("CONNECT host:80 HTTP/1.1\r\n" 238 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
288 "Host: host\r\n" 239 "Host: host\r\n"
289 "Proxy-Connection: keep-alive\r\n" 240 "Proxy-Connection: keep-alive\r\n"
290 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"), 241 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
(...skipping 21 matching lines...)
312 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback.WaitForResult()); 263 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback.WaitForResult());
313 EXPECT_FALSE(handle.is_initialized()); 264 EXPECT_FALSE(handle.is_initialized());
314 EXPECT_FALSE(handle.socket()); 265 EXPECT_FALSE(handle.socket());
315 } 266 }
316 267
317 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. 268 // It would be nice to also test the timeouts in HttpProxyClientSocketPool.
318 269
319 } // namespace 270 } // namespace
320 271
321 } // namespace net 272 } // namespace net
OLDNEW

Powered by Google App Engine