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