#include "services/network/trust_tokens/trust_token_persister.h"
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include "base/functional/callback.h"
#include "base/task/single_thread_task_runner.h"
#include "base/test/bind.h"
#include "base/test/protobuf_matchers.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "services/network/public/mojom/trust_tokens.mojom.h"
#include "services/network/trust_tokens/in_memory_trust_token_persister.h"
#include "services/network/trust_tokens/proto/public.pb.h"
#include "services/network/trust_tokens/proto/storage.pb.h"
#include "services/network/trust_tokens/sqlite_trust_token_persister.h"
#include "services/network/trust_tokens/suitable_trust_token_origin.h"
#include "services/network/trust_tokens/trust_token_database_owner.h"
#include "services/network/trust_tokens/types.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using ::base::test::EqualsProto;
using ::testing::IsNull;
using ::testing::Pointee;
namespace network {
namespace {
const base::Time before_begin =
base::Time::FromDeltaSinceWindowsEpoch(base::Microseconds(12345));
const base::Time begin_time = before_begin + base::Microseconds(1);
const base::Time time_in_window = begin_time + base::Seconds(42);
const base::Time end_time = time_in_window + base::Seconds(1);
const base::Time after_end_time = end_time + base::Microseconds(1);
const auto TimestampFromMicros = [](int64_t micros) -> Timestamp {
return internal::TimeToTimestamp(
base::Time::FromDeltaSinceWindowsEpoch(base::Microseconds(micros)));
};
const auto GenericKeyMatcher =
[](const SuitableTrustTokenOrigin& origin,
const SuitableTrustTokenOrigin& origin_to_delete) -> bool {
return (origin == origin_to_delete);
};
const auto GenericTimeMatcher = [](const base::Time& begin_time,
const base::Time& end_time,
const base::Time& creation_time) -> bool {
const base::TimeDelta creation_delta =
creation_time.ToDeltaSinceWindowsEpoch();
const base::TimeDelta begin_delta = begin_time.ToDeltaSinceWindowsEpoch();
const base::TimeDelta end_delta = end_time.ToDeltaSinceWindowsEpoch();
if ((creation_delta < begin_delta) || (creation_delta > end_delta)) {
return false;
}
return true;
};
const auto AlwaysFalseKeyMatcher = base::BindRepeating(
[](const SuitableTrustTokenOrigin& origin) -> bool { return false; });
const auto AlwaysFalseTimeMatcher = base::BindRepeating(
[](const base::Time& creation_time) -> bool { return false; });
const auto AlwaysTrueKeyMatcher = base::BindRepeating(
[](const SuitableTrustTokenOrigin& origin) -> bool { return true; });
const auto AlwaysTrueTimeMatcher = base::BindRepeating(
[](const base::Time& creation_time) -> bool { return true; });
class InMemoryTrustTokenPersisterFactory {
public:
static std::unique_ptr<TrustTokenPersister> Create() {
return std::make_unique<InMemoryTrustTokenPersister>();
}
};
class NoDatabaseSqliteTrustTokenPersisterFactory {
public:
static std::unique_ptr<TrustTokenPersister> Create() {
std::unique_ptr<TrustTokenDatabaseOwner> owner;
TrustTokenDatabaseOwner::Create(
base::BindOnce([](sql::Database*) { return false; }),
base::SingleThreadTaskRunner::GetCurrentDefault(),
base::TimeDelta(),
base::BindLambdaForTesting(
[&owner](std::unique_ptr<TrustTokenDatabaseOwner> created) {
owner = std::move(created);
base::RunLoop().Quit();
}));
base::RunLoop().RunUntilIdle();
CHECK(owner);
return std::make_unique<SQLiteTrustTokenPersister>(std::move(owner));
}
};
class EndToEndSqliteTrustTokenPersisterFactory {
public:
static std::unique_ptr<TrustTokenPersister> Create() {
std::unique_ptr<TrustTokenDatabaseOwner> owner;
TrustTokenDatabaseOwner::Create(
base::BindOnce(
[](sql::Database* db) { return db->OpenInMemory(); }),
base::SingleThreadTaskRunner::GetCurrentDefault(),
base::TimeDelta(),
base::BindLambdaForTesting(
[&owner](std::unique_ptr<TrustTokenDatabaseOwner> created) {
owner = std::move(created);
base::RunLoop().Quit();
}));
base::RunLoop().RunUntilIdle();
CHECK(owner);
return std::make_unique<SQLiteTrustTokenPersister>(std::move(owner));
}
};
}
template <typename Factory>
class TrustTokenPersisterTest : public ::testing::Test {};
typedef ::testing::Types<InMemoryTrustTokenPersisterFactory,
NoDatabaseSqliteTrustTokenPersisterFactory,
EndToEndSqliteTrustTokenPersisterFactory>
TrustTokenPersisterFactoryTypes;
class PersisterFactoryTypeNames {
public:
template <typename T>
static std::string GetName(int) {
if (std::is_same<T, InMemoryTrustTokenPersisterFactory>())
return "InMemoryPersister";
if (std::is_same<T, NoDatabaseSqliteTrustTokenPersisterFactory>())
return "SQLitePersisterMemoryFallback";
if (std::is_same<T, EndToEndSqliteTrustTokenPersisterFactory>())
return "SQLitePersisterOnDisk";
NOTREACHED();
}
};
TYPED_TEST_SUITE(TrustTokenPersisterTest,
TrustTokenPersisterFactoryTypes,
PersisterFactoryTypeNames);
TYPED_TEST(TrustTokenPersisterTest, NegativeResults) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
auto origin = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
EXPECT_THAT(persister->GetIssuerConfig(origin), IsNull());
EXPECT_THAT(persister->GetToplevelConfig(origin), IsNull());
EXPECT_THAT(persister->GetIssuerToplevelPairConfig(origin, origin), IsNull());
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, StoresIssuerConfigs) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig config;
TrustToken my_token;
my_token.set_body("token token token");
*config.add_tokens() = my_token;
auto config_to_store = std::make_unique<TrustTokenIssuerConfig>(config);
auto origin = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
persister->SetIssuerConfig(origin, std::move(config_to_store));
env.RunUntilIdle();
auto result = persister->GetIssuerConfig(origin);
EXPECT_THAT(result, Pointee(EqualsProto(config)));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, StoresToplevelConfigs) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenToplevelConfig config;
*config.add_associated_issuers() = "an issuer";
auto config_to_store = std::make_unique<TrustTokenToplevelConfig>(config);
auto origin = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
persister->SetToplevelConfig(origin, std::move(config_to_store));
env.RunUntilIdle();
auto result = persister->GetToplevelConfig(origin);
EXPECT_THAT(result, Pointee(EqualsProto(config)));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, StoresIssuerToplevelPairConfigs) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerToplevelPairConfig config;
*config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*config.mutable_last_redemption() = TimestampFromMicros(200);
auto config_to_store =
std::make_unique<TrustTokenIssuerToplevelPairConfig>(config);
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerToplevelPairConfig(issuer, toplevel,
std::move(config_to_store));
env.RunUntilIdle();
auto result = persister->GetIssuerToplevelPairConfig(issuer, toplevel);
EXPECT_THAT(result, Pointee(EqualsProto(config)));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, CallDeleteOnEmptyPersister) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
EXPECT_FALSE(
persister->DeleteForOrigins(AlwaysTrueKeyMatcher, AlwaysTrueTimeMatcher));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, DeletesIssuerToplevelKeyedDataNoRR) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerToplevelPairConfig pair_config;
*pair_config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*pair_config.mutable_last_redemption() = TimestampFromMicros(200);
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerToplevelPairConfig(
issuer, toplevel,
std::make_unique<TrustTokenIssuerToplevelPairConfig>(pair_config));
env.RunUntilIdle();
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer), AlwaysFalseTimeMatcher));
env.RunUntilIdle();
EXPECT_FALSE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
DeletesIssuerToplevelKeyedDataHasRRNoCreationTime) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerToplevelPairConfig pair_config;
*pair_config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*pair_config.mutable_last_redemption() = TimestampFromMicros(200);
TrustTokenRedemptionRecord rr;
rr.set_body("rr body");
rr.set_token_verification_key("key");
rr.set_lifetime(1234567);
*(pair_config.mutable_redemption_record()) = rr;
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerToplevelPairConfig(
issuer, toplevel,
std::make_unique<TrustTokenIssuerToplevelPairConfig>(pair_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
EXPECT_FALSE(persister->DeleteForOrigins(AlwaysFalseKeyMatcher,
AlwaysTrueTimeMatcher));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
env.RunUntilIdle();
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, toplevel),
AlwaysFalseTimeMatcher));
env.RunUntilIdle();
EXPECT_FALSE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
DeletesIssuerToplevelKeyedDataHasRRHasCreationTimeNoMatch) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerToplevelPairConfig pair_config;
*pair_config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*pair_config.mutable_last_redemption() = TimestampFromMicros(100);
TrustTokenRedemptionRecord rr;
rr.set_body("rr body");
rr.set_token_verification_key("key");
rr.set_lifetime(1234567);
*rr.mutable_creation_time() = internal::TimeToTimestamp(before_begin);
*(pair_config.mutable_redemption_record()) = rr;
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerToplevelPairConfig(
issuer, toplevel,
std::make_unique<TrustTokenIssuerToplevelPairConfig>(pair_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
EXPECT_FALSE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
*pair_config.mutable_redemption_record()->mutable_creation_time() =
internal::TimeToTimestamp(after_end_time);
env.RunUntilIdle();
EXPECT_FALSE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
DeletesIssuerToplevelKeyedDataHasRRHasCreationTimeMatches) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerToplevelPairConfig pair_config;
*pair_config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*pair_config.mutable_last_redemption() = TimestampFromMicros(200);
TrustTokenRedemptionRecord rr;
rr.set_body("rr body");
rr.set_token_verification_key("key");
rr.set_lifetime(1234567);
*rr.mutable_creation_time() = internal::TimeToTimestamp(time_in_window);
*(pair_config.mutable_redemption_record()) = rr;
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerToplevelPairConfig(
issuer, toplevel,
std::make_unique<TrustTokenIssuerToplevelPairConfig>(pair_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, toplevel),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_FALSE(persister->GetIssuerToplevelPairConfig(issuer, toplevel));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, DeletesIssuerKeyedDataKeyNoTokens) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig issuer_config;
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_FALSE(persister->DeleteForOrigins(AlwaysFalseKeyMatcher,
AlwaysTrueTimeMatcher));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer), AlwaysFalseTimeMatcher));
EXPECT_FALSE(persister->GetIssuerConfig(issuer));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
DeletesIssuerKeyedDataKeyHasTokenNoCreationTime) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig issuer_config;
TrustToken* token = issuer_config.add_tokens();
token->set_signing_key("key");
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer), AlwaysFalseTimeMatcher));
env.RunUntilIdle();
EXPECT_FALSE(persister->GetIssuerConfig(issuer));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
DeletesIssuerKeyedDataKeyHasTokenWithCreationTime) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig issuer_config;
TrustToken* token = issuer_config.add_tokens();
token->set_signing_key("key");
*token->mutable_creation_time() = internal::TimeToTimestamp(before_begin);
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_FALSE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerConfig(issuer));
issuer_config.clear_tokens();
token = issuer_config.add_tokens();
token->set_signing_key("key");
*token->mutable_creation_time() = internal::TimeToTimestamp(time_in_window);
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_FALSE(persister->GetIssuerConfig(issuer));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, DeletesToplevelKeyedData) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenToplevelConfig toplevel_config;
*toplevel_config.add_associated_issuers() = "some issuer";
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
persister->SetToplevelConfig(
toplevel, std::make_unique<TrustTokenToplevelConfig>(toplevel_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetToplevelConfig(toplevel));
EXPECT_FALSE(persister->DeleteForOrigins(AlwaysFalseKeyMatcher,
AlwaysTrueTimeMatcher));
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, toplevel),
AlwaysFalseTimeMatcher));
env.RunUntilIdle();
ASSERT_FALSE(persister->GetToplevelConfig(toplevel));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, RetrievesAvailableTrustTokens) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
auto result = persister->GetStoredTrustTokenCounts();
EXPECT_EQ(result.size(), 0ul);
TrustTokenIssuerConfig config;
TrustToken my_token;
my_token.set_body("token token token");
*my_token.mutable_creation_time() = internal::TimeToTimestamp(time_in_window);
*config.add_tokens() = my_token;
auto config_to_store = std::make_unique<TrustTokenIssuerConfig>(config);
auto origin = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
persister->SetIssuerConfig(origin, std::move(config_to_store));
env.RunUntilIdle();
result = persister->GetStoredTrustTokenCounts();
EXPECT_EQ(result.size(), 1ul);
EXPECT_EQ(result.begin()->first, origin);
EXPECT_EQ(result.begin()->second, 1);
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
RetrievesRedemptionRecordsByIssuerToplevelPair) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
auto toplevel_a = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto toplevel_b = *SuitableTrustTokenOrigin::Create(GURL("https://b.com/"));
auto issuer_a =
*SuitableTrustTokenOrigin::Create(GURL("https://issuer_a.com/"));
auto issuer_b =
*SuitableTrustTokenOrigin::Create(GURL("https://issuer_b.com/"));
auto result = persister->GetRedemptionRecords();
EXPECT_TRUE(result.empty()) << result.size();
TrustTokenIssuerToplevelPairConfig config;
TrustTokenRedemptionRecord rr_a;
Timestamp last_redemption = TimestampFromMicros(200);
*rr_a.mutable_creation_time() = internal::TimeToTimestamp(before_begin);
*config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*config.mutable_last_redemption() = last_redemption;
*config.mutable_redemption_record() = rr_a;
auto config_to_store =
std::make_unique<TrustTokenIssuerToplevelPairConfig>(config);
persister->SetIssuerToplevelPairConfig(issuer_a, toplevel_a,
std::move(config_to_store));
env.RunUntilIdle();
result = persister->GetRedemptionRecords();
EXPECT_EQ(result.size(), 1ul);
EXPECT_TRUE(result.contains(issuer_a.origin()));
EXPECT_EQ(result[issuer_a][0]->toplevel_origin, toplevel_a.origin());
EXPECT_EQ(result[issuer_a][0]->last_redemption,
internal::TimestampToTime(last_redemption));
TrustTokenRedemptionRecord rr_b;
*rr_b.mutable_creation_time() = internal::TimeToTimestamp(before_begin);
*config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*config.mutable_last_redemption() = last_redemption;
*config.mutable_redemption_record() = rr_b;
auto config_to_store_b =
std::make_unique<TrustTokenIssuerToplevelPairConfig>(config);
persister->SetIssuerToplevelPairConfig(issuer_b, toplevel_b,
std::move(config_to_store_b));
env.RunUntilIdle();
result = persister->GetRedemptionRecords();
EXPECT_EQ(result.size(), 2ul);
EXPECT_TRUE(result.contains(issuer_b.origin()));
EXPECT_EQ(result[issuer_b][0]->toplevel_origin, toplevel_b.origin());
EXPECT_EQ(result[issuer_b][0]->last_redemption,
internal::TimestampToTime(last_redemption));
auto config_to_store_c =
std::make_unique<TrustTokenIssuerToplevelPairConfig>(config);
persister->SetIssuerToplevelPairConfig(issuer_a, toplevel_b,
std::move(config_to_store_c));
env.RunUntilIdle();
result = persister->GetRedemptionRecords();
EXPECT_EQ(result.size(), 2ul);
EXPECT_EQ(result[issuer_a].size(), 2ul);
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, SomeTokensAreOutOfTimeWindow) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig issuer_config;
{
TrustToken* first_token = issuer_config.add_tokens();
first_token->set_signing_key("key");
first_token->set_body("before begin time");
*first_token->mutable_creation_time() =
internal::TimeToTimestamp(before_begin);
TrustToken* second_token = issuer_config.add_tokens();
second_token->set_signing_key("key");
second_token->set_body("between begin and end time");
*second_token->mutable_creation_time() =
internal::TimeToTimestamp(time_in_window);
TrustToken* third_token = issuer_config.add_tokens();
third_token->set_signing_key("key");
third_token->set_body("after end");
*third_token->mutable_creation_time() =
internal::TimeToTimestamp(after_end_time);
}
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_EQ(persister->GetIssuerConfig(issuer)->tokens().size(), 2);
EXPECT_EQ(persister->GetIssuerConfig(issuer)->tokens()[0].body(),
"before begin time");
EXPECT_EQ(persister->GetIssuerConfig(issuer)->tokens()[1].body(),
"after end");
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, AllTokensAreWithinTimeWindow) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig issuer_config;
for (int i = 0; i < 5; ++i) {
TrustToken* b_token = issuer_config.add_tokens();
b_token->set_signing_key("key");
b_token->set_body("token towards begin time");
*b_token->mutable_creation_time() =
internal::TimeToTimestamp(begin_time + base::Microseconds(i));
TrustToken* e_token = issuer_config.add_tokens();
e_token->set_signing_key("key");
e_token->set_body("token towards end time");
*e_token->mutable_creation_time() =
internal::TimeToTimestamp(end_time - base::Microseconds(i));
}
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_TRUE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_FALSE(persister->GetIssuerConfig(issuer));
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest, AllTokensAreOutOfTimeWindow) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerConfig issuer_config;
{
TrustToken* first_token = issuer_config.add_tokens();
first_token->set_signing_key("key");
first_token->set_body("before begin time");
*first_token->mutable_creation_time() =
internal::TimeToTimestamp(before_begin);
TrustToken* second_token = issuer_config.add_tokens();
second_token->set_signing_key("key");
second_token->set_body("after end");
*second_token->mutable_creation_time() =
internal::TimeToTimestamp(after_end_time);
}
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerConfig(
issuer, std::make_unique<TrustTokenIssuerConfig>(issuer_config));
env.RunUntilIdle();
ASSERT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_FALSE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
EXPECT_TRUE(persister->GetIssuerConfig(issuer));
EXPECT_EQ(persister->GetIssuerConfig(issuer)->tokens().size(), 2);
EXPECT_EQ(persister->GetIssuerConfig(issuer)->tokens()[0].body(),
"before begin time");
EXPECT_EQ(persister->GetIssuerConfig(issuer)->tokens()[1].body(),
"after end");
persister.reset();
env.RunUntilIdle();
}
TYPED_TEST(TrustTokenPersisterTest,
DoNotDeleteOutOfTimeWindowRedemptionRecord) {
base::test::TaskEnvironment env;
std::unique_ptr<TrustTokenPersister> persister = TypeParam::Create();
env.RunUntilIdle();
TrustTokenIssuerToplevelPairConfig config;
*config.mutable_penultimate_redemption() = TimestampFromMicros(100);
*config.mutable_last_redemption() = TimestampFromMicros(200);
TrustTokenRedemptionRecord rr;
rr.set_body("rr body");
rr.set_token_verification_key("key");
rr.set_lifetime(1234567);
*rr.mutable_creation_time() = internal::TimeToTimestamp(before_begin);
*(config.mutable_redemption_record()) = rr;
auto config_to_store =
std::make_unique<TrustTokenIssuerToplevelPairConfig>(config);
auto toplevel = *SuitableTrustTokenOrigin::Create(GURL("https://a.com/"));
auto issuer = *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"));
persister->SetIssuerToplevelPairConfig(issuer, toplevel,
std::move(config_to_store));
env.RunUntilIdle();
EXPECT_FALSE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, issuer),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
auto result = persister->GetIssuerToplevelPairConfig(issuer, toplevel);
EXPECT_THAT(result, Pointee(EqualsProto(config)));
*rr.mutable_creation_time() = internal::TimeToTimestamp(after_end_time);
*(result->mutable_redemption_record()) = rr;
env.RunUntilIdle();
EXPECT_FALSE(persister->DeleteForOrigins(
base::BindRepeating(GenericKeyMatcher, toplevel),
base::BindRepeating(GenericTimeMatcher, begin_time, end_time)));
env.RunUntilIdle();
result = persister->GetIssuerToplevelPairConfig(issuer, toplevel);
EXPECT_THAT(result, Pointee(EqualsProto(config)));
persister.reset();
env.RunUntilIdle();
}
}