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 |