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)); |