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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: net/http/http_stream_factory_impl_unittest.cc
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc
index 26b305abad77d6925dd0032049ef4ceb9575575e..83036ef6dbd0ef5257342f7f818daee61fc3f45d 100644
--- a/net/http/http_stream_factory_impl_unittest.cc
+++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -388,6 +388,8 @@ class CapturePreconnectsSocketPool : public ParentPool {
return last_num_streams_;
}
+ int total_num_streams() const { return total_num_streams_; }
+
int RequestSocket(const std::string& group_name,
const void* socket_params,
RequestPriority priority,
@@ -404,6 +406,7 @@ class CapturePreconnectsSocketPool : public ParentPool {
int num_sockets,
const NetLogWithSource& net_log) override {
last_num_streams_ = num_sockets;
+ total_num_streams_ += num_sockets;
}
void CancelRequest(const std::string& group_name,
@@ -435,6 +438,7 @@ class CapturePreconnectsSocketPool : public ParentPool {
private:
int last_num_streams_;
+ int total_num_streams_;
};
typedef CapturePreconnectsSocketPool<TransportClientSocketPool>
@@ -454,7 +458,8 @@ CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool(
CTVerifier*,
CTPolicyEnforcer*)
: ParentPool(0, 0, host_resolver, nullptr, nullptr, nullptr),
- last_num_streams_(-1) {}
+ last_num_streams_(-1),
+ total_num_streams_(0) {}
template <>
CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool(
@@ -464,7 +469,8 @@ CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool(
CTVerifier*,
CTPolicyEnforcer*)
: HttpProxyClientSocketPool(0, 0, nullptr, nullptr, nullptr),
- last_num_streams_(-1) {}
+ last_num_streams_(-1),
+ total_num_streams_(0) {}
template <>
CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool(
@@ -487,7 +493,8 @@ CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool(
nullptr,
nullptr, // ssl_config_service
nullptr), // net_log
- last_num_streams_(-1) {}
+ last_num_streams_(-1),
+ total_num_streams_(0) {}
class HttpStreamFactoryTest : public ::testing::Test,
public ::testing::WithParamInterface<NextProto> {
@@ -1217,6 +1224,106 @@ TEST_F(HttpStreamFactoryTest, QuicDisablePreConnectIfZeroRtt) {
}
}
+TEST_F(HttpStreamFactoryTest, QuicRacePreconnectsToProxyServer) {
+ for (bool race_preconnects_to_http2_proxies : {false, true}) {
+ for (int num_streams = 1; num_streams < 3; ++num_streams) {
+ TestProxyDelegate test_proxy_delegate;
+ base::HistogramTester histogram_tester;
+ GURL url = GURL("http://www.google.com");
+ std::unique_ptr<ProxyService> proxy_service =
+ ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443");
+
+ // Set up QUIC as alternative_service.
+ HttpServerPropertiesImpl http_server_properties;
+ const AlternativeService alternative_service(kProtoQUIC, "myproxy.org",
+ 443);
+ AlternativeServiceInfoVector alternative_service_info_vector;
+ base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
+ alternative_service_info_vector.push_back(
+ AlternativeServiceInfo(alternative_service, expiration));
+ HostPortPair host_port_pair(alternative_service.host_port_pair());
+ url::SchemeHostPort server("https", host_port_pair.host(),
+ host_port_pair.port());
+ http_server_properties.SetAlternativeServices(
+ server, alternative_service_info_vector);
+
+ SpdySessionDependencies session_deps;
+ HttpNetworkSession::Params params =
+ SpdySessionDependencies::CreateSessionParams(&session_deps);
+ params.enable_quic = true;
+ params.proxy_service = proxy_service.get();
+ params.race_preconnects_to_http2_proxies =
+ race_preconnects_to_http2_proxies;
+ // |quic_disable_preconnect_if_0rtt| has no effect on preconnect for
+ // proxies.
+ params.quic_disable_preconnect_if_0rtt = false;
+ params.http_server_properties = &http_server_properties;
+
+ test_proxy_delegate.set_alternative_proxy_server(
+ ProxyServer::FromPacString("QUIC myproxy.org:443"));
+ params.proxy_delegate = &test_proxy_delegate;
+
+ std::unique_ptr<HttpNetworkSession> session(
+ new HttpNetworkSession(params));
+
+ HttpNetworkSessionPeer peer(session.get());
+ HostPortPair proxy_host("myproxy.org", 443);
+
+ CapturePreconnectsTransportSocketPool* transport_conn_pool =
+ new CapturePreconnectsTransportSocketPool(
+ session_deps.host_resolver.get(),
+ session_deps.cert_verifier.get(),
+ session_deps.transport_security_state.get(),
+ session_deps.cert_transparency_verifier.get(),
+ session_deps.ct_policy_enforcer.get());
+
+ CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
+ new CapturePreconnectsHttpProxySocketPool(
+ session_deps.host_resolver.get(),
+ session_deps.cert_verifier.get(),
+ session_deps.transport_security_state.get(),
+ session_deps.cert_transparency_verifier.get(),
+ session_deps.ct_policy_enforcer.get());
+ CapturePreconnectsSSLSocketPool* ssl_conn_pool =
+ new CapturePreconnectsSSLSocketPool(
+ session_deps.host_resolver.get(),
+ session_deps.cert_verifier.get(),
+ session_deps.transport_security_state.get(),
+ session_deps.cert_transparency_verifier.get(),
+ session_deps.ct_policy_enforcer.get());
+
+ std::unique_ptr<MockClientSocketPoolManager> mock_pool_manager(
+ new MockClientSocketPoolManager);
+ mock_pool_manager->SetTransportSocketPool(transport_conn_pool);
+ mock_pool_manager->SetSocketPoolForHTTPProxy(
+ proxy_host, base::WrapUnique(http_proxy_pool));
+ mock_pool_manager->SetSocketPoolForSSLWithProxy(
+ proxy_host, base::WrapUnique(ssl_conn_pool));
+ peer.SetClientSocketPoolManager(std::move(mock_pool_manager));
+
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = url;
+ request_info.load_flags = 0;
+
+ session->http_stream_factory()->PreconnectStreams(num_streams,
+ request_info);
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(-1, transport_conn_pool->last_num_streams());
+ EXPECT_EQ(0, transport_conn_pool->total_num_streams());
+ EXPECT_EQ(-1, ssl_conn_pool->last_num_streams());
+ EXPECT_EQ(0, ssl_conn_pool->total_num_streams());
+ EXPECT_EQ(race_preconnects_to_http2_proxies ? 1 : num_streams,
+ http_proxy_pool->last_num_streams());
+ EXPECT_EQ(race_preconnects_to_http2_proxies ? 1 : num_streams,
+ http_proxy_pool->total_num_streams());
+ histogram_tester.ExpectTotalCount(
+ "Net.QuicAlternativeProxy.PreconnectJobsRaced",
+ race_preconnects_to_http2_proxies ? 1 : 0);
+ }
+ }
+}
+
// Verify that only one preconnect job succeeds to a proxy server that supports
// request priorities.
TEST_F(HttpStreamFactoryTest, OnlyOnePreconnectToProxyServer) {

Powered by Google App Engine
This is Rietveld 408576698