| Index: net/http/disk_cache_based_quic_server_info_unittest.cc
|
| diff --git a/net/http/disk_cache_based_quic_server_info_unittest.cc b/net/http/disk_cache_based_quic_server_info_unittest.cc
|
| index 845fdc953f64ca34f7ecff583e6eeaf4c772644f..847b3d8a16e51132a4426c386953039dada124dd 100644
|
| --- a/net/http/disk_cache_based_quic_server_info_unittest.cc
|
| +++ b/net/http/disk_cache_based_quic_server_info_unittest.cc
|
| @@ -395,4 +395,191 @@ TEST(DiskCacheBasedQuicServerInfo, CancelWaitForDataReadyButDataIsReady) {
|
| RemoveMockTransaction(&kHostInfoTransaction1);
|
| }
|
|
|
| +// Test Start() followed by Persist() without calling WaitForDataReady.
|
| +TEST(DiskCacheBasedQuicServerInfo, StartAndPersist) {
|
| + MockHttpCache cache;
|
| + AddMockTransaction(&kHostInfoTransaction1);
|
| +
|
| + QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED);
|
| + scoped_ptr<QuicServerInfo> quic_server_info(
|
| + new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
|
| + EXPECT_FALSE(quic_server_info->IsDataReady());
|
| + quic_server_info->Start();
|
| + // Wait until Start() does the work.
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| +
|
| + EXPECT_TRUE(quic_server_info->IsDataReady());
|
| +
|
| + QuicServerInfo::State* state = quic_server_info->mutable_state();
|
| + EXPECT_TRUE(state->certs.empty());
|
| + const string server_config_a = "server_config_a";
|
| + const string source_address_token_a = "source_address_token_a";
|
| + const string server_config_sig_a = "server_config_sig_a";
|
| + const string cert_a = "cert_a";
|
| +
|
| + state->server_config = server_config_a;
|
| + state->source_address_token = source_address_token_a;
|
| + state->server_config_sig = server_config_sig_a;
|
| + state->certs.push_back(cert_a);
|
| + EXPECT_TRUE(quic_server_info->IsReadyToPersist());
|
| + quic_server_info->Persist();
|
| + quic_server_info->OnExternalCacheHit();
|
| +
|
| + // Once we call Persist, IsReadyToPersist should return false until Persist
|
| + // has completed.
|
| + EXPECT_FALSE(quic_server_info->IsReadyToPersist());
|
| +
|
| + // Wait until Persist() does the work.
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| +
|
| + EXPECT_TRUE(quic_server_info->IsReadyToPersist());
|
| +
|
| + // Verify that the state was updated.
|
| + quic_server_info.reset(
|
| + new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
|
| + quic_server_info->Start();
|
| + TestCompletionCallback callback;
|
| + int rv = quic_server_info->WaitForDataReady(callback.callback());
|
| + EXPECT_EQ(OK, callback.GetResult(rv));
|
| + EXPECT_TRUE(quic_server_info->IsDataReady());
|
| +
|
| + const QuicServerInfo::State& state1 = quic_server_info->state();
|
| + EXPECT_EQ(server_config_a, state1.server_config);
|
| + EXPECT_EQ(source_address_token_a, state1.source_address_token);
|
| + EXPECT_EQ(server_config_sig_a, state1.server_config_sig);
|
| + EXPECT_EQ(1U, state1.certs.size());
|
| + EXPECT_EQ(cert_a, state1.certs[0]);
|
| +
|
| + RemoveMockTransaction(&kHostInfoTransaction1);
|
| +}
|
| +
|
| +// Test Persisting data when we are not ready to persist and then verify it
|
| +// persists the data when Start() finishes.
|
| +TEST(DiskCacheBasedQuicServerInfo, PersistWhenNotReadyToPersist) {
|
| + MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
|
| + MockHttpCache cache(factory);
|
| + AddMockTransaction(&kHostInfoTransaction1);
|
| + TestCompletionCallback callback;
|
| +
|
| + QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED);
|
| + scoped_ptr<QuicServerInfo> quic_server_info(
|
| + new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
|
| + EXPECT_FALSE(quic_server_info->IsDataReady());
|
| + // We do a Start(), but don't call WaitForDataReady(). Because we haven't
|
| + // created the backend, we will wait and data wouldn't be ready.
|
| + quic_server_info->Start();
|
| + EXPECT_FALSE(quic_server_info->IsDataReady());
|
| +
|
| + // Persist data once, even though the backend is not ready.
|
| + QuicServerInfo::State* state = quic_server_info->mutable_state();
|
| + EXPECT_TRUE(state->certs.empty());
|
| + const string server_config_init = "server_config_init";
|
| + const string source_address_token_init = "source_address_token_init";
|
| + const string server_config_sig_init = "server_config_sig_init";
|
| + const string cert_init = "cert_init";
|
| +
|
| + state->server_config = server_config_init;
|
| + state->source_address_token = source_address_token_init;
|
| + state->server_config_sig = server_config_sig_init;
|
| + state->certs.push_back(cert_init);
|
| + EXPECT_FALSE(quic_server_info->IsReadyToPersist());
|
| + quic_server_info->Persist();
|
| + EXPECT_FALSE(quic_server_info->IsReadyToPersist());
|
| +
|
| + // Now complete the backend creation and let the callback run.
|
| + factory->FinishCreation();
|
| + EXPECT_TRUE(quic_server_info->IsDataReady());
|
| +
|
| + // Wait until Persist() does the work.
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| +
|
| + // Verify that the state was updated.
|
| + quic_server_info.reset(
|
| + new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
|
| + quic_server_info->Start();
|
| + int rv = quic_server_info->WaitForDataReady(callback.callback());
|
| + EXPECT_EQ(OK, callback.GetResult(rv));
|
| + EXPECT_TRUE(quic_server_info->IsDataReady());
|
| +
|
| + const QuicServerInfo::State& state1 = quic_server_info->state();
|
| + EXPECT_EQ(server_config_init, state1.server_config);
|
| + EXPECT_EQ(source_address_token_init, state1.source_address_token);
|
| + EXPECT_EQ(server_config_sig_init, state1.server_config_sig);
|
| + EXPECT_EQ(1U, state1.certs.size());
|
| + EXPECT_EQ(cert_init, state1.certs[0]);
|
| + RemoveMockTransaction(&kHostInfoTransaction1);
|
| +}
|
| +
|
| +// Test multiple calls to Persist without waiting for the data to be written.
|
| +TEST(DiskCacheBasedQuicServerInfo, MultiplePersistsWithoutWaiting) {
|
| + MockHttpCache cache;
|
| + AddMockTransaction(&kHostInfoTransaction1);
|
| + TestCompletionCallback callback;
|
| +
|
| + QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED);
|
| + scoped_ptr<QuicServerInfo> quic_server_info(
|
| + new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
|
| + EXPECT_FALSE(quic_server_info->IsDataReady());
|
| + quic_server_info->Start();
|
| + int rv = quic_server_info->WaitForDataReady(callback.callback());
|
| + EXPECT_EQ(OK, callback.GetResult(rv));
|
| + EXPECT_TRUE(quic_server_info->IsDataReady());
|
| +
|
| + // Persist data once.
|
| + QuicServerInfo::State* state = quic_server_info->mutable_state();
|
| + EXPECT_TRUE(state->certs.empty());
|
| + const string server_config_init = "server_config_init";
|
| + const string source_address_token_init = "source_address_token_init";
|
| + const string server_config_sig_init = "server_config_sig_init";
|
| + const string cert_init = "cert_init";
|
| +
|
| + state->server_config = server_config_init;
|
| + state->source_address_token = source_address_token_init;
|
| + state->server_config_sig = server_config_sig_init;
|
| + state->certs.push_back(cert_init);
|
| + EXPECT_TRUE(quic_server_info->IsReadyToPersist());
|
| + quic_server_info->Persist();
|
| +
|
| + // Once we call Persist, IsReadyToPersist should return false until Persist
|
| + // has completed.
|
| + EXPECT_FALSE(quic_server_info->IsReadyToPersist());
|
| +
|
| + // Persist one more time using the same |quic_server_info| object and without
|
| + // doing another Start() and WaitForDataReady.
|
| + const string server_config_a = "server_config_a";
|
| + const string source_address_token_a = "source_address_token_a";
|
| + const string server_config_sig_a = "server_config_sig_a";
|
| + const string cert_a = "cert_a";
|
| +
|
| + state->server_config = server_config_a;
|
| + state->source_address_token = source_address_token_a;
|
| + state->server_config_sig = server_config_sig_a;
|
| + state->certs.push_back(cert_a);
|
| + EXPECT_FALSE(quic_server_info->IsReadyToPersist());
|
| + quic_server_info->Persist();
|
| +
|
| + // Wait until Persist() does the work.
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| +
|
| + EXPECT_TRUE(quic_server_info->IsReadyToPersist());
|
| +
|
| + // Verify that the state was updated.
|
| + quic_server_info.reset(
|
| + new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
|
| + quic_server_info->Start();
|
| + rv = quic_server_info->WaitForDataReady(callback.callback());
|
| + EXPECT_EQ(OK, callback.GetResult(rv));
|
| + EXPECT_TRUE(quic_server_info->IsDataReady());
|
| +
|
| + // Verify the second time persisted data is persisted.
|
| + const QuicServerInfo::State& state1 = quic_server_info->state();
|
| + EXPECT_EQ(server_config_a, state1.server_config);
|
| + EXPECT_EQ(source_address_token_a, state1.source_address_token);
|
| + EXPECT_EQ(server_config_sig_a, state1.server_config_sig);
|
| + EXPECT_EQ(1U, state1.certs.size());
|
| + EXPECT_EQ(cert_a, state1.certs[0]);
|
| +
|
| + RemoveMockTransaction(&kHostInfoTransaction1);
|
| +}
|
| +
|
| } // namespace net
|
|
|