15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/http/disk_cache_based_quic_server_info.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind_helpers.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/net_errors.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/http/mock_http_cache.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/crypto/quic_server_info.h" 14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/quic/quic_server_id.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace net { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This is an empty transaction, needed to register the URL and the test mode. 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const MockTransaction kHostInfoTransaction1 = { 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "quicserverinfo:https://www.google.com:443", 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "", 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time(), 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "", 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LOAD_NORMAL, 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "", 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "", 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Time(), 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "", 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TEST_MODE_NORMAL, 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL, 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const MockTransaction kHostInfoTransaction2 = { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "quicserverinfo:http://www.google.com:80", 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time(), 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch LOAD_NORMAL, 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time(), 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "", 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TEST_MODE_NORMAL, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that we can delete a DiskCacheBasedQuicServerInfo object in a 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// completion callback for DiskCacheBasedQuicServerInfo::WaitForDataReady. 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(DiskCacheBasedQuicServerInfo, DeleteInCallback) { 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use the blocking mock backend factory to force asynchronous completion 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // of quic_server_info->WaitForDataReady(), so that the callback will run. 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockBlockingBackendFactory* factory = new MockBlockingBackendFactory(); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHttpCache cache(factory); 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id("www.verisign.com", 443, true, PRIVACY_MODE_DISABLED); 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicServerInfo> quic_server_info( 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache())); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info->Start(); 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestCompletionCallback callback; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = quic_server_info->WaitForDataReady(callback.callback()); 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now complete the backend creation and let the callback run. 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) factory->FinishCreation(); 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests the basic logic of storing, retrieving and updating data. 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(DiskCacheBasedQuicServerInfo, Update) { 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHttpCache cache; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AddMockTransaction(&kHostInfoTransaction1); 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestCompletionCallback callback; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED); 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicServerInfo> quic_server_info( 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache())); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info->Start(); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = quic_server_info->WaitForDataReady(callback.callback()); 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicServerInfo::State* state = quic_server_info->mutable_state(); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(state->certs.empty()); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string server_config_a = "server_config_a"; 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string source_address_token_a = "source_address_token_a"; 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string server_config_sig_a = "server_config_sig_a"; 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string cert_a = "cert_a"; 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string cert_b = "cert_b"; 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->server_config = server_config_a; 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->source_address_token = source_address_token_a; 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->server_config_sig = server_config_sig_a; 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->certs.push_back(cert_a); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info->Persist(); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait until Persist() does the work. 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Open the stored QuicServerInfo. 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info.reset( 104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache())); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info->Start(); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = quic_server_info->WaitForDataReady(callback.callback()); 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // And now update the data. 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state = quic_server_info->mutable_state(); 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->certs.push_back(cert_b); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fail instead of DCHECKing double creates. 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cache.disk_cache()->set_double_create_check(false); 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info->Persist(); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify that the state was updated. 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info.reset( 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache())); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quic_server_info->Start(); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = quic_server_info->WaitForDataReady(callback.callback()); 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsDataReady()); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const QuicServerInfo::State& state1 = quic_server_info->state(); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(server_config_a, state1.server_config); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(source_address_token_a, state1.source_address_token); 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(server_config_sig_a, state1.server_config_sig); 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(2U, state1.certs.size()); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(cert_a, state1.certs[0]); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(cert_b, state1.certs[1]); 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveMockTransaction(&kHostInfoTransaction1); 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that demonstrates different info is returned when the ports differ. 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(DiskCacheBasedQuicServerInfo, UpdateDifferentPorts) { 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MockHttpCache cache; 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AddMockTransaction(&kHostInfoTransaction1); 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AddMockTransaction(&kHostInfoTransaction2); 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestCompletionCallback callback; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Persist data for port 443. 145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id1("www.google.com", 443, true, PRIVACY_MODE_DISABLED); 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicServerInfo> quic_server_info1( 147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id1, cache.http_cache())); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info1->Start(); 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = quic_server_info1->WaitForDataReady(callback.callback()); 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicServerInfo::State* state1 = quic_server_info1->mutable_state(); 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(state1->certs.empty()); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string server_config_a = "server_config_a"; 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string source_address_token_a = "source_address_token_a"; 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string server_config_sig_a = "server_config_sig_a"; 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string cert_a = "cert_a"; 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state1->server_config = server_config_a; 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state1->source_address_token = source_address_token_a; 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state1->server_config_sig = server_config_sig_a; 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state1->certs.push_back(cert_a); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info1->Persist(); 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Wait until Persist() does the work. 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Persist data for port 80. 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id2("www.google.com", 80, false, PRIVACY_MODE_DISABLED); 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicServerInfo> quic_server_info2( 171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id2, cache.http_cache())); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info2->Start(); 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = quic_server_info2->WaitForDataReady(callback.callback()); 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicServerInfo::State* state2 = quic_server_info2->mutable_state(); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(state2->certs.empty()); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string server_config_b = "server_config_b"; 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string source_address_token_b = "source_address_token_b"; 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string server_config_sig_b = "server_config_sig_b"; 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string cert_b = "cert_b"; 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state2->server_config = server_config_b; 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state2->source_address_token = source_address_token_b; 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state2->server_config_sig = server_config_sig_b; 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state2->certs.push_back(cert_b); 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info2->Persist(); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Wait until Persist() does the work. 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the stored QuicServerInfo for port 443. 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicServerInfo> quic_server_info( 194e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id1, cache.http_cache())); 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info->Start(); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = quic_server_info->WaitForDataReady(callback.callback()); 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsDataReady()); 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const QuicServerInfo::State& state_a = quic_server_info->state(); 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(server_config_a, state_a.server_config); 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(source_address_token_a, state_a.source_address_token); 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(server_config_sig_a, state_a.server_config_sig); 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, state_a.certs.size()); 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(cert_a, state_a.certs[0]); 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify the stored QuicServerInfo for port 80. 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info.reset( 209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id2, cache.http_cache())); 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) quic_server_info->Start(); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = quic_server_info->WaitForDataReady(callback.callback()); 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsDataReady()); 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const QuicServerInfo::State& state_b = quic_server_info->state(); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(server_config_b, state_b.server_config); 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(source_address_token_b, state_b.source_address_token); 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(server_config_sig_b, state_b.server_config_sig); 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, state_b.certs.size()); 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(cert_b, state_b.certs[0]); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveMockTransaction(&kHostInfoTransaction2); 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveMockTransaction(&kHostInfoTransaction1); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Test IsReadyToPersist when there is a pending write. 22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(DiskCacheBasedQuicServerInfo, IsReadyToPersist) { 22823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MockHttpCache cache; 22923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) AddMockTransaction(&kHostInfoTransaction1); 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch TestCompletionCallback callback; 23123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED); 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicServerInfo> quic_server_info( 234e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache())); 23523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_FALSE(quic_server_info->IsDataReady()); 23623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) quic_server_info->Start(); 23723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int rv = quic_server_info->WaitForDataReady(callback.callback()); 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 23923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsDataReady()); 24023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicServerInfo::State* state = quic_server_info->mutable_state(); 24223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(state->certs.empty()); 24323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const string server_config_a = "server_config_a"; 24423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const string source_address_token_a = "source_address_token_a"; 24523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const string server_config_sig_a = "server_config_sig_a"; 24623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const string cert_a = "cert_a"; 24723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) state->server_config = server_config_a; 24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) state->source_address_token = source_address_token_a; 25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) state->server_config_sig = server_config_sig_a; 25123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) state->certs.push_back(cert_a); 25223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsReadyToPersist()); 25323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) quic_server_info->Persist(); 25423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 25523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Once we call Persist, IsReadyToPersist should return false until Persist 25623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // has completed. 25723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_FALSE(quic_server_info->IsReadyToPersist()); 25823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Wait until Persist() does the work. 26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 26123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 26223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsReadyToPersist()); 26323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 26423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Verify that the state was updated. 26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) quic_server_info.reset( 266e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache())); 26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) quic_server_info->Start(); 26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) rv = quic_server_info->WaitForDataReady(callback.callback()); 269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback.GetResult(rv)); 27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(quic_server_info->IsDataReady()); 27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const QuicServerInfo::State& state1 = quic_server_info->state(); 27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(server_config_a, state1.server_config); 27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(source_address_token_a, state1.source_address_token); 27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(server_config_sig_a, state1.server_config_sig); 27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(1U, state1.certs.size()); 27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(cert_a, state1.certs[0]); 27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RemoveMockTransaction(&kHostInfoTransaction1); 28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 28123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace net 283