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