Index: net/socket/ssl_client_socket_pool_unittest.cc |
=================================================================== |
--- net/socket/ssl_client_socket_pool_unittest.cc (revision 107497) |
+++ net/socket/ssl_client_socket_pool_unittest.cc (working copy) |
@@ -690,7 +690,7 @@ |
StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
socket_factory_.AddSocketDataProvider(&data); |
SSLSocketDataProvider ssl(true, OK); |
- ssl.cert_ = X509Certificate::CreateFromBytes( |
+ ssl.cert = X509Certificate::CreateFromBytes( |
reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); |
ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
ssl.next_proto = "spdy/2"; |
@@ -719,7 +719,7 @@ |
EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), |
SSLClientSocket::kProtoSPDY2); |
- // TODO(rtenneti): MockClientSocket::GetPeerAddress return's 0 as the port |
+ // TODO(rtenneti): MockClientSocket::GetPeerAddress returns 0 as the port |
// number. Fix it to return port 80 and then use GetPeerAddress to AddAlias. |
const addrinfo* address = test_hosts[0].addresses.head(); |
SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); |
@@ -738,6 +738,91 @@ |
session_->spdy_session_pool()->CloseAllSessions(); |
} |
+// Verifies that an SSL connection with client authentication disables SPDY IP |
+// pooling. |
+TEST_F(SSLClientSocketPoolTest, IPPoolingClientCert) { |
+ const int kTestPort = 80; |
+ struct TestHosts { |
+ std::string name; |
+ std::string iplist; |
+ HostPortProxyPair pair; |
+ AddressList addresses; |
+ } test_hosts[] = { |
+ { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" }, |
+ { "js.webkit.org", "192.168.0.4,192.168.0.1,192.0.2.33" }, |
+ }; |
+ |
+ TestOldCompletionCallback callback; |
+ int rv; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_hosts); i++) { |
+ host_resolver_.rules()->AddIPLiteralRule(test_hosts[i].name, |
+ test_hosts[i].iplist, ""); |
+ |
+ // This test requires that the HostResolver cache be populated. Normal |
+ // code would have done this already, but we do it manually. |
+ HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); |
+ rv = host_resolver_.Resolve(info, &test_hosts[i].addresses, &callback, |
+ NULL, BoundNetLog()); |
+ EXPECT_EQ(OK, callback.GetResult(rv)); |
+ |
+ // Setup a HostPortProxyPair |
+ test_hosts[i].pair = HostPortProxyPair( |
+ HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct()); |
+ } |
+ |
+ MockRead reads[] = { |
+ MockRead(true, ERR_IO_PENDING), |
+ }; |
+ StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
+ socket_factory_.AddSocketDataProvider(&data); |
+ SSLSocketDataProvider ssl(true, OK); |
+ ssl.cert = X509Certificate::CreateFromBytes( |
+ reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); |
+ ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
+ ssl.next_proto = "spdy/2"; |
+ ssl.client_cert_sent = true; |
+ socket_factory_.AddSSLSocketDataProvider(&ssl); |
+ |
+ CreatePool(true /* tcp pool */, false, false); |
+ scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
+ true); |
+ |
+ scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle()); |
+ rv = handle->Init( |
+ "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ EXPECT_FALSE(handle->is_initialized()); |
+ EXPECT_FALSE(handle->socket()); |
+ |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ EXPECT_TRUE(handle->is_initialized()); |
+ EXPECT_TRUE(handle->socket()); |
+ |
+ SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle->socket()); |
+ EXPECT_TRUE(ssl_socket->was_npn_negotiated()); |
+ std::string proto; |
+ ssl_socket->GetNextProto(&proto); |
+ EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), |
+ SSLClientSocket::kProtoSPDY2); |
+ |
+ // TODO(rtenneti): MockClientSocket::GetPeerAddress returns 0 as the port |
+ // number. Fix it to return port 80 and then use GetPeerAddress to AddAlias. |
+ const addrinfo* address = test_hosts[0].addresses.head(); |
+ SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); |
+ pool_peer.AddAlias(address, test_hosts[0].pair); |
+ |
+ scoped_refptr<SpdySession> spdy_session; |
+ rv = session_->spdy_session_pool()->GetSpdySessionFromSocket( |
+ test_hosts[0].pair, handle.release(), BoundNetLog(), 0, |
+ &spdy_session, true); |
+ EXPECT_EQ(0, rv); |
+ |
+ EXPECT_TRUE(session_->spdy_session_pool()->HasSession(test_hosts[0].pair)); |
+ EXPECT_FALSE(session_->spdy_session_pool()->HasSession(test_hosts[1].pair)); |
+ |
+ session_->spdy_session_pool()->CloseAllSessions(); |
+} |
+ |
// It would be nice to also test the timeouts in SSLClientSocketPool. |
} // namespace |