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

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: ps 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) {
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698