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

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: Fixed error in SSLSessionIsInCache. 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..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));

Powered by Google App Engine
This is Rietveld 408576698