| 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.
|
|
|