// Copyright 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/quic/crypto/quic_compressed_certs_cache.h" #include #include #include "base/logging.h" #include "base/macros.h" #include "base/strings/string_number_conversions.h" #include "net/quic/crypto/cert_compressor.h" #include "net/quic/test_tools/crypto_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" using std::vector; namespace net { namespace test { namespace { class QuicCompressedCertsCacheTest : public testing::Test { public: QuicCompressedCertsCacheTest() : certs_cache_(QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {} protected: QuicCompressedCertsCache certs_cache_; }; TEST_F(QuicCompressedCertsCacheTest, CacheHit) { vector certs = {"leaf cert", "intermediate cert", "root cert"}; scoped_refptr chain(new ProofSource::Chain(certs)); string common_certs = "common certs"; string cached_certs = "cached certs"; string compressed = "compressed cert"; certs_cache_.Insert(chain, common_certs, cached_certs, compressed); const string* cached_value = certs_cache_.GetCompressedCert(chain, common_certs, cached_certs); ASSERT_NE(nullptr, cached_value); EXPECT_EQ(*cached_value, compressed); } TEST_F(QuicCompressedCertsCacheTest, CacheMiss) { vector certs = {"leaf cert", "intermediate cert", "root cert"}; scoped_refptr chain(new ProofSource::Chain(certs)); string common_certs = "common certs"; string cached_certs = "cached certs"; string compressed = "compressed cert"; certs_cache_.Insert(chain, common_certs, cached_certs, compressed); EXPECT_EQ(nullptr, certs_cache_.GetCompressedCert( chain, "mismatched common certs", cached_certs)); EXPECT_EQ(nullptr, certs_cache_.GetCompressedCert(chain, common_certs, "mismatched cached certs")); scoped_refptr chain2(new ProofSource::Chain(certs)); EXPECT_EQ(nullptr, certs_cache_.GetCompressedCert(chain2, common_certs, cached_certs)); } TEST_F(QuicCompressedCertsCacheTest, CacheMissDueToEviction) { // Test cache returns a miss when a queried uncompressed certs was cached but // then evicted. vector certs = {"leaf cert", "intermediate cert", "root cert"}; scoped_refptr chain(new ProofSource::Chain(certs)); string common_certs = "common certs"; string cached_certs = "cached certs"; string compressed = "compressed cert"; certs_cache_.Insert(chain, common_certs, cached_certs, compressed); // Insert another kQuicCompressedCertsCacheSize certs to evict the first // cached cert. for (unsigned int i = 0; i < QuicCompressedCertsCache::kQuicCompressedCertsCacheSize; i++) { EXPECT_EQ(certs_cache_.Size(), i + 1); certs_cache_.Insert(chain, base::IntToString(i), "", base::IntToString(i)); } EXPECT_EQ(certs_cache_.MaxSize(), certs_cache_.Size()); EXPECT_EQ(nullptr, certs_cache_.GetCompressedCert(chain, common_certs, cached_certs)); } } // namespace } // namespace test } // namespace net