diff options
Diffstat (limited to 'net/base/default_server_bound_cert_store_unittest.cc')
-rw-r--r-- | net/base/default_server_bound_cert_store_unittest.cc | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/net/base/default_server_bound_cert_store_unittest.cc b/net/base/default_server_bound_cert_store_unittest.cc new file mode 100644 index 0000000..5fbe4e2 --- /dev/null +++ b/net/base/default_server_bound_cert_store_unittest.cc @@ -0,0 +1,294 @@ +// Copyright (c) 2012 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/base/default_server_bound_cert_store.h" + +#include <map> +#include <string> +#include <vector> + +#include "base/bind.h" +#include "base/compiler_specific.h" +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { + +class MockPersistentStore + : public DefaultServerBoundCertStore::PersistentStore { + public: + MockPersistentStore(); + virtual ~MockPersistentStore(); + + // DefaultServerBoundCertStore::PersistentStore implementation. + virtual bool Load( + std::vector<DefaultServerBoundCertStore::ServerBoundCert*>* certs) + OVERRIDE; + virtual void AddServerBoundCert( + const DefaultServerBoundCertStore::ServerBoundCert& cert) OVERRIDE; + virtual void DeleteServerBoundCert( + const DefaultServerBoundCertStore::ServerBoundCert& cert) OVERRIDE; + virtual void SetClearLocalStateOnExit(bool clear_local_state) OVERRIDE; + virtual void Flush(const base::Closure& completion_task) OVERRIDE; + + private: + typedef std::map<std::string, DefaultServerBoundCertStore::ServerBoundCert> + ServerBoundCertMap; + + ServerBoundCertMap origin_certs_; +}; + +MockPersistentStore::MockPersistentStore() {} + +MockPersistentStore::~MockPersistentStore() {} + +bool MockPersistentStore::Load( + std::vector<DefaultServerBoundCertStore::ServerBoundCert*>* certs) { + ServerBoundCertMap::iterator it; + + for (it = origin_certs_.begin(); it != origin_certs_.end(); ++it) { + certs->push_back( + new DefaultServerBoundCertStore::ServerBoundCert(it->second)); + } + + return true; +} + +void MockPersistentStore::AddServerBoundCert( + const DefaultServerBoundCertStore::ServerBoundCert& cert) { + origin_certs_[cert.server_identifier()] = cert; +} + +void MockPersistentStore::DeleteServerBoundCert( + const DefaultServerBoundCertStore::ServerBoundCert& cert) { + origin_certs_.erase(cert.server_identifier()); +} + +void MockPersistentStore::SetClearLocalStateOnExit(bool clear_local_state) {} + +void MockPersistentStore::Flush(const base::Closure& completion_task) { + NOTREACHED(); +} + +TEST(DefaultServerBoundCertStoreTest, TestLoading) { + scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore); + + persistent_store->AddServerBoundCert( + DefaultServerBoundCertStore::ServerBoundCert( + "google.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "a", "b")); + persistent_store->AddServerBoundCert( + DefaultServerBoundCertStore::ServerBoundCert( + "verisign.com", + CLIENT_CERT_ECDSA_SIGN, + base::Time(), + base::Time(), + "c", "d")); + + // Make sure certs load properly. + DefaultServerBoundCertStore store(persistent_store.get()); + EXPECT_EQ(2, store.GetCertCount()); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "e", "f"); + EXPECT_EQ(2, store.GetCertCount()); + store.SetServerBoundCert( + "twitter.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "g", "h"); + EXPECT_EQ(3, store.GetCertCount()); +} + +TEST(DefaultServerBoundCertStoreTest, TestSettingAndGetting) { + DefaultServerBoundCertStore store(NULL); + SSLClientCertType type; + base::Time creation_time; + base::Time expiration_time; + std::string private_key, cert; + EXPECT_EQ(0, store.GetCertCount()); + EXPECT_FALSE(store.GetServerBoundCert("verisign.com", + &type, + &creation_time, + &expiration_time, + &private_key, + &cert)); + EXPECT_TRUE(private_key.empty()); + EXPECT_TRUE(cert.empty()); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_RSA_SIGN, + base::Time::FromInternalValue(123), + base::Time::FromInternalValue(456), + "i", "j"); + EXPECT_TRUE(store.GetServerBoundCert("verisign.com", + &type, + &creation_time, + &expiration_time, + &private_key, + &cert)); + EXPECT_EQ(CLIENT_CERT_RSA_SIGN, type); + EXPECT_EQ(123, creation_time.ToInternalValue()); + EXPECT_EQ(456, expiration_time.ToInternalValue()); + EXPECT_EQ("i", private_key); + EXPECT_EQ("j", cert); +} + +TEST(DefaultServerBoundCertStoreTest, TestDuplicateCerts) { + scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore); + DefaultServerBoundCertStore store(persistent_store.get()); + + SSLClientCertType type; + base::Time creation_time; + base::Time expiration_time; + std::string private_key, cert; + EXPECT_EQ(0, store.GetCertCount()); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_RSA_SIGN, + base::Time::FromInternalValue(123), + base::Time::FromInternalValue(1234), + "a", "b"); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_ECDSA_SIGN, + base::Time::FromInternalValue(456), + base::Time::FromInternalValue(4567), + "c", "d"); + + EXPECT_EQ(1, store.GetCertCount()); + EXPECT_TRUE(store.GetServerBoundCert("verisign.com", + &type, + &creation_time, + &expiration_time, + &private_key, + &cert)); + EXPECT_EQ(CLIENT_CERT_ECDSA_SIGN, type); + EXPECT_EQ(456, creation_time.ToInternalValue()); + EXPECT_EQ(4567, expiration_time.ToInternalValue()); + EXPECT_EQ("c", private_key); + EXPECT_EQ("d", cert); +} + +TEST(DefaultServerBoundCertStoreTest, TestDeleteAll) { + scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore); + DefaultServerBoundCertStore store(persistent_store.get()); + + EXPECT_EQ(0, store.GetCertCount()); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "a", "b"); + store.SetServerBoundCert( + "google.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "c", "d"); + store.SetServerBoundCert( + "harvard.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "e", "f"); + + EXPECT_EQ(3, store.GetCertCount()); + store.DeleteAll(); + EXPECT_EQ(0, store.GetCertCount()); +} + +TEST(DefaultServerBoundCertStoreTest, TestDelete) { + scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore); + DefaultServerBoundCertStore store(persistent_store.get()); + + SSLClientCertType type; + base::Time creation_time; + base::Time expiration_time; + std::string private_key, cert; + EXPECT_EQ(0, store.GetCertCount()); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "a", "b"); + store.SetServerBoundCert( + "google.com", + CLIENT_CERT_ECDSA_SIGN, + base::Time(), + base::Time(), + "c", "d"); + + EXPECT_EQ(2, store.GetCertCount()); + store.DeleteServerBoundCert("verisign.com"); + EXPECT_EQ(1, store.GetCertCount()); + EXPECT_FALSE(store.GetServerBoundCert("verisign.com", + &type, + &creation_time, + &expiration_time, + &private_key, + &cert)); + EXPECT_TRUE(store.GetServerBoundCert("google.com", + &type, + &creation_time, + &expiration_time, + &private_key, + &cert)); + store.DeleteServerBoundCert("google.com"); + EXPECT_EQ(0, store.GetCertCount()); + EXPECT_FALSE(store.GetServerBoundCert("google.com", + &type, + &creation_time, + &expiration_time, + &private_key, + &cert)); +} + +TEST(DefaultServerBoundCertStoreTest, TestGetAll) { + scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore); + DefaultServerBoundCertStore store(persistent_store.get()); + + EXPECT_EQ(0, store.GetCertCount()); + store.SetServerBoundCert( + "verisign.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "a", "b"); + store.SetServerBoundCert( + "google.com", + CLIENT_CERT_ECDSA_SIGN, + base::Time(), + base::Time(), + "c", "d"); + store.SetServerBoundCert( + "harvard.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "e", "f"); + store.SetServerBoundCert( + "mit.com", + CLIENT_CERT_RSA_SIGN, + base::Time(), + base::Time(), + "g", "h"); + + EXPECT_EQ(4, store.GetCertCount()); + std::vector<ServerBoundCertStore::ServerBoundCert> certs; + store.GetAllServerBoundCerts(&certs); + EXPECT_EQ(4u, certs.size()); +} + +} // namespace net |