Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Side by Side Diff: net/http/http_proxy_client_socket_pool_unittest.cc

Issue 2932993002: Determine proxy connection timeout based on current network quality (Closed)
Patch Set: mmenke comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/http/http_proxy_client_socket_pool.cc ('k') | net/nqe/network_quality_estimator_test_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698