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

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

Issue 2595413002: Race preconnects to HTTP2 proxies that support alternate proxies
Patch Set: Rebased, rch comments Created 3 years, 11 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_stream_factory_impl.h" 5 #include "net/http/http_stream_factory_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 CapturePreconnectsSocketPool(HostResolver* host_resolver, 381 CapturePreconnectsSocketPool(HostResolver* host_resolver,
382 CertVerifier* cert_verifier, 382 CertVerifier* cert_verifier,
383 TransportSecurityState* transport_security_state, 383 TransportSecurityState* transport_security_state,
384 CTVerifier* cert_transparency_verifier, 384 CTVerifier* cert_transparency_verifier,
385 CTPolicyEnforcer* ct_policy_enforcer); 385 CTPolicyEnforcer* ct_policy_enforcer);
386 386
387 int last_num_streams() const { 387 int last_num_streams() const {
388 return last_num_streams_; 388 return last_num_streams_;
389 } 389 }
390 390
391 int total_num_streams() const { return total_num_streams_; }
392
391 int RequestSocket(const std::string& group_name, 393 int RequestSocket(const std::string& group_name,
392 const void* socket_params, 394 const void* socket_params,
393 RequestPriority priority, 395 RequestPriority priority,
394 ClientSocketPool::RespectLimits respect_limits, 396 ClientSocketPool::RespectLimits respect_limits,
395 ClientSocketHandle* handle, 397 ClientSocketHandle* handle,
396 const CompletionCallback& callback, 398 const CompletionCallback& callback,
397 const NetLogWithSource& net_log) override { 399 const NetLogWithSource& net_log) override {
398 ADD_FAILURE(); 400 ADD_FAILURE();
399 return ERR_UNEXPECTED; 401 return ERR_UNEXPECTED;
400 } 402 }
401 403
402 void RequestSockets(const std::string& group_name, 404 void RequestSockets(const std::string& group_name,
403 const void* socket_params, 405 const void* socket_params,
404 int num_sockets, 406 int num_sockets,
405 const NetLogWithSource& net_log) override { 407 const NetLogWithSource& net_log) override {
406 last_num_streams_ = num_sockets; 408 last_num_streams_ = num_sockets;
409 total_num_streams_ += num_sockets;
407 } 410 }
408 411
409 void CancelRequest(const std::string& group_name, 412 void CancelRequest(const std::string& group_name,
410 ClientSocketHandle* handle) override { 413 ClientSocketHandle* handle) override {
411 ADD_FAILURE(); 414 ADD_FAILURE();
412 } 415 }
413 void ReleaseSocket(const std::string& group_name, 416 void ReleaseSocket(const std::string& group_name,
414 std::unique_ptr<StreamSocket> socket, 417 std::unique_ptr<StreamSocket> socket,
415 int id) override { 418 int id) override {
416 ADD_FAILURE(); 419 ADD_FAILURE();
(...skipping 11 matching lines...) Expand all
428 const ClientSocketHandle* handle) const override { 431 const ClientSocketHandle* handle) const override {
429 ADD_FAILURE(); 432 ADD_FAILURE();
430 return LOAD_STATE_IDLE; 433 return LOAD_STATE_IDLE;
431 } 434 }
432 base::TimeDelta ConnectionTimeout() const override { 435 base::TimeDelta ConnectionTimeout() const override {
433 return base::TimeDelta(); 436 return base::TimeDelta();
434 } 437 }
435 438
436 private: 439 private:
437 int last_num_streams_; 440 int last_num_streams_;
441 int total_num_streams_;
438 }; 442 };
439 443
440 typedef CapturePreconnectsSocketPool<TransportClientSocketPool> 444 typedef CapturePreconnectsSocketPool<TransportClientSocketPool>
441 CapturePreconnectsTransportSocketPool; 445 CapturePreconnectsTransportSocketPool;
442 typedef CapturePreconnectsSocketPool<HttpProxyClientSocketPool> 446 typedef CapturePreconnectsSocketPool<HttpProxyClientSocketPool>
443 CapturePreconnectsHttpProxySocketPool; 447 CapturePreconnectsHttpProxySocketPool;
444 typedef CapturePreconnectsSocketPool<SOCKSClientSocketPool> 448 typedef CapturePreconnectsSocketPool<SOCKSClientSocketPool>
445 CapturePreconnectsSOCKSSocketPool; 449 CapturePreconnectsSOCKSSocketPool;
446 typedef CapturePreconnectsSocketPool<SSLClientSocketPool> 450 typedef CapturePreconnectsSocketPool<SSLClientSocketPool>
447 CapturePreconnectsSSLSocketPool; 451 CapturePreconnectsSSLSocketPool;
448 452
449 template <typename ParentPool> 453 template <typename ParentPool>
450 CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool( 454 CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool(
451 HostResolver* host_resolver, 455 HostResolver* host_resolver,
452 CertVerifier*, 456 CertVerifier*,
453 TransportSecurityState*, 457 TransportSecurityState*,
454 CTVerifier*, 458 CTVerifier*,
455 CTPolicyEnforcer*) 459 CTPolicyEnforcer*)
456 : ParentPool(0, 0, host_resolver, nullptr, nullptr, nullptr), 460 : ParentPool(0, 0, host_resolver, nullptr, nullptr, nullptr),
457 last_num_streams_(-1) {} 461 last_num_streams_(-1),
462 total_num_streams_(0) {}
458 463
459 template <> 464 template <>
460 CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool( 465 CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool(
461 HostResolver*, 466 HostResolver*,
462 CertVerifier*, 467 CertVerifier*,
463 TransportSecurityState*, 468 TransportSecurityState*,
464 CTVerifier*, 469 CTVerifier*,
465 CTPolicyEnforcer*) 470 CTPolicyEnforcer*)
466 : HttpProxyClientSocketPool(0, 0, nullptr, nullptr, nullptr), 471 : HttpProxyClientSocketPool(0, 0, nullptr, nullptr, nullptr),
467 last_num_streams_(-1) {} 472 last_num_streams_(-1),
473 total_num_streams_(0) {}
468 474
469 template <> 475 template <>
470 CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool( 476 CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool(
471 HostResolver* /* host_resolver */, 477 HostResolver* /* host_resolver */,
472 CertVerifier* cert_verifier, 478 CertVerifier* cert_verifier,
473 TransportSecurityState* transport_security_state, 479 TransportSecurityState* transport_security_state,
474 CTVerifier* cert_transparency_verifier, 480 CTVerifier* cert_transparency_verifier,
475 CTPolicyEnforcer* ct_policy_enforcer) 481 CTPolicyEnforcer* ct_policy_enforcer)
476 : SSLClientSocketPool(0, 482 : SSLClientSocketPool(0,
477 0, 483 0,
478 cert_verifier, 484 cert_verifier,
479 nullptr, // channel_id_store 485 nullptr, // channel_id_store
480 transport_security_state, 486 transport_security_state,
481 cert_transparency_verifier, 487 cert_transparency_verifier,
482 ct_policy_enforcer, 488 ct_policy_enforcer,
483 std::string(), // ssl_session_cache_shard 489 std::string(), // ssl_session_cache_shard
484 nullptr, // deterministic_socket_factory 490 nullptr, // deterministic_socket_factory
485 nullptr, // transport_socket_pool 491 nullptr, // transport_socket_pool
486 nullptr, 492 nullptr,
487 nullptr, 493 nullptr,
488 nullptr, // ssl_config_service 494 nullptr, // ssl_config_service
489 nullptr), // net_log 495 nullptr), // net_log
490 last_num_streams_(-1) {} 496 last_num_streams_(-1),
497 total_num_streams_(0) {}
491 498
492 class HttpStreamFactoryTest : public ::testing::Test, 499 class HttpStreamFactoryTest : public ::testing::Test,
493 public ::testing::WithParamInterface<NextProto> { 500 public ::testing::WithParamInterface<NextProto> {
494 }; 501 };
495 502
496 TEST_F(HttpStreamFactoryTest, PreconnectDirect) { 503 TEST_F(HttpStreamFactoryTest, PreconnectDirect) {
497 for (size_t i = 0; i < arraysize(kTests); ++i) { 504 for (size_t i = 0; i < arraysize(kTests); ++i) {
498 SpdySessionDependencies session_deps(ProxyService::CreateDirect()); 505 SpdySessionDependencies session_deps(ProxyService::CreateDirect());
499 std::unique_ptr<HttpNetworkSession> session( 506 std::unique_ptr<HttpNetworkSession> session(
500 SpdySessionDependencies::SpdyCreateSession(&session_deps)); 507 SpdySessionDependencies::SpdyCreateSession(&session_deps));
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 HttpRequestInfo request; 1217 HttpRequestInfo request;
1211 request.method = "GET"; 1218 request.method = "GET";
1212 request.url = url; 1219 request.url = url;
1213 request.load_flags = 0; 1220 request.load_flags = 0;
1214 1221
1215 session->http_stream_factory()->PreconnectStreams(num_streams, request); 1222 session->http_stream_factory()->PreconnectStreams(num_streams, request);
1216 EXPECT_EQ(-1, transport_conn_pool->last_num_streams()); 1223 EXPECT_EQ(-1, transport_conn_pool->last_num_streams());
1217 } 1224 }
1218 } 1225 }
1219 1226
1227 TEST_F(HttpStreamFactoryTest, QuicRacePreconnectsToProxyServer) {
1228 for (bool race_preconnects_to_http2_proxies : {false, true}) {
1229 for (int num_streams = 1; num_streams < 3; ++num_streams) {
1230 TestProxyDelegate test_proxy_delegate;
1231 base::HistogramTester histogram_tester;
1232 GURL url = GURL("http://www.google.com");
1233 std::unique_ptr<ProxyService> proxy_service =
1234 ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443");
1235
1236 // Set up QUIC as alternative_service.
1237 HttpServerPropertiesImpl http_server_properties;
1238 const AlternativeService alternative_service(kProtoQUIC, "myproxy.org",
1239 443);
1240 AlternativeServiceInfoVector alternative_service_info_vector;
1241 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1242 alternative_service_info_vector.push_back(
1243 AlternativeServiceInfo(alternative_service, expiration));
1244 HostPortPair host_port_pair(alternative_service.host_port_pair());
1245 url::SchemeHostPort server("https", host_port_pair.host(),
1246 host_port_pair.port());
1247 http_server_properties.SetAlternativeServices(
1248 server, alternative_service_info_vector);
1249
1250 SpdySessionDependencies session_deps;
1251 HttpNetworkSession::Params params =
1252 SpdySessionDependencies::CreateSessionParams(&session_deps);
1253 params.enable_quic = true;
1254 params.proxy_service = proxy_service.get();
1255 params.race_preconnects_to_http2_proxies =
1256 race_preconnects_to_http2_proxies;
1257 // |quic_disable_preconnect_if_0rtt| has no effect on preconnect for
1258 // proxies.
1259 params.quic_disable_preconnect_if_0rtt = false;
1260 params.http_server_properties = &http_server_properties;
1261
1262 test_proxy_delegate.set_alternative_proxy_server(
1263 ProxyServer::FromPacString("QUIC myproxy.org:443"));
1264 params.proxy_delegate = &test_proxy_delegate;
1265
1266 std::unique_ptr<HttpNetworkSession> session(
1267 new HttpNetworkSession(params));
1268
1269 HttpNetworkSessionPeer peer(session.get());
1270 HostPortPair proxy_host("myproxy.org", 443);
1271
1272 CapturePreconnectsTransportSocketPool* transport_conn_pool =
1273 new CapturePreconnectsTransportSocketPool(
1274 session_deps.host_resolver.get(),
1275 session_deps.cert_verifier.get(),
1276 session_deps.transport_security_state.get(),
1277 session_deps.cert_transparency_verifier.get(),
1278 session_deps.ct_policy_enforcer.get());
1279
1280 CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
1281 new CapturePreconnectsHttpProxySocketPool(
1282 session_deps.host_resolver.get(),
1283 session_deps.cert_verifier.get(),
1284 session_deps.transport_security_state.get(),
1285 session_deps.cert_transparency_verifier.get(),
1286 session_deps.ct_policy_enforcer.get());
1287 CapturePreconnectsSSLSocketPool* ssl_conn_pool =
1288 new CapturePreconnectsSSLSocketPool(
1289 session_deps.host_resolver.get(),
1290 session_deps.cert_verifier.get(),
1291 session_deps.transport_security_state.get(),
1292 session_deps.cert_transparency_verifier.get(),
1293 session_deps.ct_policy_enforcer.get());
1294
1295 std::unique_ptr<MockClientSocketPoolManager> mock_pool_manager(
1296 new MockClientSocketPoolManager);
1297 mock_pool_manager->SetTransportSocketPool(transport_conn_pool);
1298 mock_pool_manager->SetSocketPoolForHTTPProxy(
1299 proxy_host, base::WrapUnique(http_proxy_pool));
1300 mock_pool_manager->SetSocketPoolForSSLWithProxy(
1301 proxy_host, base::WrapUnique(ssl_conn_pool));
1302 peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
1303
1304 HttpRequestInfo request_info;
1305 request_info.method = "GET";
1306 request_info.url = url;
1307 request_info.load_flags = 0;
1308
1309 session->http_stream_factory()->PreconnectStreams(num_streams,
1310 request_info);
1311 base::RunLoop().RunUntilIdle();
1312 EXPECT_EQ(-1, transport_conn_pool->last_num_streams());
1313 EXPECT_EQ(0, transport_conn_pool->total_num_streams());
1314 EXPECT_EQ(-1, ssl_conn_pool->last_num_streams());
1315 EXPECT_EQ(0, ssl_conn_pool->total_num_streams());
1316 EXPECT_EQ(race_preconnects_to_http2_proxies ? 1 : num_streams,
1317 http_proxy_pool->last_num_streams());
1318 EXPECT_EQ(race_preconnects_to_http2_proxies ? 1 : num_streams,
1319 http_proxy_pool->total_num_streams());
1320 histogram_tester.ExpectTotalCount(
1321 "Net.QuicAlternativeProxy.PreconnectJobsRaced",
1322 race_preconnects_to_http2_proxies ? 1 : 0);
1323 }
1324 }
1325 }
1326
1220 // Verify that only one preconnect job succeeds to a proxy server that supports 1327 // Verify that only one preconnect job succeeds to a proxy server that supports
1221 // request priorities. 1328 // request priorities.
1222 TEST_F(HttpStreamFactoryTest, OnlyOnePreconnectToProxyServer) { 1329 TEST_F(HttpStreamFactoryTest, OnlyOnePreconnectToProxyServer) {
1223 for (bool set_http_server_properties : {false, true}) { 1330 for (bool set_http_server_properties : {false, true}) {
1224 for (int num_streams = 1; num_streams < 3; ++num_streams) { 1331 for (int num_streams = 1; num_streams < 3; ++num_streams) {
1225 base::HistogramTester histogram_tester; 1332 base::HistogramTester histogram_tester;
1226 GURL url = GURL("http://www.google.com"); 1333 GURL url = GURL("http://www.google.com");
1227 std::unique_ptr<ProxyService> proxy_service = 1334 std::unique_ptr<ProxyService> proxy_service =
1228 ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443"); 1335 ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443");
1229 1336
(...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after
2504 session->GetTransportSocketPool( 2611 session->GetTransportSocketPool(
2505 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 2612 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
2506 EXPECT_EQ(1, GetSocketPoolGroupCount( 2613 EXPECT_EQ(1, GetSocketPoolGroupCount(
2507 session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 2614 session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
2508 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 2615 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
2509 } 2616 }
2510 2617
2511 } // namespace 2618 } // namespace
2512 2619
2513 } // namespace net 2620 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698