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

Unified Diff: net/socket/ssl_client_socket_pool_unittest.cc

Issue 353713005: Implements new, more robust design for communicating between SSLConnectJobs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed location of enable_connect_job_waiting_ and added documentation. Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: net/socket/ssl_client_socket_pool_unittest.cc
diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc
index e71d0b2c2357683bd4547d075f71d5f4ffcc5209..3a39a37e87fa717ed2dfe309709a3d0a4badcc8c 100644
--- a/net/socket/ssl_client_socket_pool_unittest.cc
+++ b/net/socket/ssl_client_socket_pool_unittest.cc
@@ -229,6 +229,149 @@ INSTANTIATE_TEST_CASE_P(
testing::Values(kProtoDeprecatedSPDY2,
kProtoSPDY3, kProtoSPDY31, kProtoSPDY4));
+// Make sure that sockets still connect after the leader socket's
+// connection fails.
+TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsFail) {
+ SSLClientSocket::EnableConnectJobWaiting(true);
+
+ StaticSocketDataProvider data1;
+ StaticSocketDataProvider data2;
+ StaticSocketDataProvider data3;
+ StaticSocketDataProvider data4;
+ StaticSocketDataProvider data5;
+ socket_factory_.AddSocketDataProvider(&data1);
+ socket_factory_.AddSocketDataProvider(&data2);
+ socket_factory_.AddSocketDataProvider(&data3);
+ socket_factory_.AddSocketDataProvider(&data4);
+ socket_factory_.AddSocketDataProvider(&data5);
+ SSLSocketDataProvider ssl(ASYNC, ERR_CONNECTION_FAILED);
+ ssl.is_in_session_cache_ = false;
+ ssl.is_leader_ = true;
+ SSLSocketDataProvider ssl2(ASYNC, OK);
+ ssl2.is_in_session_cache_ = false;
+ ssl2.is_leader_ = false;
+ SSLSocketDataProvider ssl3(ASYNC, OK);
+ ssl3.is_in_session_cache_ = false;
+ ssl3.is_leader_ = false;
+ SSLSocketDataProvider ssl4(ASYNC, OK);
+ ssl4.is_in_session_cache_ = false;
+ ssl4.is_leader_ = false;
+ SSLSocketDataProvider ssl5(ASYNC, OK);
+ ssl.is_in_session_cache_ = false;
+ ssl.is_leader_ = false;
+
+ socket_factory_.AddSSLSocketDataProvider(&ssl);
+ socket_factory_.AddSSLSocketDataProvider(&ssl2);
+ socket_factory_.AddSSLSocketDataProvider(&ssl3);
+ socket_factory_.AddSSLSocketDataProvider(&ssl4);
+ socket_factory_.AddSSLSocketDataProvider(&ssl5);
+
+ CreatePool(true, false, false);
+ scoped_refptr<SSLSocketParams> params1 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ scoped_refptr<SSLSocketParams> params2 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ scoped_refptr<SSLSocketParams> params3 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ scoped_refptr<SSLSocketParams> params4 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ ClientSocketHandle handle1;
+ ClientSocketHandle handle2;
+ ClientSocketHandle handle3;
+ ClientSocketHandle handle4;
+ TestCompletionCallback callback1;
+ TestCompletionCallback callback2;
+ TestCompletionCallback callback3;
+ TestCompletionCallback callback4;
+ handle1.Init(
+ "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
+ handle2.Init(
+ "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
+ handle3.Init(
+ "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
+ handle4.Init(
+ "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog());
+
+ callback4.WaitForResult();
+
+ // The leader should not have connected.
+ EXPECT_FALSE(handle1.socket());
+ // Ensure that all sockets following the leader still connected.
+ EXPECT_TRUE(handle2.socket()->IsConnected());
+ EXPECT_TRUE(handle3.socket()->IsConnected());
+ EXPECT_TRUE(handle4.socket()->IsConnected());
+}
+
+// Make sure that no sockets connect before the "leader" socket,
+// given that the leader has a successful connection.
+TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsSuccess) {
+ SSLClientSocket::EnableConnectJobWaiting(true);
+
+ StaticSocketDataProvider data1;
+ StaticSocketDataProvider data2;
+ StaticSocketDataProvider data3;
+ StaticSocketDataProvider data4;
+ socket_factory_.AddSocketDataProvider(&data1);
+ socket_factory_.AddSocketDataProvider(&data2);
+ socket_factory_.AddSocketDataProvider(&data3);
+ socket_factory_.AddSocketDataProvider(&data4);
+ SSLSocketDataProvider ssl(ASYNC, OK);
+ ssl.is_in_session_cache_ = false;
+ ssl.is_leader_ = true;
+ SSLSocketDataProvider ssl2(ASYNC, OK);
+ ssl2.is_in_session_cache_ = false;
+ ssl2.is_leader_ = false;
+ SSLSocketDataProvider ssl3(ASYNC, OK);
+ ssl3.is_in_session_cache_ = false;
+ ssl3.is_leader_ = false;
+ SSLSocketDataProvider ssl4(ASYNC, OK);
+ ssl4.is_in_session_cache_ = false;
+ ssl4.is_leader_ = false;
+
+ socket_factory_.AddSSLSocketDataProvider(&ssl);
+ socket_factory_.AddSSLSocketDataProvider(&ssl2);
+ socket_factory_.AddSSLSocketDataProvider(&ssl3);
+ socket_factory_.AddSSLSocketDataProvider(&ssl4);
+
+ CreatePool(true, false, false);
+ scoped_refptr<SSLSocketParams> params1 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ scoped_refptr<SSLSocketParams> params2 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ scoped_refptr<SSLSocketParams> params3 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ scoped_refptr<SSLSocketParams> params4 =
+ SSLParams(ProxyServer::SCHEME_DIRECT, false);
+ ClientSocketHandle handle1;
+ ClientSocketHandle handle2;
+ ClientSocketHandle handle3;
+ ClientSocketHandle handle4;
+ TestCompletionCallback callback1;
+ TestCompletionCallback callback2;
+ TestCompletionCallback callback3;
+ TestCompletionCallback callback4;
+ handle1.Init(
+ "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog());
+ handle2.Init(
+ "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog());
+ handle3.Init(
+ "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog());
+ handle4.Init(
+ "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog());
+
+ callback4.WaitForResult();
+
+ std::vector<MockSSLClientSocket*> sockets =
+ socket_factory_.GetSSLClientSockets();
+ for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin();
+ it != sockets.end();
+ ++it)
+ EXPECT_TRUE((*it)->IsGoodOrdering());
+
+ EXPECT_TRUE(handle1.socket());
+ EXPECT_TRUE(handle2.socket());
+}
+
TEST_P(SSLClientSocketPoolTest, TCPFail) {
StaticSocketDataProvider data;
data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED));

Powered by Google App Engine
This is Rietveld 408576698