| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/ssl_client_socket_pool.h" | 5 #include "net/socket/ssl_client_socket_pool.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 EXPECT_FALSE(handle.is_initialized()); | 366 EXPECT_FALSE(handle.is_initialized()); |
| 367 EXPECT_FALSE(handle.socket()); | 367 EXPECT_FALSE(handle.socket()); |
| 368 EXPECT_TRUE(handle.is_ssl_error()); | 368 EXPECT_TRUE(handle.is_ssl_error()); |
| 369 } | 369 } |
| 370 | 370 |
| 371 TEST_F(SSLClientSocketPoolTest, DirectGotSPDY) { | 371 TEST_F(SSLClientSocketPoolTest, DirectGotSPDY) { |
| 372 StaticSocketDataProvider data; | 372 StaticSocketDataProvider data; |
| 373 socket_factory_.AddSocketDataProvider(&data); | 373 socket_factory_.AddSocketDataProvider(&data); |
| 374 SSLSocketDataProvider ssl(true, OK); | 374 SSLSocketDataProvider ssl(true, OK); |
| 375 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 375 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 376 ssl.next_proto = "spdy/2"; | 376 ssl.next_proto = "spdy/2.1"; |
| 377 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY2; | 377 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY21; |
| 378 socket_factory_.AddSSLSocketDataProvider(&ssl); | 378 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 379 | 379 |
| 380 CreatePool(true /* tcp pool */, false, false); | 380 CreatePool(true /* tcp pool */, false, false); |
| 381 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | 381 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
| 382 true); | 382 true); |
| 383 | 383 |
| 384 ClientSocketHandle handle; | 384 ClientSocketHandle handle; |
| 385 TestCompletionCallback callback; | 385 TestCompletionCallback callback; |
| 386 int rv = handle.Init( | 386 int rv = handle.Init( |
| 387 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | 387 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
| 388 EXPECT_EQ(ERR_IO_PENDING, rv); | 388 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 389 EXPECT_FALSE(handle.is_initialized()); | 389 EXPECT_FALSE(handle.is_initialized()); |
| 390 EXPECT_FALSE(handle.socket()); | 390 EXPECT_FALSE(handle.socket()); |
| 391 | 391 |
| 392 EXPECT_EQ(OK, callback.WaitForResult()); | 392 EXPECT_EQ(OK, callback.WaitForResult()); |
| 393 EXPECT_TRUE(handle.is_initialized()); | 393 EXPECT_TRUE(handle.is_initialized()); |
| 394 EXPECT_TRUE(handle.socket()); | 394 EXPECT_TRUE(handle.socket()); |
| 395 | 395 |
| 396 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); | 396 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); |
| 397 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); | 397 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); |
| 398 std::string proto; | 398 std::string proto; |
| 399 std::string server_protos; | 399 std::string server_protos; |
| 400 ssl_socket->GetNextProto(&proto, &server_protos); | 400 ssl_socket->GetNextProto(&proto, &server_protos); |
| 401 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), | 401 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), |
| 402 SSLClientSocket::kProtoSPDY2); | 402 SSLClientSocket::kProtoSPDY21); |
| 403 } | 403 } |
| 404 | 404 |
| 405 TEST_F(SSLClientSocketPoolTest, DirectGotBonusSPDY) { | 405 TEST_F(SSLClientSocketPoolTest, DirectGotBonusSPDY) { |
| 406 StaticSocketDataProvider data; | 406 StaticSocketDataProvider data; |
| 407 socket_factory_.AddSocketDataProvider(&data); | 407 socket_factory_.AddSocketDataProvider(&data); |
| 408 SSLSocketDataProvider ssl(true, OK); | 408 SSLSocketDataProvider ssl(true, OK); |
| 409 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 409 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 410 ssl.next_proto = "spdy/2"; | 410 ssl.next_proto = "spdy/2.1"; |
| 411 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY2; | 411 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY21; |
| 412 socket_factory_.AddSSLSocketDataProvider(&ssl); | 412 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 413 | 413 |
| 414 CreatePool(true /* tcp pool */, false, false); | 414 CreatePool(true /* tcp pool */, false, false); |
| 415 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | 415 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
| 416 true); | 416 true); |
| 417 | 417 |
| 418 ClientSocketHandle handle; | 418 ClientSocketHandle handle; |
| 419 TestCompletionCallback callback; | 419 TestCompletionCallback callback; |
| 420 int rv = handle.Init( | 420 int rv = handle.Init( |
| 421 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | 421 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
| 422 EXPECT_EQ(ERR_IO_PENDING, rv); | 422 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 423 EXPECT_FALSE(handle.is_initialized()); | 423 EXPECT_FALSE(handle.is_initialized()); |
| 424 EXPECT_FALSE(handle.socket()); | 424 EXPECT_FALSE(handle.socket()); |
| 425 | 425 |
| 426 EXPECT_EQ(OK, callback.WaitForResult()); | 426 EXPECT_EQ(OK, callback.WaitForResult()); |
| 427 EXPECT_TRUE(handle.is_initialized()); | 427 EXPECT_TRUE(handle.is_initialized()); |
| 428 EXPECT_TRUE(handle.socket()); | 428 EXPECT_TRUE(handle.socket()); |
| 429 | 429 |
| 430 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); | 430 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); |
| 431 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); | 431 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); |
| 432 std::string proto; | 432 std::string proto; |
| 433 std::string server_protos; | 433 std::string server_protos; |
| 434 ssl_socket->GetNextProto(&proto, &server_protos); | 434 ssl_socket->GetNextProto(&proto, &server_protos); |
| 435 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), | 435 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), |
| 436 SSLClientSocket::kProtoSPDY2); | 436 SSLClientSocket::kProtoSPDY21); |
| 437 } | 437 } |
| 438 | 438 |
| 439 TEST_F(SSLClientSocketPoolTest, SOCKSFail) { | 439 TEST_F(SSLClientSocketPoolTest, SOCKSFail) { |
| 440 StaticSocketDataProvider data; | 440 StaticSocketDataProvider data; |
| 441 data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED)); | 441 data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED)); |
| 442 socket_factory_.AddSocketDataProvider(&data); | 442 socket_factory_.AddSocketDataProvider(&data); |
| 443 | 443 |
| 444 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | 444 CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
| 445 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, | 445 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, |
| 446 false); | 446 false); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 | 702 |
| 703 MockRead reads[] = { | 703 MockRead reads[] = { |
| 704 MockRead(true, ERR_IO_PENDING), | 704 MockRead(true, ERR_IO_PENDING), |
| 705 }; | 705 }; |
| 706 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 706 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 707 socket_factory_.AddSocketDataProvider(&data); | 707 socket_factory_.AddSocketDataProvider(&data); |
| 708 SSLSocketDataProvider ssl(true, OK); | 708 SSLSocketDataProvider ssl(true, OK); |
| 709 ssl.cert = X509Certificate::CreateFromBytes( | 709 ssl.cert = X509Certificate::CreateFromBytes( |
| 710 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); | 710 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); |
| 711 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 711 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 712 ssl.next_proto = "spdy/2"; | 712 ssl.next_proto = "spdy/2.1"; |
| 713 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY2; | 713 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY21; |
| 714 socket_factory_.AddSSLSocketDataProvider(&ssl); | 714 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 715 | 715 |
| 716 CreatePool(true /* tcp pool */, false, false); | 716 CreatePool(true /* tcp pool */, false, false); |
| 717 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | 717 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
| 718 true); | 718 true); |
| 719 | 719 |
| 720 scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle()); | 720 scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle()); |
| 721 TestCompletionCallback callback; | 721 TestCompletionCallback callback; |
| 722 int rv = handle->Init( | 722 int rv = handle->Init( |
| 723 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | 723 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
| 724 EXPECT_EQ(ERR_IO_PENDING, rv); | 724 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 725 EXPECT_FALSE(handle->is_initialized()); | 725 EXPECT_FALSE(handle->is_initialized()); |
| 726 EXPECT_FALSE(handle->socket()); | 726 EXPECT_FALSE(handle->socket()); |
| 727 | 727 |
| 728 EXPECT_EQ(OK, callback.WaitForResult()); | 728 EXPECT_EQ(OK, callback.WaitForResult()); |
| 729 EXPECT_TRUE(handle->is_initialized()); | 729 EXPECT_TRUE(handle->is_initialized()); |
| 730 EXPECT_TRUE(handle->socket()); | 730 EXPECT_TRUE(handle->socket()); |
| 731 | 731 |
| 732 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle->socket()); | 732 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle->socket()); |
| 733 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); | 733 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); |
| 734 std::string proto; | 734 std::string proto; |
| 735 std::string server_protos; | 735 std::string server_protos; |
| 736 ssl_socket->GetNextProto(&proto, &server_protos); | 736 ssl_socket->GetNextProto(&proto, &server_protos); |
| 737 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), | 737 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), |
| 738 SSLClientSocket::kProtoSPDY2); | 738 SSLClientSocket::kProtoSPDY21); |
| 739 | 739 |
| 740 // TODO(rtenneti): MockClientSocket::GetPeerAddress returns 0 as the port | 740 // TODO(rtenneti): MockClientSocket::GetPeerAddress returns 0 as the port |
| 741 // number. Fix it to return port 80 and then use GetPeerAddress to AddAlias. | 741 // number. Fix it to return port 80 and then use GetPeerAddress to AddAlias. |
| 742 const addrinfo* address = test_hosts[0].addresses.head(); | 742 const addrinfo* address = test_hosts[0].addresses.head(); |
| 743 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | 743 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); |
| 744 pool_peer.AddAlias(address, test_hosts[0].pair); | 744 pool_peer.AddAlias(address, test_hosts[0].pair); |
| 745 | 745 |
| 746 scoped_refptr<SpdySession> spdy_session; | 746 scoped_refptr<SpdySession> spdy_session; |
| 747 rv = session_->spdy_session_pool()->GetSpdySessionFromSocket( | 747 rv = session_->spdy_session_pool()->GetSpdySessionFromSocket( |
| 748 test_hosts[0].pair, handle.release(), BoundNetLog(), 0, | 748 test_hosts[0].pair, handle.release(), BoundNetLog(), 0, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 790 |
| 791 MockRead reads[] = { | 791 MockRead reads[] = { |
| 792 MockRead(true, ERR_IO_PENDING), | 792 MockRead(true, ERR_IO_PENDING), |
| 793 }; | 793 }; |
| 794 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 794 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 795 socket_factory_.AddSocketDataProvider(&data); | 795 socket_factory_.AddSocketDataProvider(&data); |
| 796 SSLSocketDataProvider ssl(true, OK); | 796 SSLSocketDataProvider ssl(true, OK); |
| 797 ssl.cert = X509Certificate::CreateFromBytes( | 797 ssl.cert = X509Certificate::CreateFromBytes( |
| 798 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); | 798 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); |
| 799 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 799 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 800 ssl.next_proto = "spdy/2"; | 800 ssl.next_proto = "spdy/2.1"; |
| 801 ssl.client_cert_sent = true; | 801 ssl.client_cert_sent = true; |
| 802 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY2; | 802 ssl.protocol_negotiated = SSLClientSocket::kProtoSPDY21; |
| 803 socket_factory_.AddSSLSocketDataProvider(&ssl); | 803 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 804 | 804 |
| 805 CreatePool(true /* tcp pool */, false, false); | 805 CreatePool(true /* tcp pool */, false, false); |
| 806 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | 806 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
| 807 true); | 807 true); |
| 808 | 808 |
| 809 scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle()); | 809 scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle()); |
| 810 rv = handle->Init( | 810 rv = handle->Init( |
| 811 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | 811 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
| 812 EXPECT_EQ(ERR_IO_PENDING, rv); | 812 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 813 EXPECT_FALSE(handle->is_initialized()); | 813 EXPECT_FALSE(handle->is_initialized()); |
| 814 EXPECT_FALSE(handle->socket()); | 814 EXPECT_FALSE(handle->socket()); |
| 815 | 815 |
| 816 EXPECT_EQ(OK, callback.WaitForResult()); | 816 EXPECT_EQ(OK, callback.WaitForResult()); |
| 817 EXPECT_TRUE(handle->is_initialized()); | 817 EXPECT_TRUE(handle->is_initialized()); |
| 818 EXPECT_TRUE(handle->socket()); | 818 EXPECT_TRUE(handle->socket()); |
| 819 | 819 |
| 820 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle->socket()); | 820 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle->socket()); |
| 821 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); | 821 EXPECT_TRUE(ssl_socket->was_npn_negotiated()); |
| 822 std::string proto; | 822 std::string proto; |
| 823 std::string server_protos; | 823 std::string server_protos; |
| 824 ssl_socket->GetNextProto(&proto, &server_protos); | 824 ssl_socket->GetNextProto(&proto, &server_protos); |
| 825 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), | 825 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), |
| 826 SSLClientSocket::kProtoSPDY2); | 826 SSLClientSocket::kProtoSPDY21); |
| 827 | 827 |
| 828 // TODO(rtenneti): MockClientSocket::GetPeerAddress returns 0 as the port | 828 // TODO(rtenneti): MockClientSocket::GetPeerAddress returns 0 as the port |
| 829 // number. Fix it to return port 80 and then use GetPeerAddress to AddAlias. | 829 // number. Fix it to return port 80 and then use GetPeerAddress to AddAlias. |
| 830 const addrinfo* address = test_hosts[0].addresses.head(); | 830 const addrinfo* address = test_hosts[0].addresses.head(); |
| 831 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | 831 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); |
| 832 pool_peer.AddAlias(address, test_hosts[0].pair); | 832 pool_peer.AddAlias(address, test_hosts[0].pair); |
| 833 | 833 |
| 834 scoped_refptr<SpdySession> spdy_session; | 834 scoped_refptr<SpdySession> spdy_session; |
| 835 rv = session_->spdy_session_pool()->GetSpdySessionFromSocket( | 835 rv = session_->spdy_session_pool()->GetSpdySessionFromSocket( |
| 836 test_hosts[0].pair, handle.release(), BoundNetLog(), 0, | 836 test_hosts[0].pair, handle.release(), BoundNetLog(), 0, |
| 837 &spdy_session, true); | 837 &spdy_session, true); |
| 838 EXPECT_EQ(0, rv); | 838 EXPECT_EQ(0, rv); |
| 839 | 839 |
| 840 EXPECT_TRUE(session_->spdy_session_pool()->HasSession(test_hosts[0].pair)); | 840 EXPECT_TRUE(session_->spdy_session_pool()->HasSession(test_hosts[0].pair)); |
| 841 EXPECT_FALSE(session_->spdy_session_pool()->HasSession(test_hosts[1].pair)); | 841 EXPECT_FALSE(session_->spdy_session_pool()->HasSession(test_hosts[1].pair)); |
| 842 | 842 |
| 843 session_->spdy_session_pool()->CloseAllSessions(); | 843 session_->spdy_session_pool()->CloseAllSessions(); |
| 844 } | 844 } |
| 845 | 845 |
| 846 // It would be nice to also test the timeouts in SSLClientSocketPool. | 846 // It would be nice to also test the timeouts in SSLClientSocketPool. |
| 847 | 847 |
| 848 } // namespace | 848 } // namespace |
| 849 | 849 |
| 850 } // namespace net | 850 } // namespace net |
| OLD | NEW |