| 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..1d0c3827efac13cf319d6bf8189410a899eca1de 100644
|
| --- a/net/socket/ssl_client_socket_pool_unittest.cc
|
| +++ b/net/socket/ssl_client_socket_pool_unittest.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/callback.h"
|
| #include "base/compiler_specific.h"
|
| +#include "base/run_loop.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/time/time.h"
|
| @@ -229,6 +230,167 @@ 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) {
|
| + SSLClientSocketPool::set_enable_connect_job_waiting(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_SSL_PROTOCOL_ERROR);
|
| + ssl.is_in_session_cache_ = false;
|
| + ssl.block_in_connect_ = true;
|
| + SSLSocketDataProvider ssl2(ASYNC, OK);
|
| + ssl2.is_in_session_cache_ = false;
|
| + ssl2.block_in_connect_ = true;
|
| + SSLSocketDataProvider ssl3(ASYNC, OK);
|
| + ssl3.is_in_session_cache_ = false;
|
| + SSLSocketDataProvider ssl4(ASYNC, OK);
|
| + ssl4.is_in_session_cache_ = false;
|
| + SSLSocketDataProvider ssl5(ASYNC, OK);
|
| + ssl5.is_in_session_cache_ = 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());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::vector<MockSSLClientSocket*> sockets =
|
| + socket_factory_.GetSSLClientSockets();
|
| +
|
| + // The first socket's connection should have failed, and no other sockets
|
| + // should have connected yet.
|
| + for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin();
|
| + it != sockets.end();
|
| + ++it) {
|
| + EXPECT_FALSE((*it)->IsConnectedSSL());
|
| + }
|
| +
|
| + // Allow the first socket to resume it's connection process.
|
| + sockets[0]->Connect(sockets[0]->GetResumptionCallback());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // The second socket should have connected.
|
| + EXPECT_TRUE(sockets[1]->IsConnectedSSL());
|
| +
|
| + // Allow the second socket to continue its connection.
|
| + sockets[1]->Connect(sockets[1]->GetResumptionCallback());
|
| + callback4.WaitForResult();
|
| +
|
| + // Pending connections should ultimately succeed.
|
| + for (std::vector<MockSSLClientSocket*>::iterator it = ++sockets.begin();
|
| + it != sockets.end();
|
| + ++it) {
|
| + EXPECT_TRUE((*it)->IsConnectedSSL());
|
| + }
|
| +}
|
| +
|
| +// Make sure that no sockets connect before the "leader" socket,
|
| +// given that the leader has a successful connection.
|
| +TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsSuccess) {
|
| + SSLClientSocketPool::set_enable_connect_job_waiting(true);
|
| +
|
| + StaticSocketDataProvider data1;
|
| + StaticSocketDataProvider data2;
|
| + StaticSocketDataProvider data3;
|
| + socket_factory_.AddSocketDataProvider(&data1);
|
| + socket_factory_.AddSocketDataProvider(&data2);
|
| + socket_factory_.AddSocketDataProvider(&data3);
|
| +
|
| + SSLSocketDataProvider ssl(ASYNC, OK);
|
| + ssl.is_in_session_cache_ = false;
|
| + ssl.block_in_connect_ = true;
|
| + SSLSocketDataProvider ssl2(ASYNC, OK);
|
| + ssl2.is_in_session_cache_ = false;
|
| + SSLSocketDataProvider ssl3(ASYNC, OK);
|
| + ssl3.is_in_session_cache_ = false;
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl2);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl3);
|
| +
|
| + 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);
|
| + ClientSocketHandle handle1;
|
| + ClientSocketHandle handle2;
|
| + ClientSocketHandle handle3;
|
| + TestCompletionCallback callback1;
|
| + TestCompletionCallback callback2;
|
| + TestCompletionCallback callback3;
|
| +
|
| + 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());
|
| +
|
| + // Allow the connections to proceed until the first socket has finished
|
| + // connecting.
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + std::vector<MockSSLClientSocket*> sockets =
|
| + socket_factory_.GetSSLClientSockets();
|
| +
|
| + EXPECT_TRUE(sockets[0]->IsConnectedSSL());
|
| + for (std::vector<MockSSLClientSocket*>::iterator it = ++sockets.begin();
|
| + it != sockets.end();
|
| + ++it) {
|
| + EXPECT_FALSE((*it)->IsConnectedSSL());
|
| + }
|
| +
|
| + sockets[0]->Connect(sockets[0]->GetResumptionCallback());
|
| +
|
| + callback3.WaitForResult();
|
| +
|
| + EXPECT_TRUE(handle1.socket()->IsConnected());
|
| + EXPECT_TRUE(handle2.socket()->IsConnected());
|
| + EXPECT_TRUE(handle3.socket()->IsConnected());
|
| +}
|
| +
|
| TEST_P(SSLClientSocketPoolTest, TCPFail) {
|
| StaticSocketDataProvider data;
|
| data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED));
|
|
|