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 2a00dfc194c06e0bd6ebf512c619d843623f0b13..c007c12887b4bc3d94f4bb0fcb091e7527f583ec 100644 |
--- a/net/http/http_stream_factory_impl_unittest.cc |
+++ b/net/http/http_stream_factory_impl_unittest.cc |
@@ -1091,6 +1091,70 @@ |
} |
} |
+TEST_F(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) { |
+ // Checks if a |
+ std::unique_ptr<ProxyService> proxy_service; |
+ proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); |
+ |
+ HttpNetworkSession::Params params; |
+ params.enable_quic = true; |
+ params.quic_disable_preconnect_if_0rtt = false; |
+ scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
+ new SSLConfigServiceDefaults); |
+ HttpServerPropertiesImpl http_server_properties; |
+ MockClientSocketFactory socket_factory; |
+ params.client_socket_factory = &socket_factory; |
+ MockHostResolver host_resolver; |
+ params.host_resolver = &host_resolver; |
+ MockCertVerifier cert_verifier; |
+ params.cert_verifier = &cert_verifier; |
+ TransportSecurityState transport_security_state; |
+ params.transport_security_state = &transport_security_state; |
+ MultiLogCTVerifier ct_verifier; |
+ params.cert_transparency_verifier = &ct_verifier; |
+ CTPolicyEnforcer ct_policy_enforcer; |
+ params.ct_policy_enforcer = &ct_policy_enforcer; |
+ params.proxy_service = proxy_service.get(); |
+ params.ssl_config_service = ssl_config_service.get(); |
+ params.http_server_properties = &http_server_properties; |
+ params.quic_max_number_of_lossy_connections = 2; |
+ |
+ std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
+ session->quic_stream_factory()->set_require_confirmation(false); |
+ |
+ session->quic_stream_factory()->number_of_lossy_connections_[99] = |
+ params.quic_max_number_of_lossy_connections; |
+ session->quic_stream_factory()->MaybeDisableQuic(99); |
+ ASSERT_TRUE(session->quic_stream_factory()->IsQuicDisabled(99)); |
+ |
+ StaticSocketDataProvider socket_data2; |
+ socket_data2.set_connect_data(MockConnect(ASYNC, OK)); |
+ socket_factory.AddSocketDataProvider(&socket_data2); |
+ |
+ // Now request a stream. It should succeed using the second proxy in the |
+ // list. |
+ HttpRequestInfo request_info; |
+ request_info.method = "GET"; |
+ request_info.url = GURL("http://www.google.com"); |
+ |
+ SSLConfig ssl_config; |
+ StreamRequestWaiter waiter; |
+ std::unique_ptr<HttpStreamRequest> request( |
+ session->http_stream_factory()->RequestStream( |
+ request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
+ BoundNetLog())); |
+ waiter.WaitForStream(); |
+ |
+ // The proxy that failed should now be known to the proxy_service as bad. |
+ const ProxyRetryInfoMap& retry_info = |
+ session->proxy_service()->proxy_retry_info(); |
+ EXPECT_EQ(1u, retry_info.size()); |
+ EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
+ |
+ ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); |
+ EXPECT_TRUE(iter != retry_info.end()); |
+} |
+ |
TEST_F(HttpStreamFactoryTest, UsePreConnectIfNoZeroRTT) { |
for (int num_streams = 1; num_streams < 3; ++num_streams) { |
GURL url = GURL("https://www.google.com"); |