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

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

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/base/test_completion_callback.h" 12 #include "net/base/test_completion_callback.h"
13 #include "net/http/http_network_session.h" 13 #include "net/http/http_network_session.h"
14 #include "net/http/http_proxy_client_socket.h" 14 #include "net/http/http_proxy_client_socket.h"
15 #include "net/http/http_response_headers.h" 15 #include "net/http/http_response_headers.h"
16 #include "net/socket/client_socket_handle.h" 16 #include "net/socket/client_socket_handle.h"
17 #include "net/socket/client_socket_pool_histograms.h" 17 #include "net/socket/client_socket_pool_histograms.h"
18 #include "net/socket/next_proto.h" 18 #include "net/socket/next_proto.h"
19 #include "net/socket/socket_test_util.h" 19 #include "net/socket/socket_test_util.h"
20 #include "net/spdy/spdy_protocol.h" 20 #include "net/spdy/spdy_protocol.h"
21 #include "net/spdy/spdy_test_util_common.h" 21 #include "net/spdy/spdy_test_util_common.h"
22 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
23 23
24 namespace net { 24 namespace net {
25 25
26 namespace { 26 namespace {
27 27
28 const int kMaxSockets = 32; 28 const int kMaxSockets = 32;
29 const int kMaxSocketsPerGroup = 6; 29 const int kMaxSocketsPerGroup = 6;
30 const char * const kAuthHeaders[] = { 30 const char* const kAuthHeaders[] = {"proxy-authorization",
31 "proxy-authorization", "Basic Zm9vOmJhcg==" 31 "Basic Zm9vOmJhcg=="};
32 };
33 const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2; 32 const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2;
34 33
35 enum HttpProxyType { 34 enum HttpProxyType { HTTP, HTTPS, SPDY };
36 HTTP,
37 HTTPS,
38 SPDY
39 };
40 35
41 struct HttpProxyClientSocketPoolTestParams { 36 struct HttpProxyClientSocketPoolTestParams {
42 HttpProxyClientSocketPoolTestParams() 37 HttpProxyClientSocketPoolTestParams()
43 : proxy_type(HTTP), 38 : proxy_type(HTTP), protocol(kProtoSPDY3) {}
44 protocol(kProtoSPDY3) {}
45 39
46 HttpProxyClientSocketPoolTestParams( 40 HttpProxyClientSocketPoolTestParams(HttpProxyType proxy_type,
47 HttpProxyType proxy_type, 41 NextProto protocol)
48 NextProto protocol) 42 : proxy_type(proxy_type), protocol(protocol) {}
49 : proxy_type(proxy_type),
50 protocol(protocol) {}
51 43
52 HttpProxyType proxy_type; 44 HttpProxyType proxy_type;
53 NextProto protocol; 45 NextProto protocol;
54 }; 46 };
55 47
56 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; 48 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam;
57 49
58 const char kHttpProxyHost[] = "httpproxy.example.com"; 50 const char kHttpProxyHost[] = "httpproxy.example.com";
59 const char kHttpsProxyHost[] = "httpsproxy.example.com"; 51 const char kHttpsProxyHost[] = "httpsproxy.example.com";
60 52
(...skipping 28 matching lines...) Expand all
89 http_proxy_histograms_("HttpProxyUnitTest"), 81 http_proxy_histograms_("HttpProxyUnitTest"),
90 spdy_util_(GetParam().protocol), 82 spdy_util_(GetParam().protocol),
91 pool_(kMaxSockets, 83 pool_(kMaxSockets,
92 kMaxSocketsPerGroup, 84 kMaxSocketsPerGroup,
93 &http_proxy_histograms_, 85 &http_proxy_histograms_,
94 NULL, 86 NULL,
95 &transport_socket_pool_, 87 &transport_socket_pool_,
96 &ssl_socket_pool_, 88 &ssl_socket_pool_,
97 NULL) {} 89 NULL) {}
98 90
99 virtual ~HttpProxyClientSocketPoolTest() { 91 virtual ~HttpProxyClientSocketPoolTest() {}
100 }
101 92
102 void AddAuthToCache() { 93 void AddAuthToCache() {
103 const base::string16 kFoo(base::ASCIIToUTF16("foo")); 94 const base::string16 kFoo(base::ASCIIToUTF16("foo"));
104 const base::string16 kBar(base::ASCIIToUTF16("bar")); 95 const base::string16 kBar(base::ASCIIToUTF16("bar"));
105 GURL proxy_url(GetParam().proxy_type == HTTP ? 96 GURL proxy_url(GetParam().proxy_type == HTTP
106 (std::string("http://") + kHttpProxyHost) : 97 ? (std::string("http://") + kHttpProxyHost)
107 (std::string("https://") + kHttpsProxyHost)); 98 : (std::string("https://") + kHttpsProxyHost));
108 session_->http_auth_cache()->Add(proxy_url, 99 session_->http_auth_cache()->Add(proxy_url,
109 "MyRealm1", 100 "MyRealm1",
110 HttpAuth::AUTH_SCHEME_BASIC, 101 HttpAuth::AUTH_SCHEME_BASIC,
111 "Basic realm=MyRealm1", 102 "Basic realm=MyRealm1",
112 AuthCredentials(kFoo, kBar), 103 AuthCredentials(kFoo, kBar),
113 "/"); 104 "/");
114 } 105 }
115 106
116 scoped_refptr<TransportSocketParams> CreateHttpProxyParams() const { 107 scoped_refptr<TransportSocketParams> CreateHttpProxyParams() const {
117 if (GetParam().proxy_type != HTTP) 108 if (GetParam().proxy_type != HTTP)
118 return NULL; 109 return NULL;
119 return new TransportSocketParams(HostPortPair(kHttpProxyHost, 80), 110 return new TransportSocketParams(HostPortPair(kHttpProxyHost, 80),
120 false, 111 false,
121 false, 112 false,
122 OnHostResolutionCallback()); 113 OnHostResolutionCallback());
123 } 114 }
124 115
125 scoped_refptr<SSLSocketParams> CreateHttpsProxyParams() const { 116 scoped_refptr<SSLSocketParams> CreateHttpsProxyParams() const {
126 if (GetParam().proxy_type == HTTP) 117 if (GetParam().proxy_type == HTTP)
127 return NULL; 118 return NULL;
128 return new SSLSocketParams( 119 return new SSLSocketParams(
129 new TransportSocketParams( 120 new TransportSocketParams(HostPortPair(kHttpsProxyHost, 443),
130 HostPortPair(kHttpsProxyHost, 443), 121 false,
131 false, 122 false,
132 false, 123 OnHostResolutionCallback()),
133 OnHostResolutionCallback()),
134 NULL, 124 NULL,
135 NULL, 125 NULL,
136 HostPortPair(kHttpsProxyHost, 443), 126 HostPortPair(kHttpsProxyHost, 443),
137 SSLConfig(), 127 SSLConfig(),
138 PRIVACY_MODE_DISABLED, 128 PRIVACY_MODE_DISABLED,
139 0, 129 0,
140 false, 130 false,
141 false); 131 false);
142 } 132 }
143 133
(...skipping 17 matching lines...) Expand all
161 } 151 }
162 152
163 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() { 153 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() {
164 return CreateParams(false); 154 return CreateParams(false);
165 } 155 }
166 156
167 DeterministicMockClientSocketFactory* socket_factory() { 157 DeterministicMockClientSocketFactory* socket_factory() {
168 return session_deps_.deterministic_socket_factory.get(); 158 return session_deps_.deterministic_socket_factory.get();
169 } 159 }
170 160
171 void Initialize(MockRead* reads, size_t reads_count, 161 void Initialize(MockRead* reads,
172 MockWrite* writes, size_t writes_count, 162 size_t reads_count,
173 MockRead* spdy_reads, size_t spdy_reads_count, 163 MockWrite* writes,
174 MockWrite* spdy_writes, size_t spdy_writes_count) { 164 size_t writes_count,
165 MockRead* spdy_reads,
166 size_t spdy_reads_count,
167 MockWrite* spdy_writes,
168 size_t spdy_writes_count) {
175 if (GetParam().proxy_type == SPDY) { 169 if (GetParam().proxy_type == SPDY) {
176 data_.reset(new DeterministicSocketData(spdy_reads, spdy_reads_count, 170 data_.reset(new DeterministicSocketData(
177 spdy_writes, spdy_writes_count)); 171 spdy_reads, spdy_reads_count, spdy_writes, spdy_writes_count));
178 } else { 172 } else {
179 data_.reset(new DeterministicSocketData(reads, reads_count, writes, 173 data_.reset(new DeterministicSocketData(
180 writes_count)); 174 reads, reads_count, writes, writes_count));
181 } 175 }
182 176
183 data_->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 177 data_->set_connect_data(MockConnect(SYNCHRONOUS, OK));
184 data_->StopAfter(2); // Request / Response 178 data_->StopAfter(2); // Request / Response
185 179
186 socket_factory()->AddSocketDataProvider(data_.get()); 180 socket_factory()->AddSocketDataProvider(data_.get());
187 181
188 if (GetParam().proxy_type != HTTP) { 182 if (GetParam().proxy_type != HTTP) {
189 ssl_data_.reset(new SSLSocketDataProvider(SYNCHRONOUS, OK)); 183 ssl_data_.reset(new SSLSocketDataProvider(SYNCHRONOUS, OK));
190 if (GetParam().proxy_type == SPDY) { 184 if (GetParam().proxy_type == SPDY) {
191 InitializeSpdySsl(); 185 InitializeSpdySsl();
192 } 186 }
193 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); 187 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
194 } 188 }
195 } 189 }
196 190
197 void InitializeSpdySsl() { 191 void InitializeSpdySsl() { ssl_data_->SetNextProto(GetParam().protocol); }
198 ssl_data_->SetNextProto(GetParam().protocol);
199 }
200 192
201 HttpNetworkSession* CreateNetworkSession() { 193 HttpNetworkSession* CreateNetworkSession() {
202 return SpdySessionDependencies::SpdyCreateSessionDeterministic( 194 return SpdySessionDependencies::SpdyCreateSessionDeterministic(
203 &session_deps_); 195 &session_deps_);
204 } 196 }
205 197
206 RequestPriority GetLastTransportRequestPriority() const { 198 RequestPriority GetLastTransportRequestPriority() const {
207 return transport_socket_pool_.last_request_priority(); 199 return transport_socket_pool_.last_request_priority();
208 } 200 }
209 201
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), 240 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31),
249 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), 241 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31),
250 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), 242 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31),
251 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), 243 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4),
252 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), 244 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4),
253 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); 245 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4)));
254 246
255 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { 247 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) {
256 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); 248 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
257 249
258 int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, CompletionCallback(), 250 int rv = handle_.Init("a",
259 &pool_, BoundNetLog()); 251 CreateNoTunnelParams(),
252 LOW,
253 CompletionCallback(),
254 &pool_,
255 BoundNetLog());
260 EXPECT_EQ(OK, rv); 256 EXPECT_EQ(OK, rv);
261 EXPECT_TRUE(handle_.is_initialized()); 257 EXPECT_TRUE(handle_.is_initialized());
262 ASSERT_TRUE(handle_.socket()); 258 ASSERT_TRUE(handle_.socket());
263 HttpProxyClientSocket* tunnel_socket = 259 HttpProxyClientSocket* tunnel_socket =
264 static_cast<HttpProxyClientSocket*>(handle_.socket()); 260 static_cast<HttpProxyClientSocket*>(handle_.socket());
265 EXPECT_TRUE(tunnel_socket->IsConnected()); 261 EXPECT_TRUE(tunnel_socket->IsConnected());
266 } 262 }
267 263
268 // Make sure that HttpProxyConnectJob passes on its priority to its 264 // Make sure that HttpProxyConnectJob passes on its priority to its
269 // (non-SSL) socket request on Init. 265 // (non-SSL) socket request on Init.
270 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { 266 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) {
271 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); 267 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
272 EXPECT_EQ(OK, 268 EXPECT_EQ(OK,
273 handle_.Init("a", CreateNoTunnelParams(), HIGHEST, 269 handle_.Init("a",
274 CompletionCallback(), &pool_, BoundNetLog())); 270 CreateNoTunnelParams(),
271 HIGHEST,
272 CompletionCallback(),
273 &pool_,
274 BoundNetLog()));
275 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); 275 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority());
276 } 276 }
277 277
278 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { 278 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) {
279 MockWrite writes[] = { 279 MockWrite writes[] = {
280 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" 280 MockWrite(ASYNC,
281 "Host: www.google.com\r\n" 281 0,
282 "Proxy-Connection: keep-alive\r\n\r\n"), 282 "CONNECT www.google.com:443 HTTP/1.1\r\n"
283 "Host: www.google.com\r\n"
284 "Proxy-Connection: keep-alive\r\n\r\n"),
283 }; 285 };
284 MockRead reads[] = { 286 MockRead reads[] = {
285 // No credentials. 287 // No credentials.
286 MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"), 288 MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"),
287 MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), 289 MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
288 MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"), 290 MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"),
289 MockRead(ASYNC, 4, "0123456789"), 291 MockRead(ASYNC, 4, "0123456789"),
290 }; 292 };
291 scoped_ptr<SpdyFrame> req( 293 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOW));
292 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOW));
293 scoped_ptr<SpdyFrame> rst( 294 scoped_ptr<SpdyFrame> rst(
294 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 295 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
295 MockWrite spdy_writes[] = { 296 MockWrite spdy_writes[] = {
296 CreateMockWrite(*req, 0, ASYNC), 297 CreateMockWrite(*req, 0, ASYNC), CreateMockWrite(*rst, 2, ASYNC),
297 CreateMockWrite(*rst, 2, ASYNC),
298 }; 298 };
299 const char* const kAuthChallenge[] = { 299 const char* const kAuthChallenge[] = {
300 spdy_util_.GetStatusKey(), "407 Proxy Authentication Required", 300 spdy_util_.GetStatusKey(), "407 Proxy Authentication Required",
301 spdy_util_.GetVersionKey(), "HTTP/1.1", 301 spdy_util_.GetVersionKey(), "HTTP/1.1",
302 "proxy-authenticate", "Basic realm=\"MyRealm1\"", 302 "proxy-authenticate", "Basic realm=\"MyRealm1\"",
303 }; 303 };
304 scoped_ptr<SpdyFrame> resp( 304 scoped_ptr<SpdyFrame> resp(
305 spdy_util_.ConstructSpdyControlFrame(NULL, 305 spdy_util_.ConstructSpdyControlFrame(NULL,
306 0, 306 0,
307 false, 307 false,
308 1, 308 1,
309 LOW, 309 LOW,
310 SYN_REPLY, 310 SYN_REPLY,
311 CONTROL_FLAG_NONE, 311 CONTROL_FLAG_NONE,
312 kAuthChallenge, 312 kAuthChallenge,
313 arraysize(kAuthChallenge), 313 arraysize(kAuthChallenge),
314 0)); 314 0));
315 MockRead spdy_reads[] = { 315 MockRead spdy_reads[] = {CreateMockRead(*resp, 1, ASYNC),
316 CreateMockRead(*resp, 1, ASYNC), 316 MockRead(ASYNC, 0, 3)};
317 MockRead(ASYNC, 0, 3)
318 };
319 317
320 Initialize(reads, arraysize(reads), writes, arraysize(writes), 318 Initialize(reads,
321 spdy_reads, arraysize(spdy_reads), spdy_writes, 319 arraysize(reads),
320 writes,
321 arraysize(writes),
322 spdy_reads,
323 arraysize(spdy_reads),
324 spdy_writes,
322 arraysize(spdy_writes)); 325 arraysize(spdy_writes));
323 326
324 data_->StopAfter(4); 327 data_->StopAfter(4);
325 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 328 int rv = handle_.Init("a",
326 &pool_, BoundNetLog()); 329 CreateTunnelParams(),
330 LOW,
331 callback_.callback(),
332 &pool_,
333 BoundNetLog());
327 EXPECT_EQ(ERR_IO_PENDING, rv); 334 EXPECT_EQ(ERR_IO_PENDING, rv);
328 EXPECT_FALSE(handle_.is_initialized()); 335 EXPECT_FALSE(handle_.is_initialized());
329 EXPECT_FALSE(handle_.socket()); 336 EXPECT_FALSE(handle_.socket());
330 337
331 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); 338 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4);
332 rv = callback_.WaitForResult(); 339 rv = callback_.WaitForResult();
333 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); 340 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv);
334 EXPECT_TRUE(handle_.is_initialized()); 341 EXPECT_TRUE(handle_.is_initialized());
335 ASSERT_TRUE(handle_.socket()); 342 ASSERT_TRUE(handle_.socket());
336 ProxyClientSocket* tunnel_socket = 343 ProxyClientSocket* tunnel_socket =
337 static_cast<ProxyClientSocket*>(handle_.socket()); 344 static_cast<ProxyClientSocket*>(handle_.socket());
338 if (GetParam().proxy_type == SPDY) { 345 if (GetParam().proxy_type == SPDY) {
339 EXPECT_TRUE(tunnel_socket->IsConnected()); 346 EXPECT_TRUE(tunnel_socket->IsConnected());
340 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); 347 EXPECT_TRUE(tunnel_socket->IsUsingSpdy());
341 } else { 348 } else {
342 EXPECT_FALSE(tunnel_socket->IsConnected()); 349 EXPECT_FALSE(tunnel_socket->IsConnected());
343 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); 350 EXPECT_FALSE(tunnel_socket->IsUsingSpdy());
344 } 351 }
345 } 352 }
346 353
347 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { 354 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) {
348 // It's pretty much impossible to make the SPDY case behave synchronously 355 // It's pretty much impossible to make the SPDY case behave synchronously
349 // so we skip this test for SPDY 356 // so we skip this test for SPDY
350 if (GetParam().proxy_type == SPDY) 357 if (GetParam().proxy_type == SPDY)
351 return; 358 return;
352 MockWrite writes[] = { 359 MockWrite writes[] = {
353 MockWrite(SYNCHRONOUS, 0, 360 MockWrite(SYNCHRONOUS,
354 "CONNECT www.google.com:443 HTTP/1.1\r\n" 361 0,
355 "Host: www.google.com\r\n" 362 "CONNECT www.google.com:443 HTTP/1.1\r\n"
356 "Proxy-Connection: keep-alive\r\n" 363 "Host: www.google.com\r\n"
357 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 364 "Proxy-Connection: keep-alive\r\n"
365 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
358 }; 366 };
359 MockRead reads[] = { 367 MockRead reads[] = {
360 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), 368 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"),
361 }; 369 };
362 370
363 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, 371 Initialize(
364 NULL, 0); 372 reads, arraysize(reads), writes, arraysize(writes), NULL, 0, NULL, 0);
365 AddAuthToCache(); 373 AddAuthToCache();
366 374
367 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 375 int rv = handle_.Init("a",
368 &pool_, BoundNetLog()); 376 CreateTunnelParams(),
377 LOW,
378 callback_.callback(),
379 &pool_,
380 BoundNetLog());
369 EXPECT_EQ(OK, rv); 381 EXPECT_EQ(OK, rv);
370 EXPECT_TRUE(handle_.is_initialized()); 382 EXPECT_TRUE(handle_.is_initialized());
371 ASSERT_TRUE(handle_.socket()); 383 ASSERT_TRUE(handle_.socket());
372 HttpProxyClientSocket* tunnel_socket = 384 HttpProxyClientSocket* tunnel_socket =
373 static_cast<HttpProxyClientSocket*>(handle_.socket()); 385 static_cast<HttpProxyClientSocket*>(handle_.socket());
374 EXPECT_TRUE(tunnel_socket->IsConnected()); 386 EXPECT_TRUE(tunnel_socket->IsConnected());
375 } 387 }
376 388
377 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { 389 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
378 MockWrite writes[] = { 390 MockWrite writes[] = {
379 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" 391 MockWrite(ASYNC,
380 "Host: www.google.com\r\n" 392 0,
381 "Proxy-Connection: keep-alive\r\n" 393 "CONNECT www.google.com:443 HTTP/1.1\r\n"
382 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 394 "Host: www.google.com\r\n"
395 "Proxy-Connection: keep-alive\r\n"
396 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
383 }; 397 };
384 MockRead reads[] = { 398 MockRead reads[] = {
385 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), 399 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"),
386 }; 400 };
387 401
388 scoped_ptr<SpdyFrame> req( 402 scoped_ptr<SpdyFrame> req(
389 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); 403 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW));
390 MockWrite spdy_writes[] = { 404 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0, ASYNC)};
391 CreateMockWrite(*req, 0, ASYNC)
392 };
393 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 405 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
394 MockRead spdy_reads[] = { 406 MockRead spdy_reads[] = {CreateMockRead(*resp, 1, ASYNC),
395 CreateMockRead(*resp, 1, ASYNC), 407 MockRead(ASYNC, 0, 2)};
396 MockRead(ASYNC, 0, 2)
397 };
398 408
399 Initialize(reads, arraysize(reads), writes, arraysize(writes), 409 Initialize(reads,
400 spdy_reads, arraysize(spdy_reads), spdy_writes, 410 arraysize(reads),
411 writes,
412 arraysize(writes),
413 spdy_reads,
414 arraysize(spdy_reads),
415 spdy_writes,
401 arraysize(spdy_writes)); 416 arraysize(spdy_writes));
402 AddAuthToCache(); 417 AddAuthToCache();
403 418
404 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 419 int rv = handle_.Init("a",
405 &pool_, BoundNetLog()); 420 CreateTunnelParams(),
421 LOW,
422 callback_.callback(),
423 &pool_,
424 BoundNetLog());
406 EXPECT_EQ(ERR_IO_PENDING, rv); 425 EXPECT_EQ(ERR_IO_PENDING, rv);
407 EXPECT_FALSE(handle_.is_initialized()); 426 EXPECT_FALSE(handle_.is_initialized());
408 EXPECT_FALSE(handle_.socket()); 427 EXPECT_FALSE(handle_.socket());
409 428
410 data_->RunFor(2); 429 data_->RunFor(2);
411 EXPECT_EQ(OK, callback_.WaitForResult()); 430 EXPECT_EQ(OK, callback_.WaitForResult());
412 EXPECT_TRUE(handle_.is_initialized()); 431 EXPECT_TRUE(handle_.is_initialized());
413 ASSERT_TRUE(handle_.socket()); 432 ASSERT_TRUE(handle_.socket());
414 HttpProxyClientSocket* tunnel_socket = 433 HttpProxyClientSocket* tunnel_socket =
415 static_cast<HttpProxyClientSocket*>(handle_.socket()); 434 static_cast<HttpProxyClientSocket*>(handle_.socket());
416 EXPECT_TRUE(tunnel_socket->IsConnected()); 435 EXPECT_TRUE(tunnel_socket->IsConnected());
417 } 436 }
418 437
419 // Make sure that HttpProxyConnectJob passes on its priority to its 438 // Make sure that HttpProxyConnectJob passes on its priority to its
420 // SPDY session's socket request on Init (if applicable). 439 // SPDY session's socket request on Init (if applicable).
421 TEST_P(HttpProxyClientSocketPoolTest, 440 TEST_P(HttpProxyClientSocketPoolTest,
422 SetSpdySessionSocketRequestPriorityOnInit) { 441 SetSpdySessionSocketRequestPriorityOnInit) {
423 if (GetParam().proxy_type != SPDY) 442 if (GetParam().proxy_type != SPDY)
424 return; 443 return;
425 444
426 scoped_ptr<SpdyFrame> req( 445 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(
427 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 446 kAuthHeaders, kAuthHeadersSize, 1, MEDIUM));
428 1, MEDIUM)); 447 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0, ASYNC)};
429 MockWrite spdy_writes[] = {
430 CreateMockWrite(*req, 0, ASYNC)
431 };
432 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 448 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
433 MockRead spdy_reads[] = { 449 MockRead spdy_reads[] = {CreateMockRead(*resp, 1, ASYNC),
434 CreateMockRead(*resp, 1, ASYNC), 450 MockRead(ASYNC, 0, 2)};
435 MockRead(ASYNC, 0, 2)
436 };
437 451
438 Initialize(NULL, 0, NULL, 0, 452 Initialize(NULL,
439 spdy_reads, arraysize(spdy_reads), 453 0,
440 spdy_writes, arraysize(spdy_writes)); 454 NULL,
455 0,
456 spdy_reads,
457 arraysize(spdy_reads),
458 spdy_writes,
459 arraysize(spdy_writes));
441 AddAuthToCache(); 460 AddAuthToCache();
442 461
443 EXPECT_EQ(ERR_IO_PENDING, 462 EXPECT_EQ(ERR_IO_PENDING,
444 handle_.Init("a", CreateTunnelParams(), MEDIUM, 463 handle_.Init("a",
445 callback_.callback(), &pool_, BoundNetLog())); 464 CreateTunnelParams(),
465 MEDIUM,
466 callback_.callback(),
467 &pool_,
468 BoundNetLog()));
446 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); 469 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority());
447 470
448 data_->RunFor(2); 471 data_->RunFor(2);
449 EXPECT_EQ(OK, callback_.WaitForResult()); 472 EXPECT_EQ(OK, callback_.WaitForResult());
450 } 473 }
451 474
452 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { 475 TEST_P(HttpProxyClientSocketPoolTest, TCPError) {
453 if (GetParam().proxy_type == SPDY) return; 476 if (GetParam().proxy_type == SPDY)
477 return;
454 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); 478 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0));
455 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); 479 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED));
456 480
457 socket_factory()->AddSocketDataProvider(data_.get()); 481 socket_factory()->AddSocketDataProvider(data_.get());
458 482
459 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 483 int rv = handle_.Init("a",
460 &pool_, BoundNetLog()); 484 CreateTunnelParams(),
485 LOW,
486 callback_.callback(),
487 &pool_,
488 BoundNetLog());
461 EXPECT_EQ(ERR_IO_PENDING, rv); 489 EXPECT_EQ(ERR_IO_PENDING, rv);
462 EXPECT_FALSE(handle_.is_initialized()); 490 EXPECT_FALSE(handle_.is_initialized());
463 EXPECT_FALSE(handle_.socket()); 491 EXPECT_FALSE(handle_.socket());
464 492
465 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); 493 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult());
466 494
467 EXPECT_FALSE(handle_.is_initialized()); 495 EXPECT_FALSE(handle_.is_initialized());
468 EXPECT_FALSE(handle_.socket()); 496 EXPECT_FALSE(handle_.socket());
469 } 497 }
470 498
471 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { 499 TEST_P(HttpProxyClientSocketPoolTest, SSLError) {
472 if (GetParam().proxy_type == HTTP) return; 500 if (GetParam().proxy_type == HTTP)
501 return;
473 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); 502 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0));
474 data_->set_connect_data(MockConnect(ASYNC, OK)); 503 data_->set_connect_data(MockConnect(ASYNC, OK));
475 socket_factory()->AddSocketDataProvider(data_.get()); 504 socket_factory()->AddSocketDataProvider(data_.get());
476 505
477 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, 506 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, ERR_CERT_AUTHORITY_INVALID));
478 ERR_CERT_AUTHORITY_INVALID));
479 if (GetParam().proxy_type == SPDY) { 507 if (GetParam().proxy_type == SPDY) {
480 InitializeSpdySsl(); 508 InitializeSpdySsl();
481 } 509 }
482 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); 510 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
483 511
484 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 512 int rv = handle_.Init("a",
485 &pool_, BoundNetLog()); 513 CreateTunnelParams(),
514 LOW,
515 callback_.callback(),
516 &pool_,
517 BoundNetLog());
486 EXPECT_EQ(ERR_IO_PENDING, rv); 518 EXPECT_EQ(ERR_IO_PENDING, rv);
487 EXPECT_FALSE(handle_.is_initialized()); 519 EXPECT_FALSE(handle_.is_initialized());
488 EXPECT_FALSE(handle_.socket()); 520 EXPECT_FALSE(handle_.socket());
489 521
490 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); 522 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult());
491 523
492 EXPECT_FALSE(handle_.is_initialized()); 524 EXPECT_FALSE(handle_.is_initialized());
493 EXPECT_FALSE(handle_.socket()); 525 EXPECT_FALSE(handle_.socket());
494 } 526 }
495 527
496 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { 528 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) {
497 if (GetParam().proxy_type == HTTP) return; 529 if (GetParam().proxy_type == HTTP)
530 return;
498 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); 531 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0));
499 data_->set_connect_data(MockConnect(ASYNC, OK)); 532 data_->set_connect_data(MockConnect(ASYNC, OK));
500 socket_factory()->AddSocketDataProvider(data_.get()); 533 socket_factory()->AddSocketDataProvider(data_.get());
501 534
502 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, 535 ssl_data_.reset(
503 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); 536 new SSLSocketDataProvider(ASYNC, ERR_SSL_CLIENT_AUTH_CERT_NEEDED));
504 if (GetParam().proxy_type == SPDY) { 537 if (GetParam().proxy_type == SPDY) {
505 InitializeSpdySsl(); 538 InitializeSpdySsl();
506 } 539 }
507 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); 540 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
508 541
509 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 542 int rv = handle_.Init("a",
510 &pool_, BoundNetLog()); 543 CreateTunnelParams(),
544 LOW,
545 callback_.callback(),
546 &pool_,
547 BoundNetLog());
511 EXPECT_EQ(ERR_IO_PENDING, rv); 548 EXPECT_EQ(ERR_IO_PENDING, rv);
512 EXPECT_FALSE(handle_.is_initialized()); 549 EXPECT_FALSE(handle_.is_initialized());
513 EXPECT_FALSE(handle_.socket()); 550 EXPECT_FALSE(handle_.socket());
514 551
515 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); 552 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult());
516 553
517 EXPECT_FALSE(handle_.is_initialized()); 554 EXPECT_FALSE(handle_.is_initialized());
518 EXPECT_FALSE(handle_.socket()); 555 EXPECT_FALSE(handle_.socket());
519 } 556 }
520 557
521 TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) { 558 TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) {
522 MockWrite writes[] = { 559 MockWrite writes[] = {
523 MockWrite(ASYNC, 0, 560 MockWrite(ASYNC,
524 "CONNECT www.google.com:443 HTTP/1.1\r\n" 561 0,
525 "Host: www.google.com\r\n" 562 "CONNECT www.google.com:443 HTTP/1.1\r\n"
526 "Proxy-Connection: keep-alive\r\n" 563 "Host: www.google.com\r\n"
527 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 564 "Proxy-Connection: keep-alive\r\n"
565 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
528 }; 566 };
529 MockRead reads[] = { 567 MockRead reads[] = {
530 MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"), 568 MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"),
531 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2), 569 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2),
532 }; 570 };
533 scoped_ptr<SpdyFrame> req( 571 scoped_ptr<SpdyFrame> req(
534 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); 572 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW));
535 MockWrite spdy_writes[] = { 573 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0, ASYNC)};
536 CreateMockWrite(*req, 0, ASYNC)
537 };
538 MockRead spdy_reads[] = { 574 MockRead spdy_reads[] = {
539 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), 575 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1),
540 }; 576 };
541 577
542 Initialize(reads, arraysize(reads), writes, arraysize(writes), 578 Initialize(reads,
543 spdy_reads, arraysize(spdy_reads), spdy_writes, 579 arraysize(reads),
580 writes,
581 arraysize(writes),
582 spdy_reads,
583 arraysize(spdy_reads),
584 spdy_writes,
544 arraysize(spdy_writes)); 585 arraysize(spdy_writes));
545 AddAuthToCache(); 586 AddAuthToCache();
546 587
547 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 588 int rv = handle_.Init("a",
548 &pool_, BoundNetLog()); 589 CreateTunnelParams(),
590 LOW,
591 callback_.callback(),
592 &pool_,
593 BoundNetLog());
549 EXPECT_EQ(ERR_IO_PENDING, rv); 594 EXPECT_EQ(ERR_IO_PENDING, rv);
550 EXPECT_FALSE(handle_.is_initialized()); 595 EXPECT_FALSE(handle_.is_initialized());
551 EXPECT_FALSE(handle_.socket()); 596 EXPECT_FALSE(handle_.socket());
552 597
553 data_->RunFor(3); 598 data_->RunFor(3);
554 if (GetParam().proxy_type == SPDY) { 599 if (GetParam().proxy_type == SPDY) {
555 // SPDY cannot process a headers block unless it's complete and so it 600 // SPDY cannot process a headers block unless it's complete and so it
556 // returns ERR_CONNECTION_CLOSED in this case. 601 // returns ERR_CONNECTION_CLOSED in this case.
557 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); 602 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult());
558 } else { 603 } else {
559 EXPECT_EQ(ERR_RESPONSE_HEADERS_TRUNCATED, callback_.WaitForResult()); 604 EXPECT_EQ(ERR_RESPONSE_HEADERS_TRUNCATED, callback_.WaitForResult());
560 } 605 }
561 EXPECT_FALSE(handle_.is_initialized()); 606 EXPECT_FALSE(handle_.is_initialized());
562 EXPECT_FALSE(handle_.socket()); 607 EXPECT_FALSE(handle_.socket());
563 } 608 }
564 609
565 TEST_P(HttpProxyClientSocketPoolTest, Tunnel1xxResponse) { 610 TEST_P(HttpProxyClientSocketPoolTest, Tunnel1xxResponse) {
566 // Tests that 1xx responses are rejected for a CONNECT request. 611 // Tests that 1xx responses are rejected for a CONNECT request.
567 if (GetParam().proxy_type == SPDY) { 612 if (GetParam().proxy_type == SPDY) {
568 // SPDY doesn't have 1xx responses. 613 // SPDY doesn't have 1xx responses.
569 return; 614 return;
570 } 615 }
571 616
572 MockWrite writes[] = { 617 MockWrite writes[] = {
573 MockWrite(ASYNC, 0, 618 MockWrite(ASYNC,
574 "CONNECT www.google.com:443 HTTP/1.1\r\n" 619 0,
575 "Host: www.google.com\r\n" 620 "CONNECT www.google.com:443 HTTP/1.1\r\n"
576 "Proxy-Connection: keep-alive\r\n\r\n"), 621 "Host: www.google.com\r\n"
622 "Proxy-Connection: keep-alive\r\n\r\n"),
577 }; 623 };
578 MockRead reads[] = { 624 MockRead reads[] = {
579 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), 625 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"),
580 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), 626 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"),
581 }; 627 };
582 628
583 Initialize(reads, arraysize(reads), writes, arraysize(writes), 629 Initialize(
584 NULL, 0, NULL, 0); 630 reads, arraysize(reads), writes, arraysize(writes), NULL, 0, NULL, 0);
585 631
586 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 632 int rv = handle_.Init("a",
587 &pool_, BoundNetLog()); 633 CreateTunnelParams(),
634 LOW,
635 callback_.callback(),
636 &pool_,
637 BoundNetLog());
588 EXPECT_EQ(ERR_IO_PENDING, rv); 638 EXPECT_EQ(ERR_IO_PENDING, rv);
589 EXPECT_FALSE(handle_.is_initialized()); 639 EXPECT_FALSE(handle_.is_initialized());
590 EXPECT_FALSE(handle_.socket()); 640 EXPECT_FALSE(handle_.socket());
591 641
592 data_->RunFor(2); 642 data_->RunFor(2);
593 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); 643 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult());
594 } 644 }
595 645
596 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { 646 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) {
597 MockWrite writes[] = { 647 MockWrite writes[] = {
598 MockWrite(ASYNC, 0, 648 MockWrite(ASYNC,
599 "CONNECT www.google.com:443 HTTP/1.1\r\n" 649 0,
600 "Host: www.google.com\r\n" 650 "CONNECT www.google.com:443 HTTP/1.1\r\n"
601 "Proxy-Connection: keep-alive\r\n" 651 "Host: www.google.com\r\n"
602 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 652 "Proxy-Connection: keep-alive\r\n"
653 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
603 }; 654 };
604 MockRead reads[] = { 655 MockRead reads[] = {
605 MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"), 656 MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"),
606 }; 657 };
607 scoped_ptr<SpdyFrame> req( 658 scoped_ptr<SpdyFrame> req(
608 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); 659 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW));
609 scoped_ptr<SpdyFrame> rst( 660 scoped_ptr<SpdyFrame> rst(
610 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 661 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
611 MockWrite spdy_writes[] = { 662 MockWrite spdy_writes[] = {
612 CreateMockWrite(*req, 0, ASYNC), 663 CreateMockWrite(*req, 0, ASYNC), CreateMockWrite(*rst, 2, ASYNC),
613 CreateMockWrite(*rst, 2, ASYNC),
614 }; 664 };
615 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(1)); 665 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(1));
616 MockRead spdy_reads[] = { 666 MockRead spdy_reads[] = {
617 CreateMockRead(*resp, 1, ASYNC), 667 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3),
618 MockRead(ASYNC, 0, 3),
619 }; 668 };
620 669
621 Initialize(reads, arraysize(reads), writes, arraysize(writes), 670 Initialize(reads,
622 spdy_reads, arraysize(spdy_reads), spdy_writes, 671 arraysize(reads),
672 writes,
673 arraysize(writes),
674 spdy_reads,
675 arraysize(spdy_reads),
676 spdy_writes,
623 arraysize(spdy_writes)); 677 arraysize(spdy_writes));
624 AddAuthToCache(); 678 AddAuthToCache();
625 679
626 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 680 int rv = handle_.Init("a",
627 &pool_, BoundNetLog()); 681 CreateTunnelParams(),
682 LOW,
683 callback_.callback(),
684 &pool_,
685 BoundNetLog());
628 EXPECT_EQ(ERR_IO_PENDING, rv); 686 EXPECT_EQ(ERR_IO_PENDING, rv);
629 EXPECT_FALSE(handle_.is_initialized()); 687 EXPECT_FALSE(handle_.is_initialized());
630 EXPECT_FALSE(handle_.socket()); 688 EXPECT_FALSE(handle_.socket());
631 689
632 data_->RunFor(2); 690 data_->RunFor(2);
633 691
634 rv = callback_.WaitForResult(); 692 rv = callback_.WaitForResult();
635 // All Proxy CONNECT responses are not trustworthy 693 // All Proxy CONNECT responses are not trustworthy
636 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); 694 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv);
637 EXPECT_FALSE(handle_.is_initialized()); 695 EXPECT_FALSE(handle_.is_initialized());
638 EXPECT_FALSE(handle_.socket()); 696 EXPECT_FALSE(handle_.socket());
639 } 697 }
640 698
641 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupRedirect) { 699 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupRedirect) {
642 const std::string redirectTarget = "https://foo.google.com/"; 700 const std::string redirectTarget = "https://foo.google.com/";
643 701
644 const std::string responseText = "HTTP/1.1 302 Found\r\n" 702 const std::string responseText =
645 "Location: " + redirectTarget + "\r\n" 703 "HTTP/1.1 302 Found\r\n"
646 "Set-Cookie: foo=bar\r\n" 704 "Location: " +
647 "\r\n"; 705 redirectTarget +
706 "\r\n"
707 "Set-Cookie: foo=bar\r\n"
708 "\r\n";
648 MockWrite writes[] = { 709 MockWrite writes[] = {
649 MockWrite(ASYNC, 0, 710 MockWrite(ASYNC,
650 "CONNECT www.google.com:443 HTTP/1.1\r\n" 711 0,
651 "Host: www.google.com\r\n" 712 "CONNECT www.google.com:443 HTTP/1.1\r\n"
652 "Proxy-Connection: keep-alive\r\n" 713 "Host: www.google.com\r\n"
653 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 714 "Proxy-Connection: keep-alive\r\n"
715 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
654 }; 716 };
655 MockRead reads[] = { 717 MockRead reads[] = {
656 MockRead(ASYNC, 1, responseText.c_str()), 718 MockRead(ASYNC, 1, responseText.c_str()),
657 }; 719 };
658 scoped_ptr<SpdyFrame> req( 720 scoped_ptr<SpdyFrame> req(
659 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); 721 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW));
660 scoped_ptr<SpdyFrame> rst( 722 scoped_ptr<SpdyFrame> rst(
661 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 723 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
662 724
663 MockWrite spdy_writes[] = { 725 MockWrite spdy_writes[] = {
664 CreateMockWrite(*req, 0, ASYNC), 726 CreateMockWrite(*req, 0, ASYNC), CreateMockWrite(*rst, 3, ASYNC),
665 CreateMockWrite(*rst, 3, ASYNC),
666 }; 727 };
667 728
668 const char* const responseHeaders[] = { 729 const char* const responseHeaders[] = {
669 "location", redirectTarget.c_str(), 730 "location", redirectTarget.c_str(), "set-cookie", "foo=bar",
670 "set-cookie", "foo=bar",
671 }; 731 };
672 const int responseHeadersSize = arraysize(responseHeaders) / 2; 732 const int responseHeadersSize = arraysize(responseHeaders) / 2;
673 scoped_ptr<SpdyFrame> resp( 733 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(
674 spdy_util_.ConstructSpdySynReplyError( 734 "302 Found", responseHeaders, responseHeadersSize, 1));
675 "302 Found",
676 responseHeaders, responseHeadersSize,
677 1));
678 MockRead spdy_reads[] = { 735 MockRead spdy_reads[] = {
679 CreateMockRead(*resp, 1, ASYNC), 736 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2),
680 MockRead(ASYNC, 0, 2),
681 }; 737 };
682 738
683 Initialize(reads, arraysize(reads), writes, arraysize(writes), 739 Initialize(reads,
684 spdy_reads, arraysize(spdy_reads), spdy_writes, 740 arraysize(reads),
741 writes,
742 arraysize(writes),
743 spdy_reads,
744 arraysize(spdy_reads),
745 spdy_writes,
685 arraysize(spdy_writes)); 746 arraysize(spdy_writes));
686 AddAuthToCache(); 747 AddAuthToCache();
687 748
688 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), 749 int rv = handle_.Init("a",
689 &pool_, BoundNetLog()); 750 CreateTunnelParams(),
751 LOW,
752 callback_.callback(),
753 &pool_,
754 BoundNetLog());
690 EXPECT_EQ(ERR_IO_PENDING, rv); 755 EXPECT_EQ(ERR_IO_PENDING, rv);
691 EXPECT_FALSE(handle_.is_initialized()); 756 EXPECT_FALSE(handle_.is_initialized());
692 EXPECT_FALSE(handle_.socket()); 757 EXPECT_FALSE(handle_.socket());
693 758
694 data_->RunFor(2); 759 data_->RunFor(2);
695 760
696 rv = callback_.WaitForResult(); 761 rv = callback_.WaitForResult();
697 762
698 if (GetParam().proxy_type == HTTP) { 763 if (GetParam().proxy_type == HTTP) {
699 // We don't trust 302 responses to CONNECT from HTTP proxies. 764 // We don't trust 302 responses to CONNECT from HTTP proxies.
(...skipping 22 matching lines...) Expand all
722 EXPECT_TRUE(headers->IsRedirect(&location)); 787 EXPECT_TRUE(headers->IsRedirect(&location));
723 EXPECT_EQ(location, redirectTarget); 788 EXPECT_EQ(location, redirectTarget);
724 } 789 }
725 } 790 }
726 791
727 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. 792 // It would be nice to also test the timeouts in HttpProxyClientSocketPool.
728 793
729 } // namespace 794 } // namespace
730 795
731 } // namespace net 796 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698