Chromium Code Reviews| 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) { |
|
mmenke
2017/06/13 19:52:01
git cl format.
tbansal1
2017/06/13 23:02:48
umm, this is formatted.
|field_trial_list_| is at
mmenke
2017/06/14 18:10:01
Sorry, was confused by the ssl_socket_pool_ argume
| |
| 79 kMaxSocketsPerGroup, | 85 pool_ = base::MakeUnique<HttpProxyClientSocketPool>( |
| 80 &transport_socket_pool_, | 86 kMaxSockets, kMaxSocketsPerGroup, &transport_socket_pool_, |
| 81 &ssl_socket_pool_, | 87 &ssl_socket_pool_, &estimator_, NetLogWithSource().net_log()); |
|
mmenke
2017/06/13 19:52:00
Why move this? Can still call MakeUnique in the i
tbansal1
2017/06/13 23:02:48
Done.
| |
| 82 &estimator_, | |
| 83 NULL) { | |
| 84 session_ = CreateNetworkSession(); | 88 session_ = CreateNetworkSession(); |
| 85 } | 89 } |
| 86 | 90 |
| 87 virtual ~HttpProxyClientSocketPoolTest() {} | 91 virtual ~HttpProxyClientSocketPoolTest() {} |
| 88 | 92 |
| 93 // Initializes the field trial paramters for the field trial that determines | |
| 94 // connection timeout based on the network quality. | |
| 95 void InitAdaptiveTimeoutFieldTrialWithParams( | |
| 96 int transport_rtt_multiplier, | |
| 97 base::TimeDelta min_proxy_connection_timeout, | |
| 98 base::TimeDelta max_proxy_connection_timeout) { | |
| 99 std::string trial_name = "NetAdaptiveProxyConnectionTimeout"; | |
| 100 std::string group_name = "Enabled"; | |
| 101 | |
| 102 std::map<std::string, std::string> params; | |
| 103 params["transport_rtt_multiplier"] = | |
| 104 base::IntToString(transport_rtt_multiplier); | |
| 105 params["min_proxy_connection_timeout_seconds"] = | |
| 106 base::IntToString(min_proxy_connection_timeout.InSeconds()); | |
| 107 params["max_proxy_connection_timeout_seconds"] = | |
| 108 base::IntToString(max_proxy_connection_timeout.InSeconds()); | |
| 109 base::AssociateFieldTrialParams(trial_name, group_name, params); | |
| 110 base::FieldTrialList::CreateFieldTrial(trial_name, group_name); | |
| 111 | |
| 112 // Reset |pool_| so that the field trial parameters are read by the | |
| 113 // |pool_|. | |
| 114 pool_ = base::MakeUnique<HttpProxyClientSocketPool>( | |
| 115 kMaxSockets, kMaxSocketsPerGroup, &transport_socket_pool_, | |
| 116 &ssl_socket_pool_, &estimator_, NetLogWithSource().net_log()); | |
| 117 } | |
| 118 | |
| 89 void AddAuthToCache() { | 119 void AddAuthToCache() { |
| 90 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 120 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
| 91 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 121 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
| 92 GURL proxy_url(GetParam() == HTTP | 122 GURL proxy_url(GetParam() == HTTP |
| 93 ? (std::string("http://") + kHttpProxyHost) | 123 ? (std::string("http://") + kHttpProxyHost) |
| 94 : (std::string("https://") + kHttpsProxyHost)); | 124 : (std::string("https://") + kHttpsProxyHost)); |
| 95 session_->http_auth_cache()->Add(proxy_url, | 125 session_->http_auth_cache()->Add(proxy_url, |
| 96 "MyRealm1", | 126 "MyRealm1", |
| 97 HttpAuth::AUTH_SCHEME_BASIC, | 127 HttpAuth::AUTH_SCHEME_BASIC, |
| 98 "Basic realm=MyRealm1", | 128 "Basic realm=MyRealm1", |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 std::unique_ptr<HttpNetworkSession> CreateNetworkSession() { | 219 std::unique_ptr<HttpNetworkSession> CreateNetworkSession() { |
| 190 return SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 220 return SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 191 } | 221 } |
| 192 | 222 |
| 193 RequestPriority GetLastTransportRequestPriority() const { | 223 RequestPriority GetLastTransportRequestPriority() const { |
| 194 return transport_socket_pool_.last_request_priority(); | 224 return transport_socket_pool_.last_request_priority(); |
| 195 } | 225 } |
| 196 | 226 |
| 197 const base::HistogramTester& histogram_tester() { return histogram_tester_; } | 227 const base::HistogramTester& histogram_tester() { return histogram_tester_; } |
| 198 | 228 |
| 229 TestNetworkQualityEstimator* estimator() { return &estimator_; } | |
| 230 | |
| 199 private: | 231 private: |
| 200 SpdySessionDependencies session_deps_; | 232 SpdySessionDependencies session_deps_; |
| 201 | 233 |
| 202 TestNetworkQualityEstimator estimator_; | 234 TestNetworkQualityEstimator estimator_; |
| 203 | 235 |
| 204 MockTransportClientSocketPool transport_socket_pool_; | 236 MockTransportClientSocketPool transport_socket_pool_; |
| 205 MockHostResolver host_resolver_; | 237 MockHostResolver host_resolver_; |
| 206 std::unique_ptr<CertVerifier> cert_verifier_; | 238 std::unique_ptr<CertVerifier> cert_verifier_; |
| 207 SSLClientSocketPool ssl_socket_pool_; | 239 SSLClientSocketPool ssl_socket_pool_; |
| 208 | 240 |
| 209 std::unique_ptr<HttpNetworkSession> session_; | 241 std::unique_ptr<HttpNetworkSession> session_; |
| 210 | 242 |
| 211 base::HistogramTester histogram_tester_; | 243 base::HistogramTester histogram_tester_; |
| 212 | 244 |
| 245 base::FieldTrialList field_trial_list_; | |
| 246 | |
| 213 protected: | 247 protected: |
| 214 SpdyTestUtil spdy_util_; | 248 SpdyTestUtil spdy_util_; |
| 215 std::unique_ptr<SSLSocketDataProvider> ssl_data_; | 249 std::unique_ptr<SSLSocketDataProvider> ssl_data_; |
| 216 std::unique_ptr<SequencedSocketData> data_; | 250 std::unique_ptr<SequencedSocketData> data_; |
| 217 HttpProxyClientSocketPool pool_; | 251 std::unique_ptr<HttpProxyClientSocketPool> pool_; |
| 218 ClientSocketHandle handle_; | 252 ClientSocketHandle handle_; |
| 219 TestCompletionCallback callback_; | 253 TestCompletionCallback callback_; |
| 220 }; | 254 }; |
| 221 | 255 |
| 222 // All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY) | 256 // All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY) |
| 223 // and SPDY. | 257 // and SPDY. |
| 224 INSTANTIATE_TEST_CASE_P(HttpProxyType, | 258 INSTANTIATE_TEST_CASE_P(HttpProxyType, |
| 225 HttpProxyClientSocketPoolTest, | 259 HttpProxyClientSocketPoolTest, |
| 226 ::testing::Values(HTTP, HTTPS, SPDY)); | 260 ::testing::Values(HTTP, HTTPS, SPDY)); |
| 227 | 261 |
| 228 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { | 262 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { |
| 229 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 263 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 230 | 264 |
| 231 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 265 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 232 int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, | 266 int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, |
| 233 ClientSocketPool::RespectLimits::ENABLED, | 267 ClientSocketPool::RespectLimits::ENABLED, |
| 234 CompletionCallback(), &pool_, NetLogWithSource()); | 268 CompletionCallback(), pool_.get(), NetLogWithSource()); |
| 235 EXPECT_THAT(rv, IsOk()); | 269 EXPECT_THAT(rv, IsOk()); |
| 236 EXPECT_TRUE(handle_.is_initialized()); | 270 EXPECT_TRUE(handle_.is_initialized()); |
| 237 ASSERT_TRUE(handle_.socket()); | 271 ASSERT_TRUE(handle_.socket()); |
| 238 EXPECT_TRUE(handle_.socket()->IsConnected()); | 272 EXPECT_TRUE(handle_.socket()->IsConnected()); |
| 239 EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called()); | 273 EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called()); |
| 240 EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called()); | 274 EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called()); |
| 241 EXPECT_TRUE(proxy_delegate->on_tunnel_request_completed_called()); | 275 EXPECT_TRUE(proxy_delegate->on_tunnel_request_completed_called()); |
| 242 | 276 |
| 243 bool is_secure_proxy = GetParam() == HTTPS || GetParam() == SPDY; | 277 bool is_secure_proxy = GetParam() == HTTPS || GetParam() == SPDY; |
| 244 histogram_tester().ExpectTotalCount( | 278 histogram_tester().ExpectTotalCount( |
| 245 "Net.HttpProxy.ConnectLatency.Insecure.Success", is_secure_proxy ? 0 : 1); | 279 "Net.HttpProxy.ConnectLatency.Insecure.Success", is_secure_proxy ? 0 : 1); |
| 246 histogram_tester().ExpectTotalCount( | 280 histogram_tester().ExpectTotalCount( |
| 247 "Net.HttpProxy.ConnectLatency.Secure.Success", is_secure_proxy ? 1 : 0); | 281 "Net.HttpProxy.ConnectLatency.Secure.Success", is_secure_proxy ? 1 : 0); |
| 248 } | 282 } |
| 249 | 283 |
| 250 // Make sure that HttpProxyConnectJob passes on its priority to its | 284 // Make sure that HttpProxyConnectJob passes on its priority to its |
| 251 // (non-SSL) socket request on Init. | 285 // (non-SSL) socket request on Init. |
| 252 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 286 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 253 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 287 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 254 EXPECT_EQ(OK, handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, | 288 EXPECT_EQ( |
| 255 ClientSocketPool::RespectLimits::ENABLED, | 289 OK, handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, |
| 256 CompletionCallback(), &pool_, NetLogWithSource())); | 290 ClientSocketPool::RespectLimits::ENABLED, |
| 291 CompletionCallback(), pool_.get(), NetLogWithSource())); | |
| 257 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); | 292 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); |
| 258 } | 293 } |
| 259 | 294 |
| 260 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { | 295 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { |
| 261 MockWrite writes[] = { | 296 MockWrite writes[] = { |
| 262 MockWrite(ASYNC, 0, | 297 MockWrite(ASYNC, 0, |
| 263 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 298 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 264 "Host: www.google.com:443\r\n" | 299 "Host: www.google.com:443\r\n" |
| 265 "Proxy-Connection: keep-alive\r\n\r\n"), | 300 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 266 }; | 301 }; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 286 spdy_util_.ConstructSpdyReply(1, std::move(resp_block))); | 321 spdy_util_.ConstructSpdyReply(1, std::move(resp_block))); |
| 287 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), | 322 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), |
| 288 MockRead(ASYNC, 0, 3)}; | 323 MockRead(ASYNC, 0, 3)}; |
| 289 | 324 |
| 290 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 325 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 291 spdy_reads, arraysize(spdy_reads), spdy_writes, | 326 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 292 arraysize(spdy_writes)); | 327 arraysize(spdy_writes)); |
| 293 | 328 |
| 294 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 329 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 295 ClientSocketPool::RespectLimits::ENABLED, | 330 ClientSocketPool::RespectLimits::ENABLED, |
| 296 callback_.callback(), &pool_, NetLogWithSource()); | 331 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 297 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 332 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 298 EXPECT_FALSE(handle_.is_initialized()); | 333 EXPECT_FALSE(handle_.is_initialized()); |
| 299 EXPECT_FALSE(handle_.socket()); | 334 EXPECT_FALSE(handle_.socket()); |
| 300 | 335 |
| 301 rv = callback_.WaitForResult(); | 336 rv = callback_.WaitForResult(); |
| 302 EXPECT_THAT(rv, IsError(ERR_PROXY_AUTH_REQUESTED)); | 337 EXPECT_THAT(rv, IsError(ERR_PROXY_AUTH_REQUESTED)); |
| 303 EXPECT_TRUE(handle_.is_initialized()); | 338 EXPECT_TRUE(handle_.is_initialized()); |
| 304 ASSERT_TRUE(handle_.socket()); | 339 ASSERT_TRUE(handle_.socket()); |
| 305 ProxyClientSocket* tunnel_socket = | 340 ProxyClientSocket* tunnel_socket = |
| 306 static_cast<ProxyClientSocket*>(handle_.socket()); | 341 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"), | 370 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 336 }; | 371 }; |
| 337 | 372 |
| 338 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, | 373 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, |
| 339 NULL, 0); | 374 NULL, 0); |
| 340 AddAuthToCache(); | 375 AddAuthToCache(); |
| 341 | 376 |
| 342 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 377 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 343 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, | 378 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, |
| 344 ClientSocketPool::RespectLimits::ENABLED, | 379 ClientSocketPool::RespectLimits::ENABLED, |
| 345 callback_.callback(), &pool_, NetLogWithSource()); | 380 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 346 EXPECT_THAT(rv, IsOk()); | 381 EXPECT_THAT(rv, IsOk()); |
| 347 EXPECT_TRUE(handle_.is_initialized()); | 382 EXPECT_TRUE(handle_.is_initialized()); |
| 348 ASSERT_TRUE(handle_.socket()); | 383 ASSERT_TRUE(handle_.socket()); |
| 349 EXPECT_TRUE(handle_.socket()->IsConnected()); | 384 EXPECT_TRUE(handle_.socket()->IsConnected()); |
| 350 proxy_delegate->VerifyOnTunnelHeadersReceived( | 385 proxy_delegate->VerifyOnTunnelHeadersReceived( |
| 351 "www.google.com:443", | 386 "www.google.com:443", |
| 352 proxy_host_port.c_str(), | 387 proxy_host_port.c_str(), |
| 353 "HTTP/1.1 200 Connection Established"); | 388 "HTTP/1.1 200 Connection Established"); |
| 354 proxy_delegate->VerifyOnTunnelRequestCompleted( | 389 proxy_delegate->VerifyOnTunnelRequestCompleted( |
| 355 "www.google.com:443", | 390 "www.google.com:443", |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 386 }; | 421 }; |
| 387 | 422 |
| 388 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 423 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 389 spdy_reads, arraysize(spdy_reads), spdy_writes, | 424 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 390 arraysize(spdy_writes)); | 425 arraysize(spdy_writes)); |
| 391 AddAuthToCache(); | 426 AddAuthToCache(); |
| 392 | 427 |
| 393 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 428 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 394 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, | 429 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, |
| 395 ClientSocketPool::RespectLimits::ENABLED, | 430 ClientSocketPool::RespectLimits::ENABLED, |
| 396 callback_.callback(), &pool_, NetLogWithSource()); | 431 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 397 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 432 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 398 EXPECT_FALSE(handle_.is_initialized()); | 433 EXPECT_FALSE(handle_.is_initialized()); |
| 399 EXPECT_FALSE(handle_.socket()); | 434 EXPECT_FALSE(handle_.socket()); |
| 400 | 435 |
| 401 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 436 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 402 EXPECT_TRUE(handle_.is_initialized()); | 437 EXPECT_TRUE(handle_.is_initialized()); |
| 403 ASSERT_TRUE(handle_.socket()); | 438 ASSERT_TRUE(handle_.socket()); |
| 404 EXPECT_TRUE(handle_.socket()->IsConnected()); | 439 EXPECT_TRUE(handle_.socket()->IsConnected()); |
| 405 proxy_delegate->VerifyOnTunnelRequestCompleted( | 440 proxy_delegate->VerifyOnTunnelRequestCompleted( |
| 406 "www.google.com:443", | 441 "www.google.com:443", |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 420 MockWrite spdy_writes[] = {CreateMockWrite(req, 0, ASYNC)}; | 455 MockWrite spdy_writes[] = {CreateMockWrite(req, 0, ASYNC)}; |
| 421 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); | 456 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1)); |
| 422 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), | 457 MockRead spdy_reads[] = {CreateMockRead(resp, 1, ASYNC), |
| 423 MockRead(ASYNC, 0, 2)}; | 458 MockRead(ASYNC, 0, 2)}; |
| 424 | 459 |
| 425 Initialize(NULL, 0, NULL, 0, | 460 Initialize(NULL, 0, NULL, 0, |
| 426 spdy_reads, arraysize(spdy_reads), | 461 spdy_reads, arraysize(spdy_reads), |
| 427 spdy_writes, arraysize(spdy_writes)); | 462 spdy_writes, arraysize(spdy_writes)); |
| 428 AddAuthToCache(); | 463 AddAuthToCache(); |
| 429 | 464 |
| 430 EXPECT_EQ(ERR_IO_PENDING, | 465 EXPECT_EQ( |
| 431 handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, | 466 ERR_IO_PENDING, |
| 432 ClientSocketPool::RespectLimits::ENABLED, | 467 handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, |
| 433 callback_.callback(), &pool_, NetLogWithSource())); | 468 ClientSocketPool::RespectLimits::ENABLED, |
| 469 callback_.callback(), pool_.get(), NetLogWithSource())); | |
| 434 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); | 470 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); |
| 435 | 471 |
| 436 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | 472 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 437 } | 473 } |
| 438 | 474 |
| 439 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { | 475 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { |
| 440 if (GetParam() == SPDY) | 476 if (GetParam() == SPDY) |
| 441 return; | 477 return; |
| 442 data_.reset(new SequencedSocketData(NULL, 0, NULL, 0)); | 478 data_.reset(new SequencedSocketData(NULL, 0, NULL, 0)); |
| 443 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); | 479 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); |
| 444 | 480 |
| 445 socket_factory()->AddSocketDataProvider(data_.get()); | 481 socket_factory()->AddSocketDataProvider(data_.get()); |
| 446 | 482 |
| 447 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 483 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 448 ClientSocketPool::RespectLimits::ENABLED, | 484 ClientSocketPool::RespectLimits::ENABLED, |
| 449 callback_.callback(), &pool_, NetLogWithSource()); | 485 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 450 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 486 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 451 EXPECT_FALSE(handle_.is_initialized()); | 487 EXPECT_FALSE(handle_.is_initialized()); |
| 452 EXPECT_FALSE(handle_.socket()); | 488 EXPECT_FALSE(handle_.socket()); |
| 453 | 489 |
| 454 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_PROXY_CONNECTION_FAILED)); | 490 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_PROXY_CONNECTION_FAILED)); |
| 455 | 491 |
| 456 EXPECT_FALSE(handle_.is_initialized()); | 492 EXPECT_FALSE(handle_.is_initialized()); |
| 457 EXPECT_FALSE(handle_.socket()); | 493 EXPECT_FALSE(handle_.socket()); |
| 458 | 494 |
| 459 bool is_secure_proxy = GetParam() == HTTPS; | 495 bool is_secure_proxy = GetParam() == HTTPS; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 472 | 508 |
| 473 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 509 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
| 474 ERR_CERT_AUTHORITY_INVALID)); | 510 ERR_CERT_AUTHORITY_INVALID)); |
| 475 if (GetParam() == SPDY) { | 511 if (GetParam() == SPDY) { |
| 476 InitializeSpdySsl(); | 512 InitializeSpdySsl(); |
| 477 } | 513 } |
| 478 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 514 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 479 | 515 |
| 480 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 516 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 481 ClientSocketPool::RespectLimits::ENABLED, | 517 ClientSocketPool::RespectLimits::ENABLED, |
| 482 callback_.callback(), &pool_, NetLogWithSource()); | 518 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 483 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 519 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 484 EXPECT_FALSE(handle_.is_initialized()); | 520 EXPECT_FALSE(handle_.is_initialized()); |
| 485 EXPECT_FALSE(handle_.socket()); | 521 EXPECT_FALSE(handle_.socket()); |
| 486 | 522 |
| 487 EXPECT_THAT(callback_.WaitForResult(), | 523 EXPECT_THAT(callback_.WaitForResult(), |
| 488 IsError(ERR_PROXY_CERTIFICATE_INVALID)); | 524 IsError(ERR_PROXY_CERTIFICATE_INVALID)); |
| 489 | 525 |
| 490 EXPECT_FALSE(handle_.is_initialized()); | 526 EXPECT_FALSE(handle_.is_initialized()); |
| 491 EXPECT_FALSE(handle_.socket()); | 527 EXPECT_FALSE(handle_.socket()); |
| 492 histogram_tester().ExpectTotalCount( | 528 histogram_tester().ExpectTotalCount( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 504 | 540 |
| 505 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 541 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
| 506 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 542 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
| 507 if (GetParam() == SPDY) { | 543 if (GetParam() == SPDY) { |
| 508 InitializeSpdySsl(); | 544 InitializeSpdySsl(); |
| 509 } | 545 } |
| 510 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 546 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 511 | 547 |
| 512 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 548 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 513 ClientSocketPool::RespectLimits::ENABLED, | 549 ClientSocketPool::RespectLimits::ENABLED, |
| 514 callback_.callback(), &pool_, NetLogWithSource()); | 550 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 515 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 551 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 516 EXPECT_FALSE(handle_.is_initialized()); | 552 EXPECT_FALSE(handle_.is_initialized()); |
| 517 EXPECT_FALSE(handle_.socket()); | 553 EXPECT_FALSE(handle_.socket()); |
| 518 | 554 |
| 519 EXPECT_THAT(callback_.WaitForResult(), | 555 EXPECT_THAT(callback_.WaitForResult(), |
| 520 IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 556 IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
| 521 | 557 |
| 522 EXPECT_FALSE(handle_.is_initialized()); | 558 EXPECT_FALSE(handle_.is_initialized()); |
| 523 EXPECT_FALSE(handle_.socket()); | 559 EXPECT_FALSE(handle_.socket()); |
| 524 histogram_tester().ExpectTotalCount( | 560 histogram_tester().ExpectTotalCount( |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 547 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), | 583 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), |
| 548 }; | 584 }; |
| 549 | 585 |
| 550 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 586 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 551 spdy_reads, arraysize(spdy_reads), spdy_writes, | 587 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 552 arraysize(spdy_writes)); | 588 arraysize(spdy_writes)); |
| 553 AddAuthToCache(); | 589 AddAuthToCache(); |
| 554 | 590 |
| 555 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 591 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 556 ClientSocketPool::RespectLimits::ENABLED, | 592 ClientSocketPool::RespectLimits::ENABLED, |
| 557 callback_.callback(), &pool_, NetLogWithSource()); | 593 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 558 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 594 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 559 EXPECT_FALSE(handle_.is_initialized()); | 595 EXPECT_FALSE(handle_.is_initialized()); |
| 560 EXPECT_FALSE(handle_.socket()); | 596 EXPECT_FALSE(handle_.socket()); |
| 561 | 597 |
| 562 if (GetParam() == SPDY) { | 598 if (GetParam() == SPDY) { |
| 563 // SPDY cannot process a headers block unless it's complete and so it | 599 // SPDY cannot process a headers block unless it's complete and so it |
| 564 // returns ERR_CONNECTION_CLOSED in this case. | 600 // returns ERR_CONNECTION_CLOSED in this case. |
| 565 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); | 601 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
| 566 } else { | 602 } else { |
| 567 EXPECT_THAT(callback_.WaitForResult(), | 603 EXPECT_THAT(callback_.WaitForResult(), |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 587 MockRead reads[] = { | 623 MockRead reads[] = { |
| 588 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), | 624 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"), | 625 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 590 }; | 626 }; |
| 591 | 627 |
| 592 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 628 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 593 NULL, 0, NULL, 0); | 629 NULL, 0, NULL, 0); |
| 594 | 630 |
| 595 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 631 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 596 ClientSocketPool::RespectLimits::ENABLED, | 632 ClientSocketPool::RespectLimits::ENABLED, |
| 597 callback_.callback(), &pool_, NetLogWithSource()); | 633 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 598 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 634 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 599 EXPECT_FALSE(handle_.is_initialized()); | 635 EXPECT_FALSE(handle_.is_initialized()); |
| 600 EXPECT_FALSE(handle_.socket()); | 636 EXPECT_FALSE(handle_.socket()); |
| 601 | 637 |
| 602 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 638 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
| 603 } | 639 } |
| 604 | 640 |
| 605 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 641 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { |
| 606 MockWrite writes[] = { | 642 MockWrite writes[] = { |
| 607 MockWrite(ASYNC, 0, | 643 MockWrite(ASYNC, 0, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 626 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 3), | 662 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 3), |
| 627 }; | 663 }; |
| 628 | 664 |
| 629 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 665 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 630 spdy_reads, arraysize(spdy_reads), spdy_writes, | 666 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 631 arraysize(spdy_writes)); | 667 arraysize(spdy_writes)); |
| 632 AddAuthToCache(); | 668 AddAuthToCache(); |
| 633 | 669 |
| 634 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 670 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 635 ClientSocketPool::RespectLimits::ENABLED, | 671 ClientSocketPool::RespectLimits::ENABLED, |
| 636 callback_.callback(), &pool_, NetLogWithSource()); | 672 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 637 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 673 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 638 EXPECT_FALSE(handle_.is_initialized()); | 674 EXPECT_FALSE(handle_.is_initialized()); |
| 639 EXPECT_FALSE(handle_.socket()); | 675 EXPECT_FALSE(handle_.socket()); |
| 640 | 676 |
| 641 rv = callback_.WaitForResult(); | 677 rv = callback_.WaitForResult(); |
| 642 // All Proxy CONNECT responses are not trustworthy | 678 // All Proxy CONNECT responses are not trustworthy |
| 643 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 679 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
| 644 EXPECT_FALSE(handle_.is_initialized()); | 680 EXPECT_FALSE(handle_.is_initialized()); |
| 645 EXPECT_FALSE(handle_.socket()); | 681 EXPECT_FALSE(handle_.socket()); |
| 646 } | 682 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 683 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 2), | 719 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 2), |
| 684 }; | 720 }; |
| 685 | 721 |
| 686 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 722 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 687 spdy_reads, arraysize(spdy_reads), spdy_writes, | 723 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 688 arraysize(spdy_writes)); | 724 arraysize(spdy_writes)); |
| 689 AddAuthToCache(); | 725 AddAuthToCache(); |
| 690 | 726 |
| 691 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, | 727 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 692 ClientSocketPool::RespectLimits::ENABLED, | 728 ClientSocketPool::RespectLimits::ENABLED, |
| 693 callback_.callback(), &pool_, NetLogWithSource()); | 729 callback_.callback(), pool_.get(), NetLogWithSource()); |
| 694 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 730 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 695 EXPECT_FALSE(handle_.is_initialized()); | 731 EXPECT_FALSE(handle_.is_initialized()); |
| 696 EXPECT_FALSE(handle_.socket()); | 732 EXPECT_FALSE(handle_.socket()); |
| 697 | 733 |
| 698 rv = callback_.WaitForResult(); | 734 rv = callback_.WaitForResult(); |
| 699 | 735 |
| 700 if (GetParam() == HTTP) { | 736 if (GetParam() == HTTP) { |
| 701 // We don't trust 302 responses to CONNECT from HTTP proxies. | 737 // We don't trust 302 responses to CONNECT from HTTP proxies. |
| 702 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); | 738 EXPECT_THAT(rv, IsError(ERR_TUNNEL_CONNECTION_FAILED)); |
| 703 EXPECT_FALSE(handle_.is_initialized()); | 739 EXPECT_FALSE(handle_.is_initialized()); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 720 EXPECT_TRUE(headers->HasHeaderValue("content-length", "0")); | 756 EXPECT_TRUE(headers->HasHeaderValue("content-length", "0")); |
| 721 | 757 |
| 722 // Make sure Location header was included and correct. | 758 // Make sure Location header was included and correct. |
| 723 std::string location; | 759 std::string location; |
| 724 EXPECT_TRUE(headers->IsRedirect(&location)); | 760 EXPECT_TRUE(headers->IsRedirect(&location)); |
| 725 EXPECT_EQ(location, redirectTarget); | 761 EXPECT_EQ(location, redirectTarget); |
| 726 } | 762 } |
| 727 } | 763 } |
| 728 | 764 |
| 729 TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeout) { | 765 TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeout) { |
| 730 ASSERT_LE(base::TimeDelta(), pool_.ConnectionTimeout()); | 766 EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout()); |
| 731 | 767 |
| 732 // Test against a large value. | 768 // Test against a large value. |
| 733 ASSERT_GE(base::TimeDelta::FromMinutes(10), pool_.ConnectionTimeout()); | 769 EXPECT_GE(base::TimeDelta::FromMinutes(10), pool_->ConnectionTimeout()); |
| 734 | 770 |
| 735 #if (defined(OS_ANDROID) || defined(OS_IOS)) | 771 #if (defined(OS_ANDROID) || defined(OS_IOS)) |
| 736 // On Android and iOS, the timeout is fixed to 10 seconds. | 772 // On Android and iOS, the timeout is fixed to 10 seconds. |
| 737 ASSERT_EQ(base::TimeDelta::FromSeconds(10), pool_.ConnectionTimeout()); | 773 EXPECT_EQ(base::TimeDelta::FromSeconds(10), pool_->ConnectionTimeout()); |
| 738 #endif | 774 #endif |
| 739 } | 775 } |
| 740 | 776 |
| 777 TEST_P(HttpProxyClientSocketPoolTest, ProxyPoolTimeoutWithExperiment) { | |
| 778 int transport_rtt_multiplier = 2; | |
| 779 base::TimeDelta min_timeout = base::TimeDelta::FromSeconds(8); | |
| 780 base::TimeDelta max_timeout = base::TimeDelta::FromSeconds(20); | |
| 781 | |
| 782 InitAdaptiveTimeoutFieldTrialWithParams(transport_rtt_multiplier, min_timeout, | |
| 783 max_timeout); | |
| 784 EXPECT_LE(base::TimeDelta(), pool_->ConnectionTimeout()); | |
| 785 | |
| 786 // Timeout should be |transport_rtt_multiplier| times the transport RTT | |
| 787 // estimate. | |
| 788 base::TimeDelta rtt_estimate = base::TimeDelta::FromSeconds(7); | |
| 789 estimator()->set_start_time_null_transport_rtt(rtt_estimate); | |
| 790 EXPECT_EQ(rtt_estimate + rtt_estimate, pool_->ConnectionTimeout()); | |
| 791 | |
| 792 rtt_estimate = base::TimeDelta::FromSeconds(8); | |
| 793 estimator()->set_start_time_null_transport_rtt(rtt_estimate); | |
| 794 EXPECT_EQ(rtt_estimate + rtt_estimate, pool_->ConnectionTimeout()); | |
| 795 | |
| 796 // Connection timeout should not exceed |max_timeout|. | |
| 797 rtt_estimate = base::TimeDelta::FromSeconds(25); | |
| 798 estimator()->set_start_time_null_transport_rtt(rtt_estimate); | |
| 799 EXPECT_EQ(max_timeout, pool_->ConnectionTimeout()); | |
| 800 | |
| 801 // Connection timeout should not be less than |min_timeout|. | |
| 802 rtt_estimate = base::TimeDelta::FromSeconds(0); | |
| 803 estimator()->set_start_time_null_transport_rtt(rtt_estimate); | |
| 804 EXPECT_EQ(min_timeout, pool_->ConnectionTimeout()); | |
| 805 } | |
|
mmenke
2017/06/13 19:52:01
Suggest a second set of three test with different
tbansal1
2017/06/13 23:02:48
Done.
| |
| 806 | |
| 741 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 807 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
| 742 | 808 |
| 743 } // namespace net | 809 } // namespace net |
| OLD | NEW |