// Copyright (c) 2021 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 "quiche/quic/core/crypto/quic_client_session_cache.h"

#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/mock_clock.h"
#include "quiche/common/quiche_text_utils.h"

namespace quic {
namespace test {
namespace {

const QuicTime::Delta kTimeout = QuicTime::Delta::FromSeconds(1000);
const QuicVersionLabel kFakeVersionLabel = 0x01234567;
const QuicVersionLabel kFakeVersionLabel2 = 0x89ABCDEF;
const uint64_t kFakeIdleTimeoutMilliseconds = 12012;
const uint8_t kFakeStatelessResetTokenData[16] = {
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
    0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F};
const uint64_t kFakeMaxPacketSize = 9001;
const uint64_t kFakeInitialMaxData = 101;
const bool kFakeDisableMigration = true;
const auto kCustomParameter1 =
    static_cast<TransportParameters::TransportParameterId>(0xffcd);
const char* kCustomParameter1Value = "foo";
const auto kCustomParameter2 =
    static_cast<TransportParameters::TransportParameterId>(0xff34);
const char* kCustomParameter2Value = "bar";

std::vector<uint8_t> CreateFakeStatelessResetToken() {
  return std::vector<uint8_t>(
      kFakeStatelessResetTokenData,
      kFakeStatelessResetTokenData + sizeof(kFakeStatelessResetTokenData));
}

TransportParameters::LegacyVersionInformation
CreateFakeLegacyVersionInformation() {
  TransportParameters::LegacyVersionInformation legacy_version_information;
  legacy_version_information.version = kFakeVersionLabel;
  legacy_version_information.supported_versions.push_back(kFakeVersionLabel);
  legacy_version_information.supported_versions.push_back(kFakeVersionLabel2);
  return legacy_version_information;
}

TransportParameters::VersionInformation CreateFakeVersionInformation() {
  TransportParameters::VersionInformation version_information;
  version_information.chosen_version = kFakeVersionLabel;
  version_information.other_versions.push_back(kFakeVersionLabel);
  return version_information;
}

// Make a TransportParameters that has a few fields set to help test comparison.
std::unique_ptr<TransportParameters> MakeFakeTransportParams() {
  auto params = std::make_unique<TransportParameters>();
  params->perspective = Perspective::IS_CLIENT;
  params->legacy_version_information = CreateFakeLegacyVersionInformation();
  params->version_information = CreateFakeVersionInformation();
  params->max_idle_timeout_ms.set_value(kFakeIdleTimeoutMilliseconds);
  params->stateless_reset_token = CreateFakeStatelessResetToken();
  params->max_udp_payload_size.set_value(kFakeMaxPacketSize);
  params->initial_max_data.set_value(kFakeInitialMaxData);
  params->disable_active_migration = kFakeDisableMigration;
  params->custom_parameters[kCustomParameter1] = kCustomParameter1Value;
  params->custom_parameters[kCustomParameter2] = kCustomParameter2Value;
  return params;
}

// Generated by running TlsClientHandshakerTest.ZeroRttResumption and in
// TlsClientHandshaker::InsertSession calling SSL_SESSION_to_bytes to serialize
// the received 0-RTT capable ticket.
static const char kCachedSession[] =
    "30820ad7020101020203040402130104206594ce84e61a866b56163c4ba09079aebf1d4f"
    "6cbcbd38dc9d7066a38a76c9cf0420ec9062063582a4cc0a44f9ff93256a195153ba6032"
    "0cf3c9189990932d838adaa10602046196f7b9a205020302a300a382039f3082039b3082"
    "0183a00302010202021001300d06092a864886f70d010105050030623111300f06035504"
    "030c08426f677573204941310b300906035504080c024d41310b30090603550406130255"
    "533121301f06092a864886f70d0109011612626f67757340626f6775732d69612e636f6d"
    "3110300e060355040a0c07426f6775734941301e170d3231303132383136323030315a17"
    "0d3331303132363136323030315a3069311d301b06035504030c14746573745f6563632e"
    "6578616d706c652e636f6d310b300906035504080c024d41310b30090603550406130255"
    "53311e301c06092a864886f70d010901160f626f67757340626f6775732e636f6d310e30"
    "0c060355040a0c05426f6775733059301306072a8648ce3d020106082a8648ce3d030107"
    "034200041ba5e2b6f24e64990b9f24ae6d23473d8c77fbcfb7f554f36559529a69a57170"
    "a10a81b7fe4a36ebf37b0a8c5e467a8443d8b8c002892aa5c1194bd843f42c9aa31f301d"
    "301b0603551d11041430128210746573742e6578616d706c652e636f6d300d06092a8648"
    "86f70d0101050500038202010019921d54ac06948763d609215f64f5d6540e3da886c6c9"
    "61bc737a437719b4621416ef1229f39282d7d3234e1a5d57535473066233bd246eec8e96"
    "1e0633cf4fe014c800e62599981820ec33d92e74ded0fa2953db1d81e19cb6890b6305b6"
    "3ede8d3e9fcf3c09f3f57283acf08aa57be4ee9a68d00bb3e2ded5920c619b5d83e5194a"
    "adb77ae5d61ed3e0a5670f0ae61cc3197329f0e71e3364dcab0405e9e4a6646adef8f022"
    "6415ec16c8046307b1769029fe780bd576114dde2fa9b4a32aa70bc436549a24ee4907a9"
    "045f6457ce8dfd8d62cc65315afe798ae1a948eefd70b035d415e73569c48fb20085de1a"
    "87de039e6b0b9a5fcb4069df27f3a7a1409e72d1ac739c72f29ef786134207e61c79855f"
    "c22e3ee5f6ad59a7b1ff0f18d79776f1c95efaebbebe381664132a58a1e7ff689945b7e0"
    "88634b0872feeefbf6be020884b994c6a7ff435f2b3f609077ff97cb509cfa17ff479b34"
    "e633e4b5bc46b20c5f27c80a2e2943f795a928acd5a3fc43c3af8425ad600c048b41d87e"
    "6361bc72fc4e5e44680a3d325674ba6ffa760d2fc7d9e4847a8e0dd9d35a543324e18b94"
    "2d42af6391ed1dd54a39e3f4a4c6b32486eb4ba72815dbd89c56fc053743a0b0483ce676"
    "15defce6800c629b99d0cbc56da162487f475b7c246099eaf1e6d10a022b2f49c6af1da3"
    "e8ed66096f267c4a76976b9572db7456ef90278330a4020400aa81b60481b3494e534543"
    "55524500f3439e548c21d2ad6e5634cc1cc0045730819702010102020304040213010400"
    "0420ec9062063582a4cc0a44f9ff93256a195153ba60320cf3c9189990932d838adaa106"
    "02046196f7b9a205020302a300a4020400b20302011db5060404130800cdb807020500ff"
    "ffffffb9050203093a80ba0404026833bb030101ffbc23042100d27d985bfce04833f02d"
    "38366b219f4def42bc4ba1b01844d1778db11731487dbd020400be020400b20302011db3"
    "8205da308205d6308203bea00302010202021000300d06092a864886f70d010105050030"
    "62310b3009060355040613025553310b300906035504080c024d413110300e060355040a"
    "0c07426f67757343413111300f06035504030c08426f6775732043413121301f06092a86"
    "4886f70d0109011612626f67757340626f6775732d63612e636f6d3020170d3231303132"
    "383136313935385a180f32303730303531313136313935385a30623111300f0603550403"
    "0c08426f677573204941310b300906035504080c024d41310b3009060355040613025553"
    "3121301f06092a864886f70d0109011612626f67757340626f6775732d69612e636f6d31"
    "10300e060355040a0c07426f677573494130820222300d06092a864886f70d0101010500"
    "0382020f003082020a028202010096c03a0ffc61bcedcd5ec9bf6f848b8a066b43f08377"
    "3af518a6a0044f22e666e24d2ae741954e344302c4be04612185bd53bcd848eb322bf900"
    "724eb0848047d647033ffbddb00f01d1de7c1cdb684f83c9bf5fd18ff60afad5a53b0d7d"
    "2c2a50abc38df019cd7f50194d05bc4597a1ef8570ea04069a2c36d74496af126573ca18"
    "8e470009b56250fadf2a04e837ee3837b36b1f08b7a0cfe2533d05f26484ce4e30203d01"
    "517fffd3da63d0341079ddce16e9ab4dbf9d4049e5cc52326031e645dd682fe6220d9e0e"
    "95451f5a82f3e1720dc13e8499466426a0bdbea9f6a76b3c9228dd3c79ab4dcc4c145ef0"
    "e78d1ee8bfd4650692d7e28a54bed809d8f7b37fe24c586be59cc46638531cb291c8c156"
    "8f08d67e768e51563e95a639c1f138b275ffad6a6a2a042ba9e26ad63c2ce63b600013f0"
    "a6f0703ee51c4f457f7bab0391c2fc4c5bb3213742c9cf9941bff68cc2e1cc96139d35ed"
    "1885244ddde0bf658416c486701841b81f7b17503d08c59a4db08a2a80755e007aa3b6c7"
    "eadcaa9e07c8325f3689f100de23970b12c9d9f6d0a8fb35ba0fd75c64410318db4a13ac"
    "3972ad16cdf6408af37013c7bcd7c42f20d6d04c3e39436c7531e8dafa219dd04b784ef0"
    "3c70ee5a4782b33cafa925aa3deca62a14aed704f179b932efabc2b0c5c15a8a99bfc9e6"
    "189dce7da50ea303594b6af9c933dd54b6e9d17c472d0203010001a38193308190300f06"
    "03551d130101ff040530030101ff301d0603551d0e041604141a98e80029a80992b7e5e0"
    "068ab9b3486cd839d6301f0603551d23041830168014780beeefe2fa419c48a438bdb30b"
    "e37ef0b7a94e300b0603551d0f0404030202a430130603551d25040c300a06082b060105"
    "05070301301b0603551d11041430128207426f67757343418207426f6775734941300d06"
    "092a864886f70d010105050003820201009e822ed8064b1aabaddf1340010ea147f68c06"
    "5a5a599ea305349f1b0e545a00817d6e55c7bf85560fab429ca72186c4d520b52f5cc121"
    "abd068b06f3111494431d2522efa54642f907059e7db80b73bb5ecf621377195b8700bba"
    "df798cece8c67a9571548d0e6592e81ae5d934877cb170aef18d3b97f635600fe0890d98"
    "f88b33fe3d1fd34c1c915beae4e5c0b133f476c40b21d220f16ce9cdd9e8f97a36a31723"
    "68875f052c9271648d9cb54687c6fdc3ea96f2908003bc5e5e79de00a21da7b8429f8b08"
    "af4c4d34641e386d72eabf5f01f106363f2ffd18969bf0bb9a4d17627c6427ff772c4308"
    "83c276feef5fc6dba9582c22fdbe9df7e8dfca375695f028ed588df54f3c86462dbf4c07"
    "91d80ca738988a1419c86bb4dd8d738b746921f01f39422e5ffd488b6f00195b996e6392"
    "3a820a32cd78b5989f339c0fcf4f269103964a30a16347d0ffdc8df1f3653ddc1515fa09"
    "22c7aef1af1fbcb23e93ae7622ab1ee11fcfa98319bad4c37c091cad46bd0337b3cc78b5"
    "5b9f1ea7994acc1f89c49a0b4cb540d2137e266fd43e56a9b5b778217b6f77df530e1eaf"
    "b3417262b5ddb86d3c6c5ac51e3f326c650dcc2434473973b7182c66220d1f3871bde7ee"
    "47d3f359d3d4c5bdd61baa684c03db4c75f9d6690c9e6e3abe6eaf5fa2c33c4daf26b373"
    "d85a1e8a7d671ac4a0a97b14e36e81280de4593bbb12da7695b5060404130800cdb60301"
    "0100b70402020403b807020500ffffffffb9050203093a80ba0404026833bb030101ffbd"
    "020400be020400";

class QuicClientSessionCacheTest : public QuicTest {
 public:
  QuicClientSessionCacheTest() : ssl_ctx_(SSL_CTX_new(TLS_method())) {
    clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
  }

 protected:
  bssl::UniquePtr<SSL_SESSION> NewSSLSession() {
    std::string cached_session =
        absl::HexStringToBytes(absl::string_view(kCachedSession));
    SSL_SESSION* session = SSL_SESSION_from_bytes(
        reinterpret_cast<const uint8_t*>(cached_session.data()),
        cached_session.size(), ssl_ctx_.get());
    QUICHE_DCHECK(session);
    return bssl::UniquePtr<SSL_SESSION>(session);
  }

  bssl::UniquePtr<SSL_SESSION> MakeTestSession(
      QuicTime::Delta timeout = kTimeout) {
    bssl::UniquePtr<SSL_SESSION> session = NewSSLSession();
    SSL_SESSION_set_time(session.get(), clock_.WallNow().ToUNIXSeconds());
    SSL_SESSION_set_timeout(session.get(), timeout.ToSeconds());
    return session;
  }

  bssl::UniquePtr<SSL_CTX> ssl_ctx_;
  MockClock clock_;
};

// Tests that simple insertion and lookup work correctly.
TEST_F(QuicClientSessionCacheTest, SingleSession) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);

  auto params2 = MakeFakeTransportParams();
  auto session2 = MakeTestSession();
  SSL_SESSION* unowned2 = session2.get();
  QuicServerId id2("b.com", 443);

  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(nullptr, cache.Lookup(id2, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(0u, cache.size());

  cache.Insert(id1, std::move(session), *params, nullptr);
  EXPECT_EQ(1u, cache.size());
  EXPECT_EQ(
      *params,
      *(cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get())->transport_params));
  EXPECT_EQ(nullptr, cache.Lookup(id2, clock_.WallNow(), ssl_ctx_.get()));
  // No session is available for id1, even though the entry exists.
  EXPECT_EQ(1u, cache.size());
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
  // Lookup() will trigger a deletion of invalid entry.
  EXPECT_EQ(0u, cache.size());

  auto session3 = MakeTestSession();
  SSL_SESSION* unowned3 = session3.get();
  QuicServerId id3("c.com", 443);
  cache.Insert(id3, std::move(session3), *params, nullptr);
  cache.Insert(id2, std::move(session2), *params2, nullptr);
  EXPECT_EQ(2u, cache.size());
  EXPECT_EQ(
      unowned2,
      cache.Lookup(id2, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());
  EXPECT_EQ(
      unowned3,
      cache.Lookup(id3, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());

  // Verify that the cache is cleared after Lookups.
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(nullptr, cache.Lookup(id2, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(nullptr, cache.Lookup(id3, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(0u, cache.size());
}

TEST_F(QuicClientSessionCacheTest, MultipleSessions) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);
  auto session2 = MakeTestSession();
  SSL_SESSION* unowned2 = session2.get();
  auto session3 = MakeTestSession();
  SSL_SESSION* unowned3 = session3.get();

  cache.Insert(id1, std::move(session), *params, nullptr);
  cache.Insert(id1, std::move(session2), *params, nullptr);
  cache.Insert(id1, std::move(session3), *params, nullptr);
  // The latest session is popped first.
  EXPECT_EQ(
      unowned3,
      cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());
  EXPECT_EQ(
      unowned2,
      cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());
  // Only two sessions are cached.
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
}

// Test that when a different TransportParameter is inserted for
// the same server id, the existing entry is removed.
TEST_F(QuicClientSessionCacheTest, DifferentTransportParams) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);
  auto session2 = MakeTestSession();
  auto session3 = MakeTestSession();
  SSL_SESSION* unowned3 = session3.get();

  cache.Insert(id1, std::move(session), *params, nullptr);
  cache.Insert(id1, std::move(session2), *params, nullptr);
  // tweak the transport parameters a little bit.
  params->perspective = Perspective::IS_SERVER;
  cache.Insert(id1, std::move(session3), *params, nullptr);
  auto resumption_state = cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get());
  EXPECT_EQ(unowned3, resumption_state->tls_session.get());
  EXPECT_EQ(*params.get(), *resumption_state->transport_params);
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
}

TEST_F(QuicClientSessionCacheTest, DifferentApplicationState) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);
  auto session2 = MakeTestSession();
  auto session3 = MakeTestSession();
  SSL_SESSION* unowned3 = session3.get();
  ApplicationState state;
  state.push_back('a');

  cache.Insert(id1, std::move(session), *params, &state);
  cache.Insert(id1, std::move(session2), *params, &state);
  cache.Insert(id1, std::move(session3), *params, nullptr);
  auto resumption_state = cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get());
  EXPECT_EQ(unowned3, resumption_state->tls_session.get());
  EXPECT_EQ(nullptr, resumption_state->application_state);
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
}

TEST_F(QuicClientSessionCacheTest, BothStatesDifferent) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);
  auto session2 = MakeTestSession();
  auto session3 = MakeTestSession();
  SSL_SESSION* unowned3 = session3.get();
  ApplicationState state;
  state.push_back('a');

  cache.Insert(id1, std::move(session), *params, &state);
  cache.Insert(id1, std::move(session2), *params, &state);
  params->perspective = Perspective::IS_SERVER;
  cache.Insert(id1, std::move(session3), *params, nullptr);
  auto resumption_state = cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get());
  EXPECT_EQ(unowned3, resumption_state->tls_session.get());
  EXPECT_EQ(*params.get(), *resumption_state->transport_params);
  EXPECT_EQ(nullptr, resumption_state->application_state);
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
}

// When the size limit is exceeded, the oldest entry should be erased.
TEST_F(QuicClientSessionCacheTest, SizeLimit) {
  QuicClientSessionCache cache(2);

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);

  auto session2 = MakeTestSession();
  SSL_SESSION* unowned2 = session2.get();
  QuicServerId id2("b.com", 443);

  auto session3 = MakeTestSession();
  SSL_SESSION* unowned3 = session3.get();
  QuicServerId id3("c.com", 443);

  cache.Insert(id1, std::move(session), *params, nullptr);
  cache.Insert(id2, std::move(session2), *params, nullptr);
  cache.Insert(id3, std::move(session3), *params, nullptr);

  EXPECT_EQ(2u, cache.size());
  EXPECT_EQ(
      unowned2,
      cache.Lookup(id2, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());
  EXPECT_EQ(
      unowned3,
      cache.Lookup(id3, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
}

TEST_F(QuicClientSessionCacheTest, ClearEarlyData) {
  QuicClientSessionCache cache;
  SSL_CTX_set_early_data_enabled(ssl_ctx_.get(), 1);
  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);
  auto session2 = MakeTestSession();

  EXPECT_TRUE(SSL_SESSION_early_data_capable(session.get()));
  EXPECT_TRUE(SSL_SESSION_early_data_capable(session2.get()));

  cache.Insert(id1, std::move(session), *params, nullptr);
  cache.Insert(id1, std::move(session2), *params, nullptr);

  cache.ClearEarlyData(id1);

  auto resumption_state = cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get());
  EXPECT_FALSE(
      SSL_SESSION_early_data_capable(resumption_state->tls_session.get()));
  resumption_state = cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get());
  EXPECT_FALSE(
      SSL_SESSION_early_data_capable(resumption_state->tls_session.get()));
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
}

// Expired session isn't considered valid and nullptr will be returned upon
// Lookup.
TEST_F(QuicClientSessionCacheTest, Expiration) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  QuicServerId id1("a.com", 443);

  auto session2 = MakeTestSession(3 * kTimeout);
  SSL_SESSION* unowned2 = session2.get();
  QuicServerId id2("b.com", 443);

  cache.Insert(id1, std::move(session), *params, nullptr);
  cache.Insert(id2, std::move(session2), *params, nullptr);

  EXPECT_EQ(2u, cache.size());
  // Expire the session.
  clock_.AdvanceTime(kTimeout * 2);
  // The entry has not been removed yet.
  EXPECT_EQ(2u, cache.size());

  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(1u, cache.size());
  EXPECT_EQ(
      unowned2,
      cache.Lookup(id2, clock_.WallNow(), ssl_ctx_.get())->tls_session.get());
  EXPECT_EQ(1u, cache.size());
}

TEST_F(QuicClientSessionCacheTest, RemoveExpiredEntriesAndClear) {
  QuicClientSessionCache cache;

  auto params = MakeFakeTransportParams();
  auto session = MakeTestSession();
  quic::QuicServerId id1("a.com", 443);

  auto session2 = MakeTestSession(3 * kTimeout);
  quic::QuicServerId id2("b.com", 443);

  cache.Insert(id1, std::move(session), *params, nullptr);
  cache.Insert(id2, std::move(session2), *params, nullptr);

  EXPECT_EQ(2u, cache.size());
  // Expire the session.
  clock_.AdvanceTime(kTimeout * 2);
  // The entry has not been removed yet.
  EXPECT_EQ(2u, cache.size());

  // Flush expired sessions.
  cache.RemoveExpiredEntries(clock_.WallNow());

  // session is expired and should be flushed.
  EXPECT_EQ(nullptr, cache.Lookup(id1, clock_.WallNow(), ssl_ctx_.get()));
  EXPECT_EQ(1u, cache.size());

  cache.Clear();
  EXPECT_EQ(0u, cache.size());
}

}  // namespace
}  // namespace test
}  // namespace quic
