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 |