Index: net/socket/transport_client_socket_pool_unittest.cc |
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc |
index 1cc015a1fa1b4842f5fcc1d1b6568353e24e057f..2a05b44f09e267ce83ca8b28ec7ed2cf517e4c3f 100644 |
--- a/net/socket/transport_client_socket_pool_unittest.cc |
+++ b/net/socket/transport_client_socket_pool_unittest.cc |
@@ -40,9 +40,12 @@ class TransportClientSocketPoolTest : public testing::Test { |
: connect_backup_jobs_enabled_( |
ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true)), |
params_( |
- new TransportSocketParams(HostPortPair("www.google.com", 80), |
- false, false, |
- OnHostResolutionCallback())), |
+ new TransportSocketParams( |
+ HostPortPair("www.google.com", 80), |
+ false, |
+ false, |
+ OnHostResolutionCallback(), |
+ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), |
histograms_(new ClientSocketPoolHistograms("TCPUnitTest")), |
host_resolver_(new MockHostResolver), |
client_socket_factory_(&net_log_), |
@@ -59,10 +62,17 @@ class TransportClientSocketPoolTest : public testing::Test { |
connect_backup_jobs_enabled_); |
} |
+ scoped_refptr<TransportSocketParams> CreateParamsForTCPFastOpen() { |
+ return new TransportSocketParams(HostPortPair("www.google.com", 80), |
+ false, false, OnHostResolutionCallback(), |
+ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED); |
+ } |
+ |
int StartRequest(const std::string& group_name, RequestPriority priority) { |
scoped_refptr<TransportSocketParams> params(new TransportSocketParams( |
HostPortPair("www.google.com", 80), false, false, |
- OnHostResolutionCallback())); |
+ OnHostResolutionCallback(), |
+ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); |
return test_base_.StartRequestUsingPool( |
&pool_, group_name, priority, params); |
} |
@@ -201,8 +211,8 @@ TEST_F(TransportClientSocketPoolTest, InitHostResolutionFailure) { |
ClientSocketHandle handle; |
HostPortPair host_port_pair("unresolvable.host.name", 80); |
scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( |
- host_port_pair, false, false, |
- OnHostResolutionCallback())); |
+ host_port_pair, false, false, OnHostResolutionCallback(), |
+ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); |
EXPECT_EQ(ERR_IO_PENDING, |
handle.Init("a", dest, kDefaultPriority, callback.callback(), |
&pool_, BoundNetLog())); |
@@ -477,7 +487,8 @@ class RequestSocketCallback : public TestCompletionCallbackBase { |
within_callback_ = true; |
scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( |
HostPortPair("www.google.com", 80), false, false, |
- OnHostResolutionCallback())); |
+ OnHostResolutionCallback(), |
+ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); |
int rv = handle_->Init("a", dest, LOWEST, callback(), pool_, |
BoundNetLog()); |
EXPECT_EQ(OK, rv); |
@@ -497,7 +508,8 @@ TEST_F(TransportClientSocketPoolTest, RequestTwice) { |
RequestSocketCallback callback(&handle, &pool_); |
scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( |
HostPortPair("www.google.com", 80), false, false, |
- OnHostResolutionCallback())); |
+ OnHostResolutionCallback(), |
+ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); |
int rv = handle.Init("a", dest, LOWEST, callback.callback(), &pool_, |
BoundNetLog()); |
ASSERT_EQ(ERR_IO_PENDING, rv); |
@@ -964,6 +976,137 @@ TEST_F(TransportClientSocketPoolTest, IPv4HasNoFallback) { |
EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
} |
+// Test that if TCP FastOpen is enabled, it is set on the socket |
+// when we have only an IPv4 address. |
+TEST_F(TransportClientSocketPoolTest, TCPFastOpenOnIPv4WithNoFallback) { |
+ // Create a pool without backup jobs. |
+ ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
+ TransportClientSocketPool pool(kMaxSockets, |
+ kMaxSocketsPerGroup, |
+ histograms_.get(), |
+ host_resolver_.get(), |
+ &client_socket_factory_, |
+ NULL); |
+ client_socket_factory_.set_default_client_socket_type( |
+ MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); |
+ // Resolve an AddressList with only IPv4 addresses. |
+ host_resolver_->rules()->AddIPLiteralRule("*", "1.1.1.1", std::string()); |
+ |
+ TestCompletionCallback callback; |
+ ClientSocketHandle handle; |
+ // Enable TCP FastOpen in TransportSocketParams. |
+ scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); |
+ handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ EXPECT_TRUE(handle.socket()->UsingTCPFastOpen()); |
+} |
+ |
+// Test that if TCP FastOpen is enabled, it is set on the socket |
+// when we have only IPv6 addresses. |
+TEST_F(TransportClientSocketPoolTest, TCPFastOpenOnIPv6WithNoFallback) { |
+ // Create a pool without backup jobs. |
+ ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
+ TransportClientSocketPool pool(kMaxSockets, |
+ kMaxSocketsPerGroup, |
+ histograms_.get(), |
+ host_resolver_.get(), |
+ &client_socket_factory_, |
+ NULL); |
+ client_socket_factory_.set_default_client_socket_type( |
+ MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); |
+ // Resolve an AddressList with only IPv6 addresses. |
+ host_resolver_->rules() |
+ ->AddIPLiteralRule("*", "2:abcd::3:4:ff,3:abcd::3:4:ff", std::string()); |
+ |
+ TestCompletionCallback callback; |
+ ClientSocketHandle handle; |
+ // Enable TCP FastOpen in TransportSocketParams. |
+ scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); |
+ handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ EXPECT_TRUE(handle.socket()->UsingTCPFastOpen()); |
+} |
+ |
+// Test that if TCP FastOpen is enabled, it does not do anything when there |
+// is a IPv6 address with fallback to an IPv4 address. This test tests the case |
+// when the IPv6 connect fails and the IPv4 one succeeds. |
+TEST_F(TransportClientSocketPoolTest, |
+ NoTCPFastOpenOnIPv6FailureWithIPv4Fallback) { |
+ // Create a pool without backup jobs. |
+ ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
+ TransportClientSocketPool pool(kMaxSockets, |
+ kMaxSocketsPerGroup, |
+ histograms_.get(), |
+ host_resolver_.get(), |
+ &client_socket_factory_, |
+ NULL); |
+ |
+ MockTransportClientSocketFactory::ClientSocketType case_types[] = { |
+ // This is the IPv6 socket. |
+ MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, |
+ // This is the IPv4 socket. |
+ MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET |
+ }; |
+ client_socket_factory_.set_client_socket_types(case_types, 2); |
+ // Resolve an AddressList with a IPv6 address first and then a IPv4 address. |
+ host_resolver_->rules() |
+ ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); |
+ |
+ TestCompletionCallback callback; |
+ ClientSocketHandle handle; |
+ // Enable TCP FastOpen in TransportSocketParams. |
+ scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); |
+ handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ // Verify that the socket used is connected to the fallback IPv4 address. |
+ IPEndPoint endpoint; |
+ handle.socket()->GetLocalAddress(&endpoint); |
+ EXPECT_EQ(kIPv4AddressSize, endpoint.address().size()); |
+ EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
+ // Verify that TCP FastOpen was not turned on for the socket. |
+ EXPECT_FALSE(handle.socket()->UsingTCPFastOpen()); |
+} |
+ |
+// Test that if TCP FastOpen is enabled, it does not do anything when there |
+// is a IPv6 address with fallback to an IPv4 address. This test tests the case |
+// when the IPv6 connect succeeds. |
+TEST_F(TransportClientSocketPoolTest, |
+ NoTCPFastOpenOnIPv6SuccessWithIPv4Fallback) { |
+ // Create a pool without backup jobs. |
+ ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false); |
+ TransportClientSocketPool pool(kMaxSockets, |
+ kMaxSocketsPerGroup, |
+ histograms_.get(), |
+ host_resolver_.get(), |
+ &client_socket_factory_, |
+ NULL); |
+ |
+ MockTransportClientSocketFactory::ClientSocketType case_types[] = { |
+ // This is the IPv6 socket. |
+ MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET, |
+ // This is the IPv4 socket. |
+ MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET |
+ }; |
+ client_socket_factory_.set_client_socket_types(case_types, 2); |
+ // Resolve an AddressList with a IPv6 address first and then a IPv4 address. |
+ host_resolver_->rules() |
+ ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string()); |
+ |
+ TestCompletionCallback callback; |
+ ClientSocketHandle handle; |
+ // Enable TCP FastOpen in TransportSocketParams. |
+ scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); |
+ handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ // Verify that the socket used is connected to the IPv6 address. |
+ IPEndPoint endpoint; |
+ handle.socket()->GetLocalAddress(&endpoint); |
+ EXPECT_EQ(kIPv6AddressSize, endpoint.address().size()); |
+ EXPECT_EQ(1, client_socket_factory_.allocation_count()); |
+ // Verify that TCP FastOpen was not turned on for the socket. |
+ EXPECT_FALSE(handle.socket()->UsingTCPFastOpen()); |
+} |
+ |
} // namespace |
} // namespace net |