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
3 // found in the LICENSE file.
5 #include "net/http/http_proxy_client_socket_pool.h"
7 #include "base/callback.h"
8 #include "base/compiler_specific.h"
9 #include "base/run_loop.h"
10 #include "base/strings/string_util.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h"
13 #include "net/base/auth.h"
14 #include "net/base/load_timing_info.h"
15 #include "net/base/load_timing_info_test_util.h"
16 #include "net/base/net_errors.h"
17 #include "net/base/test_completion_callback.h"
18 #include "net/cert/cert_verifier.h"
19 #include "net/dns/mock_host_resolver.h"
20 #include "net/http/http_auth_handler_factory.h"
21 #include "net/http/http_network_session.h"
22 #include "net/http/http_request_headers.h"
23 #include "net/http/http_response_headers.h"
24 #include "net/http/http_server_properties_impl.h"
25 #include "net/proxy/proxy_service.h"
26 #include "net/socket/client_socket_handle.h"
27 #include "net/socket/client_socket_pool_histograms.h"
28 #include "net/socket/next_proto.h"
29 #include "net/socket/socket_test_util.h"
30 #include "net/spdy/spdy_session.h"
31 #include "net/spdy/spdy_session_pool.h"
32 #include "net/spdy/spdy_test_util_common.h"
33 #include "net/ssl/ssl_config_service_defaults.h"
34 #include "net/test/test_certificate_data.h"
35 #include "testing/gtest/include/gtest/gtest.h"
41 const int kMaxSockets
= 32;
42 const int kMaxSocketsPerGroup
= 6;
44 // Make sure |handle|'s load times are set correctly. DNS and connect start
45 // times comes from mock client sockets in these tests, so primarily serves to
46 // check those times were copied, and ssl times / connect end are set correctly.
47 void TestLoadTimingInfo(const ClientSocketHandle
& handle
) {
48 LoadTimingInfo load_timing_info
;
49 EXPECT_TRUE(handle
.GetLoadTimingInfo(false, &load_timing_info
));
51 EXPECT_FALSE(load_timing_info
.socket_reused
);
52 // None of these tests use a NetLog.
53 EXPECT_EQ(NetLog::Source::kInvalidId
, load_timing_info
.socket_log_id
);
55 ExpectConnectTimingHasTimes(
56 load_timing_info
.connect_timing
,
57 CONNECT_TIMING_HAS_SSL_TIMES
| CONNECT_TIMING_HAS_DNS_TIMES
);
58 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info
);
61 // Just like TestLoadTimingInfo, except DNS times are expected to be null, for
62 // tests over proxies that do DNS lookups themselves.
63 void TestLoadTimingInfoNoDns(const ClientSocketHandle
& handle
) {
64 LoadTimingInfo load_timing_info
;
65 EXPECT_TRUE(handle
.GetLoadTimingInfo(false, &load_timing_info
));
67 // None of these tests use a NetLog.
68 EXPECT_EQ(NetLog::Source::kInvalidId
, load_timing_info
.socket_log_id
);
70 EXPECT_FALSE(load_timing_info
.socket_reused
);
72 ExpectConnectTimingHasTimes(load_timing_info
.connect_timing
,
73 CONNECT_TIMING_HAS_SSL_TIMES
);
74 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info
);
77 class SSLClientSocketPoolTest
78 : public testing::Test
,
79 public ::testing::WithParamInterface
<NextProto
> {
81 SSLClientSocketPoolTest()
82 : proxy_service_(ProxyService::CreateDirect()),
83 ssl_config_service_(new SSLConfigServiceDefaults
),
84 http_auth_handler_factory_(
85 HttpAuthHandlerFactory::CreateDefault(&host_resolver_
)),
86 session_(CreateNetworkSession()),
87 direct_transport_socket_params_(
88 new TransportSocketParams(HostPortPair("host", 443),
91 OnHostResolutionCallback())),
92 transport_histograms_("MockTCP"),
93 transport_socket_pool_(kMaxSockets
,
95 &transport_histograms_
,
97 proxy_transport_socket_params_(
98 new TransportSocketParams(HostPortPair("proxy", 443),
101 OnHostResolutionCallback())),
102 socks_socket_params_(
103 new SOCKSSocketParams(proxy_transport_socket_params_
,
105 HostPortPair("sockshost", 443))),
106 socks_histograms_("MockSOCKS"),
107 socks_socket_pool_(kMaxSockets
,
110 &transport_socket_pool_
),
111 http_proxy_socket_params_(
112 new HttpProxySocketParams(proxy_transport_socket_params_
,
116 HostPortPair("host", 80),
117 session_
->http_auth_cache(),
118 session_
->http_auth_handler_factory(),
119 session_
->spdy_session_pool(),
121 http_proxy_histograms_("MockHttpProxy"),
122 http_proxy_socket_pool_(kMaxSockets
,
124 &http_proxy_histograms_
,
126 &transport_socket_pool_
,
129 enable_ssl_connect_job_waiting_(false) {
130 scoped_refptr
<SSLConfigService
> ssl_config_service(
131 new SSLConfigServiceDefaults
);
132 ssl_config_service
->GetSSLConfig(&ssl_config_
);
135 void CreatePool(bool transport_pool
, bool http_proxy_pool
, bool socks_pool
) {
136 ssl_histograms_
.reset(new ClientSocketPoolHistograms("SSLUnitTest"));
137 pool_
.reset(new SSLClientSocketPool(
140 ssl_histograms_
.get(),
141 NULL
/* host_resolver */,
142 NULL
/* cert_verifier */,
143 NULL
/* channel_id_service */,
144 NULL
/* transport_security_state */,
145 NULL
/* cert_transparency_verifier */,
146 std::string() /* ssl_session_cache_shard */,
148 transport_pool
? &transport_socket_pool_
: NULL
,
149 socks_pool
? &socks_socket_pool_
: NULL
,
150 http_proxy_pool
? &http_proxy_socket_pool_
: NULL
,
152 enable_ssl_connect_job_waiting_
,
156 scoped_refptr
<SSLSocketParams
> SSLParams(ProxyServer::Scheme proxy
,
157 bool want_spdy_over_npn
) {
158 return make_scoped_refptr(new SSLSocketParams(
159 proxy
== ProxyServer::SCHEME_DIRECT
? direct_transport_socket_params_
161 proxy
== ProxyServer::SCHEME_SOCKS5
? socks_socket_params_
: NULL
,
162 proxy
== ProxyServer::SCHEME_HTTP
? http_proxy_socket_params_
: NULL
,
163 HostPortPair("host", 443),
165 PRIVACY_MODE_DISABLED
,
168 want_spdy_over_npn
));
171 void AddAuthToCache() {
172 const base::string16
kFoo(base::ASCIIToUTF16("foo"));
173 const base::string16
kBar(base::ASCIIToUTF16("bar"));
174 session_
->http_auth_cache()->Add(GURL("http://proxy:443/"),
176 HttpAuth::AUTH_SCHEME_BASIC
,
177 "Basic realm=MyRealm1",
178 AuthCredentials(kFoo
, kBar
),
182 HttpNetworkSession
* CreateNetworkSession() {
183 HttpNetworkSession::Params params
;
184 params
.host_resolver
= &host_resolver_
;
185 params
.cert_verifier
= cert_verifier_
.get();
186 params
.transport_security_state
= transport_security_state_
.get();
187 params
.proxy_service
= proxy_service_
.get();
188 params
.client_socket_factory
= &socket_factory_
;
189 params
.ssl_config_service
= ssl_config_service_
.get();
190 params
.http_auth_handler_factory
= http_auth_handler_factory_
.get();
191 params
.http_server_properties
=
192 http_server_properties_
.GetWeakPtr();
193 params
.enable_spdy_compression
= false;
194 params
.spdy_default_protocol
= GetParam();
195 return new HttpNetworkSession(params
);
198 void TestIPPoolingDisabled(SSLSocketDataProvider
* ssl
);
200 MockClientSocketFactory socket_factory_
;
201 MockCachingHostResolver host_resolver_
;
202 scoped_ptr
<CertVerifier
> cert_verifier_
;
203 scoped_ptr
<TransportSecurityState
> transport_security_state_
;
204 const scoped_ptr
<ProxyService
> proxy_service_
;
205 const scoped_refptr
<SSLConfigService
> ssl_config_service_
;
206 const scoped_ptr
<HttpAuthHandlerFactory
> http_auth_handler_factory_
;
207 HttpServerPropertiesImpl http_server_properties_
;
208 const scoped_refptr
<HttpNetworkSession
> session_
;
210 scoped_refptr
<TransportSocketParams
> direct_transport_socket_params_
;
211 ClientSocketPoolHistograms transport_histograms_
;
212 MockTransportClientSocketPool transport_socket_pool_
;
214 scoped_refptr
<TransportSocketParams
> proxy_transport_socket_params_
;
216 scoped_refptr
<SOCKSSocketParams
> socks_socket_params_
;
217 ClientSocketPoolHistograms socks_histograms_
;
218 MockSOCKSClientSocketPool socks_socket_pool_
;
220 scoped_refptr
<HttpProxySocketParams
> http_proxy_socket_params_
;
221 ClientSocketPoolHistograms http_proxy_histograms_
;
222 HttpProxyClientSocketPool http_proxy_socket_pool_
;
224 SSLConfig ssl_config_
;
225 scoped_ptr
<ClientSocketPoolHistograms
> ssl_histograms_
;
226 scoped_ptr
<SSLClientSocketPool
> pool_
;
228 bool enable_ssl_connect_job_waiting_
;
231 INSTANTIATE_TEST_CASE_P(
233 SSLClientSocketPoolTest
,
234 testing::Values(kProtoDeprecatedSPDY2
,
235 kProtoSPDY3
, kProtoSPDY31
, kProtoSPDY4
));
237 // Tests that the final socket will connect even if all sockets
240 // All sockets should wait for the first socket to attempt to
241 // connect. Once it fails to connect, all other sockets should
242 // attempt to connect. All should fail, except the final socket.
243 TEST_P(SSLClientSocketPoolTest
, AllSocketsFailButLast
) {
244 // Although we request four sockets, the first three socket connect
245 // failures cause the socket pool to create three more sockets because
246 // there are pending requests.
247 StaticSocketDataProvider data1
;
248 StaticSocketDataProvider data2
;
249 StaticSocketDataProvider data3
;
250 StaticSocketDataProvider data4
;
251 StaticSocketDataProvider data5
;
252 StaticSocketDataProvider data6
;
253 StaticSocketDataProvider data7
;
254 socket_factory_
.AddSocketDataProvider(&data1
);
255 socket_factory_
.AddSocketDataProvider(&data2
);
256 socket_factory_
.AddSocketDataProvider(&data3
);
257 socket_factory_
.AddSocketDataProvider(&data4
);
258 socket_factory_
.AddSocketDataProvider(&data5
);
259 socket_factory_
.AddSocketDataProvider(&data6
);
260 socket_factory_
.AddSocketDataProvider(&data7
);
261 SSLSocketDataProvider
ssl(ASYNC
, ERR_SSL_PROTOCOL_ERROR
);
262 ssl
.is_in_session_cache
= false;
263 SSLSocketDataProvider
ssl2(ASYNC
, ERR_SSL_PROTOCOL_ERROR
);
264 ssl2
.is_in_session_cache
= false;
265 SSLSocketDataProvider
ssl3(ASYNC
, ERR_SSL_PROTOCOL_ERROR
);
266 ssl3
.is_in_session_cache
= false;
267 SSLSocketDataProvider
ssl4(ASYNC
, OK
);
268 ssl4
.is_in_session_cache
= false;
269 SSLSocketDataProvider
ssl5(ASYNC
, OK
);
270 ssl5
.is_in_session_cache
= false;
271 SSLSocketDataProvider
ssl6(ASYNC
, OK
);
272 ssl6
.is_in_session_cache
= false;
273 SSLSocketDataProvider
ssl7(ASYNC
, OK
);
274 ssl7
.is_in_session_cache
= false;
276 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
277 socket_factory_
.AddSSLSocketDataProvider(&ssl2
);
278 socket_factory_
.AddSSLSocketDataProvider(&ssl3
);
279 socket_factory_
.AddSSLSocketDataProvider(&ssl4
);
280 socket_factory_
.AddSSLSocketDataProvider(&ssl5
);
281 socket_factory_
.AddSSLSocketDataProvider(&ssl6
);
282 socket_factory_
.AddSSLSocketDataProvider(&ssl7
);
284 enable_ssl_connect_job_waiting_
= true;
285 CreatePool(true, false, false);
287 scoped_refptr
<SSLSocketParams
> params1
=
288 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
289 scoped_refptr
<SSLSocketParams
> params2
=
290 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
291 scoped_refptr
<SSLSocketParams
> params3
=
292 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
293 scoped_refptr
<SSLSocketParams
> params4
=
294 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
295 ClientSocketHandle handle1
;
296 ClientSocketHandle handle2
;
297 ClientSocketHandle handle3
;
298 ClientSocketHandle handle4
;
299 TestCompletionCallback callback1
;
300 TestCompletionCallback callback2
;
301 TestCompletionCallback callback3
;
302 TestCompletionCallback callback4
;
305 "b", params1
, MEDIUM
, callback1
.callback(), pool_
.get(), BoundNetLog());
307 "b", params2
, MEDIUM
, callback2
.callback(), pool_
.get(), BoundNetLog());
309 "b", params3
, MEDIUM
, callback3
.callback(), pool_
.get(), BoundNetLog());
311 "b", params4
, MEDIUM
, callback4
.callback(), pool_
.get(), BoundNetLog());
313 base::RunLoop().RunUntilIdle();
315 // Only the last socket should have connected.
316 EXPECT_FALSE(handle1
.socket());
317 EXPECT_FALSE(handle2
.socket());
318 EXPECT_FALSE(handle3
.socket());
319 EXPECT_TRUE(handle4
.socket()->IsConnected());
322 // Tests that sockets will still connect in parallel if the
323 // EnableSSLConnectJobWaiting flag is not enabled.
324 TEST_P(SSLClientSocketPoolTest
, SocketsConnectWithoutFlag
) {
325 StaticSocketDataProvider data1
;
326 StaticSocketDataProvider data2
;
327 StaticSocketDataProvider data3
;
328 socket_factory_
.AddSocketDataProvider(&data1
);
329 socket_factory_
.AddSocketDataProvider(&data2
);
330 socket_factory_
.AddSocketDataProvider(&data3
);
332 SSLSocketDataProvider
ssl(ASYNC
, OK
);
333 ssl
.is_in_session_cache
= false;
334 ssl
.should_block_on_connect
= true;
335 SSLSocketDataProvider
ssl2(ASYNC
, OK
);
336 ssl2
.is_in_session_cache
= false;
337 ssl2
.should_block_on_connect
= true;
338 SSLSocketDataProvider
ssl3(ASYNC
, OK
);
339 ssl3
.is_in_session_cache
= false;
340 ssl3
.should_block_on_connect
= true;
341 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
342 socket_factory_
.AddSSLSocketDataProvider(&ssl2
);
343 socket_factory_
.AddSSLSocketDataProvider(&ssl3
);
345 CreatePool(true, false, false);
347 scoped_refptr
<SSLSocketParams
> params1
=
348 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
349 scoped_refptr
<SSLSocketParams
> params2
=
350 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
351 scoped_refptr
<SSLSocketParams
> params3
=
352 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
353 ClientSocketHandle handle1
;
354 ClientSocketHandle handle2
;
355 ClientSocketHandle handle3
;
356 TestCompletionCallback callback1
;
357 TestCompletionCallback callback2
;
358 TestCompletionCallback callback3
;
361 "b", params1
, MEDIUM
, callback1
.callback(), pool_
.get(), BoundNetLog());
363 "b", params2
, MEDIUM
, callback2
.callback(), pool_
.get(), BoundNetLog());
365 "b", params3
, MEDIUM
, callback3
.callback(), pool_
.get(), BoundNetLog());
367 base::RunLoop().RunUntilIdle();
369 std::vector
<MockSSLClientSocket
*> sockets
=
370 socket_factory_
.ssl_client_sockets();
372 // All sockets should have started their connections.
373 for (std::vector
<MockSSLClientSocket
*>::iterator it
= sockets
.begin();
376 EXPECT_TRUE((*it
)->reached_connect());
379 // Resume connecting all of the sockets.
380 for (std::vector
<MockSSLClientSocket
*>::iterator it
= sockets
.begin();
383 (*it
)->RestartPausedConnect();
386 callback1
.WaitForResult();
387 callback2
.WaitForResult();
388 callback3
.WaitForResult();
390 EXPECT_TRUE(handle1
.socket()->IsConnected());
391 EXPECT_TRUE(handle2
.socket()->IsConnected());
392 EXPECT_TRUE(handle3
.socket()->IsConnected());
395 // Tests that the pool deleting an SSLConnectJob will not cause a crash,
396 // or prevent pending sockets from connecting.
397 TEST_P(SSLClientSocketPoolTest
, DeletedSSLConnectJob
) {
398 StaticSocketDataProvider data1
;
399 StaticSocketDataProvider data2
;
400 StaticSocketDataProvider data3
;
401 socket_factory_
.AddSocketDataProvider(&data1
);
402 socket_factory_
.AddSocketDataProvider(&data2
);
403 socket_factory_
.AddSocketDataProvider(&data3
);
405 SSLSocketDataProvider
ssl(ASYNC
, OK
);
406 ssl
.is_in_session_cache
= false;
407 ssl
.should_block_on_connect
= true;
408 SSLSocketDataProvider
ssl2(ASYNC
, OK
);
409 ssl2
.is_in_session_cache
= false;
410 SSLSocketDataProvider
ssl3(ASYNC
, OK
);
411 ssl3
.is_in_session_cache
= false;
412 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
413 socket_factory_
.AddSSLSocketDataProvider(&ssl2
);
414 socket_factory_
.AddSSLSocketDataProvider(&ssl3
);
416 enable_ssl_connect_job_waiting_
= true;
417 CreatePool(true, false, false);
419 scoped_refptr
<SSLSocketParams
> params1
=
420 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
421 scoped_refptr
<SSLSocketParams
> params2
=
422 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
423 scoped_refptr
<SSLSocketParams
> params3
=
424 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
425 ClientSocketHandle handle1
;
426 ClientSocketHandle handle2
;
427 ClientSocketHandle handle3
;
428 TestCompletionCallback callback1
;
429 TestCompletionCallback callback2
;
430 TestCompletionCallback callback3
;
433 "b", params1
, MEDIUM
, callback1
.callback(), pool_
.get(), BoundNetLog());
435 "b", params2
, MEDIUM
, callback2
.callback(), pool_
.get(), BoundNetLog());
437 "b", params3
, MEDIUM
, callback3
.callback(), pool_
.get(), BoundNetLog());
439 // Allow the connections to proceed until the first socket has started
441 base::RunLoop().RunUntilIdle();
443 std::vector
<MockSSLClientSocket
*> sockets
=
444 socket_factory_
.ssl_client_sockets();
446 pool_
->CancelRequest("b", &handle2
);
448 sockets
[0]->RestartPausedConnect();
450 callback1
.WaitForResult();
451 callback3
.WaitForResult();
453 EXPECT_TRUE(handle1
.socket()->IsConnected());
454 EXPECT_FALSE(handle2
.socket());
455 EXPECT_TRUE(handle3
.socket()->IsConnected());
458 // Tests that all pending sockets still connect when the pool deletes a pending
459 // SSLConnectJob which immediately followed a failed leading connection.
460 TEST_P(SSLClientSocketPoolTest
, DeletedSocketAfterFail
) {
461 StaticSocketDataProvider data1
;
462 StaticSocketDataProvider data2
;
463 StaticSocketDataProvider data3
;
464 StaticSocketDataProvider data4
;
465 socket_factory_
.AddSocketDataProvider(&data1
);
466 socket_factory_
.AddSocketDataProvider(&data2
);
467 socket_factory_
.AddSocketDataProvider(&data3
);
468 socket_factory_
.AddSocketDataProvider(&data4
);
470 SSLSocketDataProvider
ssl(ASYNC
, ERR_SSL_PROTOCOL_ERROR
);
471 ssl
.is_in_session_cache
= false;
472 ssl
.should_block_on_connect
= true;
473 SSLSocketDataProvider
ssl2(ASYNC
, OK
);
474 ssl2
.is_in_session_cache
= false;
475 SSLSocketDataProvider
ssl3(ASYNC
, OK
);
476 ssl3
.is_in_session_cache
= false;
477 SSLSocketDataProvider
ssl4(ASYNC
, OK
);
478 ssl4
.is_in_session_cache
= false;
479 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
480 socket_factory_
.AddSSLSocketDataProvider(&ssl2
);
481 socket_factory_
.AddSSLSocketDataProvider(&ssl3
);
482 socket_factory_
.AddSSLSocketDataProvider(&ssl4
);
484 enable_ssl_connect_job_waiting_
= true;
485 CreatePool(true, false, false);
487 scoped_refptr
<SSLSocketParams
> params1
=
488 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
489 scoped_refptr
<SSLSocketParams
> params2
=
490 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
491 scoped_refptr
<SSLSocketParams
> params3
=
492 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
493 ClientSocketHandle handle1
;
494 ClientSocketHandle handle2
;
495 ClientSocketHandle handle3
;
496 TestCompletionCallback callback1
;
497 TestCompletionCallback callback2
;
498 TestCompletionCallback callback3
;
501 "b", params1
, MEDIUM
, callback1
.callback(), pool_
.get(), BoundNetLog());
503 "b", params2
, MEDIUM
, callback2
.callback(), pool_
.get(), BoundNetLog());
505 "b", params3
, MEDIUM
, callback3
.callback(), pool_
.get(), BoundNetLog());
507 // Allow the connections to proceed until the first socket has started
509 base::RunLoop().RunUntilIdle();
511 std::vector
<MockSSLClientSocket
*> sockets
=
512 socket_factory_
.ssl_client_sockets();
514 EXPECT_EQ(3u, sockets
.size());
515 EXPECT_TRUE(sockets
[0]->reached_connect());
516 EXPECT_FALSE(handle1
.socket());
518 pool_
->CancelRequest("b", &handle2
);
520 sockets
[0]->RestartPausedConnect();
522 callback1
.WaitForResult();
523 callback3
.WaitForResult();
525 EXPECT_FALSE(handle1
.socket());
526 EXPECT_FALSE(handle2
.socket());
527 EXPECT_TRUE(handle3
.socket()->IsConnected());
530 // Make sure that sockets still connect after the leader socket's
532 TEST_P(SSLClientSocketPoolTest
, SimultaneousConnectJobsFail
) {
533 StaticSocketDataProvider data1
;
534 StaticSocketDataProvider data2
;
535 StaticSocketDataProvider data3
;
536 StaticSocketDataProvider data4
;
537 StaticSocketDataProvider data5
;
538 socket_factory_
.AddSocketDataProvider(&data1
);
539 socket_factory_
.AddSocketDataProvider(&data2
);
540 socket_factory_
.AddSocketDataProvider(&data3
);
541 socket_factory_
.AddSocketDataProvider(&data4
);
542 socket_factory_
.AddSocketDataProvider(&data5
);
543 SSLSocketDataProvider
ssl(ASYNC
, ERR_SSL_PROTOCOL_ERROR
);
544 ssl
.is_in_session_cache
= false;
545 ssl
.should_block_on_connect
= true;
546 SSLSocketDataProvider
ssl2(ASYNC
, OK
);
547 ssl2
.is_in_session_cache
= false;
548 ssl2
.should_block_on_connect
= true;
549 SSLSocketDataProvider
ssl3(ASYNC
, OK
);
550 ssl3
.is_in_session_cache
= false;
551 SSLSocketDataProvider
ssl4(ASYNC
, OK
);
552 ssl4
.is_in_session_cache
= false;
553 SSLSocketDataProvider
ssl5(ASYNC
, OK
);
554 ssl5
.is_in_session_cache
= false;
556 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
557 socket_factory_
.AddSSLSocketDataProvider(&ssl2
);
558 socket_factory_
.AddSSLSocketDataProvider(&ssl3
);
559 socket_factory_
.AddSSLSocketDataProvider(&ssl4
);
560 socket_factory_
.AddSSLSocketDataProvider(&ssl5
);
562 enable_ssl_connect_job_waiting_
= true;
563 CreatePool(true, false, false);
564 scoped_refptr
<SSLSocketParams
> params1
=
565 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
566 scoped_refptr
<SSLSocketParams
> params2
=
567 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
568 scoped_refptr
<SSLSocketParams
> params3
=
569 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
570 scoped_refptr
<SSLSocketParams
> params4
=
571 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
572 ClientSocketHandle handle1
;
573 ClientSocketHandle handle2
;
574 ClientSocketHandle handle3
;
575 ClientSocketHandle handle4
;
576 TestCompletionCallback callback1
;
577 TestCompletionCallback callback2
;
578 TestCompletionCallback callback3
;
579 TestCompletionCallback callback4
;
581 "b", params1
, MEDIUM
, callback1
.callback(), pool_
.get(), BoundNetLog());
583 "b", params2
, MEDIUM
, callback2
.callback(), pool_
.get(), BoundNetLog());
585 "b", params3
, MEDIUM
, callback3
.callback(), pool_
.get(), BoundNetLog());
587 "b", params4
, MEDIUM
, callback4
.callback(), pool_
.get(), BoundNetLog());
589 base::RunLoop().RunUntilIdle();
591 std::vector
<MockSSLClientSocket
*> sockets
=
592 socket_factory_
.ssl_client_sockets();
594 std::vector
<MockSSLClientSocket
*>::const_iterator it
= sockets
.begin();
596 // The first socket should have had Connect called on it.
597 EXPECT_TRUE((*it
)->reached_connect());
600 // No other socket should have reached connect yet.
601 for (; it
!= sockets
.end(); ++it
)
602 EXPECT_FALSE((*it
)->reached_connect());
604 // Allow the first socket to resume it's connection process.
605 sockets
[0]->RestartPausedConnect();
607 base::RunLoop().RunUntilIdle();
609 // The second socket should have reached connect.
610 EXPECT_TRUE(sockets
[1]->reached_connect());
612 // Allow the second socket to continue its connection.
613 sockets
[1]->RestartPausedConnect();
615 base::RunLoop().RunUntilIdle();
617 EXPECT_FALSE(handle1
.socket());
618 EXPECT_TRUE(handle2
.socket()->IsConnected());
619 EXPECT_TRUE(handle3
.socket()->IsConnected());
620 EXPECT_TRUE(handle4
.socket()->IsConnected());
623 // Make sure that no sockets connect before the "leader" socket,
624 // given that the leader has a successful connection.
625 TEST_P(SSLClientSocketPoolTest
, SimultaneousConnectJobsSuccess
) {
626 StaticSocketDataProvider data1
;
627 StaticSocketDataProvider data2
;
628 StaticSocketDataProvider data3
;
629 socket_factory_
.AddSocketDataProvider(&data1
);
630 socket_factory_
.AddSocketDataProvider(&data2
);
631 socket_factory_
.AddSocketDataProvider(&data3
);
633 SSLSocketDataProvider
ssl(ASYNC
, OK
);
634 ssl
.is_in_session_cache
= false;
635 ssl
.should_block_on_connect
= true;
636 SSLSocketDataProvider
ssl2(ASYNC
, OK
);
637 ssl2
.is_in_session_cache
= false;
638 SSLSocketDataProvider
ssl3(ASYNC
, OK
);
639 ssl3
.is_in_session_cache
= false;
640 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
641 socket_factory_
.AddSSLSocketDataProvider(&ssl2
);
642 socket_factory_
.AddSSLSocketDataProvider(&ssl3
);
644 enable_ssl_connect_job_waiting_
= true;
645 CreatePool(true, false, false);
647 scoped_refptr
<SSLSocketParams
> params1
=
648 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
649 scoped_refptr
<SSLSocketParams
> params2
=
650 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
651 scoped_refptr
<SSLSocketParams
> params3
=
652 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
653 ClientSocketHandle handle1
;
654 ClientSocketHandle handle2
;
655 ClientSocketHandle handle3
;
656 TestCompletionCallback callback1
;
657 TestCompletionCallback callback2
;
658 TestCompletionCallback callback3
;
661 "b", params1
, MEDIUM
, callback1
.callback(), pool_
.get(), BoundNetLog());
663 "b", params2
, MEDIUM
, callback2
.callback(), pool_
.get(), BoundNetLog());
665 "b", params3
, MEDIUM
, callback3
.callback(), pool_
.get(), BoundNetLog());
667 // Allow the connections to proceed until the first socket has finished
669 base::RunLoop().RunUntilIdle();
671 std::vector
<MockSSLClientSocket
*> sockets
=
672 socket_factory_
.ssl_client_sockets();
674 std::vector
<MockSSLClientSocket
*>::const_iterator it
= sockets
.begin();
675 // The first socket should have reached connect.
676 EXPECT_TRUE((*it
)->reached_connect());
678 // No other socket should have reached connect yet.
679 for (; it
!= sockets
.end(); ++it
)
680 EXPECT_FALSE((*it
)->reached_connect());
682 sockets
[0]->RestartPausedConnect();
684 callback1
.WaitForResult();
685 callback2
.WaitForResult();
686 callback3
.WaitForResult();
688 EXPECT_TRUE(handle1
.socket()->IsConnected());
689 EXPECT_TRUE(handle2
.socket()->IsConnected());
690 EXPECT_TRUE(handle3
.socket()->IsConnected());
693 TEST_P(SSLClientSocketPoolTest
, TCPFail
) {
694 StaticSocketDataProvider data
;
695 data
.set_connect_data(MockConnect(SYNCHRONOUS
, ERR_CONNECTION_FAILED
));
696 socket_factory_
.AddSocketDataProvider(&data
);
698 CreatePool(true /* tcp pool */, false, false);
699 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
702 ClientSocketHandle handle
;
703 int rv
= handle
.Init("a", params
, MEDIUM
, CompletionCallback(), pool_
.get(),
705 EXPECT_EQ(ERR_CONNECTION_FAILED
, rv
);
706 EXPECT_FALSE(handle
.is_initialized());
707 EXPECT_FALSE(handle
.socket());
708 EXPECT_FALSE(handle
.is_ssl_error());
711 TEST_P(SSLClientSocketPoolTest
, TCPFailAsync
) {
712 StaticSocketDataProvider data
;
713 data
.set_connect_data(MockConnect(ASYNC
, ERR_CONNECTION_FAILED
));
714 socket_factory_
.AddSocketDataProvider(&data
);
716 CreatePool(true /* tcp pool */, false, false);
717 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
720 ClientSocketHandle handle
;
721 TestCompletionCallback callback
;
722 int rv
= handle
.Init(
723 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
724 EXPECT_EQ(ERR_IO_PENDING
, rv
);
725 EXPECT_FALSE(handle
.is_initialized());
726 EXPECT_FALSE(handle
.socket());
728 EXPECT_EQ(ERR_CONNECTION_FAILED
, callback
.WaitForResult());
729 EXPECT_FALSE(handle
.is_initialized());
730 EXPECT_FALSE(handle
.socket());
731 EXPECT_FALSE(handle
.is_ssl_error());
734 TEST_P(SSLClientSocketPoolTest
, BasicDirect
) {
735 StaticSocketDataProvider data
;
736 data
.set_connect_data(MockConnect(SYNCHRONOUS
, OK
));
737 socket_factory_
.AddSocketDataProvider(&data
);
738 SSLSocketDataProvider
ssl(SYNCHRONOUS
, OK
);
739 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
741 CreatePool(true /* tcp pool */, false, false);
742 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
745 ClientSocketHandle handle
;
746 TestCompletionCallback callback
;
747 int rv
= handle
.Init(
748 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
750 EXPECT_TRUE(handle
.is_initialized());
751 EXPECT_TRUE(handle
.socket());
752 TestLoadTimingInfo(handle
);
755 // Make sure that SSLConnectJob passes on its priority to its
756 // socket request on Init (for the DIRECT case).
757 TEST_P(SSLClientSocketPoolTest
, SetSocketRequestPriorityOnInitDirect
) {
758 CreatePool(true /* tcp pool */, false, false);
759 scoped_refptr
<SSLSocketParams
> params
=
760 SSLParams(ProxyServer::SCHEME_DIRECT
, false);
762 for (int i
= MINIMUM_PRIORITY
; i
<= MAXIMUM_PRIORITY
; ++i
) {
763 RequestPriority priority
= static_cast<RequestPriority
>(i
);
764 StaticSocketDataProvider data
;
765 data
.set_connect_data(MockConnect(SYNCHRONOUS
, OK
));
766 socket_factory_
.AddSocketDataProvider(&data
);
767 SSLSocketDataProvider
ssl(SYNCHRONOUS
, OK
);
768 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
770 ClientSocketHandle handle
;
771 TestCompletionCallback callback
;
772 EXPECT_EQ(OK
, handle
.Init("a", params
, priority
, callback
.callback(),
773 pool_
.get(), BoundNetLog()));
774 EXPECT_EQ(priority
, transport_socket_pool_
.last_request_priority());
775 handle
.socket()->Disconnect();
779 TEST_P(SSLClientSocketPoolTest
, BasicDirectAsync
) {
780 StaticSocketDataProvider data
;
781 socket_factory_
.AddSocketDataProvider(&data
);
782 SSLSocketDataProvider
ssl(ASYNC
, OK
);
783 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
785 CreatePool(true /* tcp pool */, false, false);
786 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
789 ClientSocketHandle handle
;
790 TestCompletionCallback callback
;
791 int rv
= handle
.Init(
792 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
793 EXPECT_EQ(ERR_IO_PENDING
, rv
);
794 EXPECT_FALSE(handle
.is_initialized());
795 EXPECT_FALSE(handle
.socket());
797 EXPECT_EQ(OK
, callback
.WaitForResult());
798 EXPECT_TRUE(handle
.is_initialized());
799 EXPECT_TRUE(handle
.socket());
800 TestLoadTimingInfo(handle
);
803 TEST_P(SSLClientSocketPoolTest
, DirectCertError
) {
804 StaticSocketDataProvider data
;
805 socket_factory_
.AddSocketDataProvider(&data
);
806 SSLSocketDataProvider
ssl(ASYNC
, ERR_CERT_COMMON_NAME_INVALID
);
807 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
809 CreatePool(true /* tcp pool */, false, false);
810 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
813 ClientSocketHandle handle
;
814 TestCompletionCallback callback
;
815 int rv
= handle
.Init(
816 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
817 EXPECT_EQ(ERR_IO_PENDING
, rv
);
818 EXPECT_FALSE(handle
.is_initialized());
819 EXPECT_FALSE(handle
.socket());
821 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID
, callback
.WaitForResult());
822 EXPECT_TRUE(handle
.is_initialized());
823 EXPECT_TRUE(handle
.socket());
824 TestLoadTimingInfo(handle
);
827 TEST_P(SSLClientSocketPoolTest
, DirectSSLError
) {
828 StaticSocketDataProvider data
;
829 socket_factory_
.AddSocketDataProvider(&data
);
830 SSLSocketDataProvider
ssl(ASYNC
, ERR_SSL_PROTOCOL_ERROR
);
831 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
833 CreatePool(true /* tcp pool */, false, false);
834 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
837 ClientSocketHandle handle
;
838 TestCompletionCallback callback
;
839 int rv
= handle
.Init(
840 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
841 EXPECT_EQ(ERR_IO_PENDING
, rv
);
842 EXPECT_FALSE(handle
.is_initialized());
843 EXPECT_FALSE(handle
.socket());
845 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR
, callback
.WaitForResult());
846 EXPECT_FALSE(handle
.is_initialized());
847 EXPECT_FALSE(handle
.socket());
848 EXPECT_TRUE(handle
.is_ssl_error());
851 TEST_P(SSLClientSocketPoolTest
, DirectWithNPN
) {
852 StaticSocketDataProvider data
;
853 socket_factory_
.AddSocketDataProvider(&data
);
854 SSLSocketDataProvider
ssl(ASYNC
, OK
);
855 ssl
.SetNextProto(kProtoHTTP11
);
856 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
858 CreatePool(true /* tcp pool */, false, false);
859 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
862 ClientSocketHandle handle
;
863 TestCompletionCallback callback
;
864 int rv
= handle
.Init(
865 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
866 EXPECT_EQ(ERR_IO_PENDING
, rv
);
867 EXPECT_FALSE(handle
.is_initialized());
868 EXPECT_FALSE(handle
.socket());
870 EXPECT_EQ(OK
, callback
.WaitForResult());
871 EXPECT_TRUE(handle
.is_initialized());
872 EXPECT_TRUE(handle
.socket());
873 TestLoadTimingInfo(handle
);
874 SSLClientSocket
* ssl_socket
= static_cast<SSLClientSocket
*>(handle
.socket());
875 EXPECT_TRUE(ssl_socket
->WasNpnNegotiated());
878 TEST_P(SSLClientSocketPoolTest
, DirectNoSPDY
) {
879 StaticSocketDataProvider data
;
880 socket_factory_
.AddSocketDataProvider(&data
);
881 SSLSocketDataProvider
ssl(ASYNC
, OK
);
882 ssl
.SetNextProto(kProtoHTTP11
);
883 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
885 CreatePool(true /* tcp pool */, false, false);
886 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
889 ClientSocketHandle handle
;
890 TestCompletionCallback callback
;
891 int rv
= handle
.Init(
892 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
893 EXPECT_EQ(ERR_IO_PENDING
, rv
);
894 EXPECT_FALSE(handle
.is_initialized());
895 EXPECT_FALSE(handle
.socket());
897 EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED
, callback
.WaitForResult());
898 EXPECT_FALSE(handle
.is_initialized());
899 EXPECT_FALSE(handle
.socket());
900 EXPECT_TRUE(handle
.is_ssl_error());
903 TEST_P(SSLClientSocketPoolTest
, DirectGotSPDY
) {
904 StaticSocketDataProvider data
;
905 socket_factory_
.AddSocketDataProvider(&data
);
906 SSLSocketDataProvider
ssl(ASYNC
, OK
);
907 ssl
.SetNextProto(GetParam());
908 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
910 CreatePool(true /* tcp pool */, false, false);
911 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
914 ClientSocketHandle handle
;
915 TestCompletionCallback callback
;
916 int rv
= handle
.Init(
917 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
918 EXPECT_EQ(ERR_IO_PENDING
, rv
);
919 EXPECT_FALSE(handle
.is_initialized());
920 EXPECT_FALSE(handle
.socket());
922 EXPECT_EQ(OK
, callback
.WaitForResult());
923 EXPECT_TRUE(handle
.is_initialized());
924 EXPECT_TRUE(handle
.socket());
925 TestLoadTimingInfo(handle
);
927 SSLClientSocket
* ssl_socket
= static_cast<SSLClientSocket
*>(handle
.socket());
928 EXPECT_TRUE(ssl_socket
->WasNpnNegotiated());
930 ssl_socket
->GetNextProto(&proto
);
931 EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto
));
934 TEST_P(SSLClientSocketPoolTest
, DirectGotBonusSPDY
) {
935 StaticSocketDataProvider data
;
936 socket_factory_
.AddSocketDataProvider(&data
);
937 SSLSocketDataProvider
ssl(ASYNC
, OK
);
938 ssl
.SetNextProto(GetParam());
939 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
941 CreatePool(true /* tcp pool */, false, false);
942 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_DIRECT
,
945 ClientSocketHandle handle
;
946 TestCompletionCallback callback
;
947 int rv
= handle
.Init(
948 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
949 EXPECT_EQ(ERR_IO_PENDING
, rv
);
950 EXPECT_FALSE(handle
.is_initialized());
951 EXPECT_FALSE(handle
.socket());
953 EXPECT_EQ(OK
, callback
.WaitForResult());
954 EXPECT_TRUE(handle
.is_initialized());
955 EXPECT_TRUE(handle
.socket());
956 TestLoadTimingInfo(handle
);
958 SSLClientSocket
* ssl_socket
= static_cast<SSLClientSocket
*>(handle
.socket());
959 EXPECT_TRUE(ssl_socket
->WasNpnNegotiated());
961 ssl_socket
->GetNextProto(&proto
);
962 EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto
));
965 TEST_P(SSLClientSocketPoolTest
, SOCKSFail
) {
966 StaticSocketDataProvider data
;
967 data
.set_connect_data(MockConnect(SYNCHRONOUS
, ERR_CONNECTION_FAILED
));
968 socket_factory_
.AddSocketDataProvider(&data
);
970 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
971 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_SOCKS5
,
974 ClientSocketHandle handle
;
975 TestCompletionCallback callback
;
976 int rv
= handle
.Init(
977 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
978 EXPECT_EQ(ERR_CONNECTION_FAILED
, rv
);
979 EXPECT_FALSE(handle
.is_initialized());
980 EXPECT_FALSE(handle
.socket());
981 EXPECT_FALSE(handle
.is_ssl_error());
984 TEST_P(SSLClientSocketPoolTest
, SOCKSFailAsync
) {
985 StaticSocketDataProvider data
;
986 data
.set_connect_data(MockConnect(ASYNC
, ERR_CONNECTION_FAILED
));
987 socket_factory_
.AddSocketDataProvider(&data
);
989 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
990 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_SOCKS5
,
993 ClientSocketHandle handle
;
994 TestCompletionCallback callback
;
995 int rv
= handle
.Init(
996 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
997 EXPECT_EQ(ERR_IO_PENDING
, rv
);
998 EXPECT_FALSE(handle
.is_initialized());
999 EXPECT_FALSE(handle
.socket());
1001 EXPECT_EQ(ERR_CONNECTION_FAILED
, callback
.WaitForResult());
1002 EXPECT_FALSE(handle
.is_initialized());
1003 EXPECT_FALSE(handle
.socket());
1004 EXPECT_FALSE(handle
.is_ssl_error());
1007 TEST_P(SSLClientSocketPoolTest
, SOCKSBasic
) {
1008 StaticSocketDataProvider data
;
1009 data
.set_connect_data(MockConnect(SYNCHRONOUS
, OK
));
1010 socket_factory_
.AddSocketDataProvider(&data
);
1011 SSLSocketDataProvider
ssl(SYNCHRONOUS
, OK
);
1012 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1014 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1015 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_SOCKS5
,
1018 ClientSocketHandle handle
;
1019 TestCompletionCallback callback
;
1020 int rv
= handle
.Init(
1021 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1023 EXPECT_TRUE(handle
.is_initialized());
1024 EXPECT_TRUE(handle
.socket());
1025 // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here
1026 // don't go through the real logic, unlike in the HTTP proxy tests.
1027 TestLoadTimingInfo(handle
);
1030 // Make sure that SSLConnectJob passes on its priority to its
1031 // transport socket on Init (for the SOCKS_PROXY case).
1032 TEST_P(SSLClientSocketPoolTest
, SetTransportPriorityOnInitSOCKS
) {
1033 StaticSocketDataProvider data
;
1034 data
.set_connect_data(MockConnect(SYNCHRONOUS
, OK
));
1035 socket_factory_
.AddSocketDataProvider(&data
);
1036 SSLSocketDataProvider
ssl(SYNCHRONOUS
, OK
);
1037 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1039 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1040 scoped_refptr
<SSLSocketParams
> params
=
1041 SSLParams(ProxyServer::SCHEME_SOCKS5
, false);
1043 ClientSocketHandle handle
;
1044 TestCompletionCallback callback
;
1045 EXPECT_EQ(OK
, handle
.Init("a", params
, HIGHEST
, callback
.callback(),
1046 pool_
.get(), BoundNetLog()));
1047 EXPECT_EQ(HIGHEST
, transport_socket_pool_
.last_request_priority());
1050 TEST_P(SSLClientSocketPoolTest
, SOCKSBasicAsync
) {
1051 StaticSocketDataProvider data
;
1052 socket_factory_
.AddSocketDataProvider(&data
);
1053 SSLSocketDataProvider
ssl(ASYNC
, OK
);
1054 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1056 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1057 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_SOCKS5
,
1060 ClientSocketHandle handle
;
1061 TestCompletionCallback callback
;
1062 int rv
= handle
.Init(
1063 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1064 EXPECT_EQ(ERR_IO_PENDING
, rv
);
1065 EXPECT_FALSE(handle
.is_initialized());
1066 EXPECT_FALSE(handle
.socket());
1068 EXPECT_EQ(OK
, callback
.WaitForResult());
1069 EXPECT_TRUE(handle
.is_initialized());
1070 EXPECT_TRUE(handle
.socket());
1071 // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here
1072 // don't go through the real logic, unlike in the HTTP proxy tests.
1073 TestLoadTimingInfo(handle
);
1076 TEST_P(SSLClientSocketPoolTest
, HttpProxyFail
) {
1077 StaticSocketDataProvider data
;
1078 data
.set_connect_data(MockConnect(SYNCHRONOUS
, ERR_CONNECTION_FAILED
));
1079 socket_factory_
.AddSocketDataProvider(&data
);
1081 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1082 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_HTTP
,
1085 ClientSocketHandle handle
;
1086 TestCompletionCallback callback
;
1087 int rv
= handle
.Init(
1088 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1089 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED
, rv
);
1090 EXPECT_FALSE(handle
.is_initialized());
1091 EXPECT_FALSE(handle
.socket());
1092 EXPECT_FALSE(handle
.is_ssl_error());
1095 TEST_P(SSLClientSocketPoolTest
, HttpProxyFailAsync
) {
1096 StaticSocketDataProvider data
;
1097 data
.set_connect_data(MockConnect(ASYNC
, ERR_CONNECTION_FAILED
));
1098 socket_factory_
.AddSocketDataProvider(&data
);
1100 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1101 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_HTTP
,
1104 ClientSocketHandle handle
;
1105 TestCompletionCallback callback
;
1106 int rv
= handle
.Init(
1107 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1108 EXPECT_EQ(ERR_IO_PENDING
, rv
);
1109 EXPECT_FALSE(handle
.is_initialized());
1110 EXPECT_FALSE(handle
.socket());
1112 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED
, callback
.WaitForResult());
1113 EXPECT_FALSE(handle
.is_initialized());
1114 EXPECT_FALSE(handle
.socket());
1115 EXPECT_FALSE(handle
.is_ssl_error());
1118 TEST_P(SSLClientSocketPoolTest
, HttpProxyBasic
) {
1119 MockWrite writes
[] = {
1120 MockWrite(SYNCHRONOUS
,
1121 "CONNECT host:80 HTTP/1.1\r\n"
1123 "Proxy-Connection: keep-alive\r\n"
1124 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
1126 MockRead reads
[] = {
1127 MockRead(SYNCHRONOUS
, "HTTP/1.1 200 Connection Established\r\n\r\n"),
1129 StaticSocketDataProvider
data(reads
, arraysize(reads
), writes
,
1131 data
.set_connect_data(MockConnect(SYNCHRONOUS
, OK
));
1132 socket_factory_
.AddSocketDataProvider(&data
);
1134 SSLSocketDataProvider
ssl(SYNCHRONOUS
, OK
);
1135 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1137 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1138 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_HTTP
,
1141 ClientSocketHandle handle
;
1142 TestCompletionCallback callback
;
1143 int rv
= handle
.Init(
1144 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1146 EXPECT_TRUE(handle
.is_initialized());
1147 EXPECT_TRUE(handle
.socket());
1148 TestLoadTimingInfoNoDns(handle
);
1151 // Make sure that SSLConnectJob passes on its priority to its
1152 // transport socket on Init (for the HTTP_PROXY case).
1153 TEST_P(SSLClientSocketPoolTest
, SetTransportPriorityOnInitHTTP
) {
1154 MockWrite writes
[] = {
1155 MockWrite(SYNCHRONOUS
,
1156 "CONNECT host:80 HTTP/1.1\r\n"
1158 "Proxy-Connection: keep-alive\r\n"
1159 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
1161 MockRead reads
[] = {
1162 MockRead(SYNCHRONOUS
, "HTTP/1.1 200 Connection Established\r\n\r\n"),
1164 StaticSocketDataProvider
data(reads
, arraysize(reads
), writes
,
1166 data
.set_connect_data(MockConnect(SYNCHRONOUS
, OK
));
1167 socket_factory_
.AddSocketDataProvider(&data
);
1169 SSLSocketDataProvider
ssl(SYNCHRONOUS
, OK
);
1170 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1172 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1173 scoped_refptr
<SSLSocketParams
> params
=
1174 SSLParams(ProxyServer::SCHEME_HTTP
, false);
1176 ClientSocketHandle handle
;
1177 TestCompletionCallback callback
;
1178 EXPECT_EQ(OK
, handle
.Init("a", params
, HIGHEST
, callback
.callback(),
1179 pool_
.get(), BoundNetLog()));
1180 EXPECT_EQ(HIGHEST
, transport_socket_pool_
.last_request_priority());
1183 TEST_P(SSLClientSocketPoolTest
, HttpProxyBasicAsync
) {
1184 MockWrite writes
[] = {
1185 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
1187 "Proxy-Connection: keep-alive\r\n"
1188 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
1190 MockRead reads
[] = {
1191 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
1193 StaticSocketDataProvider
data(reads
, arraysize(reads
), writes
,
1195 socket_factory_
.AddSocketDataProvider(&data
);
1197 SSLSocketDataProvider
ssl(ASYNC
, OK
);
1198 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1200 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1201 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_HTTP
,
1204 ClientSocketHandle handle
;
1205 TestCompletionCallback callback
;
1206 int rv
= handle
.Init(
1207 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1208 EXPECT_EQ(ERR_IO_PENDING
, rv
);
1209 EXPECT_FALSE(handle
.is_initialized());
1210 EXPECT_FALSE(handle
.socket());
1212 EXPECT_EQ(OK
, callback
.WaitForResult());
1213 EXPECT_TRUE(handle
.is_initialized());
1214 EXPECT_TRUE(handle
.socket());
1215 TestLoadTimingInfoNoDns(handle
);
1218 TEST_P(SSLClientSocketPoolTest
, NeedProxyAuth
) {
1219 MockWrite writes
[] = {
1220 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
1222 "Proxy-Connection: keep-alive\r\n\r\n"),
1224 MockRead reads
[] = {
1225 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
1226 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
1227 MockRead("Content-Length: 10\r\n\r\n"),
1228 MockRead("0123456789"),
1230 StaticSocketDataProvider
data(reads
, arraysize(reads
), writes
,
1232 socket_factory_
.AddSocketDataProvider(&data
);
1233 SSLSocketDataProvider
ssl(ASYNC
, OK
);
1234 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1236 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
1237 scoped_refptr
<SSLSocketParams
> params
= SSLParams(ProxyServer::SCHEME_HTTP
,
1240 ClientSocketHandle handle
;
1241 TestCompletionCallback callback
;
1242 int rv
= handle
.Init(
1243 "a", params
, MEDIUM
, callback
.callback(), pool_
.get(), BoundNetLog());
1244 EXPECT_EQ(ERR_IO_PENDING
, rv
);
1245 EXPECT_FALSE(handle
.is_initialized());
1246 EXPECT_FALSE(handle
.socket());
1248 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED
, callback
.WaitForResult());
1249 EXPECT_FALSE(handle
.is_initialized());
1250 EXPECT_FALSE(handle
.socket());
1251 EXPECT_FALSE(handle
.is_ssl_error());
1252 const HttpResponseInfo
& tunnel_info
= handle
.ssl_error_response_info();
1253 EXPECT_EQ(tunnel_info
.headers
->response_code(), 407);
1254 scoped_ptr
<ClientSocketHandle
> tunnel_handle(
1255 handle
.release_pending_http_proxy_connection());
1256 EXPECT_TRUE(tunnel_handle
->socket());
1257 EXPECT_FALSE(tunnel_handle
->socket()->IsConnected());
1260 // TODO(rch): re-enable this.
1261 TEST_P(SSLClientSocketPoolTest
, DISABLED_IPPooling
) {
1262 const int kTestPort
= 80;
1267 AddressList addresses
;
1269 { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" },
1270 { "code.google.com", "192.168.0.2,192.168.0.3,192.168.0.5" },
1271 { "js.webkit.org", "192.168.0.4,192.168.0.1,192.0.2.33" },
1274 host_resolver_
.set_synchronous_mode(true);
1275 for (size_t i
= 0; i
< ARRAYSIZE_UNSAFE(test_hosts
); i
++) {
1276 host_resolver_
.rules()->AddIPLiteralRule(
1277 test_hosts
[i
].name
, test_hosts
[i
].iplist
, std::string());
1279 // This test requires that the HostResolver cache be populated. Normal
1280 // code would have done this already, but we do it manually.
1281 HostResolver::RequestInfo
info(HostPortPair(test_hosts
[i
].name
, kTestPort
));
1282 host_resolver_
.Resolve(info
,
1284 &test_hosts
[i
].addresses
,
1285 CompletionCallback(),
1289 // Setup a SpdySessionKey
1290 test_hosts
[i
].key
= SpdySessionKey(
1291 HostPortPair(test_hosts
[i
].name
, kTestPort
), ProxyServer::Direct(),
1292 PRIVACY_MODE_DISABLED
);
1295 MockRead reads
[] = {
1296 MockRead(ASYNC
, ERR_IO_PENDING
),
1298 StaticSocketDataProvider
data(reads
, arraysize(reads
), NULL
, 0);
1299 socket_factory_
.AddSocketDataProvider(&data
);
1300 SSLSocketDataProvider
ssl(ASYNC
, OK
);
1301 ssl
.cert
= X509Certificate::CreateFromBytes(
1302 reinterpret_cast<const char*>(webkit_der
), sizeof(webkit_der
));
1303 ssl
.SetNextProto(GetParam());
1304 socket_factory_
.AddSSLSocketDataProvider(&ssl
);
1306 CreatePool(true /* tcp pool */, false, false);
1307 base::WeakPtr
<SpdySession
> spdy_session
=
1308 CreateSecureSpdySession(session_
, test_hosts
[0].key
, BoundNetLog());
1311 HasSpdySession(session_
->spdy_session_pool(), test_hosts
[0].key
));
1313 HasSpdySession(session_
->spdy_session_pool(), test_hosts
[1].key
));
1315 HasSpdySession(session_
->spdy_session_pool(), test_hosts
[2].key
));
1317 session_
->spdy_session_pool()->CloseAllSessions();
1320 void SSLClientSocketPoolTest::TestIPPoolingDisabled(
1321 SSLSocketDataProvider
* ssl
) {
1322 const int kTestPort
= 80;
1327 AddressList addresses
;
1329 { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" },
1330 { "js.webkit.com", "192.168.0.4,192.168.0.1,192.0.2.33" },
1333 TestCompletionCallback callback
;
1335 for (size_t i
= 0; i
< ARRAYSIZE_UNSAFE(test_hosts
); i
++) {
1336 host_resolver_
.rules()->AddIPLiteralRule(
1337 test_hosts
[i
].name
, test_hosts
[i
].iplist
, std::string());
1339 // This test requires that the HostResolver cache be populated. Normal
1340 // code would have done this already, but we do it manually.
1341 HostResolver::RequestInfo
info(HostPortPair(test_hosts
[i
].name
, kTestPort
));
1342 rv
= host_resolver_
.Resolve(info
,
1344 &test_hosts
[i
].addresses
,
1345 callback
.callback(),
1348 EXPECT_EQ(OK
, callback
.GetResult(rv
));
1350 // Setup a SpdySessionKey
1351 test_hosts
[i
].key
= SpdySessionKey(
1352 HostPortPair(test_hosts
[i
].name
, kTestPort
), ProxyServer::Direct(),
1353 PRIVACY_MODE_DISABLED
);
1356 MockRead reads
[] = {
1357 MockRead(ASYNC
, ERR_IO_PENDING
),
1359 StaticSocketDataProvider
data(reads
, arraysize(reads
), NULL
, 0);
1360 socket_factory_
.AddSocketDataProvider(&data
);
1361 socket_factory_
.AddSSLSocketDataProvider(ssl
);
1363 CreatePool(true /* tcp pool */, false, false);
1364 base::WeakPtr
<SpdySession
> spdy_session
=
1365 CreateSecureSpdySession(session_
, test_hosts
[0].key
, BoundNetLog());
1368 HasSpdySession(session_
->spdy_session_pool(), test_hosts
[0].key
));
1370 HasSpdySession(session_
->spdy_session_pool(), test_hosts
[1].key
));
1372 session_
->spdy_session_pool()->CloseAllSessions();
1375 // Verifies that an SSL connection with client authentication disables SPDY IP
1377 TEST_P(SSLClientSocketPoolTest
, IPPoolingClientCert
) {
1378 SSLSocketDataProvider
ssl(ASYNC
, OK
);
1379 ssl
.cert
= X509Certificate::CreateFromBytes(
1380 reinterpret_cast<const char*>(webkit_der
), sizeof(webkit_der
));
1381 ssl
.client_cert_sent
= true;
1382 ssl
.SetNextProto(GetParam());
1383 TestIPPoolingDisabled(&ssl
);
1386 // Verifies that an SSL connection with channel ID disables SPDY IP pooling.
1387 TEST_P(SSLClientSocketPoolTest
, IPPoolingChannelID
) {
1388 SSLSocketDataProvider
ssl(ASYNC
, OK
);
1389 ssl
.channel_id_sent
= true;
1390 ssl
.SetNextProto(GetParam());
1391 TestIPPoolingDisabled(&ssl
);
1394 // It would be nice to also test the timeouts in SSLClientSocketPool.