| 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/http/http_proxy_client_socket_pool.h" | 5 #include "net/http/http_proxy_client_socket_pool.h" |
| 6 | 6 |
| 7 #include <map> |
| 8 #include <string> |
| 7 #include <utility> | 9 #include <utility> |
| 8 | 10 |
| 9 #include "base/callback.h" | 11 #include "base/callback.h" |
| 10 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 13 #include "base/metrics/field_trial.h" |
| 14 #include "base/metrics/field_trial_param_associator.h" |
| 15 #include "base/metrics/field_trial_params.h" |
| 16 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/test/histogram_tester.h" | 19 #include "base/test/histogram_tester.h" |
| 14 #include "net/base/net_errors.h" | 20 #include "net/base/net_errors.h" |
| 15 #include "net/base/proxy_delegate.h" | 21 #include "net/base/proxy_delegate.h" |
| 16 #include "net/base/test_completion_callback.h" | 22 #include "net/base/test_completion_callback.h" |
| 17 #include "net/base/test_proxy_delegate.h" | 23 #include "net/base/test_proxy_delegate.h" |
| 18 #include "net/http/http_network_session.h" | 24 #include "net/http/http_network_session.h" |
| 19 #include "net/http/http_proxy_client_socket.h" | 25 #include "net/http/http_proxy_client_socket.h" |
| 20 #include "net/http/http_response_headers.h" | 26 #include "net/http/http_response_headers.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 NULL /* transport_security_state */, | 74 NULL /* transport_security_state */, |
| 69 NULL /* cert_transparency_verifier */, | 75 NULL /* cert_transparency_verifier */, |
| 70 NULL /* ct_policy_enforcer */, | 76 NULL /* ct_policy_enforcer */, |
| 71 std::string() /* ssl_session_cache_shard */, | 77 std::string() /* ssl_session_cache_shard */, |
| 72 session_deps_.socket_factory.get(), | 78 session_deps_.socket_factory.get(), |
| 73 &transport_socket_pool_, | 79 &transport_socket_pool_, |
| 74 NULL, | 80 NULL, |
| 75 NULL, | 81 NULL, |
| 76 session_deps_.ssl_config_service.get(), | 82 session_deps_.ssl_config_service.get(), |
| 77 NetLogWithSource().net_log()), | 83 NetLogWithSource().net_log()), |
| 78 pool_(kMaxSockets, | 84 field_trial_list_(nullptr), |
| 79 kMaxSocketsPerGroup, | 85 pool_( |
| 80 &transport_socket_pool_, | 86 base::MakeUnique<HttpProxyClientSocketPool>(kMaxSockets, |
| 81 &ssl_socket_pool_, | 87 kMaxSocketsPerGroup, |
| 82 &estimator_, | 88 &transport_socket_pool_, |
| 83 NULL) { | 89 &ssl_socket_pool_, |
| 90 &estimator_, |
| 91 nullptr)) { |
| 84 session_ = CreateNetworkSession(); | 92 session_ = CreateNetworkSession(); |
| 85 } | 93 } |
| 86 | 94 |
| 87 virtual ~HttpProxyClientSocketPoolTest() {} | 95 virtual ~HttpProxyClientSocketPoolTest() {} |
| 88 | 96 |
| 97 // Initializes the field trial paramters for the field trial that determines |
| 98 // connection timeout based on the network quality. |
| 99 void InitAdaptiveTimeoutFieldTrialWithParams( |
| 100 bool use_default_params, |
| 101 int transport_rtt_multiplier, |
| 102 base::TimeDelta min_proxy_connection_timeout, |
| 103 base::TimeDelta max_proxy_connection_timeout) { |
| 104 std::string trial_name = "NetAdaptiveProxyConnectionTimeout"; |
| 105 std::string group_name = "Enabled"; |
| 106 |
| 107 std::map<std::string, std::string> params; |
| 108 if (!use_default_params) { |
| 109 params["transport_rtt_multiplier"] = |
| 110 base::IntToString(transport_rtt_multiplier); |
| 111 params["min_proxy_connection_timeout_seconds"] = |
| 112 base::IntToString(min_proxy_connection_timeout.InSeconds()); |
| 113 params["max_proxy_connection_timeout_seconds"] = |
| 114 base::IntToString(max_proxy_connection_timeout.InSeconds()); |
| 115 } |
| 116 base::FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting(); |
| 117 EXPECT_TRUE( |
| 118 base::AssociateFieldTrialParams(trial_name, group_name, params)); |
| 119 EXPECT_TRUE(base::FieldTrialList::CreateFieldTrial(trial_name, group_name)); |
| 120 |
| 121 // Reset |pool_| so that the field trial parameters are read by the |
| 122 // |pool_|. |
| 123 pool_ = base::MakeUnique<HttpProxyClientSocketPool>( |
| 124 kMaxSockets, kMaxSocketsPerGroup, &transport_socket_pool_, |
| 125 &ssl_socket_pool_, &estimator_, NetLogWithSource().net_log()); |
| 126 } |
| 127 |
| 89 void AddAuthToCache() { | 128 void AddAuthToCache() { |
| 90 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 129 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
| 91 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 130 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
| 92 GURL proxy_url(GetParam() == HTTP | 131 GURL proxy_url(GetParam() == HTTP |
| 93 ? (std::string("http://") + kHttpProxyHost) | 132 ? (std::string("http://") + kHttpProxyHost) |
| 94 : (std::string("https://") + kHttpsProxyHost)); | 133 : (std::string("https://") + kHttpsProxyHost)); |
| 95 session_->http_auth_cache()->Add(proxy_url, | 134 session_->http_auth_cache()->Add(proxy_url, |
| 96 "MyRealm1", | 135 "MyRealm1", |
| 97 HttpAuth::AUTH_SCHEME_BASIC, | 136 HttpAuth::AUTH_SCHEME_BASIC, |
| 98 "Basic realm=MyRealm1", | 137 "Basic realm=MyRealm1", |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 std::unique_ptr<HttpNetworkSession> CreateNetworkSession() { | 228 std::unique_ptr<HttpNetworkSession> CreateNetworkSession() { |
| 190 return SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 229 return SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 191 } | 230 } |
| 192 | 231 |
| 193 RequestPriority GetLastTransportRequestPriority() const { | 232 RequestPriority GetLastTransportRequestPriority() const { |
| 194 return transport_socket_pool_.last_request_priority(); | 233 return transport_socket_pool_.last_request_priority(); |
| 195 } | 234 } |
| 196 | 235 |
| 197 const base::HistogramTester& histogram_tester() { return histogram_tester_; } | 236 const base::HistogramTester& histogram_tester() { return histogram_tester_; } |
| 198 | 237 |
| 238 TestNetworkQualityEstimator* estimator() { return &estimator_; } |
| 239 |
| 199 private: | 240 private: |
| 200 SpdySessionDependencies session_deps_; | 241 SpdySessionDependencies session_deps_; |
| 201 | 242 |
| 202 TestNetworkQualityEstimator estimator_; | 243 TestNetworkQualityEstimator estimator_; |
| 203 | 244 |
| 204 MockTransportClientSocketPool transport_socket_pool_; | 245 MockTransportClientSocketPool transport_socket_pool_; |
| 205 MockHostResolver host_resolver_; | 246 MockHostResolver host_resolver_; |
| 206 std::unique_ptr<CertVerifier> cert_verifier_; | 247 std::unique_ptr<CertVerifier> cert_verifier_; |
| 207 SSLClientSocketPool ssl_socket_pool_; | 248 SSLClientSocketPool ssl_socket_pool_; |
| 208 | 249 |
| 209 std::unique_ptr<HttpNetworkSession> session_; | 250 std::unique_ptr<HttpNetworkSession> session_; |
| 210 | 251 |
| 211 base::HistogramTester histogram_tester_; | 252 base::HistogramTester histogram_tester_; |
| 212 | 253 |
| 254 base::FieldTrialList field_trial_list_; |
| 255 |
| 213 protected: | 256 protected: |
| 214 SpdyTestUtil spdy_util_; | 257 SpdyTestUtil spdy_util_; |
| 215 std::unique_ptr<SSLSocketDataProvider> ssl_data_; | 258 std::unique_ptr<SSLSocketDataProvider> ssl_data_; |
| 216 std::unique_ptr<SequencedSocketData> data_; | 259 std::unique_ptr<SequencedSocketData> data_; |
| 217 HttpProxyClientSocketPool pool_; | 260 std::unique_ptr<HttpProxyClientSocketPool> pool_; |
| 218 ClientSocketHandle handle_; | 261 ClientSocketHandle handle_; |
| 219 TestCompletionCallback callback_; | 262 TestCompletionCallback callback_; |
| 220 }; | 263 }; |
| 221 | 264 |
| 222 // All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY) | 265 // All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY) |
| 223 // and SPDY. | 266 // and SPDY. |
| 224 INSTANTIATE_TEST_CASE_P(HttpProxyType, | 267 INSTANTIATE_TEST_CASE_P(HttpProxyType, |
| 225 HttpProxyClientSocketPoolTest, | 268 HttpProxyClientSocketPoolTest, |
| 226 ::testing::Values(HTTP, HTTPS, SPDY)); | 269 ::testing::Values(HTTP, HTTPS, SPDY)); |
| 227 | 270 |
| 228 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { | 271 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { |
| 229 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 272 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 230 | 273 |
| 231 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 274 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 232 int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, | 275 int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, |
| 233 ClientSocketPool::RespectLimits::ENABLED, | 276 ClientSocketPool::RespectLimits::ENABLED, |
| 234 CompletionCallback(), &pool_, NetLogWithSource()); | 277 CompletionCallback(), pool_.get(), NetLogWithSource()); |
| 235 EXPECT_THAT(rv, IsOk()); | 278 EXPECT_THAT(rv, IsOk()); |
| 236 EXPECT_TRUE(handle_.is_initialized()); | 279 EXPECT_TRUE(handle_.is_initialized()); |
| 237 ASSERT_TRUE(handle_.socket()); | 280 ASSERT_TRUE(handle_.socket()); |
| 238 EXPECT_TRUE(handle_.socket()->IsConnected()); | 281 EXPECT_TRUE(handle_.socket()->IsConnected()); |
| 239 EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called()); | 282 EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called()); |
| 240 EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called()); | 283 EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called()); |
| 241 EXPECT_TRUE(proxy_delegate->on_tunnel_request_completed_called()); | 284 EXPECT_TRUE(proxy_delegate->on_tunnel_request_completed_called()); |
| 242 | 285 |
| 243 bool is_secure_proxy = GetParam() == HTTPS || GetParam() == SPDY; | 286 bool is_secure_proxy = GetParam() == HTTPS || GetParam() == SPDY; |
| 244 histogram_tester().ExpectTotalCount( | 287 histogram_tester().ExpectTotalCount( |
| 245 "Net.HttpProxy.ConnectLatency.Insecure.Success", is_secure_proxy ? 0 : 1); | 288 "Net.HttpProxy.ConnectLatency.Insecure.Success", is_secure_proxy ? 0 : 1); |
| 246 histogram_tester().ExpectTotalCount( | 289 histogram_tester().ExpectTotalCount( |
| 247 "Net.HttpProxy.ConnectLatency.Secure.Success", is_secure_proxy ? 1 : 0); | 290 "Net.HttpProxy.ConnectLatency.Secure.Success", is_secure_proxy ? 1 : 0); |
| 248 } | 291 } |
| 249 | 292 |
| 250 // Make sure that HttpProxyConnectJob passes on its priority to its | 293 // Make sure that HttpProxyConnectJob passes on its priority to its |
| 251 // (non-SSL) socket request on Init. | 294 // (non-SSL) socket request on Init. |
| 252 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 295 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 253 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 296 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 254 EXPECT_EQ(OK, handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, | 297 EXPECT_EQ( |
| 255 ClientSocketPool::RespectLimits::ENABLED, | 298 OK, handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, |
| 256 CompletionCallback(), &pool_, NetLogWithSource())); | 299 ClientSocketPool::RespectLimits::ENABLED, |
| 300 CompletionCallback(), pool_.get(), NetLogWithSource())); |
| 257 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); | 301 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); |
| 258 } | 302 } |
| 259 | 303 |
| 260 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { | 304 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { |
| 261 MockWrite writes[] = { | 305 MockWrite writes[] = { |
| 262 MockWrite(ASYNC, 0, | 306 MockWrite(ASYNC, 0, |
| 263 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 307 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 264 "Host: www.google.com:443\r\n" | 308 "Host: www.google.com:443\r\n" |
| 265 "Proxy-Connection: keep-alive\r\n\r\n"), | 309 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 266 }; | 310 }; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 286 spdy_util_.ConstructSpdyReply(1, std::move(resp_block))); | 330 spdy_util_.ConstructSpdyReply(1, std::move(resp_block))); |
| 287 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), | 331 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), |
| 288 MockRead(ASYNC, 0, 3)}; | 332 MockRead(ASYNC, 0, 3)}; |
| 289 | 333 |
| 290 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 334 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 291 spdy_reads, arraysize(spdy_reads), spdy_writes, | 335 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 292 arraysize(spdy_writes)); | 336 arraysize(spdy_writes)); |
| 293 | 337 |
| 294 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 338 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 295 ClientSocketPool::RespectLimits::ENABLED, | 339 ClientSocketPool::RespectLimits::ENABLED, |
| 296 callback_.callback(), &pool_, NetLogWithSource()); | 340 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 297 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 341 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 298 EXPECT_FALSE(handle_.is_initialized()); | 342 EXPECT_FALSE(handle_.is_initialized()); |
| 299 EXPECT_FALSE(handle_.socket()); | 343 EXPECT_FALSE(handle_.socket()); |
| 300 | 344 |
| 301 rv = callback_.WaitForResult(); | 345 rv = callback_.WaitForResult(); |
| 302 EXPECT_THAT(rv, IsError(ERR_PROXY_AUTH_REQUESTED)); | 346 EXPECT_THAT(rv, IsError(ERR_PROXY_AUTH_REQUESTED)); |
| 303 EXPECT_TRUE(handle_.is_initialized()); | 347 EXPECT_TRUE(handle_.is_initialized()); |
| 304 ASSERT_TRUE(handle_.socket()); | 348 ASSERT_TRUE(handle_.socket()); |
| 305 ProxyClientSocket* tunnel_socket = | 349 ProxyClientSocket* tunnel_socket = |
| 306 static_cast<ProxyClientSocket*>(handle_.socket()); | 350 static_cast<ProxyClientSocket*>(handle_.socket()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 335 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 379 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 336 }; | 380 }; |
| 337 | 381 |
| 338 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, | 382 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, |
| 339 NULL, 0); | 383 NULL, 0); |
| 340 AddAuthToCache(); | 384 AddAuthToCache(); |
| 341 | 385 |
| 342 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 386 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 343 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, | 387 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, |
| 344 ClientSocketPool::RespectLimits::ENABLED, | 388 ClientSocketPool::RespectLimits::ENABLED, |
| 345 callback_.callback(), &pool_, NetLogWithSource()); | 389 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 346 EXPECT_THAT(rv, IsOk()); | 390 EXPECT_THAT(rv, IsOk()); |
| 347 EXPECT_TRUE(handle_.is_initialized()); | 391 EXPECT_TRUE(handle_.is_initialized()); |
| 348 ASSERT_TRUE(handle_.socket()); | 392 ASSERT_TRUE(handle_.socket()); |
| 349 EXPECT_TRUE(handle_.socket()->IsConnected()); | 393 EXPECT_TRUE(handle_.socket()->IsConnected()); |
| 350 proxy_delegate->VerifyOnTunnelHeadersReceived( | 394 proxy_delegate->VerifyOnTunnelHeadersReceived( |
| 351 "www.google.com:443", | 395 "www.google.com:443", |
| 352 proxy_host_port.c_str(), | 396 proxy_host_port.c_str(), |
| 353 "HTTP/1.1 200 Connection Established"); | 397 "HTTP/1.1 200 Connection Established"); |
| 354 proxy_delegate->VerifyOnTunnelRequestCompleted( | 398 proxy_delegate->VerifyOnTunnelRequestCompleted( |
| 355 "www.google.com:443", | 399 "www.google.com:443", |
| (...skipping 30 matching lines...) Expand all Loading... |
| 386 }; | 430 }; |
| 387 | 431 |
| 388 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 432 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 389 spdy_reads, arraysize(spdy_reads), spdy_writes, | 433 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 390 arraysize(spdy_writes)); | 434 arraysize(spdy_writes)); |
| 391 AddAuthToCache(); | 435 AddAuthToCache(); |
| 392 | 436 |
| 393 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 437 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 394 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, | 438 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, |
| 395 ClientSocketPool::RespectLimits::ENABLED, | 439 ClientSocketPool::RespectLimits::ENABLED, |
| 396 callback_.callback(), &pool_, NetLogWithSource()); | 440 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 397 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 441 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 398 EXPECT_FALSE(handle_.is_initialized()); | 442 EXPECT_FALSE(handle_.is_initialized()); |
| 399 EXPECT_FALSE(handle_.socket()); | 443 EXPECT_FALSE(handle_.socket()); |
| 400 | 444 |
| 401 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 445 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 402 EXPECT_TRUE(handle_.is_initialized()); | 446 EXPECT_TRUE(handle_.is_initialized()); |
| 403 ASSERT_TRUE(handle_.socket()); | 447 ASSERT_TRUE(handle_.socket()); |
| 404 EXPECT_TRUE(handle_.socket()->IsConnected()); | 448 EXPECT_TRUE(handle_.socket()->IsConnected()); |
| 405 proxy_delegate->VerifyOnTunnelRequestCompleted( | 449 proxy_delegate->VerifyOnTunnelRequestCompleted( |
| 406 "www.google.com:443", | 450 "www.google.com:443", |
| (...skipping 13 matching lines...) Expand all Loading... |
| 420 MockWrite spdy_writes[] = {CreateMockWrite(req, 0, ASYNC)}; | 464 MockWrite spdy_writes[] = {CreateMockWrite(req, 0, ASYNC)}; |
| 421 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); | 465 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 422 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), | 466 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), |
| 423 MockRead(ASYNC, 0, 2)}; | 467 MockRead(ASYNC, 0, 2)}; |
| 424 | 468 |
| 425 Initialize(NULL, 0, NULL, 0, | 469 Initialize(NULL, 0, NULL, 0, |
| 426 spdy_reads, arraysize(spdy_reads), | 470 spdy_reads, arraysize(spdy_reads), |
| 427 spdy_writes, arraysize(spdy_writes)); | 471 spdy_writes, arraysize(spdy_writes)); |
| 428 AddAuthToCache(); | 472 AddAuthToCache(); |
| 429 | 473 |
| 430 EXPECT_EQ(ERR_IO_PENDING, | 474 EXPECT_EQ( |
| 431 handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, | 475 ERR_IO_PENDING, |
| 432 ClientSocketPool::RespectLimits::ENABLED, | 476 handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, |
| 433 callback_.callback(), &pool_, NetLogWithSource())); | 477 ClientSocketPool::RespectLimits::ENABLED, |
| 478 callback_.callback(), pool_.get(), NetLogWithSource())); |
| 434 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); | 479 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); |
| 435 | 480 |
| 436 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 481 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 437 } | 482 } |
| 438 | 483 |
| 439 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { | 484 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { |
| 440 if (GetParam() == SPDY) | 485 if (GetParam() == SPDY) |
| 441 return; | 486 return; |
| 442 data_.reset(new SequencedSocketData(NULL, 0, NULL, 0)); | 487 data_.reset(new SequencedSocketData(NULL, 0, NULL, 0)); |
| 443 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); | 488 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); |
| 444 | 489 |
| 445 socket_factory()->AddSocketDataProvider(data_.get()); | 490 socket_factory()->AddSocketDataProvider(data_.get()); |
| 446 | 491 |
| 447 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 492 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 448 ClientSocketPool::RespectLimits::ENABLED, | 493 ClientSocketPool::RespectLimits::ENABLED, |
| 449 callback_.callback(), &pool_, NetLogWithSource()); | 494 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 450 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 495 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 451 EXPECT_FALSE(handle_.is_initialized()); | 496 EXPECT_FALSE(handle_.is_initialized()); |
| 452 EXPECT_FALSE(handle_.socket()); | 497 EXPECT_FALSE(handle_.socket()); |
| 453 | 498 |
| 454 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_PROXY_CONNECTION_FAILED)); | 499 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_PROXY_CONNECTION_FAILED)); |
| 455 | 500 |
| 456 EXPECT_FALSE(handle_.is_initialized()); | 501 EXPECT_FALSE(handle_.is_initialized()); |
| 457 EXPECT_FALSE(handle_.socket()); | 502 EXPECT_FALSE(handle_.socket()); |
| 458 | 503 |
| 459 bool is_secure_proxy = GetParam() == HTTPS; | 504 bool is_secure_proxy = GetParam() == HTTPS; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 472 | 517 |
| 473 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 518 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
| 474 ERR_CERT_AUTHORITY_INVALID)); | 519 ERR_CERT_AUTHORITY_INVALID)); |
| 475 if (GetParam() == SPDY) { | 520 if (GetParam() == SPDY) { |
| 476 InitializeSpdySsl(); | 521 InitializeSpdySsl(); |
| 477 } | 522 } |
| 478 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 523 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 479 | 524 |
| 480 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 525 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 481 ClientSocketPool::RespectLimits::ENABLED, | 526 ClientSocketPool::RespectLimits::ENABLED, |
| 482 callback_.callback(), &pool_, NetLogWithSource()); | 527 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 483 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 528 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 484 EXPECT_FALSE(handle_.is_initialized()); | 529 EXPECT_FALSE(handle_.is_initialized()); |
| 485 EXPECT_FALSE(handle_.socket()); | 530 EXPECT_FALSE(handle_.socket()); |
| 486 | 531 |
| 487 EXPECT_THAT(callback_.WaitForResult(), | 532 EXPECT_THAT(callback_.WaitForResult(), |
| 488 IsError(ERR_PROXY_CERTIFICATE_INVALID)); | 533 IsError(ERR_PROXY_CERTIFICATE_INVALID)); |
| 489 | 534 |
| 490 EXPECT_FALSE(handle_.is_initialized()); | 535 EXPECT_FALSE(handle_.is_initialized()); |
| 491 EXPECT_FALSE(handle_.socket()); | 536 EXPECT_FALSE(handle_.socket()); |
| 492 histogram_tester().ExpectTotalCount( | 537 histogram_tester().ExpectTotalCount( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 504 | 549 |
| 505 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 550 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
| 506 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 551 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
| 507 if (GetParam() == SPDY) { | 552 if (GetParam() == SPDY) { |
| 508 InitializeSpdySsl(); | 553 InitializeSpdySsl(); |
| 509 } | 554 } |
| 510 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 555 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 511 | 556 |
| 512 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 557 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 513 ClientSocketPool::RespectLimits::ENABLED, | 558 ClientSocketPool::RespectLimits::ENABLED, |
| 514 callback_.callback(), &pool_, NetLogWithSource()); | 559 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 515 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 560 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 516 EXPECT_FALSE(handle_.is_initialized()); | 561 EXPECT_FALSE(handle_.is_initialized()); |
| 517 EXPECT_FALSE(handle_.socket()); | 562 EXPECT_FALSE(handle_.socket()); |
| 518 | 563 |
| 519 EXPECT_THAT(callback_.WaitForResult(), | 564 EXPECT_THAT(callback_.WaitForResult(), |
| 520 IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 565 IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
| 521 | 566 |
| 522 EXPECT_FALSE(handle_.is_initialized()); | 567 EXPECT_FALSE(handle_.is_initialized()); |
| 523 EXPECT_FALSE(handle_.socket()); | 568 EXPECT_FALSE(handle_.socket()); |
| 524 histogram_tester().ExpectTotalCount( | 569 histogram_tester().ExpectTotalCount( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 547 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), | 592 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), |
| 548 }; | 593 }; |
| 549 | 594 |
| 550 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 595 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 551 spdy_reads, arraysize(spdy_reads), spdy_writes, | 596 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 552 arraysize(spdy_writes)); | 597 arraysize(spdy_writes)); |
| 553 AddAuthToCache(); | 598 AddAuthToCache(); |
| 554 | 599 |
| 555 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 600 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 556 ClientSocketPool::RespectLimits::ENABLED, | 601 ClientSocketPool::RespectLimits::ENABLED, |
| 557 callback_.callback(), &pool_, NetLogWithSource()); | 602 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 558 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 603 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 559 EXPECT_FALSE(handle_.is_initialized()); | 604 EXPECT_FALSE(handle_.is_initialized()); |
| 560 EXPECT_FALSE(handle_.socket()); | 605 EXPECT_FALSE(handle_.socket()); |
| 561 | 606 |
| 562 if (GetParam() == SPDY) { | 607 if (GetParam() == SPDY) { |
| 563 // SPDY cannot process a headers block unless it's complete and so it | 608 // SPDY cannot process a headers block unless it's complete and so it |
| 564 // returns ERR_CONNECTION_CLOSED in this case. | 609 // returns ERR_CONNECTION_CLOSED in this case. |
| 565 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); | 610 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
| 566 } else { | 611 } else { |
| 567 EXPECT_THAT(callback_.WaitForResult(), | 612 EXPECT_THAT(callback_.WaitForResult(), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 587 MockRead reads[] = { | 632 MockRead reads[] = { |
| 588 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), | 633 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), |
| 589 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 634 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 590 }; | 635 }; |
| 591 | 636 |
| 592 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 637 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 593 NULL, 0, NULL, 0); | 638 NULL, 0, NULL, 0); |
| 594 | 639 |
| 595 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 640 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 596 ClientSocketPool::RespectLimits::ENABLED, | 641 ClientSocketPool::RespectLimits::ENABLED, |
| 597 callback_.callback(), &pool_, NetLogWithSource()); | 642 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 598 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 643 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 599 EXPECT_FALSE(handle_.is_initialized()); | 644 EXPECT_FALSE(handle_.is_initialized()); |
| 600 EXPECT_FALSE(handle_.socket()); | 645 EXPECT_FALSE(handle_.socket()); |
| 601 | 646 |
| 602 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 647 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
| 603 } | 648 } |
| 604 | 649 |
| 605 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 650 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { |
| 606 MockWrite writes[] = { | 651 MockWrite writes[] = { |
| 607 MockWrite(ASYNC, 0, | 652 MockWrite(ASYNC, 0, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 626 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 3), | 671 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 3), |
| 627 }; | 672 }; |
| 628 | 673 |
| 629 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 674 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 630 spdy_reads, arraysize(spdy_reads), spdy_writes, | 675 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 631 arraysize(spdy_writes)); | 676 arraysize(spdy_writes)); |
| 632 AddAuthToCache(); | 677 AddAuthToCache(); |
| 633 | 678 |
| 634 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 679 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 635 ClientSocketPool::RespectLimits::ENABLED, | 680 ClientSocketPool::RespectLimits::ENABLED, |
| 636 callback_.callback(), &pool_, NetLogWithSource()); | 681 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 637 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 682 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 638 EXPECT_FALSE(handle_.is_initialized()); | 683 EXPECT_FALSE(handle_.is_initialized()); |
| 639 EXPECT_FALSE(handle_.socket()); | 684 EXPECT_FALSE(handle_.socket()); |
| 640 | 685 |
| 641 rv = callback_.WaitForResult(); | 686 rv = callback_.WaitForResult(); |
| 642 // All Proxy CONNECT responses are not trustworthy | 687 // All Proxy CONNECT responses are not trustworthy |
| 643 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 688 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
| 644 EXPECT_FALSE(handle_.is_initialized()); | 689 EXPECT_FALSE(handle_.is_initialized()); |
| 645 EXPECT_FALSE(handle_.socket()); | 690 EXPECT_FALSE(handle_.socket()); |
| 646 } | 691 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 2), | 728 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 2), |
| 684 }; | 729 }; |
| 685 | 730 |
| 686 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 731 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 687 spdy_reads, arraysize(spdy_reads), spdy_writes, | 732 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 688 arraysize(spdy_writes)); | 733 arraysize(spdy_writes)); |
| 689 AddAuthToCache(); | 734 AddAuthToCache(); |
| 690 | 735 |
| 691 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 736 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 692 ClientSocketPool::RespectLimits::ENABLED, | 737 ClientSocketPool::RespectLimits::ENABLED, |
| 693 callback_.callback(), &pool_, NetLogWithSource()); | 738 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 694 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 739 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 695 EXPECT_FALSE(handle_.is_initialized()); | 740 EXPECT_FALSE(handle_.is_initialized()); |
| 696 EXPECT_FALSE(handle_.socket()); | 741 EXPECT_FALSE(handle_.socket()); |
| 697 | 742 |
| 698 rv = callback_.WaitForResult(); | 743 rv = callback_.WaitForResult(); |
| 699 | 744 |
| 700 if (GetParam() == HTTP) { | 745 if (GetParam() == HTTP) { |
| 701 // We don't trust 302 responses to CONNECT from HTTP proxies. | 746 // We don't trust 302 responses to CONNECT from HTTP proxies. |
| 702 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 747 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
| 703 EXPECT_FALSE(handle_.is_initialized()); | 748 EXPECT_FALSE(handle_.is_initialized()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 720 EXPECT_TRUE(headers->HasHeaderValue("content-length", "0")); | 765 EXPECT_TRUE(headers->HasHeaderValue("content-length", "0")); |
| 721 | 766 |
| 722 // Make sure Location header was included and correct. | 767 // Make sure Location header was included and correct. |
| 723 std::string location; | 768 std::string location; |
| 724 EXPECT_TRUE(headers->IsRedirect(&location)); | 769 EXPECT_TRUE(headers->IsRedirect(&location)); |
| 725 EXPECT_EQ(location, redirectTarget); | 770 EXPECT_EQ(location, redirectTarget); |
| 726 } | 771 } |
| 727 } | 772 } |
| 728 | 773 |
| 729 TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeout) { | 774 TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeout) { |
| 730 ASSERT_LE(base::TimeDelta(), pool_.ConnectionTimeout()); | 775 EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout()); |
| 731 | 776 |
| 732 // Test against a large value. | 777 // Test against a large value. |
| 733 ASSERT_GE(base::TimeDelta::FromMinutes(10), pool_.ConnectionTimeout()); | 778 EXPECT_GE(base::TimeDelta::FromMinutes(10), pool_->ConnectionTimeout()); |
| 734 | 779 |
| 735 #if (defined(OS_ANDROID) || defined(OS_IOS)) | 780 #if (defined(OS_ANDROID) || defined(OS_IOS)) |
| 736 // On Android and iOS, the timeout is fixed to 10 seconds. | 781 // On Android and iOS, the timeout is fixed to 10 seconds. |
| 737 ASSERT_EQ(base::TimeDelta::FromSeconds(10), pool_.ConnectionTimeout()); | 782 EXPECT_EQ(base::TimeDelta::FromSeconds(10), pool_->ConnectionTimeout()); |
| 738 #endif | 783 #endif |
| 739 } | 784 } |
| 740 | 785 |
| 786 // Tests the connection timeout values when the field trial parameters are |
| 787 // specified. |
| 788 TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeoutWithExperiment) { |
| 789 int transport_rtt_multiplier = 2; |
| 790 base::TimeDelta min_timeout = base::TimeDelta::FromSeconds(8); |
| 791 base::TimeDelta max_timeout = base::TimeDelta::FromSeconds(20); |
| 792 |
| 793 InitAdaptiveTimeoutFieldTrialWithParams(false, transport_rtt_multiplier, |
| 794 min_timeout, max_timeout); |
| 795 EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout()); |
| 796 |
| 797 // Timeout should be |transport_rtt_multiplier| times the transport RTT |
| 798 // estimate. |
| 799 base::TimeDelta rtt_estimate = base::TimeDelta::FromSeconds(7); |
| 800 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 801 EXPECT_EQ(rtt_estimate + rtt_estimate, pool_->ConnectionTimeout()); |
| 802 |
| 803 // A change in RTT estimate should also change the connection timeout. |
| 804 rtt_estimate = base::TimeDelta::FromSeconds(8); |
| 805 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 806 EXPECT_EQ(rtt_estimate + rtt_estimate, pool_->ConnectionTimeout()); |
| 807 |
| 808 // Connection timeout should not exceed |max_timeout|. |
| 809 rtt_estimate = base::TimeDelta::FromSeconds(25); |
| 810 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 811 EXPECT_EQ(max_timeout, pool_->ConnectionTimeout()); |
| 812 |
| 813 // Connection timeout should not be less than |min_timeout|. |
| 814 rtt_estimate = base::TimeDelta::FromSeconds(0); |
| 815 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 816 EXPECT_EQ(min_timeout, pool_->ConnectionTimeout()); |
| 817 } |
| 818 |
| 819 // Tests the connection timeout values when the field trial parameters are |
| 820 // specified. |
| 821 TEST_P(HttpProxyClientSocketPoolTest, |
| 822 ProxyPoolTimeoutWithExperimentDifferentParams) { |
| 823 int transport_rtt_multiplier = 3; |
| 824 base::TimeDelta min_timeout = base::TimeDelta::FromSeconds(2); |
| 825 base::TimeDelta max_timeout = base::TimeDelta::FromSeconds(30); |
| 826 |
| 827 InitAdaptiveTimeoutFieldTrialWithParams(false, transport_rtt_multiplier, |
| 828 min_timeout, max_timeout); |
| 829 EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout()); |
| 830 |
| 831 // Timeout should be |transport_rtt_multiplier| times the transport RTT |
| 832 // estimate. |
| 833 base::TimeDelta rtt_estimate = base::TimeDelta::FromSeconds(2); |
| 834 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 835 EXPECT_EQ(rtt_estimate + rtt_estimate + rtt_estimate, |
| 836 pool_->ConnectionTimeout()); |
| 837 |
| 838 // A change in RTT estimate should also change the connection timeout. |
| 839 rtt_estimate = base::TimeDelta::FromSeconds(7); |
| 840 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 841 EXPECT_EQ(rtt_estimate + rtt_estimate + rtt_estimate, |
| 842 pool_->ConnectionTimeout()); |
| 843 |
| 844 // Connection timeout should not exceed |max_timeout|. |
| 845 rtt_estimate = base::TimeDelta::FromSeconds(35); |
| 846 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 847 EXPECT_EQ(max_timeout, pool_->ConnectionTimeout()); |
| 848 |
| 849 // Connection timeout should not be less than |min_timeout|. |
| 850 rtt_estimate = base::TimeDelta::FromSeconds(0); |
| 851 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 852 EXPECT_EQ(min_timeout, pool_->ConnectionTimeout()); |
| 853 } |
| 854 |
| 855 // Tests the connection timeout values when the field trial parameters are not |
| 856 // specified. |
| 857 TEST_P(HttpProxyClientSocketPoolTest, |
| 858 ProxyPoolTimeoutWithExperimentDefaultParams) { |
| 859 InitAdaptiveTimeoutFieldTrialWithParams(true, 0, base::TimeDelta(), |
| 860 base::TimeDelta()); |
| 861 EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout()); |
| 862 |
| 863 // Timeout should be |transport_rtt_multiplier| times the transport RTT |
| 864 // estimate. |
| 865 base::TimeDelta rtt_estimate = base::TimeDelta::FromMilliseconds(10); |
| 866 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 867 // Connection timeout should not be less than the transport RTT estimate. |
| 868 EXPECT_LE(rtt_estimate, pool_->ConnectionTimeout()); |
| 869 |
| 870 // A change in RTT estimate should also change the connection timeout. |
| 871 rtt_estimate = base::TimeDelta::FromSeconds(10); |
| 872 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 873 // Connection timeout should not be less than the transport RTT estimate. |
| 874 EXPECT_LE(rtt_estimate, pool_->ConnectionTimeout()); |
| 875 |
| 876 // Set RTT to a very large value. |
| 877 rtt_estimate = base::TimeDelta::FromMinutes(60); |
| 878 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 879 EXPECT_GT(rtt_estimate, pool_->ConnectionTimeout()); |
| 880 |
| 881 // Set RTT to a very small value. |
| 882 rtt_estimate = base::TimeDelta::FromSeconds(0); |
| 883 estimator()->set_start_time_null_transport_rtt(rtt_estimate); |
| 884 EXPECT_LT(rtt_estimate, pool_->ConnectionTimeout()); |
| 885 } |
| 886 |
| 741 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 887 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
| 742 | 888 |
| 743 } // namespace net | 889 } // namespace net |
| OLD | NEW |