| 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/transport_client_socket_pool.h" | 5 #include "net/socket/transport_client_socket_pool.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 // Let the second connect be synchronous. Otherwise, the emulated | 769 // Let the second connect be synchronous. Otherwise, the emulated |
| 770 // host resolution takes an extra trip through the message loop. | 770 // host resolution takes an extra trip through the message loop. |
| 771 host_resolver_->set_synchronous_mode(true); | 771 host_resolver_->set_synchronous_mode(true); |
| 772 | 772 |
| 773 // Let the appropriate socket connect. | 773 // Let the appropriate socket connect. |
| 774 base::MessageLoop::current()->RunUntilIdle(); | 774 base::MessageLoop::current()->RunUntilIdle(); |
| 775 | 775 |
| 776 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 776 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
| 777 EXPECT_FALSE(handle.is_initialized()); | 777 EXPECT_FALSE(handle.is_initialized()); |
| 778 EXPECT_FALSE(handle.socket()); | 778 EXPECT_FALSE(handle.socket()); |
| 779 ASSERT_EQ(1u, handle.connection_attempts().size()); |
| 780 EXPECT_EQ(ERR_CONNECTION_FAILED, handle.connection_attempts()[0].result); |
| 779 EXPECT_EQ(0, pool_.IdleSocketCount()); | 781 EXPECT_EQ(0, pool_.IdleSocketCount()); |
| 780 handle.Reset(); | 782 handle.Reset(); |
| 781 | 783 |
| 782 // Reset for the next case. | 784 // Reset for the next case. |
| 783 host_resolver_->set_synchronous_mode(false); | 785 host_resolver_->set_synchronous_mode(false); |
| 784 } | 786 } |
| 785 | 787 |
| 786 // Test the case where a socket took long enough to start the creation | 788 // Test the case where a socket took long enough to start the creation |
| 787 // of the backup socket and eventually completes, but the backup socket | 789 // of the backup socket and eventually completes, but the backup socket |
| 788 // fails. | 790 // fails. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 817 // Let the second connect be synchronous. Otherwise, the emulated | 819 // Let the second connect be synchronous. Otherwise, the emulated |
| 818 // host resolution takes an extra trip through the message loop. | 820 // host resolution takes an extra trip through the message loop. |
| 819 host_resolver_->set_synchronous_mode(true); | 821 host_resolver_->set_synchronous_mode(true); |
| 820 | 822 |
| 821 // Let the appropriate socket connect. | 823 // Let the appropriate socket connect. |
| 822 base::MessageLoop::current()->RunUntilIdle(); | 824 base::MessageLoop::current()->RunUntilIdle(); |
| 823 | 825 |
| 824 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 826 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
| 825 EXPECT_FALSE(handle.is_initialized()); | 827 EXPECT_FALSE(handle.is_initialized()); |
| 826 EXPECT_FALSE(handle.socket()); | 828 EXPECT_FALSE(handle.socket()); |
| 829 ASSERT_EQ(1u, handle.connection_attempts().size()); |
| 830 EXPECT_EQ(ERR_CONNECTION_FAILED, handle.connection_attempts()[0].result); |
| 827 handle.Reset(); | 831 handle.Reset(); |
| 828 | 832 |
| 829 // Reset for the next case. | 833 // Reset for the next case. |
| 830 host_resolver_->set_synchronous_mode(false); | 834 host_resolver_->set_synchronous_mode(false); |
| 831 } | 835 } |
| 832 | 836 |
| 833 // Test the case of the IPv6 address stalling, and falling back to the IPv4 | 837 // Test the case of the IPv6 address stalling, and falling back to the IPv4 |
| 834 // socket which finishes first. | 838 // socket which finishes first. |
| 835 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv4FinishesFirst) { | 839 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv4FinishesFirst) { |
| 836 // Create a pool without backup jobs. | 840 // Create a pool without backup jobs. |
| 837 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 841 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
| 838 TransportClientSocketPool pool(kMaxSockets, | 842 TransportClientSocketPool pool(kMaxSockets, |
| 839 kMaxSocketsPerGroup, | 843 kMaxSocketsPerGroup, |
| 840 host_resolver_.get(), | 844 host_resolver_.get(), |
| 841 &client_socket_factory_, | 845 &client_socket_factory_, |
| 842 NULL); | 846 NULL); |
| 843 | 847 |
| 844 MockTransportClientSocketFactory::ClientSocketType case_types[] = { | 848 MockTransportClientSocketFactory::ClientSocketType case_types[] = { |
| 845 // This is the IPv6 socket. | 849 // This is the IPv6 socket. It stalls, but presents one failed connection |
| 846 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, | 850 // attempt on GetConnectionAttempts. |
| 847 // This is the IPv4 socket. | 851 MockTransportClientSocketFactory::MOCK_STALLED_FAILING_CLIENT_SOCKET, |
| 848 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET | 852 // This is the IPv4 socket. |
| 849 }; | 853 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET}; |
| 850 | 854 |
| 851 client_socket_factory_.set_client_socket_types(case_types, 2); | 855 client_socket_factory_.set_client_socket_types(case_types, 2); |
| 852 | 856 |
| 853 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. | 857 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. |
| 854 host_resolver_->rules() | 858 host_resolver_->rules() |
| 855 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); | 859 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); |
| 856 | 860 |
| 857 TestCompletionCallback callback; | 861 TestCompletionCallback callback; |
| 858 ClientSocketHandle handle; | 862 ClientSocketHandle handle; |
| 859 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, | 863 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, |
| 860 BoundNetLog()); | 864 BoundNetLog()); |
| 861 EXPECT_EQ(ERR_IO_PENDING, rv); | 865 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 862 EXPECT_FALSE(handle.is_initialized()); | 866 EXPECT_FALSE(handle.is_initialized()); |
| 863 EXPECT_FALSE(handle.socket()); | 867 EXPECT_FALSE(handle.socket()); |
| 864 | 868 |
| 865 EXPECT_EQ(OK, callback.WaitForResult()); | 869 EXPECT_EQ(OK, callback.WaitForResult()); |
| 866 EXPECT_TRUE(handle.is_initialized()); | 870 EXPECT_TRUE(handle.is_initialized()); |
| 867 EXPECT_TRUE(handle.socket()); | 871 EXPECT_TRUE(handle.socket()); |
| 868 IPEndPoint endpoint; | 872 IPEndPoint endpoint; |
| 869 handle.socket()->GetLocalAddress(&endpoint); | 873 handle.socket()->GetLocalAddress(&endpoint); |
| 870 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); | 874 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); |
| 875 |
| 876 // Check that the failed connection attempt on the main socket is collected. |
| 877 ConnectionAttempts attempts; |
| 878 handle.socket()->GetConnectionAttempts(&attempts); |
| 879 ASSERT_EQ(1u, attempts.size()); |
| 880 EXPECT_EQ(ERR_CONNECTION_FAILED, attempts[0].result); |
| 881 EXPECT_EQ(kIPv6AddressSize, attempts[0].endpoint.address().size()); |
| 882 |
| 871 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 883 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 872 } | 884 } |
| 873 | 885 |
| 874 // Test the case of the IPv6 address being slow, thus falling back to trying to | 886 // Test the case of the IPv6 address being slow, thus falling back to trying to |
| 875 // connect to the IPv4 address, but having the connect to the IPv6 address | 887 // connect to the IPv4 address, but having the connect to the IPv6 address |
| 876 // finish first. | 888 // finish first. |
| 877 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv6FinishesFirst) { | 889 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv6FinishesFirst) { |
| 878 // Create a pool without backup jobs. | 890 // Create a pool without backup jobs. |
| 879 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 891 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
| 880 TransportClientSocketPool pool(kMaxSockets, | 892 TransportClientSocketPool pool(kMaxSockets, |
| 881 kMaxSocketsPerGroup, | 893 kMaxSocketsPerGroup, |
| 882 host_resolver_.get(), | 894 host_resolver_.get(), |
| 883 &client_socket_factory_, | 895 &client_socket_factory_, |
| 884 NULL); | 896 NULL); |
| 885 | 897 |
| 886 MockTransportClientSocketFactory::ClientSocketType case_types[] = { | 898 MockTransportClientSocketFactory::ClientSocketType case_types[] = { |
| 887 // This is the IPv6 socket. | 899 // This is the IPv6 socket. |
| 888 MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, | 900 MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET, |
| 889 // This is the IPv4 socket. | 901 // This is the IPv4 socket. It stalls, but presents one failed connection |
| 890 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET | 902 // attempt on GetConnectionATtempts. |
| 891 }; | 903 MockTransportClientSocketFactory::MOCK_STALLED_FAILING_CLIENT_SOCKET}; |
| 892 | 904 |
| 893 client_socket_factory_.set_client_socket_types(case_types, 2); | 905 client_socket_factory_.set_client_socket_types(case_types, 2); |
| 894 client_socket_factory_.set_delay(base::TimeDelta::FromMilliseconds( | 906 client_socket_factory_.set_delay(base::TimeDelta::FromMilliseconds( |
| 895 TransportConnectJobHelper::kIPv6FallbackTimerInMs + 50)); | 907 TransportConnectJobHelper::kIPv6FallbackTimerInMs + 50)); |
| 896 | 908 |
| 897 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. | 909 // Resolve an AddressList with a IPv6 address first and then a IPv4 address. |
| 898 host_resolver_->rules() | 910 host_resolver_->rules() |
| 899 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); | 911 ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); |
| 900 | 912 |
| 901 TestCompletionCallback callback; | 913 TestCompletionCallback callback; |
| 902 ClientSocketHandle handle; | 914 ClientSocketHandle handle; |
| 903 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, | 915 int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, |
| 904 BoundNetLog()); | 916 BoundNetLog()); |
| 905 EXPECT_EQ(ERR_IO_PENDING, rv); | 917 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 906 EXPECT_FALSE(handle.is_initialized()); | 918 EXPECT_FALSE(handle.is_initialized()); |
| 907 EXPECT_FALSE(handle.socket()); | 919 EXPECT_FALSE(handle.socket()); |
| 908 | 920 |
| 909 EXPECT_EQ(OK, callback.WaitForResult()); | 921 EXPECT_EQ(OK, callback.WaitForResult()); |
| 910 EXPECT_TRUE(handle.is_initialized()); | 922 EXPECT_TRUE(handle.is_initialized()); |
| 911 EXPECT_TRUE(handle.socket()); | 923 EXPECT_TRUE(handle.socket()); |
| 912 IPEndPoint endpoint; | 924 IPEndPoint endpoint; |
| 913 handle.socket()->GetLocalAddress(&endpoint); | 925 handle.socket()->GetLocalAddress(&endpoint); |
| 914 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); | 926 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); |
| 927 |
| 928 // Check that the failed connection attempt on the fallback socket is |
| 929 // collected. |
| 930 ConnectionAttempts attempts; |
| 931 handle.socket()->GetConnectionAttempts(&attempts); |
| 932 ASSERT_EQ(1u, attempts.size()); |
| 933 EXPECT_EQ(ERR_CONNECTION_FAILED, attempts[0].result); |
| 934 EXPECT_EQ(kIPv4AddressSize, attempts[0].endpoint.address().size()); |
| 935 |
| 915 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 936 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 916 } | 937 } |
| 917 | 938 |
| 918 TEST_F(TransportClientSocketPoolTest, IPv6NoIPv4AddressesToFallbackTo) { | 939 TEST_F(TransportClientSocketPoolTest, IPv6NoIPv4AddressesToFallbackTo) { |
| 919 // Create a pool without backup jobs. | 940 // Create a pool without backup jobs. |
| 920 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 941 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
| 921 TransportClientSocketPool pool(kMaxSockets, | 942 TransportClientSocketPool pool(kMaxSockets, |
| 922 kMaxSocketsPerGroup, | 943 kMaxSocketsPerGroup, |
| 923 host_resolver_.get(), | 944 host_resolver_.get(), |
| 924 &client_socket_factory_, | 945 &client_socket_factory_, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 938 EXPECT_EQ(ERR_IO_PENDING, rv); | 959 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 939 EXPECT_FALSE(handle.is_initialized()); | 960 EXPECT_FALSE(handle.is_initialized()); |
| 940 EXPECT_FALSE(handle.socket()); | 961 EXPECT_FALSE(handle.socket()); |
| 941 | 962 |
| 942 EXPECT_EQ(OK, callback.WaitForResult()); | 963 EXPECT_EQ(OK, callback.WaitForResult()); |
| 943 EXPECT_TRUE(handle.is_initialized()); | 964 EXPECT_TRUE(handle.is_initialized()); |
| 944 EXPECT_TRUE(handle.socket()); | 965 EXPECT_TRUE(handle.socket()); |
| 945 IPEndPoint endpoint; | 966 IPEndPoint endpoint; |
| 946 handle.socket()->GetLocalAddress(&endpoint); | 967 handle.socket()->GetLocalAddress(&endpoint); |
| 947 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); | 968 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); |
| 969 EXPECT_EQ(0u, handle.connection_attempts().size()); |
| 948 EXPECT_EQ(1, client_socket_factory_.allocation_count()); | 970 EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
| 949 } | 971 } |
| 950 | 972 |
| 951 TEST_F(TransportClientSocketPoolTest, IPv4HasNoFallback) { | 973 TEST_F(TransportClientSocketPoolTest, IPv4HasNoFallback) { |
| 952 // Create a pool without backup jobs. | 974 // Create a pool without backup jobs. |
| 953 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 975 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
| 954 TransportClientSocketPool pool(kMaxSockets, | 976 TransportClientSocketPool pool(kMaxSockets, |
| 955 kMaxSocketsPerGroup, | 977 kMaxSocketsPerGroup, |
| 956 host_resolver_.get(), | 978 host_resolver_.get(), |
| 957 &client_socket_factory_, | 979 &client_socket_factory_, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 970 EXPECT_EQ(ERR_IO_PENDING, rv); | 992 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 971 EXPECT_FALSE(handle.is_initialized()); | 993 EXPECT_FALSE(handle.is_initialized()); |
| 972 EXPECT_FALSE(handle.socket()); | 994 EXPECT_FALSE(handle.socket()); |
| 973 | 995 |
| 974 EXPECT_EQ(OK, callback.WaitForResult()); | 996 EXPECT_EQ(OK, callback.WaitForResult()); |
| 975 EXPECT_TRUE(handle.is_initialized()); | 997 EXPECT_TRUE(handle.is_initialized()); |
| 976 EXPECT_TRUE(handle.socket()); | 998 EXPECT_TRUE(handle.socket()); |
| 977 IPEndPoint endpoint; | 999 IPEndPoint endpoint; |
| 978 handle.socket()->GetLocalAddress(&endpoint); | 1000 handle.socket()->GetLocalAddress(&endpoint); |
| 979 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); | 1001 EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); |
| 1002 EXPECT_EQ(0u, handle.connection_attempts().size()); |
| 980 EXPECT_EQ(1, client_socket_factory_.allocation_count()); | 1003 EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
| 981 } | 1004 } |
| 982 | 1005 |
| 983 // Test that if TCP FastOpen is enabled, it is set on the socket | 1006 // Test that if TCP FastOpen is enabled, it is set on the socket |
| 984 // when we have only an IPv4 address. | 1007 // when we have only an IPv4 address. |
| 985 TEST_F(TransportClientSocketPoolTest, TCPFastOpenOnIPv4WithNoFallback) { | 1008 TEST_F(TransportClientSocketPoolTest, TCPFastOpenOnIPv4WithNoFallback) { |
| 986 // Create a pool without backup jobs. | 1009 // Create a pool without backup jobs. |
| 987 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); | 1010 ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
| 988 TransportClientSocketPool pool(kMaxSockets, | 1011 TransportClientSocketPool pool(kMaxSockets, |
| 989 kMaxSocketsPerGroup, | 1012 kMaxSocketsPerGroup, |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1103 handle.socket()->GetLocalAddress(&endpoint); | 1126 handle.socket()->GetLocalAddress(&endpoint); |
| 1104 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); | 1127 EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); |
| 1105 EXPECT_EQ(1, client_socket_factory_.allocation_count()); | 1128 EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
| 1106 // Verify that TCP FastOpen was not turned on for the socket. | 1129 // Verify that TCP FastOpen was not turned on for the socket. |
| 1107 EXPECT_FALSE(handle.socket()->UsingTCPFastOpen()); | 1130 EXPECT_FALSE(handle.socket()->UsingTCPFastOpen()); |
| 1108 } | 1131 } |
| 1109 | 1132 |
| 1110 } // namespace | 1133 } // namespace |
| 1111 | 1134 |
| 1112 } // namespace net | 1135 } // namespace net |
| OLD | NEW |