blob: 272a76fa1bdd7f4dc26e7839614e873528682ae8 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <utility>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/memory/scoped_refptr.h"
#include "base/strings/string_piece.h"
#include "base/time/time.h"
#include "components/origin_trials/browser/origin_trials.h"
#include "components/origin_trials/common/persisted_trial_token.h"
#include "components/origin_trials/test/test_persistence_provider.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/origin_trials/scoped_test_origin_trial_policy.h"
#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace origin_trials {
namespace {
const char kPersistentTrialName[] = "FrobulatePersistent";
const char kNonPersistentTrialName[] = "Frobulate";
const char kPersistentExpiryPeriodTrialName[] =
"FrobulatePersistentExpiryGracePeriod";
const char kPersistentThirdPartyDeprecationTrialName[] =
"FrobulatePersistentThirdPartyDeprecation";
const char kInvalidTrialName[] = "InvalidTrial";
const char kTrialEnabledOriginA[] = "https://enabled.example.com";
const char kTrialEnabledOriginB[] = "https://enabled.alternate.com";
const char kThirdPartyTrialEnabledOrigin[] = "https://enabled.thirdparty.com";
// A dummy value that hasn't been explicitly disabled
const char kDummyTokenSignature[] = "";
const base::Time kValidTime = base::Time::FromTimeT(1000000000);
const base::Time kExpiryTime = base::Time::FromTimeT(2000000000);
// Valid header token for FrobulatePersistent
// generated with
// tools/origin_trials/generate_token.py enabled.example.com FrobulatePersistent
// --expire-timestamp=2000000000
const char kFrobulatePersistentToken[] =
"A5J4wscfmyiy3zsOMNASl25jJffHq/XGKNoFCSWoAsL0aXv+ugtTQoE/"
"Cs3a6pDezyQpKfYy10kcbdVC4i1n8AQAAABleyJvcmlnaW4iOiAiaHR0cHM6Ly9lbmFibGVkLm"
"V4YW1wbGUuY29tOjQ0MyIsICJmZWF0dXJlIjogIkZyb2J1bGF0ZVBlcnNpc3RlbnQiLCAiZXhw"
"aXJ5IjogMjAwMDAwMDAwMH0=";
// Valid header token for FrobulatePersistent
// generated with
// tools/origin_trials/generate_token.py enabled.alternate.com
// FrobulatePersistent
// --expire-timestamp=2000000000
const char kFrobulatePersistentTokenAlternate[] =
"A9djuSDQQSirNBctmtYIXSXBz9NyOjFWTMQeuZ2N3AaBA0O/"
"Rk8e1hZ8t5adUNzO5O+"
"vGamPUaicRBPNKwe2TAYAAABneyJvcmlnaW4iOiAiaHR0cHM6Ly9lbmFibGVkLmFsdGVybmF0Z"
"S5jb206NDQzIiwgImZlYXR1cmUiOiAiRnJvYnVsYXRlUGVyc2lzdGVudCIsICJleHBpcnkiOiA"
"yMDAwMDAwMDAwfQ==";
// Valid header token for Frobulate
// generated with
// tools/origin_trials/generate_token.py enabled.example.com Frobulate
// --expire-timestamp=2000000000
const char kFrobulateToken[] =
"A2QF2oWLF7q+qYSwt+"
"AvY6DSGE5QAb9Aeg7eOmbanVINtCJcCjZtNAtUUE88BB5UlvOMpPUUQjfgs3LTO0YXzAcAAABb"
"eyJvcmlnaW4iOiAiaHR0cHM6Ly9lbmFibGVkLmV4YW1wbGUuY29tOjQ0MyIsICJmZWF0dXJlIj"
"ogIkZyb2J1bGF0ZSIsICJleHBpcnkiOiAyMDAwMDAwMDAwfQ==";
// Valid header token for Frobulate
// generated with
// tools/origin_trials/generate_token.py enabled.example.com
// FrobulateManualCompletion
// --expire-timestamp=2000000000
const char kFrobulateManualCompletionToken[] =
"A4TCodS8fnQFVyShubc4TKr+"
"Ss6br97EBk4Kh1bQiskjJHwHXKjhxMjwviiL60RD4byiVF3D9UmoPdXcz7Kg8w8AAAB2eyJvcm"
"lnaW4iOiAiaHR0cHM6Ly9lbmFibGVkLmV4YW1wbGUuY29tOjQ0MyIsICJmZWF0dXJlIjogIkZy"
"b2J1bGF0ZVBlcnNpc3RlbnRFeHBpcnlHcmFjZVBlcmlvZCIsICJleHBpcnkiOiAyMDAwMDAwMD"
"AwfQ==";
// Valid header token for FrobulatePersistentExpiryGracePeriod
// generated with
// tools/origin_trials/generate_token.py enabled.example.com
// FrobulatePersistentExpiryGracePeriod
// --expire-timestamp=2000000000
const char kFrobulatePersistentExpiryGracePeriodToken[] =
"A4TCodS8fnQFVyShubc4TKr+"
"Ss6br97EBk4Kh1bQiskjJHwHXKjhxMjwviiL60RD4byiVF3D9UmoPdXcz7Kg8w8AAAB2eyJvcm"
"lnaW4iOiAiaHR0cHM6Ly9lbmFibGVkLmV4YW1wbGUuY29tOjQ0MyIsICJmZWF0dXJlIjogIkZy"
"b2J1bGF0ZVBlcnNpc3RlbnRFeHBpcnlHcmFjZVBlcmlvZCIsICJleHBpcnkiOiAyMDAwMDAwMD"
"AwfQ==";
// Valid third-party token for FrobulatePersistent
// generated with
// tools/origin_trials/generate_token.py enabled.thirdparty.com
// FrobulatePersistent --expire-timestamp=2000000000 --is-third-party
const char kFrobulatePersistentThirdPartyToken[] =
"A0k800P9maNhwX47OMx4NJk1cxcfwvudfdr4Vq12DLVLMqDlnOGxGJvxH4SkY2UUGmIt4SCuec"
"zRqRHI81k9/"
"w0AAAB+"
"eyJvcmlnaW4iOiAiaHR0cHM6Ly9lbmFibGVkLnRoaXJkcGFydHkuY29tOjQ0MyIsICJmZWF0dX"
"JlIjogIkZyb2J1bGF0ZVBlcnNpc3RlbnQiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMCwgImlzVGhp"
"cmRQYXJ0eSI6IHRydWV9";
// Valid token for FrobulatePersistentThirdPartyDeprecation
// generated with
// tools/origin_trials/generate_token.py enabled.thirdparty.com
// FrobulatePersistentThirdPartyDeprecation --expire-timestamp=2000000000
// --is-third-party
const char kFrobulatePersistentThirdPartyDeprecationToken[] =
"Az+ztSNd9o+3cmaiCk7QgSU5/2jSa1qiNKsoJOOxvMVxf/"
"8xPWsKraWc0US05bYHmTAIdzZAxh1DMMRhMir5yg4AAACTeyJvcmlnaW4iOiAiaHR0cHM6Ly9l"
"bmFibGVkLnRoaXJkcGFydHkuY29tOjQ0MyIsICJmZWF0dXJlIjogIkZyb2J1bGF0ZVBlcnNpc3"
"RlbnRUaGlyZFBhcnR5RGVwcmVjYXRpb24iLCAiZXhwaXJ5IjogMjAwMDAwMDAwMCwgImlzVGhp"
"cmRQYXJ0eSI6IHRydWV9";
class OpenScopedTestOriginTrialPolicy
: public blink::ScopedTestOriginTrialPolicy {
public:
OpenScopedTestOriginTrialPolicy() = default;
~OpenScopedTestOriginTrialPolicy() override = default;
// Check if the passed |trial_name| has been disabled.
bool IsFeatureDisabled(base::StringPiece trial_name) const override {
return disabled_trials_.contains(trial_name);
}
bool IsTokenDisabled(base::StringPiece token_signature) const override {
return disabled_signatures_.contains(token_signature);
}
// Check if the passed |trial_name| has been disabled.
bool IsFeatureDisabledForUser(base::StringPiece trial_name) const override {
return user_disabled_trials_.contains(trial_name);
}
void DisableTrial(base::StringPiece trial) {
disabled_trials_.emplace(trial);
}
void DisableToken(base::StringPiece token_signature) {
disabled_signatures_.emplace(token_signature);
}
void DisableTrialForUser(base::StringPiece trial_name) {
user_disabled_trials_.emplace(trial_name);
}
private:
base::flat_set<std::string> disabled_trials_;
base::flat_set<std::string> disabled_signatures_;
base::flat_set<std::string> user_disabled_trials_;
};
} // namespace
class OriginTrialsTest : public testing::Test {
public:
OriginTrialsTest()
: origin_trials_(std::make_unique<test::TestPersistenceProvider>(),
std::make_unique<blink::TrialTokenValidator>()),
trial_enabled_origin_(url::Origin::Create(GURL(kTrialEnabledOriginA))) {
}
OriginTrialsTest(const OriginTrialsTest&) = delete;
OriginTrialsTest& operator=(const OriginTrialsTest&) = delete;
~OriginTrialsTest() override = default;
// PersistTrialsFromTokens using |origin| as partition origin.
void PersistTrialsFromTokens(const url::Origin& origin,
base::span<std::string> tokens,
base::Time time) {
origin_trials_.PersistTrialsFromTokens(origin,
/* partition_origin*/ origin, tokens,
time);
}
// GetPersistedTrialsForOrigin using |trial_origin| as partition origin.
base::flat_set<std::string> GetPersistedTrialsForOrigin(
const url::Origin& trial_origin,
base::Time lookup_time) {
return origin_trials_.GetPersistedTrialsForOrigin(
trial_origin, /* partition_origin */ trial_origin, lookup_time);
}
// IsTrialPersistedForOrigin using |origin| as partition origin.
bool IsTrialPersistedForOrigin(const url::Origin& origin,
const std::string& trial_name,
base::Time lookup_time) {
return origin_trials_.IsTrialPersistedForOrigin(
origin, /* partition_origin */ origin, trial_name, lookup_time);
}
std::string GetTokenPartitionSite(const url::Origin& origin) {
return OriginTrials::GetTokenPartitionSite(origin);
}
// Test helper that creates an origin for the domain_name with https scheme
// and port 443.
url::Origin DomainAsOrigin(const std::string& domain_name) {
return url::Origin::CreateFromNormalizedTuple("https", domain_name, 443);
}
protected:
OriginTrials origin_trials_;
url::Origin trial_enabled_origin_;
OpenScopedTestOriginTrialPolicy origin_trial_policy_;
};
TEST_F(OriginTrialsTest, CleanObjectHasNoPersistentTrials) {
EXPECT_TRUE(
GetPersistedTrialsForOrigin(trial_enabled_origin_, kValidTime).empty());
}
TEST_F(OriginTrialsTest, EnabledTrialsArePersisted) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
base::flat_set<std::string> enabled_trials =
GetPersistedTrialsForOrigin(trial_enabled_origin_, kValidTime);
ASSERT_EQ(1ul, enabled_trials.size());
EXPECT_TRUE(enabled_trials.contains(kPersistentTrialName));
}
TEST_F(OriginTrialsTest, OnlyPersistentTrialsAreEnabled) {
std::vector<std::string> tokens = {kFrobulateToken,
kFrobulatePersistentToken};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
base::flat_set<std::string> enabled_trials =
GetPersistedTrialsForOrigin(trial_enabled_origin_, kValidTime);
ASSERT_EQ(1ul, enabled_trials.size());
EXPECT_TRUE(enabled_trials.contains(kPersistentTrialName));
EXPECT_FALSE(enabled_trials.contains(kNonPersistentTrialName));
}
TEST_F(OriginTrialsTest, ResetClearsPersistedTrials) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
EXPECT_FALSE(
GetPersistedTrialsForOrigin(trial_enabled_origin_, kValidTime).empty());
tokens = {};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
EXPECT_TRUE(
GetPersistedTrialsForOrigin(trial_enabled_origin_, kValidTime).empty());
}
TEST_F(OriginTrialsTest, TrialNotEnabledByDefault) {
EXPECT_FALSE(IsTrialPersistedForOrigin(trial_enabled_origin_,
kPersistentTrialName, kValidTime));
}
TEST_F(OriginTrialsTest, TrialEnablesFeature) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
EXPECT_TRUE(IsTrialPersistedForOrigin(trial_enabled_origin_,
kPersistentTrialName, kValidTime));
}
TEST_F(OriginTrialsTest, TrialDoesNotEnableOtherFeatures) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
EXPECT_FALSE(IsTrialPersistedForOrigin(trial_enabled_origin_,
kNonPersistentTrialName, kValidTime));
}
TEST_F(OriginTrialsTest, TokensCanBeAppended) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
PersistTrialsFromTokens(trial_enabled_origin_, tokens, kValidTime);
EXPECT_TRUE(IsTrialPersistedForOrigin(trial_enabled_origin_,
kPersistentTrialName, kValidTime));
EXPECT_FALSE(IsTrialPersistedForOrigin(
trial_enabled_origin_, kPersistentExpiryPeriodTrialName, kValidTime));
// Append an additional token for the same origin
std::vector<std::string> additional_tokens = {
kFrobulatePersistentExpiryGracePeriodToken};
origin_trials_.PersistAdditionalTrialsFromTokens(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
/*script_origins=*/{}, additional_tokens, kValidTime);
// Check that both trials are now enabled
EXPECT_TRUE(IsTrialPersistedForOrigin(trial_enabled_origin_,
kPersistentTrialName, kValidTime));
EXPECT_TRUE(IsTrialPersistedForOrigin(
trial_enabled_origin_, kPersistentExpiryPeriodTrialName, kValidTime));
}
TEST_F(OriginTrialsTest, ThirdPartyTokensCanBeAppendedOnlyIfDeprecation) {
// TODO(crbug.com/1418340): Change test when all 3P tokens are supported.
// Append third-party tokens.
std::vector<std::string> third_party_tokens = {
kFrobulatePersistentThirdPartyToken,
kFrobulatePersistentThirdPartyDeprecationToken};
url::Origin script_origin =
url::Origin::Create(GURL(kThirdPartyTrialEnabledOrigin));
std::vector<url::Origin> script_origins = {script_origin};
origin_trials_.PersistAdditionalTrialsFromTokens(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
script_origins, third_party_tokens, kValidTime);
// The FrobulatePersistent should not be persisted, as it is not a deprecation
// token.
EXPECT_FALSE(origin_trials_.IsTrialPersistedForOrigin(
script_origin, /*partition_origin=*/trial_enabled_origin_,
kPersistentTrialName, kValidTime));
// FrobulatePersistentThirdPartyDeprecation is a deprecation trial, and should
// be enabled.
EXPECT_TRUE(origin_trials_.IsTrialPersistedForOrigin(
script_origin, /*partition_origin=*/trial_enabled_origin_,
kPersistentThirdPartyDeprecationTrialName, kValidTime));
}
// Check that a stored trial name is not returned if that trial is no longer
// valid or configured to be persistent
TEST_F(OriginTrialsTest, StoredEnabledTrialNotReturnedIfNoLongerPersistent) {
std::unique_ptr<test::TestPersistenceProvider> persistence_provider =
std::make_unique<test::TestPersistenceProvider>();
base::Time token_expiry = base::Time::FromTimeT(2000000000);
base::flat_set<std::string> partition_sites = {
GetTokenPartitionSite(trial_enabled_origin_)};
base::flat_set<PersistedTrialToken> stored_tokens = {
{kNonPersistentTrialName, token_expiry,
blink::TrialToken::UsageRestriction::kNone, kDummyTokenSignature,
partition_sites},
{kInvalidTrialName, token_expiry,
blink::TrialToken::UsageRestriction::kNone, kDummyTokenSignature,
partition_sites},
{kPersistentTrialName, token_expiry,
blink::TrialToken::UsageRestriction::kNone, kDummyTokenSignature,
partition_sites}};
persistence_provider->SavePersistentTrialTokens(trial_enabled_origin_,
stored_tokens);
OriginTrials origin_trials(std::move(persistence_provider),
std::make_unique<blink::TrialTokenValidator>());
base::flat_set<std::string> enabled_trials =
origin_trials.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
kValidTime);
ASSERT_EQ(1ul, enabled_trials.size());
EXPECT_EQ(kPersistentTrialName, *(enabled_trials.begin()));
}
// Check that a saved trial name is not returned if it has been disabled by
// policy
TEST_F(OriginTrialsTest, DisabledTrialsNotReturned) {
std::unique_ptr<test::TestPersistenceProvider> persistence_provider =
std::make_unique<test::TestPersistenceProvider>();
base::Time token_expiry = base::Time::FromTimeT(2000000000);
base::flat_set<std::string> partition_sites = {
GetTokenPartitionSite(trial_enabled_origin_)};
base::flat_set<PersistedTrialToken> stored_tokens = {
{kPersistentTrialName, token_expiry,
blink::TrialToken::UsageRestriction::kNone, kDummyTokenSignature,
partition_sites}};
persistence_provider->SavePersistentTrialTokens(trial_enabled_origin_,
stored_tokens);
origin_trial_policy_.DisableTrial(kPersistentTrialName);
OriginTrials origin_trials(std::move(persistence_provider),
std::make_unique<blink::TrialTokenValidator>());
base::flat_set<std::string> enabled_trials =
origin_trials.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
kValidTime);
EXPECT_TRUE(enabled_trials.empty());
}
// Check that a saved token is not returned if its signature has been disabled
// by policy
TEST_F(OriginTrialsTest, DisabledTokensNotReturned) {
std::unique_ptr<test::TestPersistenceProvider> persistence_provider =
std::make_unique<test::TestPersistenceProvider>();
base::Time token_expiry = base::Time::FromTimeT(2000000000);
base::flat_set<std::string> partition_sites = {
GetTokenPartitionSite(trial_enabled_origin_)};
base::flat_set<PersistedTrialToken> stored_tokens = {
{kPersistentTrialName, token_expiry,
blink::TrialToken::UsageRestriction::kNone, kDummyTokenSignature,
partition_sites}};
persistence_provider->SavePersistentTrialTokens(trial_enabled_origin_,
stored_tokens);
origin_trial_policy_.DisableToken(kDummyTokenSignature);
OriginTrials origin_trials(std::move(persistence_provider),
std::make_unique<blink::TrialTokenValidator>());
base::flat_set<std::string> enabled_trials =
origin_trials.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
kValidTime);
EXPECT_TRUE(enabled_trials.empty());
}
TEST_F(OriginTrialsTest, UserDisabledTokensNotReturned) {
std::unique_ptr<test::TestPersistenceProvider> persistence_provider =
std::make_unique<test::TestPersistenceProvider>();
base::Time token_expiry = base::Time::FromTimeT(2000000000);
base::flat_set<std::string> partition_sites = {
GetTokenPartitionSite(trial_enabled_origin_)};
base::flat_set<PersistedTrialToken> stored_tokens = {
{kPersistentTrialName, token_expiry,
blink::TrialToken::UsageRestriction::kSubset, kDummyTokenSignature,
partition_sites}};
persistence_provider->SavePersistentTrialTokens(trial_enabled_origin_,
stored_tokens);
origin_trial_policy_.DisableTrialForUser(kPersistentTrialName);
OriginTrials origin_trials(std::move(persistence_provider),
std::make_unique<blink::TrialTokenValidator>());
base::flat_set<std::string> enabled_trials =
origin_trials.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
kValidTime);
EXPECT_TRUE(enabled_trials.empty());
}
TEST_F(OriginTrialsTest, GracePeriodIsRespected) {
std::vector<std::string> tokens = {kFrobulateManualCompletionToken};
origin_trials_.PersistTrialsFromTokens(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_, tokens,
kValidTime);
base::flat_set<std::string> enabled_trials =
origin_trials_.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
kExpiryTime);
EXPECT_EQ(1ul, enabled_trials.size())
<< "Expect trial to be valid at the expiry time limit";
base::Time in_grace_period = kExpiryTime + base::Days(1);
enabled_trials = origin_trials_.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
in_grace_period);
EXPECT_EQ(1ul, enabled_trials.size())
<< "Expect trial to be valid within the grace period";
base::Time end_of_grace_period = kExpiryTime + blink::kExpiryGracePeriod;
enabled_trials = origin_trials_.GetPersistedTrialsForOrigin(
trial_enabled_origin_, /*partition_origin=*/trial_enabled_origin_,
end_of_grace_period);
EXPECT_EQ(0ul, enabled_trials.size())
<< "Do not expect the trial to be valid after the grace period ends";
}
TEST_F(OriginTrialsTest, DoNotPersistTokensForOpaqueOrigins) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
url::Origin opaque_origin;
// Opaque primary origin
origin_trials_.PersistTrialsFromTokens(
opaque_origin, /*partition_origin=*/trial_enabled_origin_, tokens,
kValidTime);
EXPECT_TRUE(origin_trials_
.GetPersistedTrialsForOrigin(
opaque_origin, /*partition_origin=*/trial_enabled_origin_,
kValidTime)
.empty());
}
TEST_F(OriginTrialsTest, PersistTokensInOpaquePartition) {
std::vector<std::string> tokens = {kFrobulatePersistentToken};
url::Origin opaque_origin;
// Opaque partition origin
origin_trials_.PersistTrialsFromTokens(trial_enabled_origin_,
/*partition_origin=*/opaque_origin,
tokens, kValidTime);
EXPECT_TRUE(origin_trials_.IsTrialPersistedForOrigin(
trial_enabled_origin_, /*partition_origin=*/opaque_origin,
kPersistentTrialName, kValidTime));
}
TEST_F(OriginTrialsTest, TokensArePartitionedByTopLevelSite) {
url::Origin origin_a = trial_enabled_origin_;
url::Origin origin_b = url::Origin::Create(GURL(kTrialEnabledOriginB));
url::Origin partition_site_a = origin_a;
url::Origin partition_site_b = origin_b;
std::vector<std::string> tokens_a = {kFrobulatePersistentToken};
std::vector<std::string> tokens_b = {kFrobulatePersistentTokenAlternate};
origin_trials_.PersistTrialsFromTokens(origin_a, partition_site_a, tokens_a,
kValidTime);
origin_trials_.PersistTrialsFromTokens(origin_a, partition_site_b, tokens_a,
kValidTime);
origin_trials_.PersistTrialsFromTokens(origin_b, partition_site_b, tokens_b,
kValidTime);
// Only expect trials to be enabled for partitions where they have been set
EXPECT_TRUE(origin_trials_.IsTrialPersistedForOrigin(
origin_a, partition_site_a, kPersistentTrialName, kValidTime));
EXPECT_TRUE(origin_trials_.IsTrialPersistedForOrigin(
origin_a, partition_site_b, kPersistentTrialName, kValidTime));
EXPECT_TRUE(origin_trials_.IsTrialPersistedForOrigin(
origin_b, partition_site_b, kPersistentTrialName, kValidTime));
EXPECT_FALSE(origin_trials_.IsTrialPersistedForOrigin(
origin_b, partition_site_a, kPersistentTrialName, kValidTime));
// Removing a token should only be from one partition
origin_trials_.PersistTrialsFromTokens(origin_a, partition_site_b, {},
kValidTime);
EXPECT_TRUE(origin_trials_.IsTrialPersistedForOrigin(
origin_a, partition_site_a, kPersistentTrialName, kValidTime));
EXPECT_FALSE(origin_trials_.IsTrialPersistedForOrigin(
origin_a, partition_site_b, kPersistentTrialName, kValidTime));
}
TEST_F(OriginTrialsTest, PartitionSiteIsETLDPlusOne) {
EXPECT_EQ("https://example.com",
GetTokenPartitionSite(DomainAsOrigin("example.com")));
EXPECT_EQ("https://example.com",
GetTokenPartitionSite(DomainAsOrigin("enabled.example.com")));
EXPECT_EQ("https://example.co.uk",
GetTokenPartitionSite(DomainAsOrigin("example.co.uk")));
EXPECT_EQ("https://example.co.uk",
GetTokenPartitionSite(DomainAsOrigin("enabled.example.co.uk")));
}
TEST_F(OriginTrialsTest,
PartitionSiteUsesPrivateRegistryAsEffectiveTopLevelDomain) {
EXPECT_EQ("https://example.blogspot.com",
GetTokenPartitionSite(DomainAsOrigin("example.blogspot.com")));
EXPECT_EQ(
"https://example.blogspot.com",
GetTokenPartitionSite(DomainAsOrigin("enabled.example.blogspot.com")));
}
TEST_F(OriginTrialsTest, PartitionSiteCanBeIpAddress) {
EXPECT_EQ("http://127.0.0.1",
GetTokenPartitionSite(url::Origin::CreateFromNormalizedTuple(
"http", "127.0.0.1", 80)));
}
TEST_F(OriginTrialsTest, PartitionSiteCanBeLocalhost) {
EXPECT_EQ("http://localhost",
GetTokenPartitionSite(url::Origin::CreateFromNormalizedTuple(
"http", "localhost", 80)));
}
TEST_F(OriginTrialsTest, PartitionSiteCanHaveNonstandardPort) {
EXPECT_EQ("http://example.com",
GetTokenPartitionSite(url::Origin::CreateFromNormalizedTuple(
"http", "enabled.example.com", 5555)));
}
TEST_F(OriginTrialsTest, OpaqueOriginAsPartitionSiteSerializesAsSentinelValue) {
EXPECT_EQ(":opaque", GetTokenPartitionSite(url::Origin()));
}
} // namespace origin_trials