blob: 00b52f99bc026437f5d1ce76d82052bb49ed3261 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/agent_cluster_key.h"
#include <sstream>
#include "base/test/gtest_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace content {
using AgentClusterKeyTest = testing::Test;
TEST_F(AgentClusterKeyTest, SiteKeyed) {
GURL url = GURL("https://a.com");
AgentClusterKey key = AgentClusterKey::CreateSiteKeyed(url);
EXPECT_TRUE(key.IsSiteKeyed());
EXPECT_FALSE(key.IsOriginKeyed());
EXPECT_EQ(url, key.GetSite());
EXPECT_EQ(std::nullopt, key.GetCrossOriginIsolationKey());
ASSERT_DCHECK_DEATH(key.GetOrigin());
}
TEST_F(AgentClusterKeyTest, OriginKeyed) {
url::Origin origin =
url::Origin::CreateFromNormalizedTuple("https", "example.com", 443);
AgentClusterKey key = AgentClusterKey::CreateOriginKeyed(origin);
EXPECT_FALSE(key.IsSiteKeyed());
EXPECT_TRUE(key.IsOriginKeyed());
EXPECT_EQ(origin, key.GetOrigin());
EXPECT_EQ(std::nullopt, key.GetCrossOriginIsolationKey());
ASSERT_DCHECK_DEATH(key.GetSite());
}
TEST_F(AgentClusterKeyTest, WithCrossOriginIsolationKey) {
url::Origin origin =
url::Origin::CreateFromNormalizedTuple("https", "example.com", 443);
url::Origin common_coi_origin = url::Origin::CreateFromNormalizedTuple(
"https", "isolation.example.com", 443);
AgentClusterKey::CrossOriginIsolationKey isolation_key(
common_coi_origin, CrossOriginIsolationMode::kConcrete);
AgentClusterKey key =
AgentClusterKey::CreateWithCrossOriginIsolationKey(origin, isolation_key);
EXPECT_FALSE(key.IsSiteKeyed());
EXPECT_TRUE(key.IsOriginKeyed());
EXPECT_EQ(origin, key.GetOrigin());
EXPECT_EQ(isolation_key, key.GetCrossOriginIsolationKey());
ASSERT_DCHECK_DEATH(key.GetSite());
}
TEST_F(AgentClusterKeyTest, Comparisons) {
// Site-keyed
GURL site_a = GURL("https://a.com");
GURL site_b = GURL("https://b.com");
AgentClusterKey key_site_a = AgentClusterKey::CreateSiteKeyed(site_a);
AgentClusterKey key_site_b = AgentClusterKey::CreateSiteKeyed(site_b);
EXPECT_EQ(key_site_a, key_site_a);
EXPECT_NE(key_site_a, key_site_b);
// Origin-keyed
url::Origin origin_a = url::Origin::Create(site_a);
url::Origin origin_b = url::Origin::Create(site_b);
AgentClusterKey key_origin_a = AgentClusterKey::CreateOriginKeyed(origin_a);
AgentClusterKey key_origin_b = AgentClusterKey::CreateOriginKeyed(origin_b);
EXPECT_EQ(key_origin_a, key_origin_a);
EXPECT_NE(key_origin_a, key_origin_b);
EXPECT_NE(key_origin_a, key_site_a);
// With isolation key
AgentClusterKey::CrossOriginIsolationKey coi_a(
origin_a, CrossOriginIsolationMode::kConcrete);
AgentClusterKey::CrossOriginIsolationKey coi_b(
origin_b, CrossOriginIsolationMode::kConcrete);
AgentClusterKey::CrossOriginIsolationKey non_coi_a(
origin_a, CrossOriginIsolationMode::kLogical);
AgentClusterKey::CrossOriginIsolationKey non_coi_b(
origin_b, CrossOriginIsolationMode::kLogical);
EXPECT_EQ(coi_a, coi_a);
EXPECT_EQ(non_coi_a, non_coi_a);
EXPECT_NE(coi_a, coi_b);
EXPECT_NE(coi_a, non_coi_a);
EXPECT_NE(non_coi_a, non_coi_b);
AgentClusterKey key_origin_a_coi_a =
AgentClusterKey::CreateWithCrossOriginIsolationKey(origin_a, coi_a);
AgentClusterKey key_origin_b_coi_a =
AgentClusterKey::CreateWithCrossOriginIsolationKey(origin_b, coi_a);
AgentClusterKey key_origin_a_coi_b =
AgentClusterKey::CreateWithCrossOriginIsolationKey(origin_a, coi_b);
AgentClusterKey key_origin_a_non_coi_a =
AgentClusterKey::CreateWithCrossOriginIsolationKey(origin_a, non_coi_a);
EXPECT_EQ(key_origin_a_coi_a, key_origin_a_coi_a);
EXPECT_NE(key_origin_a_coi_a, key_origin_b_coi_a);
EXPECT_NE(key_origin_a_coi_a, key_origin_a_coi_b);
EXPECT_NE(key_origin_a_coi_a, key_origin_a_non_coi_a);
EXPECT_NE(key_origin_a_coi_a, key_origin_a);
EXPECT_NE(key_origin_a_coi_a, key_site_a);
EXPECT_NE(key_origin_a_non_coi_a, key_origin_a);
EXPECT_NE(key_origin_a_non_coi_a, key_site_a);
}
TEST_F(AgentClusterKeyTest, StreamOutput) {
std::stringstream dump;
GURL url_a("https://a.com");
url::Origin origin_a = url::Origin::Create(url_a);
url::Origin origin_b = url::Origin::Create(GURL("https://b.com"));
AgentClusterKey key_site_a = AgentClusterKey::CreateSiteKeyed(url_a);
dump << key_site_a;
EXPECT_EQ(dump.str(), "{site_: https://a.com/}");
dump.str("");
AgentClusterKey key_origin_a = AgentClusterKey::CreateOriginKeyed(origin_a);
dump << key_origin_a;
EXPECT_EQ(dump.str(), "{origin_: https://a.com}");
dump.str("");
AgentClusterKey key_origin_a_coi_b =
AgentClusterKey::CreateWithCrossOriginIsolationKey(
origin_a, AgentClusterKey::CrossOriginIsolationKey(
origin_b, CrossOriginIsolationMode::kConcrete));
dump << key_origin_a_coi_b;
EXPECT_EQ(dump.str(),
"{origin_: https://a.com, cross_origin_isolation_key_: "
"{common_coi_origin: "
"https://b.com, cross_origin_isolation_mode: concrete}}");
dump.str("");
}
} // namespace content