Chromium Code Reviews| 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..64130f63abd49815121368ff328bdeb9edcf327d 100644 |
| --- a/net/socket/transport_client_socket_pool_unittest.cc |
| +++ b/net/socket/transport_client_socket_pool_unittest.cc |
| @@ -28,6 +28,14 @@ namespace net { |
| using internal::ClientSocketPoolBaseHelper; |
| +class TransportSocketParamsPeer { |
| + public: |
| + static void SetCombineConnectAndWritePolicy(TransportSocketParams* params, |
| + TransportSocketParams::CombineConnectAndWritePolicy new_policy) { |
| + params->combine_connect_and_write_ = new_policy; |
| + } |
| +}; |
| + |
| namespace { |
| const int kMaxSockets = 32; |
| @@ -40,9 +48,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_), |
| @@ -62,7 +73,8 @@ class TransportClientSocketPoolTest : public testing::Test { |
| 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 +213,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 +489,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 +510,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 +978,95 @@ 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. |
| + TransportSocketParamsPeer::SetCombineConnectAndWritePolicy( |
|
mmenke
2014/09/11 18:14:35
Rather than creating a peer for this purpose, sugg
mmenke
2014/09/11 18:20:37
Oops...left out my "or". Or making a function to
Jana
2014/09/12 01:04:39
Done.
|
| + params_.get(), |
| + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED); |
| + 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. |
| + TransportSocketParamsPeer::SetCombineConnectAndWritePolicy( |
| + params_.get(), |
| + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED); |
| + 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. |
| +TEST_F(TransportClientSocketPoolTest, NoTCPFastOpenOnIPv6WithIPv4Fallback) { |
|
mmenke
2014/09/11 18:14:35
Suggest a test just like this, except the IPv6 soc
Jana
2014/09/12 01:04:39
Added test, PTAL.
|
| + // 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. |
| + TransportSocketParamsPeer::SetCombineConnectAndWritePolicy( |
| + params_.get(), |
| + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED); |
| + handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); |
| + EXPECT_EQ(OK, callback.WaitForResult()); |
| + EXPECT_FALSE(handle.socket()->UsingTCPFastOpen()); |
|
mmenke
2014/09/11 18:14:35
As a sanity check, suggest you check that the conn
Jana
2014/09/12 01:04:39
In general, I like to not duplicate test coverage.
|
| +} |
| + |
| } // namespace |
| } // namespace net |