1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright (c) 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/disk_based_cert_cache.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/callback_helpers.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/completion_callback.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/io_buffer.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/net_errors.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/test_completion_callback.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/test_data_directory.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/disk_cache/memory/mem_backend_impl.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/mock_http_cache.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/test/cert_test_util.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace net {
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Testing the DiskBasedCertCache requires constant use of the
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// certificates in GetTestCertsDirectory(). The TestCertMetaData
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// struct stores metadata relevant to the DiskBasedCertCache for
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// each used test certificate.
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct TestCertMetaData {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* file_name;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* cache_key;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst TestCertMetaData kCert1 = {
3334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    "root_ca_cert.pem", "cert:738D348A8AFCEC4F79C3E4B1845D985AF601AB0F"};
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst TestCertMetaData kCert2 = {
3634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    "ok_cert.pem", "cert:6C9DFD2CFA9885C71BE6DE0EA0CF962AC8F9131B"};
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// MockTransactions are required to use the MockDiskCache backend.
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// |key| is a cache key, and is equivalent to the key that will be
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// used to store or retrieve certificates in the cache. |test_mode|
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// is an integer that is used to indicate properties of the test
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// transaction, mostly whether or not it is synchronous.
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// For testing the DiskBasedCertCache, other data members of the struct
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// are irrelevant. Only one MockTransaction per certificate can be used
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// at a time.
46116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMockTransaction CreateMockTransaction(const char* key, int test_mode) {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockTransaction transaction = {key,  "", base::Time(), "", LOAD_NORMAL,
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 "",   "", base::Time(), "", test_mode,
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 NULL, 0,  OK};
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return transaction;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Helper class, for use with DiskBasedCertCache::GetCertificate, that will
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// store the returned certificate handle and allow users to WaitForResult of
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// DiskBasedCertCache::GetCertificate.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestGetCallback {
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback() : cert_handle_(NULL) {}
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~TestGetCallback() {
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (cert_handle_)
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      X509Certificate::FreeOSCertHandle(cert_handle_);
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Blocks until the underlying GetCertificate() operation has succeeded.
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void WaitForResult() { cb_.WaitForResult(); }
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns a Callback suitable for use with
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // DiskBasedCertCache::GetCertificate(). The returned callback is only valid
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // while the TestGetCallback object is still valid.
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache::GetCallback callback() {
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return base::Bind(&TestGetCallback::OnGetComplete, base::Unretained(this));
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the associated certificate handle.
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const X509Certificate::OSCertHandle& cert_handle() const {
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return cert_handle_;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnGetComplete(const X509Certificate::OSCertHandle handle) {
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (handle)
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cert_handle_ = X509Certificate::DupOSCertHandle(handle);
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    cb_.callback().Run(OK);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestCompletionCallback cb_;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  X509Certificate::OSCertHandle cert_handle_;
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Helper class, for use with DiskBasedCertCache::SetCertificate, that will
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// store the returned key and allow a user to WaitForResult of
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// DiskBasedCertCache::SetCertificate.
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestSetCallback {
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback() {}
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~TestSetCallback() {}
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Blocks until the underlying SetCertificate() operation has succeeded.
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void WaitForResult() { cb_.WaitForResult(); }
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns a Callback suitable for use with
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // DiskBasedCertCache::SetCertificate(). The returned callback is only valid
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // while the TestSetCallback object is still  valid.
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache::SetCallback callback() {
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return base::Bind(&TestSetCallback::OnSetComplete, base::Unretained(this));
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns the associated certificate handle.
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string& key() const { return key_; }
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnSetComplete(const std::string& key) {
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    key_ = key;
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    cb_.callback().Run(OK);
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestCompletionCallback cb_;
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string key_;
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Stores the certificate corresponding to |cert_data| in |backend|. If
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// |corrupt_data| is true, the certificate will be imported with errors
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// so as to mimic a corrupted file on disk.
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ImportCert(disk_cache::Backend* backend,
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                const TestCertMetaData& cert_data,
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                bool corrupt_data) {
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  disk_cache::Entry* entry;
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestCompletionCallback callback;
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int rv =
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      backend->CreateEntry(cert_data.cache_key, &entry, callback.callback());
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(OK, callback.GetResult(rv));
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), cert_data.file_name));
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string write_data;
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool encoded =
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      X509Certificate::GetDEREncoded(cert->os_cert_handle(), &write_data);
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(encoded);
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (corrupt_data) {
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (size_t i = 0; i < write_data.size(); i += 20)
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ++write_data[i];
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<IOBuffer> buffer(new IOBuffer(write_data.size()));
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  memcpy(buffer->data(), write_data.data(), write_data.size());
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  rv = entry->WriteData(0 /* index */,
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        0 /* offset */,
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        buffer.get(),
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        write_data.size(),
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        callback.callback(),
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        true /* truncate */);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(static_cast<int>(write_data.size()), callback.GetResult(rv));
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  entry->Close();
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Checks that the the certificate corresponding to |cert_data| is an existing,
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// correctly cached entry in |backend|.
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CheckCertCached(disk_cache::Backend* backend,
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     const TestCertMetaData& cert_data) {
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  disk_cache::Entry* entry;
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestCompletionCallback callback;
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int rv = backend->OpenEntry(cert_data.cache_key, &entry, callback.callback());
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(OK, callback.GetResult(rv));
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), cert_data.file_name));
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string write_data;
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool encoded =
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      X509Certificate::GetDEREncoded(cert->os_cert_handle(), &write_data);
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(encoded);
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int entry_size = entry->GetDataSize(0 /* index */);
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<IOBuffer> buffer(new IOBuffer(entry_size));
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  rv = entry->ReadData(0 /* index */,
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       0 /* offset */,
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       buffer.get(),
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       entry_size,
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       callback.callback());
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(entry_size, callback.GetResult(rv));
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  entry->Close();
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  X509Certificate::OSCertHandle cached_cert_handle =
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      X509Certificate::CreateOSCertHandleFromBytes(buffer->data(), entry_size);
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(cached_cert_handle,
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            cert->os_cert_handle()));
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  X509Certificate::FreeOSCertHandle(cached_cert_handle);
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ----------------------------------------------------------------------------
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a certificate can be stored in the cache.
190116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SetCert) {
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback.callback());
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kCert1.cache_key, set_callback.key());
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1));
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a certificate can be retrieved from the cache.
207116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, GetCert) {
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCert(&backend, kCert1, false /* not corrupted */));
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback.callback());
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback.cert_handle(),
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            cert->os_cert_handle()));
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that the DiskBasedCertCache successfully writes to the cache
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// if the cache acts synchronously
227116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SyncSet) {
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_ALL));
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback.callback());
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kCert1.cache_key, set_callback.key());
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1));
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that the DiskBasedCertCache successfully reads from the cache
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// if the cache acts synchronously
245116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SyncGet) {
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_ALL));
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (ImportCert(&backend, kCert1, false /* not corrupted */)));
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback.callback());
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback.cert_handle(),
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            cert->os_cert_handle()));
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that GetCertificate will fail on a corrupted certificate.
264116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, GetBrokenCert) {
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ImportCert(&backend, kCert1, true /* corrupted */));
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback.callback());
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(get_callback.cert_handle());
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that attempting to retrieve a cert that is not in the cache will
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// return NULL.
280116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, GetUncachedCert) {
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback.callback());
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(NULL, get_callback.cert_handle());
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Issues two requests to store a certificate in the cache
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// (simultaneously), and checks that the DiskBasedCertCache stores the
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// certificate to the cache (in one write rather than two).
295116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SetMultiple) {
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback1, set_callback2;
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Behind the scenes, these two operations will be combined
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // into one operation. IgnoreCallbacks guarantees that the
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // first SetCertificate operation is not yet complete when the second
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // SetCertificate is called, and then IgnoreCallbacks(false) continues the
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // (combined) operation in the |cache|.
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(true);
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback1.callback());
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback2.callback());
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(false);
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback1.WaitForResult();
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback2.WaitForResult();
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(set_callback1.key(), set_callback2.key());
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1));
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Issues two requests to store a certificate in the cache
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// because the first transaction finishes before the second
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// one is issued, the first cache write is overwritten.
324116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SetOverwrite) {
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  backend.set_double_create_check(false);
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback1, set_callback2;
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback1.callback());
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback1.WaitForResult();
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback2.callback());
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback2.WaitForResult();
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(set_callback1.key(), set_callback2.key());
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1));
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Stores a certificate in the DiskBasedCertCache, then retrieves it
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// and makes sure it was retrieved successfully.
346116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SimpleSetAndGet) {
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback.callback());
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(set_callback.key(), get_callback.callback());
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback.cert_handle(),
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            cert->os_cert_handle()));
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests some basic functionality of the DiskBasedCertCache, with multiple
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// set and get operations.
367116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, BasicUsage) {
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_CACHE_START));
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans2(
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert2.cache_key, TEST_MODE_NORMAL));
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert1(
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert2(
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert2.file_name));
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert1.get());
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert2.get());
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(X509Certificate::IsSameOSCert(cert1->os_cert_handle(),
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             cert2->os_cert_handle()));
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback1, set_callback2;
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Callbacks are temporarily ignored here to guarantee the asynchronous
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // operations of the DiskBasedCertCache are always executed in the same
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // order.
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(true);
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert1->os_cert_handle(), set_callback1.callback());
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert2->os_cert_handle(), set_callback2.callback());
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(false);
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback1.WaitForResult();
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback2.WaitForResult();
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback1, get_callback2;
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(true);
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(set_callback1.key(), get_callback1.callback());
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(set_callback2.key(), get_callback2.callback());
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(false);
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback1.WaitForResult();
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback2.WaitForResult();
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(cert1->os_cert_handle(),
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            get_callback1.cert_handle()));
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(cert2->os_cert_handle(),
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            get_callback2.cert_handle()));
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test the result of simultaneous requests to store and retrieve a
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// certificate from the cache, with the get operation attempting to
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// open the cache first and therefore failing to open the entry.
412116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SimultaneousGetSet) {
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_CACHE_START));
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(true);
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback.callback());
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback.callback());
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(false);
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(NULL, get_callback.cert_handle());
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kCert1.cache_key, set_callback.key());
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Test the result of simultaneous requests to store and retrieve a
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// certificate from the cache, with the get operation opening the cache
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// after the set operation, leading to a successful read.
438116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, SimultaneousSetGet) {
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_SYNC_CACHE_START));
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback;
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(true);
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback.callback());
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback.callback());
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskEntry::IgnoreCallbacks(false);
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback.WaitForResult();
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kCert1.cache_key, set_callback.key());
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(cert->os_cert_handle(),
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            get_callback.cert_handle()));
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that the DiskBasedCertCache can be deleted without issues when
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// there are pending operations in the disk cache.
464116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, DeletedCertCache) {
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<DiskBasedCertCache> cache(new DiskBasedCertCache(&backend));
469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(cert.get());
472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache->SetCertificate(cert->os_cert_handle(), set_callback.callback());
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cache.reset();
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(std::string(), set_callback.key());
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Issues two successive read requests for a certificate, and then
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// checks that the DiskBasedCertCache correctly read and recorded
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// reading through the in-memory MRU cache.
483116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, MemCacheGet) {
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCert(&backend, kCert1, false /* not corrupted */));
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback1, get_callback2;
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback1.callback());
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback1.WaitForResult();
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(0U, cache.mem_cache_hits_for_testing());
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback2.callback());
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback2.WaitForResult();
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, cache.mem_cache_hits_for_testing());
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback1.cert_handle(),
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            get_callback2.cert_handle()));
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Reads a corrupted certificate from the disk cache, and then overwrites
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// it and checks that the uncorrupted version was stored in the in-memory
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// cache.
505116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(DiskBasedCertCache, CorruptOverwrite) {
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedMockTransaction trans1(
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateMockTransaction(kCert1.cache_key, TEST_MODE_NORMAL));
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MockDiskCache backend;
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  backend.set_double_create_check(false);
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ImportCert(&backend, kCert1, true /* corrupted */));
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DiskBasedCertCache cache(&backend);
512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestGetCallback get_callback1, get_callback2;
513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback1.callback());
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback1.WaitForResult();
516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(get_callback2.cert_handle());
517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<X509Certificate> cert(
519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ImportCertFromFile(GetTestCertsDirectory(), kCert1.file_name));
520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestSetCallback set_callback;
521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.SetCertificate(cert->os_cert_handle(), set_callback.callback());
523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_callback.WaitForResult();
524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kCert1.cache_key, set_callback.key());
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(0U, cache.mem_cache_hits_for_testing());
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache.GetCertificate(kCert1.cache_key, get_callback2.callback());
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_callback2.WaitForResult();
529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(X509Certificate::IsSameOSCert(get_callback2.cert_handle(),
530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            cert->os_cert_handle()));
531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, cache.mem_cache_hits_for_testing());
532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(CheckCertCached(&backend, kCert1));
533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace net
536