| Index: net/extras/cert/cert_verifier_cache_persister_unittest.cc
|
| diff --git a/net/extras/cert/cert_verifier_cache_persister_unittest.cc b/net/extras/cert/cert_verifier_cache_persister_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7e0f99ecec9b58fd9fb375b11c905334e1799d75
|
| --- /dev/null
|
| +++ b/net/extras/cert/cert_verifier_cache_persister_unittest.cc
|
| @@ -0,0 +1,201 @@
|
| +// Copyright (c) 2016 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/extras/cert/cert_verifier_cache_persister.h"
|
| +
|
| +#include <memory>
|
| +
|
| +#include "base/files/file_path.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/base/test_completion_callback.h"
|
| +#include "net/base/test_data_directory.h"
|
| +#include "net/cert/caching_cert_verifier.h"
|
| +#include "net/cert/cert_verifier.h"
|
| +#include "net/cert/cert_verify_result.h"
|
| +#include "net/cert/mock_cert_verifier.h"
|
| +#include "net/cert/x509_certificate.h"
|
| +#include "net/log/net_log.h"
|
| +#include "net/test/cert_test_util.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +
|
| +class CertVerifierCachePersisterTest : public ::testing::Test {
|
| + public:
|
| + CertVerifierCachePersisterTest()
|
| + : verifier_(base::MakeUnique<MockCertVerifier>()),
|
| + persister_(&verifier_) {}
|
| + ~CertVerifierCachePersisterTest() override {}
|
| +
|
| + protected:
|
| + CachingCertVerifier verifier_;
|
| + CertVerifierCachePersister persister_;
|
| +};
|
| +
|
| +TEST_F(CertVerifierCachePersisterTest, RestoreEmptyData) {
|
| + // Restoring empty data should fail.
|
| + EXPECT_FALSE(persister_.LoadCache(std::string()));
|
| +}
|
| +
|
| +TEST_F(CertVerifierCachePersisterTest, RestoreCorruptedData) {
|
| + // Restoring corrupted data should fail.
|
| + EXPECT_FALSE(persister_.LoadCache(std::string("junk")));
|
| +}
|
| +
|
| +TEST_F(CertVerifierCachePersisterTest, SerializeCache) {
|
| + base::FilePath certs_dir = GetTestCertsDirectory();
|
| + scoped_refptr<X509Certificate> ok_cert(
|
| + ImportCertFromFile(certs_dir, "ok_cert.pem"));
|
| + ASSERT_TRUE(ok_cert.get());
|
| +
|
| + int error;
|
| + CertVerifyResult verify_result;
|
| + TestCompletionCallback callback;
|
| + std::unique_ptr<CertVerifier::Request> request;
|
| +
|
| + error = callback.GetResult(verifier_.Verify(
|
| + CertVerifier::RequestParams(ok_cert, "www.example.com", 0, std::string(),
|
| + CertificateList()),
|
| + nullptr, &verify_result, callback.callback(), &request, BoundNetLog()));
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| +
|
| + std::string data;
|
| + persister_.SerializeCache(&data);
|
| + EXPECT_FALSE(data.empty());
|
| +}
|
| +
|
| +TEST_F(CertVerifierCachePersisterTest, RestoreExistingEntry) {
|
| + scoped_refptr<X509Certificate> ok_cert(
|
| + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), ok_cert.get());
|
| +
|
| + int error;
|
| + CertVerifyResult verify_result;
|
| + TestCompletionCallback callback;
|
| + std::unique_ptr<CertVerifier::Request> request;
|
| +
|
| + error = callback.GetResult(verifier_.Verify(
|
| + CertVerifier::RequestParams(ok_cert, "www.example.com", 0, std::string(),
|
| + CertificateList()),
|
| + nullptr, &verify_result, callback.callback(), &request, BoundNetLog()));
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| +
|
| + std::string data;
|
| + persister_.SerializeCache(&data);
|
| + EXPECT_FALSE(data.empty());
|
| +
|
| + // Restore the cache data for an existing entry should fail.
|
| + EXPECT_FALSE(persister_.LoadCache(data));
|
| +}
|
| +
|
| +TEST_F(CertVerifierCachePersisterTest, RestoreDataIntoNewVerifier) {
|
| + scoped_refptr<X509Certificate> ok_cert(
|
| + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), ok_cert.get());
|
| +
|
| + int error;
|
| + std::string example_hostname("www.example.com");
|
| + CertVerifyResult verify_result;
|
| + TestCompletionCallback callback;
|
| + std::unique_ptr<CertVerifier::Request> request;
|
| +
|
| + error = callback.GetResult(verifier_.Verify(
|
| + CertVerifier::RequestParams(ok_cert, example_hostname, 0, std::string(),
|
| + CertificateList()),
|
| + nullptr, &verify_result, callback.callback(), &request, BoundNetLog()));
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| +
|
| + std::string data;
|
| + persister_.SerializeCache(&data);
|
| + EXPECT_FALSE(data.empty());
|
| +
|
| + // Create a new Verifier and restoring the data into it should succeed.
|
| + CachingCertVerifier verifier2(base::MakeUnique<MockCertVerifier>());
|
| + CertVerifierCachePersister persister2(&verifier2);
|
| + EXPECT_TRUE(persister2.LoadCache(data));
|
| +
|
| + CertVerifyResult verify_result2;
|
| + error = callback.GetResult(verifier2.Verify(
|
| + CertVerifier::RequestParams(ok_cert, example_hostname, 0, std::string(),
|
| + CertificateList()),
|
| + nullptr, &verify_result2, callback.callback(), &request, BoundNetLog()));
|
| + // Synchronous completion and verify it is same as serialized data.
|
| + ASSERT_NE(ERR_IO_PENDING, error);
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| + ASSERT_FALSE(request);
|
| + EXPECT_EQ(verify_result2.cert_status, verify_result.cert_status);
|
| +}
|
| +
|
| +TEST_F(CertVerifierCachePersisterTest, RestoreMultipleEntriesIntoNewVerifier) {
|
| + scoped_refptr<X509Certificate> ok_cert(
|
| + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
|
| + ASSERT_NE(static_cast<X509Certificate*>(NULL), ok_cert.get());
|
| +
|
| + const scoped_refptr<X509Certificate> root_cert =
|
| + ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem");
|
| + ASSERT_TRUE(root_cert.get());
|
| +
|
| + // Create a certificate that contains both a leaf and an intermediate/root.
|
| + X509Certificate::OSCertHandles chain;
|
| + chain.push_back(root_cert->os_cert_handle());
|
| + const scoped_refptr<X509Certificate> combined_cert =
|
| + X509Certificate::CreateFromHandle(ok_cert->os_cert_handle(), chain);
|
| + ASSERT_TRUE(combined_cert.get());
|
| +
|
| + int error;
|
| + std::string example_hostname("www.example.com");
|
| + CertVerifyResult verify1_result1;
|
| + TestCompletionCallback callback;
|
| + std::unique_ptr<CertVerifier::Request> request;
|
| +
|
| + error = callback.GetResult(verifier_.Verify(
|
| + CertVerifier::RequestParams(ok_cert, example_hostname, 0, std::string(),
|
| + CertificateList()),
|
| + nullptr, &verify1_result1, callback.callback(), &request, BoundNetLog()));
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| +
|
| + std::string example2_hostname("www.example2.com");
|
| + CertVerifyResult verify1_result2;
|
| + error = callback.GetResult(verifier_.Verify(
|
| + CertVerifier::RequestParams(combined_cert, example2_hostname, 0,
|
| + std::string(), CertificateList()),
|
| + nullptr, &verify1_result2, callback.callback(), &request, BoundNetLog()));
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| +
|
| + std::string data;
|
| + persister_.SerializeCache(&data);
|
| + EXPECT_FALSE(data.empty());
|
| +
|
| + // Create a new Verifier and restoring the data into it should succeed.
|
| + CachingCertVerifier verifier2(base::MakeUnique<MockCertVerifier>());
|
| + CertVerifierCachePersister persister2(&verifier2);
|
| + EXPECT_TRUE(persister2.LoadCache(data));
|
| +
|
| + CertVerifyResult verify2_result1;
|
| + error = callback.GetResult(verifier2.Verify(
|
| + CertVerifier::RequestParams(ok_cert, example_hostname, 0, std::string(),
|
| + CertificateList()),
|
| + nullptr, &verify2_result1, callback.callback(), &request, BoundNetLog()));
|
| + // Synchronous completion and verify it is same as serialized data.
|
| + ASSERT_NE(ERR_IO_PENDING, error);
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| + ASSERT_FALSE(request);
|
| + EXPECT_EQ(verify2_result1.cert_status, verify1_result1.cert_status);
|
| +
|
| + CertVerifyResult verify2_result2;
|
| + error = callback.GetResult(verifier2.Verify(
|
| + CertVerifier::RequestParams(combined_cert, example2_hostname, 0,
|
| + std::string(), CertificateList()),
|
| + nullptr, &verify2_result2, callback.callback(), &request, BoundNetLog()));
|
| + // Synchronous completion and verify it is same as serialized data.
|
| + ASSERT_NE(ERR_IO_PENDING, error);
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| + ASSERT_FALSE(request);
|
| + EXPECT_EQ(verify2_result2.cert_status, verify1_result2.cert_status);
|
| +}
|
| +
|
| +} // namespace net
|
|
|