Chromium Code Reviews| Index: net/socket/ssl_client_socket_unittest.cc |
| diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc |
| index 3aa445a72f8795eac9bd305e20c203ab41595d64..21d6c2b9a11c58ff7e4170a235648934cf7b3324 100644 |
| --- a/net/socket/ssl_client_socket_unittest.cc |
| +++ b/net/socket/ssl_client_socket_unittest.cc |
| @@ -658,12 +658,15 @@ class SSLClientSocketTest : public PlatformTest { |
| SSLClientSocketTest() |
| : socket_factory_(ClientSocketFactory::GetDefaultFactory()), |
| cert_verifier_(new MockCertVerifier), |
| - transport_security_state_(new TransportSecurityState) { |
| + transport_security_state_(new TransportSecurityState), |
| + ran_handshake_completion_callback_(false) { |
| cert_verifier_->set_default_result(OK); |
| context_.cert_verifier = cert_verifier_.get(); |
| context_.transport_security_state = transport_security_state_.get(); |
| } |
| + void RecordCompletedHandshake() { ran_handshake_completion_callback_ = true; } |
| + |
| protected: |
| // The address of the spawned test server, after calling StartTestServer(). |
| const AddressList& addr() const { return addr_; } |
| @@ -740,6 +743,7 @@ class SSLClientSocketTest : public PlatformTest { |
| SSLClientSocketContext context_; |
| scoped_ptr<SSLClientSocket> sock_; |
| CapturingNetLog log_; |
| + bool ran_handshake_completion_callback_; |
| private: |
| scoped_ptr<StreamSocket> transport_; |
| @@ -2646,6 +2650,92 @@ TEST_F(SSLClientSocketTest, ReuseStates) { |
| // attempt to read one byte extra. |
| } |
| +#if defined(USE_OPENSSL) |
| + |
| +TEST_F(SSLClientSocketTest, HandshakeCallbackIsRun_WithFailure) { |
| + SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| + SpawnedTestServer::kLocalhost, |
| + base::FilePath()); |
| + ASSERT_TRUE(test_server.Start()); |
| + |
| + AddressList addr; |
| + ASSERT_TRUE(test_server.GetAddressList(&addr)); |
| + |
| + TestCompletionCallback callback; |
| + scoped_ptr<StreamSocket> real_transport( |
| + new TCPClientSocket(addr, NULL, NetLog::Source())); |
| + scoped_ptr<SynchronousErrorStreamSocket> transport( |
| + new SynchronousErrorStreamSocket(real_transport.Pass())); |
| + int rv = callback.GetResult(transport->Connect(callback.callback())); |
| + EXPECT_EQ(OK, rv); |
| + |
| + // Disable TLS False Start to avoid handshake non-determinism. |
| + SSLConfig ssl_config; |
| + ssl_config.false_start_enabled = false; |
| + |
| + SynchronousErrorStreamSocket* raw_transport = transport.get(); |
| + scoped_ptr<SSLClientSocket> sock( |
| + CreateSSLClientSocket(transport.PassAs<StreamSocket>(), |
| + test_server.host_port_pair(), |
| + ssl_config)); |
| + |
| + sock->SetHandshakeCompletionCallback(base::Bind( |
| + &SSLClientSocketTest::RecordCompletedHandshake, base::Unretained(this))); |
| + |
| + raw_transport->SetNextWriteError(ERR_CONNECTION_RESET); |
| + |
| + rv = callback.GetResult(sock->Connect(callback.callback())); |
| + EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| + EXPECT_FALSE(sock->IsConnected()); |
| + |
| + EXPECT_TRUE(ran_handshake_completion_callback_); |
| +} |
| + |
| +// Tests that the completion callback is run when an SSL connection |
| +// completes successfully. |
| +TEST_F(SSLClientSocketTest, HandshakeCallbackIsRun_WithSuccess) { |
| + SpawnedTestServer::SSLOptions ssl_options; |
| + SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| + SpawnedTestServer::kLocalhost, |
| + base::FilePath()); |
| + ASSERT_TRUE(test_server.Start()); |
| + |
| + AddressList addr; |
| + ASSERT_TRUE(test_server.GetAddressList(&addr)); |
| + |
| + // TODO(mshelley) This test likely does not need a CapturingNetLog. |
| + // Pass this arg as NULL. |
| + CapturingNetLog log; |
| + scoped_ptr<StreamSocket> transport( |
| + new TCPClientSocket(addr, &log, NetLog::Source())); |
|
wtc
2014/08/04 02:39:47
Since you have to fix the build error, I suggest y
mshelley
2014/08/04 16:41:59
Done.
|
| + |
| + TestCompletionCallback callback; |
| + int rv = transport->Connect(callback.callback()); |
| + if (rv == ERR_IO_PENDING) |
| + rv = callback.WaitForResult(); |
| + EXPECT_EQ(OK, rv); |
| + |
| + SSLConfig ssl_config = kDefaultSSLConfig; |
| + ssl_config.false_start_enabled = false; |
| + |
| + scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( |
| + transport.Pass(), test_server.host_port_pair(), ssl_config)); |
| + |
| + sock->SetHandshakeCompletionCallback(base::Bind( |
| + &SSLClientSocketTest::RecordCompletedHandshake, base::Unretained(this))); |
| + |
| + if (sock->IsConnected()) |
| + LOG(ERROR) << "SSL Socket prematurely connected"; |
| + |
| + rv = callback.GetResult(sock->Connect(callback.callback())); |
| + |
| + EXPECT_EQ(OK, rv); |
| + EXPECT_TRUE(sock->IsConnected()); |
| + EXPECT_TRUE(ran_handshake_completion_callback_); |
| +} |
| + |
| +#endif // defined(USE_OPENSSL) |
| + |
| TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) { |
| // False Start requires NPN and a forward-secret cipher suite. |
| SpawnedTestServer::SSLOptions server_options; |