| Index: net/http/disk_based_cert_cache_unittest.cc
|
| diff --git a/net/http/disk_based_cert_cache_unittest.cc b/net/http/disk_based_cert_cache_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3e44b6b6c3b0bb4d2f608e5d59a2583ff472e5a9
|
| --- /dev/null
|
| +++ b/net/http/disk_based_cert_cache_unittest.cc
|
| @@ -0,0 +1,177 @@
|
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "net/http/disk_based_cert_cache.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/callback_helpers.h"
|
| +#include "net/base/completion_callback.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/base/test_completion_callback.h"
|
| +#include "net/base/test_data_directory.h"
|
| +#include "net/disk_cache/memory/mem_backend_impl.h"
|
| +#include "net/http/http_cache.h"
|
| +#include "net/test/cert_test_util.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +
|
| +namespace {
|
| +
|
| +// This class is essentially a workaround for not being able to use
|
| +// CompletionCallback with non-int parameters. Using this class
|
| +// it is possible to use the DiskBasedCertCache and also
|
| +// TestCompletionCallback::WaitForResult.
|
| +
|
| +class MockCertCacheUser {
|
| + public:
|
| + explicit MockCertCacheUser(DiskBasedCertCache* cert_cache)
|
| + : weak_factory_(this), cert_cache_(cert_cache) {}
|
| +
|
| + void Set(const X509Certificate::OSCertHandle cert_handle,
|
| + std::string& key,
|
| + CompletionCallback cb) {
|
| + user_callback_ = cb;
|
| + cert_cache_->Set(
|
| + cert_handle,
|
| + base::Bind(
|
| + &MockCertCacheUser::FinishSet, weak_factory_.GetWeakPtr(), &key));
|
| + }
|
| +
|
| + void Get(std::string key,
|
| + X509Certificate::OSCertHandle& cert_handle,
|
| + CompletionCallback cb) {
|
| + user_callback_ = cb;
|
| + cert_cache_->Get(key,
|
| + base::Bind(&MockCertCacheUser::FinishGet,
|
| + weak_factory_.GetWeakPtr(),
|
| + &cert_handle));
|
| + }
|
| +
|
| + void FinishSet(std::string* key_return, const std::string& key_received) {
|
| + *key_return = key_received;
|
| + base::ResetAndReturn(&user_callback_).Run(OK);
|
| + }
|
| +
|
| + void FinishGet(X509Certificate::OSCertHandle* handle_return,
|
| + const X509Certificate::OSCertHandle handle_retrieved) {
|
| + *handle_return = handle_retrieved;
|
| + base::ResetAndReturn(&user_callback_).Run(OK);
|
| + }
|
| +
|
| + private:
|
| + base::WeakPtrFactory<MockCertCacheUser> weak_factory_;
|
| + DiskBasedCertCache* cert_cache_;
|
| + CompletionCallback user_callback_;
|
| +};
|
| +
|
| +// ----------------------------------------------------------------------------
|
| +
|
| +} // namespace
|
| +TEST(DiskBasedCertCache, SetNewCert) {
|
| + scoped_ptr<disk_cache::Backend> backend(
|
| + disk_cache::MemBackendImpl::CreateBackend(0, NULL));
|
| +
|
| + EXPECT_TRUE(backend.get());
|
| +
|
| + DiskBasedCertCache cert_cache(backend.get());
|
| +
|
| + scoped_refptr<X509Certificate> cert(
|
| + ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem"));
|
| +
|
| + EXPECT_TRUE(cert.get());
|
| +
|
| + MockCertCacheUser user(&cert_cache);
|
| +
|
| + TestCompletionCallback set_callback;
|
| +
|
| + std::string key;
|
| +
|
| + user.Set(cert.get()->os_cert_handle(), key, set_callback.callback());
|
| + set_callback.WaitForResult();
|
| +
|
| + ASSERT_TRUE(!key.empty());
|
| +}
|
| +
|
| +// Tests that attempting to retrieve a cert that is not in the cache will
|
| +// return NULL.
|
| +TEST(DiskBasedCertCache, GetUncachedCert) {
|
| + scoped_ptr<disk_cache::Backend> backend(
|
| + disk_cache::MemBackendImpl::CreateBackend(0, NULL));
|
| + EXPECT_TRUE(backend.get());
|
| +
|
| + DiskBasedCertCache cert_cache(backend.get());
|
| +
|
| + MockCertCacheUser user(&cert_cache);
|
| +
|
| + TestCompletionCallback get_callback;
|
| +
|
| + X509Certificate::OSCertHandle cert_handle = NULL;
|
| + user.Get("cert:4C005EF1CF45F80D4A5A2BCFB00D4F198121E8D4",
|
| + cert_handle,
|
| + get_callback.callback());
|
| + get_callback.WaitForResult();
|
| +
|
| + ASSERT_EQ(NULL, cert_handle);
|
| +}
|
| +
|
| +// Tests that no errors will be thrown if a certificate is already in the cache,
|
| +// and that the past cached data will be overwritten without any errors.
|
| +TEST(DiskBasedCertCache, SetOverwrite) {
|
| + scoped_ptr<disk_cache::Backend> backend(
|
| + disk_cache::MemBackendImpl::CreateBackend(0, NULL));
|
| +
|
| + DiskBasedCertCache cert_cache(backend.get());
|
| +
|
| + scoped_refptr<X509Certificate> cert(
|
| + ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem"));
|
| +
|
| + MockCertCacheUser user(&cert_cache);
|
| +
|
| + TestCompletionCallback set_callback;
|
| + TestCompletionCallback get_callback;
|
| +
|
| + std::string key;
|
| +
|
| + user.Set(cert.get()->os_cert_handle(), key, set_callback.callback());
|
| + set_callback.WaitForResult();
|
| +
|
| + user.Set(cert.get()->os_cert_handle(), key, set_callback.callback());
|
| + set_callback.WaitForResult();
|
| +}
|
| +
|
| +// Stores a cert cache in DiskBasedCertCache, then retrieves it
|
| +// and makes sure it was retrieved successfully.
|
| +TEST(DiskBasedCertCache, SimpleSetAndGet) {
|
| + scoped_ptr<disk_cache::Backend> backend(
|
| + disk_cache::MemBackendImpl::CreateBackend(0, NULL));
|
| +
|
| + EXPECT_TRUE(backend.get());
|
| +
|
| + DiskBasedCertCache cert_cache(backend.get());
|
| +
|
| + scoped_refptr<X509Certificate> cert(
|
| + ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem"));
|
| +
|
| + EXPECT_TRUE(cert.get());
|
| +
|
| + MockCertCacheUser user(&cert_cache);
|
| +
|
| + TestCompletionCallback set_callback;
|
| + TestCompletionCallback get_callback;
|
| +
|
| + std::string key;
|
| + X509Certificate::OSCertHandle retrieved_cert_handle = NULL;
|
| +
|
| + user.Set(cert.get()->os_cert_handle(), key, set_callback.callback());
|
| + set_callback.WaitForResult();
|
| +
|
| + user.Get(key, retrieved_cert_handle, get_callback.callback());
|
| + get_callback.WaitForResult();
|
| +
|
| + ASSERT_TRUE(X509Certificate::IsSameOSCert(retrieved_cert_handle,
|
| + cert.get()->os_cert_handle()));
|
| +}
|
| +
|
| +} // namespace net
|
|
|