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

Side by Side Diff: net/socket/ssl_client_socket_pool_unittest.cc

Issue 981723008: Unwind the SSL connection holdback experiment and remove related code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rename & reformat Created 5 years, 9 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
« no previous file with comments | « net/socket/ssl_client_socket_pool.cc ('k') | net/socket/ssl_client_socket_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/run_loop.h"
10 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
11 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h" 11 #include "base/time/time.h"
13 #include "net/base/auth.h" 12 #include "net/base/auth.h"
14 #include "net/base/load_timing_info.h" 13 #include "net/base/load_timing_info.h"
15 #include "net/base/load_timing_info_test_util.h" 14 #include "net/base/load_timing_info_test_util.h"
16 #include "net/base/net_errors.h" 15 #include "net/base/net_errors.h"
17 #include "net/base/test_completion_callback.h" 16 #include "net/base/test_completion_callback.h"
18 #include "net/cert/cert_verifier.h" 17 #include "net/cert/cert_verifier.h"
19 #include "net/dns/mock_host_resolver.h" 18 #include "net/dns/mock_host_resolver.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 : public testing::Test, 78 : public testing::Test,
80 public ::testing::WithParamInterface<NextProto> { 79 public ::testing::WithParamInterface<NextProto> {
81 protected: 80 protected:
82 SSLClientSocketPoolTest() 81 SSLClientSocketPoolTest()
83 : transport_security_state_(new TransportSecurityState), 82 : transport_security_state_(new TransportSecurityState),
84 proxy_service_(ProxyService::CreateDirect()), 83 proxy_service_(ProxyService::CreateDirect()),
85 ssl_config_service_(new SSLConfigServiceDefaults), 84 ssl_config_service_(new SSLConfigServiceDefaults),
86 http_auth_handler_factory_( 85 http_auth_handler_factory_(
87 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), 86 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
88 session_(CreateNetworkSession()), 87 session_(CreateNetworkSession()),
89 direct_transport_socket_params_( 88 direct_transport_socket_params_(new TransportSocketParams(
90 new TransportSocketParams( 89 HostPortPair("host", 443),
91 HostPortPair("host", 443), 90 false,
92 false, 91 false,
93 false, 92 OnHostResolutionCallback(),
94 OnHostResolutionCallback(), 93 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)),
95 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)),
96 transport_histograms_("MockTCP"), 94 transport_histograms_("MockTCP"),
97 transport_socket_pool_(kMaxSockets, 95 transport_socket_pool_(kMaxSockets,
98 kMaxSocketsPerGroup, 96 kMaxSocketsPerGroup,
99 &transport_histograms_, 97 &transport_histograms_,
100 &socket_factory_), 98 &socket_factory_),
101 proxy_transport_socket_params_( 99 proxy_transport_socket_params_(new TransportSocketParams(
102 new TransportSocketParams( 100 HostPortPair("proxy", 443),
103 HostPortPair("proxy", 443), 101 false,
104 false, 102 false,
105 false, 103 OnHostResolutionCallback(),
106 OnHostResolutionCallback(), 104 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)),
107 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)),
108 socks_socket_params_( 105 socks_socket_params_(
109 new SOCKSSocketParams(proxy_transport_socket_params_, 106 new SOCKSSocketParams(proxy_transport_socket_params_,
110 true, 107 true,
111 HostPortPair("sockshost", 443))), 108 HostPortPair("sockshost", 443))),
112 socks_histograms_("MockSOCKS"), 109 socks_histograms_("MockSOCKS"),
113 socks_socket_pool_(kMaxSockets, 110 socks_socket_pool_(kMaxSockets,
114 kMaxSocketsPerGroup, 111 kMaxSocketsPerGroup,
115 &socks_histograms_, 112 &socks_histograms_,
116 &transport_socket_pool_), 113 &transport_socket_pool_),
117 http_proxy_socket_params_( 114 http_proxy_socket_params_(
118 new HttpProxySocketParams(proxy_transport_socket_params_, 115 new HttpProxySocketParams(proxy_transport_socket_params_,
119 NULL, 116 NULL,
120 GURL("http://host"), 117 GURL("http://host"),
121 std::string(), 118 std::string(),
122 HostPortPair("host", 80), 119 HostPortPair("host", 80),
123 session_->http_auth_cache(), 120 session_->http_auth_cache(),
124 session_->http_auth_handler_factory(), 121 session_->http_auth_handler_factory(),
125 session_->spdy_session_pool(), 122 session_->spdy_session_pool(),
126 true, 123 true,
127 NULL)), 124 NULL)),
128 http_proxy_histograms_("MockHttpProxy"), 125 http_proxy_histograms_("MockHttpProxy"),
129 http_proxy_socket_pool_(kMaxSockets, 126 http_proxy_socket_pool_(kMaxSockets,
130 kMaxSocketsPerGroup, 127 kMaxSocketsPerGroup,
131 &http_proxy_histograms_, 128 &http_proxy_histograms_,
132 &transport_socket_pool_, 129 &transport_socket_pool_,
133 NULL, 130 NULL,
134 NULL), 131 NULL) {
135 enable_ssl_connect_job_waiting_(false) {
136 scoped_refptr<SSLConfigService> ssl_config_service( 132 scoped_refptr<SSLConfigService> ssl_config_service(
137 new SSLConfigServiceDefaults); 133 new SSLConfigServiceDefaults);
138 ssl_config_service->GetSSLConfig(&ssl_config_); 134 ssl_config_service->GetSSLConfig(&ssl_config_);
139 } 135 }
140 136
141 void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) { 137 void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) {
142 ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest")); 138 ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest"));
143 pool_.reset(new SSLClientSocketPool( 139 pool_.reset(new SSLClientSocketPool(
144 kMaxSockets, kMaxSocketsPerGroup, ssl_histograms_.get(), 140 kMaxSockets, kMaxSocketsPerGroup, ssl_histograms_.get(),
145 NULL /* cert_verifier */, NULL /* channel_id_service */, 141 NULL /* cert_verifier */, NULL /* channel_id_service */,
146 NULL /* transport_security_state */, 142 NULL /* transport_security_state */,
147 NULL /* cert_transparency_verifier */, NULL /* cert_policy_enforcer */, 143 NULL /* cert_transparency_verifier */, NULL /* cert_policy_enforcer */,
148 std::string() /* ssl_session_cache_shard */, &socket_factory_, 144 std::string() /* ssl_session_cache_shard */, &socket_factory_,
149 transport_pool ? &transport_socket_pool_ : NULL, 145 transport_pool ? &transport_socket_pool_ : NULL,
150 socks_pool ? &socks_socket_pool_ : NULL, 146 socks_pool ? &socks_socket_pool_ : NULL,
151 http_proxy_pool ? &http_proxy_socket_pool_ : NULL, NULL, 147 http_proxy_pool ? &http_proxy_socket_pool_ : NULL, NULL, NULL));
152 enable_ssl_connect_job_waiting_, NULL));
153 } 148 }
154 149
155 scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy, 150 scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy,
156 bool want_spdy_over_npn) { 151 bool want_spdy_over_npn) {
157 return make_scoped_refptr(new SSLSocketParams( 152 return make_scoped_refptr(new SSLSocketParams(
158 proxy == ProxyServer::SCHEME_DIRECT ? direct_transport_socket_params_ 153 proxy == ProxyServer::SCHEME_DIRECT ? direct_transport_socket_params_
159 : NULL, 154 : NULL,
160 proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL, 155 proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL,
161 proxy == ProxyServer::SCHEME_HTTP ? http_proxy_socket_params_ : NULL, 156 proxy == ProxyServer::SCHEME_HTTP ? http_proxy_socket_params_ : NULL,
162 HostPortPair("host", 443), 157 HostPortPair("host", 443),
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 ClientSocketPoolHistograms socks_histograms_; 211 ClientSocketPoolHistograms socks_histograms_;
217 MockSOCKSClientSocketPool socks_socket_pool_; 212 MockSOCKSClientSocketPool socks_socket_pool_;
218 213
219 scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_; 214 scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_;
220 ClientSocketPoolHistograms http_proxy_histograms_; 215 ClientSocketPoolHistograms http_proxy_histograms_;
221 HttpProxyClientSocketPool http_proxy_socket_pool_; 216 HttpProxyClientSocketPool http_proxy_socket_pool_;
222 217
223 SSLConfig ssl_config_; 218 SSLConfig ssl_config_;
224 scoped_ptr<ClientSocketPoolHistograms> ssl_histograms_; 219 scoped_ptr<ClientSocketPoolHistograms> ssl_histograms_;
225 scoped_ptr<SSLClientSocketPool> pool_; 220 scoped_ptr<SSLClientSocketPool> pool_;
226
227 bool enable_ssl_connect_job_waiting_;
228 }; 221 };
229 222
230 INSTANTIATE_TEST_CASE_P(NextProto, 223 INSTANTIATE_TEST_CASE_P(NextProto,
231 SSLClientSocketPoolTest, 224 SSLClientSocketPoolTest,
232 testing::Values(kProtoSPDY31, 225 testing::Values(kProtoSPDY31,
233 kProtoSPDY4_14, 226 kProtoSPDY4_14,
234 kProtoSPDY4)); 227 kProtoSPDY4));
235 228
236 // Tests that the final socket will connect even if all sockets
237 // prior to it fail.
238 //
239 // All sockets should wait for the first socket to attempt to
240 // connect. Once it fails to connect, all other sockets should
241 // attempt to connect. All should fail, except the final socket.
242 TEST_P(SSLClientSocketPoolTest, AllSocketsFailButLast) {
243 // Although we request four sockets, the first three socket connect
244 // failures cause the socket pool to create three more sockets because
245 // there are pending requests.
246 StaticSocketDataProvider data1;
247 StaticSocketDataProvider data2;
248 StaticSocketDataProvider data3;
249 StaticSocketDataProvider data4;
250 StaticSocketDataProvider data5;
251 StaticSocketDataProvider data6;
252 StaticSocketDataProvider data7;
253 socket_factory_.AddSocketDataProvider(&data1);
254 socket_factory_.AddSocketDataProvider(&data2);
255 socket_factory_.AddSocketDataProvider(&data3);
256 socket_factory_.AddSocketDataProvider(&data4);
257 socket_factory_.AddSocketDataProvider(&data5);
258 socket_factory_.AddSocketDataProvider(&data6);
259 socket_factory_.AddSocketDataProvider(&data7);
260 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR);
261 ssl.is_in_session_cache = false;
262 SSLSocketDataProvider ssl2(ASYNC, ERR_SSL_PROTOCOL_ERROR);
263 ssl2.is_in_session_cache = false;
264 SSLSocketDataProvider ssl3(ASYNC, ERR_SSL_PROTOCOL_ERROR);
265 ssl3.is_in_session_cache = false;
266 SSLSocketDataProvider ssl4(ASYNC, OK);
267 ssl4.is_in_session_cache = false;
268 SSLSocketDataProvider ssl5(ASYNC, OK);
269 ssl5.is_in_session_cache = false;
270 SSLSocketDataProvider ssl6(ASYNC, OK);
271 ssl6.is_in_session_cache = false;
272 SSLSocketDataProvider ssl7(ASYNC, OK);
273 ssl7.is_in_session_cache = false;
274
275 socket_factory_.AddSSLSocketDataProvider(&ssl);
276 socket_factory_.AddSSLSocketDataProvider(&ssl2);
277 socket_factory_.AddSSLSocketDataProvider(&ssl3);
278 socket_factory_.AddSSLSocketDataProvider(&ssl4);
279 socket_factory_.AddSSLSocketDataProvider(&ssl5);
280 socket_factory_.AddSSLSocketDataProvider(&ssl6);
281 socket_factory_.AddSSLSocketDataProvider(&ssl7);
282
283 enable_ssl_connect_job_waiting_ = true;
284 CreatePool(true, false, false);
285
286 scoped_refptr<SSLSocketParams> params1 =
287 SSLParams(ProxyServer::SCHEME_DIRECT, false);
288 scoped_refptr<SSLSocketParams> params2 =
289 SSLParams(ProxyServer::SCHEME_DIRECT, false);
290 scoped_refptr<SSLSocketParams> params3 =
291 SSLParams(ProxyServer::SCHEME_DIRECT, false);
292 scoped_refptr<SSLSocketParams> params4 =
293 SSLParams(ProxyServer::SCHEME_DIRECT, false);
294 ClientSocketHandle handle1;
295 ClientSocketHandle handle2;
296 ClientSocketHandle handle3;
297 ClientSocketHandle handle4;
298 TestCompletionCallback callback1;
299 TestCompletionCallback callback2;
300 TestCompletionCallback callback3;
301 TestCompletionCallback callback4;
302
303 handle1.Init(
304 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
305 handle2.Init(
306 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
307 handle3.Init(
308 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
309 handle4.Init(
310 "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog());
311
312 base::RunLoop().RunUntilIdle();
313
314 // Only the last socket should have connected.
315 EXPECT_FALSE(handle1.socket());
316 EXPECT_FALSE(handle2.socket());
317 EXPECT_FALSE(handle3.socket());
318 EXPECT_TRUE(handle4.socket()->IsConnected());
319 }
320
321 // Tests that sockets will still connect in parallel if the
322 // EnableSSLConnectJobWaiting flag is not enabled.
323 TEST_P(SSLClientSocketPoolTest, SocketsConnectWithoutFlag) {
324 StaticSocketDataProvider data1;
325 StaticSocketDataProvider data2;
326 StaticSocketDataProvider data3;
327 socket_factory_.AddSocketDataProvider(&data1);
328 socket_factory_.AddSocketDataProvider(&data2);
329 socket_factory_.AddSocketDataProvider(&data3);
330
331 SSLSocketDataProvider ssl(ASYNC, OK);
332 ssl.is_in_session_cache = false;
333 ssl.should_pause_on_connect = true;
334 SSLSocketDataProvider ssl2(ASYNC, OK);
335 ssl2.is_in_session_cache = false;
336 ssl2.should_pause_on_connect = true;
337 SSLSocketDataProvider ssl3(ASYNC, OK);
338 ssl3.is_in_session_cache = false;
339 ssl3.should_pause_on_connect = true;
340 socket_factory_.AddSSLSocketDataProvider(&ssl);
341 socket_factory_.AddSSLSocketDataProvider(&ssl2);
342 socket_factory_.AddSSLSocketDataProvider(&ssl3);
343
344 CreatePool(true, false, false);
345
346 scoped_refptr<SSLSocketParams> params1 =
347 SSLParams(ProxyServer::SCHEME_DIRECT, false);
348 scoped_refptr<SSLSocketParams> params2 =
349 SSLParams(ProxyServer::SCHEME_DIRECT, false);
350 scoped_refptr<SSLSocketParams> params3 =
351 SSLParams(ProxyServer::SCHEME_DIRECT, false);
352 ClientSocketHandle handle1;
353 ClientSocketHandle handle2;
354 ClientSocketHandle handle3;
355 TestCompletionCallback callback1;
356 TestCompletionCallback callback2;
357 TestCompletionCallback callback3;
358
359 handle1.Init(
360 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
361 handle2.Init(
362 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
363 handle3.Init(
364 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
365
366 base::RunLoop().RunUntilIdle();
367
368 std::vector<MockSSLClientSocket*> sockets =
369 socket_factory_.ssl_client_sockets();
370
371 // All sockets should have started their connections.
372 for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin();
373 it != sockets.end();
374 ++it) {
375 EXPECT_TRUE((*it)->reached_connect());
376 }
377
378 // Resume connecting all of the sockets.
379 for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin();
380 it != sockets.end();
381 ++it) {
382 (*it)->RestartPausedConnect();
383 }
384
385 callback1.WaitForResult();
386 callback2.WaitForResult();
387 callback3.WaitForResult();
388
389 EXPECT_TRUE(handle1.socket()->IsConnected());
390 EXPECT_TRUE(handle2.socket()->IsConnected());
391 EXPECT_TRUE(handle3.socket()->IsConnected());
392 }
393
394 // Tests that the pool deleting an SSLConnectJob will not cause a crash,
395 // or prevent pending sockets from connecting.
396 TEST_P(SSLClientSocketPoolTest, DeletedSSLConnectJob) {
397 StaticSocketDataProvider data1;
398 StaticSocketDataProvider data2;
399 StaticSocketDataProvider data3;
400 socket_factory_.AddSocketDataProvider(&data1);
401 socket_factory_.AddSocketDataProvider(&data2);
402 socket_factory_.AddSocketDataProvider(&data3);
403
404 SSLSocketDataProvider ssl(ASYNC, OK);
405 ssl.is_in_session_cache = false;
406 ssl.should_pause_on_connect = true;
407 SSLSocketDataProvider ssl2(ASYNC, OK);
408 ssl2.is_in_session_cache = false;
409 SSLSocketDataProvider ssl3(ASYNC, OK);
410 ssl3.is_in_session_cache = false;
411 socket_factory_.AddSSLSocketDataProvider(&ssl);
412 socket_factory_.AddSSLSocketDataProvider(&ssl2);
413 socket_factory_.AddSSLSocketDataProvider(&ssl3);
414
415 enable_ssl_connect_job_waiting_ = true;
416 CreatePool(true, false, false);
417
418 scoped_refptr<SSLSocketParams> params1 =
419 SSLParams(ProxyServer::SCHEME_DIRECT, false);
420 scoped_refptr<SSLSocketParams> params2 =
421 SSLParams(ProxyServer::SCHEME_DIRECT, false);
422 scoped_refptr<SSLSocketParams> params3 =
423 SSLParams(ProxyServer::SCHEME_DIRECT, false);
424 ClientSocketHandle handle1;
425 ClientSocketHandle handle2;
426 ClientSocketHandle handle3;
427 TestCompletionCallback callback1;
428 TestCompletionCallback callback2;
429 TestCompletionCallback callback3;
430
431 handle1.Init(
432 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
433 handle2.Init(
434 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
435 handle3.Init(
436 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
437
438 // Allow the connections to proceed until the first socket has started
439 // connecting.
440 base::RunLoop().RunUntilIdle();
441
442 std::vector<MockSSLClientSocket*> sockets =
443 socket_factory_.ssl_client_sockets();
444
445 pool_->CancelRequest("b", &handle2);
446
447 sockets[0]->RestartPausedConnect();
448
449 callback1.WaitForResult();
450 callback3.WaitForResult();
451
452 EXPECT_TRUE(handle1.socket()->IsConnected());
453 EXPECT_FALSE(handle2.socket());
454 EXPECT_TRUE(handle3.socket()->IsConnected());
455 }
456
457 // Tests that all pending sockets still connect when the pool deletes a pending
458 // SSLConnectJob which immediately followed a failed leading connection.
459 TEST_P(SSLClientSocketPoolTest, DeletedSocketAfterFail) {
460 StaticSocketDataProvider data1;
461 StaticSocketDataProvider data2;
462 StaticSocketDataProvider data3;
463 StaticSocketDataProvider data4;
464 socket_factory_.AddSocketDataProvider(&data1);
465 socket_factory_.AddSocketDataProvider(&data2);
466 socket_factory_.AddSocketDataProvider(&data3);
467 socket_factory_.AddSocketDataProvider(&data4);
468
469 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR);
470 ssl.is_in_session_cache = false;
471 ssl.should_pause_on_connect = true;
472 SSLSocketDataProvider ssl2(ASYNC, OK);
473 ssl2.is_in_session_cache = false;
474 SSLSocketDataProvider ssl3(ASYNC, OK);
475 ssl3.is_in_session_cache = false;
476 SSLSocketDataProvider ssl4(ASYNC, OK);
477 ssl4.is_in_session_cache = false;
478 socket_factory_.AddSSLSocketDataProvider(&ssl);
479 socket_factory_.AddSSLSocketDataProvider(&ssl2);
480 socket_factory_.AddSSLSocketDataProvider(&ssl3);
481 socket_factory_.AddSSLSocketDataProvider(&ssl4);
482
483 enable_ssl_connect_job_waiting_ = true;
484 CreatePool(true, false, false);
485
486 scoped_refptr<SSLSocketParams> params1 =
487 SSLParams(ProxyServer::SCHEME_DIRECT, false);
488 scoped_refptr<SSLSocketParams> params2 =
489 SSLParams(ProxyServer::SCHEME_DIRECT, false);
490 scoped_refptr<SSLSocketParams> params3 =
491 SSLParams(ProxyServer::SCHEME_DIRECT, false);
492 ClientSocketHandle handle1;
493 ClientSocketHandle handle2;
494 ClientSocketHandle handle3;
495 TestCompletionCallback callback1;
496 TestCompletionCallback callback2;
497 TestCompletionCallback callback3;
498
499 handle1.Init(
500 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
501 handle2.Init(
502 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
503 handle3.Init(
504 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
505
506 // Allow the connections to proceed until the first socket has started
507 // connecting.
508 base::RunLoop().RunUntilIdle();
509
510 std::vector<MockSSLClientSocket*> sockets =
511 socket_factory_.ssl_client_sockets();
512
513 EXPECT_EQ(3u, sockets.size());
514 EXPECT_TRUE(sockets[0]->reached_connect());
515 EXPECT_FALSE(handle1.socket());
516
517 pool_->CancelRequest("b", &handle2);
518
519 sockets[0]->RestartPausedConnect();
520
521 callback1.WaitForResult();
522 callback3.WaitForResult();
523
524 EXPECT_FALSE(handle1.socket());
525 EXPECT_FALSE(handle2.socket());
526 EXPECT_TRUE(handle3.socket()->IsConnected());
527 }
528
529 // Make sure that sockets still connect after the leader socket's
530 // connection fails.
531 TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsFail) {
532 StaticSocketDataProvider data1;
533 StaticSocketDataProvider data2;
534 StaticSocketDataProvider data3;
535 StaticSocketDataProvider data4;
536 StaticSocketDataProvider data5;
537 socket_factory_.AddSocketDataProvider(&data1);
538 socket_factory_.AddSocketDataProvider(&data2);
539 socket_factory_.AddSocketDataProvider(&data3);
540 socket_factory_.AddSocketDataProvider(&data4);
541 socket_factory_.AddSocketDataProvider(&data5);
542 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR);
543 ssl.is_in_session_cache = false;
544 ssl.should_pause_on_connect = true;
545 SSLSocketDataProvider ssl2(ASYNC, OK);
546 ssl2.is_in_session_cache = false;
547 ssl2.should_pause_on_connect = true;
548 SSLSocketDataProvider ssl3(ASYNC, OK);
549 ssl3.is_in_session_cache = false;
550 SSLSocketDataProvider ssl4(ASYNC, OK);
551 ssl4.is_in_session_cache = false;
552 SSLSocketDataProvider ssl5(ASYNC, OK);
553 ssl5.is_in_session_cache = false;
554
555 socket_factory_.AddSSLSocketDataProvider(&ssl);
556 socket_factory_.AddSSLSocketDataProvider(&ssl2);
557 socket_factory_.AddSSLSocketDataProvider(&ssl3);
558 socket_factory_.AddSSLSocketDataProvider(&ssl4);
559 socket_factory_.AddSSLSocketDataProvider(&ssl5);
560
561 enable_ssl_connect_job_waiting_ = true;
562 CreatePool(true, false, false);
563 scoped_refptr<SSLSocketParams> params1 =
564 SSLParams(ProxyServer::SCHEME_DIRECT, false);
565 scoped_refptr<SSLSocketParams> params2 =
566 SSLParams(ProxyServer::SCHEME_DIRECT, false);
567 scoped_refptr<SSLSocketParams> params3 =
568 SSLParams(ProxyServer::SCHEME_DIRECT, false);
569 scoped_refptr<SSLSocketParams> params4 =
570 SSLParams(ProxyServer::SCHEME_DIRECT, false);
571 ClientSocketHandle handle1;
572 ClientSocketHandle handle2;
573 ClientSocketHandle handle3;
574 ClientSocketHandle handle4;
575 TestCompletionCallback callback1;
576 TestCompletionCallback callback2;
577 TestCompletionCallback callback3;
578 TestCompletionCallback callback4;
579 handle1.Init(
580 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
581 handle2.Init(
582 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
583 handle3.Init(
584 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
585 handle4.Init(
586 "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog());
587
588 base::RunLoop().RunUntilIdle();
589
590 std::vector<MockSSLClientSocket*> sockets =
591 socket_factory_.ssl_client_sockets();
592
593 std::vector<MockSSLClientSocket*>::const_iterator it = sockets.begin();
594
595 // The first socket should have had Connect called on it.
596 EXPECT_TRUE((*it)->reached_connect());
597 ++it;
598
599 // No other socket should have reached connect yet.
600 for (; it != sockets.end(); ++it)
601 EXPECT_FALSE((*it)->reached_connect());
602
603 // Allow the first socket to resume it's connection process.
604 sockets[0]->RestartPausedConnect();
605
606 base::RunLoop().RunUntilIdle();
607
608 // The second socket should have reached connect.
609 EXPECT_TRUE(sockets[1]->reached_connect());
610
611 // Allow the second socket to continue its connection.
612 sockets[1]->RestartPausedConnect();
613
614 base::RunLoop().RunUntilIdle();
615
616 EXPECT_FALSE(handle1.socket());
617 EXPECT_TRUE(handle2.socket()->IsConnected());
618 EXPECT_TRUE(handle3.socket()->IsConnected());
619 EXPECT_TRUE(handle4.socket()->IsConnected());
620 }
621
622 // Make sure that no sockets connect before the "leader" socket,
623 // given that the leader has a successful connection.
624 TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsSuccess) {
625 StaticSocketDataProvider data1;
626 StaticSocketDataProvider data2;
627 StaticSocketDataProvider data3;
628 socket_factory_.AddSocketDataProvider(&data1);
629 socket_factory_.AddSocketDataProvider(&data2);
630 socket_factory_.AddSocketDataProvider(&data3);
631
632 SSLSocketDataProvider ssl(ASYNC, OK);
633 ssl.is_in_session_cache = false;
634 ssl.should_pause_on_connect = true;
635 SSLSocketDataProvider ssl2(ASYNC, OK);
636 ssl2.is_in_session_cache = false;
637 SSLSocketDataProvider ssl3(ASYNC, OK);
638 ssl3.is_in_session_cache = false;
639 socket_factory_.AddSSLSocketDataProvider(&ssl);
640 socket_factory_.AddSSLSocketDataProvider(&ssl2);
641 socket_factory_.AddSSLSocketDataProvider(&ssl3);
642
643 enable_ssl_connect_job_waiting_ = true;
644 CreatePool(true, false, false);
645
646 scoped_refptr<SSLSocketParams> params1 =
647 SSLParams(ProxyServer::SCHEME_DIRECT, false);
648 scoped_refptr<SSLSocketParams> params2 =
649 SSLParams(ProxyServer::SCHEME_DIRECT, false);
650 scoped_refptr<SSLSocketParams> params3 =
651 SSLParams(ProxyServer::SCHEME_DIRECT, false);
652 ClientSocketHandle handle1;
653 ClientSocketHandle handle2;
654 ClientSocketHandle handle3;
655 TestCompletionCallback callback1;
656 TestCompletionCallback callback2;
657 TestCompletionCallback callback3;
658
659 handle1.Init(
660 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
661 handle2.Init(
662 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
663 handle3.Init(
664 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
665
666 // Allow the connections to proceed until the first socket has finished
667 // connecting.
668 base::RunLoop().RunUntilIdle();
669
670 std::vector<MockSSLClientSocket*> sockets =
671 socket_factory_.ssl_client_sockets();
672
673 std::vector<MockSSLClientSocket*>::const_iterator it = sockets.begin();
674 // The first socket should have reached connect.
675 EXPECT_TRUE((*it)->reached_connect());
676 ++it;
677 // No other socket should have reached connect yet.
678 for (; it != sockets.end(); ++it)
679 EXPECT_FALSE((*it)->reached_connect());
680
681 sockets[0]->RestartPausedConnect();
682
683 callback1.WaitForResult();
684 callback2.WaitForResult();
685 callback3.WaitForResult();
686
687 EXPECT_TRUE(handle1.socket()->IsConnected());
688 EXPECT_TRUE(handle2.socket()->IsConnected());
689 EXPECT_TRUE(handle3.socket()->IsConnected());
690 }
691
692 TEST_P(SSLClientSocketPoolTest, TCPFail) { 229 TEST_P(SSLClientSocketPoolTest, TCPFail) {
693 StaticSocketDataProvider data; 230 StaticSocketDataProvider data;
694 data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); 231 data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED));
695 socket_factory_.AddSocketDataProvider(&data); 232 socket_factory_.AddSocketDataProvider(&data);
696 233
697 CreatePool(true /* tcp pool */, false, false); 234 CreatePool(true /* tcp pool */, false, false);
698 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 235 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
699 false); 236 false);
700 237
701 ClientSocketHandle handle; 238 ClientSocketHandle handle;
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
1387 ssl.channel_id_sent = true; 924 ssl.channel_id_sent = true;
1388 ssl.SetNextProto(GetParam()); 925 ssl.SetNextProto(GetParam());
1389 TestIPPoolingDisabled(&ssl); 926 TestIPPoolingDisabled(&ssl);
1390 } 927 }
1391 928
1392 // It would be nice to also test the timeouts in SSLClientSocketPool. 929 // It would be nice to also test the timeouts in SSLClientSocketPool.
1393 930
1394 } // namespace 931 } // namespace
1395 932
1396 } // namespace net 933 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_pool.cc ('k') | net/socket/ssl_client_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698