Index: net/url_request/url_request_unittest.cc |
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc |
index 7282a0e54070ce6c5c9e8ca5468d0b0cc56167d7..1eb97117963cabd5266c74476d2b8513465b929e 100644 |
--- a/net/url_request/url_request_unittest.cc |
+++ b/net/url_request/url_request_unittest.cc |
@@ -7868,6 +7868,127 @@ |
EXPECT_EQ(LOW, job_priority); |
} |
+TEST_F(URLRequestTest, QuicServerInfoFactoryTest) { |
+ HttpNetworkSession::Params params; |
+ |
+ MockClientSocketFactory socket_factory; |
+ MockCryptoClientStreamFactory crypto_client_stream_factory; |
+ MockHostResolver host_resolver; |
+ MockCertVerifier cert_verifier; |
+ CTPolicyEnforcer ct_policy_enforcer; |
+ TransportSecurityState transport_security_state; |
+ std::unique_ptr<CTVerifier> cert_transparency_verifier( |
+ new MultiLogCTVerifier()); |
+ std::unique_ptr<ProxyService> proxy_service = ProxyService::CreateDirect(); |
+ scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
+ new SSLConfigServiceDefaults); |
+ HttpServerPropertiesImpl http_server_properties; |
+ // Set up the quic stream factory. |
+ params.enable_quic = true; |
+ params.client_socket_factory = &socket_factory; |
+ params.quic_crypto_client_stream_factory = &crypto_client_stream_factory; |
+ params.host_resolver = &host_resolver; |
+ params.cert_verifier = &cert_verifier; |
+ params.ct_policy_enforcer = &ct_policy_enforcer; |
+ params.transport_security_state = &transport_security_state; |
+ params.cert_transparency_verifier = cert_transparency_verifier.get(); |
+ |
+ params.proxy_service = proxy_service.get(); |
+ params.ssl_config_service = ssl_config_service.get(); |
+ params.http_server_properties = &http_server_properties; |
+ |
+ HttpNetworkSession session(params); |
+ DCHECK(session.quic_stream_factory()); |
+ |
+ std::unique_ptr<HttpNetworkLayer> network_layer1( |
+ new HttpNetworkLayer(&session)); |
+ |
+ HttpCache main_cache(std::move(network_layer1), |
+ HttpCache::DefaultBackend::InMemory(0), |
+ true /* is_main_cache */); |
+ |
+ EXPECT_TRUE(session.quic_stream_factory()->has_quic_server_info_factory()); |
+ |
+ default_context_.set_http_transaction_factory(&main_cache); |
+ |
+ QuicServerInfoFactory* quic_server_info_factory = |
+ session.quic_stream_factory()->quic_server_info_factory(); |
+ DCHECK(quic_server_info_factory); |
+ |
+ QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); |
+ const string server_config_a = "server_config_a"; |
+ const string source_address_token_a = "source_address_token_a"; |
+ const string cert_sct_a = "cert_sct_a"; |
+ const string chlo_hash_a = "chlo_hash_a"; |
+ const string server_config_sig_a = "server_config_sig_a"; |
+ const string cert_a = "cert_a"; |
+ const string cert_b = "cert_b"; |
+ |
+ { |
+ // Store a QuicServerInfo to the quic server info factory. |
+ TestCompletionCallback cb; |
+ std::unique_ptr<QuicServerInfo> quic_server_info = |
+ quic_server_info_factory->GetForServer(server_id); |
+ quic_server_info->Start(); |
+ int rv = quic_server_info->WaitForDataReady(cb.callback()); |
+ EXPECT_THAT(cb.GetResult(rv), IsOk()); |
+ |
+ QuicServerInfo::State* state = quic_server_info->mutable_state(); |
+ EXPECT_TRUE(state->certs.empty()); |
+ |
+ state->server_config = server_config_a; |
+ state->source_address_token = source_address_token_a; |
+ state->cert_sct = cert_sct_a; |
+ state->chlo_hash = chlo_hash_a; |
+ state->server_config_sig = server_config_sig_a; |
+ state->certs.push_back(cert_a); |
+ quic_server_info->Persist(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ // Retrieve the QuicServerInfo from the quic server info factory and verify |
+ // the data is correct. |
+ { |
+ TestCompletionCallback cb; |
+ std::unique_ptr<QuicServerInfo> quic_server_info = |
+ quic_server_info_factory->GetForServer(server_id); |
+ quic_server_info->Start(); |
+ int rv = quic_server_info->WaitForDataReady(cb.callback()); |
+ EXPECT_THAT(cb.GetResult(rv), IsOk()); |
+ |
+ QuicServerInfo::State* state = quic_server_info->mutable_state(); |
+ EXPECT_TRUE(quic_server_info->IsDataReady()); |
+ EXPECT_EQ(server_config_a, state->server_config); |
+ EXPECT_EQ(source_address_token_a, state->source_address_token); |
+ EXPECT_EQ(cert_sct_a, state->cert_sct); |
+ EXPECT_EQ(chlo_hash_a, state->chlo_hash); |
+ EXPECT_EQ(server_config_sig_a, state->server_config_sig); |
+ EXPECT_EQ(1U, state->certs.size()); |
+ EXPECT_EQ(cert_a, state->certs[0]); |
+ |
+ // Update the data. |
+ state->certs.push_back(cert_b); |
+ quic_server_info->Persist(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ { |
+ // Verify data has been successfully updated. |
+ TestCompletionCallback cb; |
+ std::unique_ptr<QuicServerInfo> quic_server_info = |
+ quic_server_info_factory->GetForServer(server_id); |
+ quic_server_info->Start(); |
+ int rv = quic_server_info->WaitForDataReady(cb.callback()); |
+ EXPECT_THAT(cb.GetResult(rv), IsOk()); |
+ |
+ QuicServerInfo::State* state = quic_server_info->mutable_state(); |
+ EXPECT_TRUE(quic_server_info->IsDataReady()); |
+ EXPECT_EQ(2U, state->certs.size()); |
+ EXPECT_EQ(cert_a, state->certs[0]); |
+ EXPECT_EQ(cert_b, state->certs[1]); |
+ } |
+} |
+ |
// Check that creating a network request while entering/exiting suspend mode |
// fails as it should. This is the only case where an HttpTransactionFactory |
// does not return an HttpTransaction. |