blob: 5b25eef60dbfaccff9a63e60bc3882111303c8cc [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 "net/http/http_stream_key.h"
#include "base/test/scoped_feature_list.h"
#include "net/base/features.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/privacy_mode.h"
#include "net/dns/public/secure_dns_policy.h"
#include "net/socket/socket_tag.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/scheme_host_port.h"
namespace net {
namespace {
static const url::SchemeHostPort kHost("https", "www.example.com", 443);
} // namespace
// These tests are similar to SpdySessionKeyTest. Note that we don't support
// non-null SocketTag.
TEST(HttpStreamKeyTest, Equality) {
HttpStreamKey key(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true);
EXPECT_EQ(key,
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true));
EXPECT_NE(key,
HttpStreamKey(url::SchemeHostPort("https", "othersite", 443),
PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true));
EXPECT_NE(key,
HttpStreamKey(kHost, PRIVACY_MODE_ENABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true));
HttpStreamKey anonymized_key(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey::CreateSameSite(
SchemefulSite(GURL("http://a.test/"))),
SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true);
if (NetworkAnonymizationKey::IsPartitioningEnabled()) {
EXPECT_NE(key, anonymized_key);
} else {
EXPECT_EQ(key, anonymized_key);
}
EXPECT_NE(key,
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kDisable,
/*disable_cert_network_fetches=*/true));
EXPECT_NE(key,
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/false));
}
TEST(HttpStreamKeyTest, OrderedSet) {
const std::vector<HttpStreamKey> stream_keys = {
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true),
HttpStreamKey(url::SchemeHostPort("https", "othersite", 443),
PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true),
HttpStreamKey(kHost, PRIVACY_MODE_ENABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true),
// This has different network_anonymization_key, but it's the same as the
// first one when anonymization is disabled.
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey::CreateSameSite(
SchemefulSite(GURL("http://a.test/"))),
SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true),
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kDisable,
/*disable_cert_network_fetches=*/true),
HttpStreamKey(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/false),
};
const std::set<HttpStreamKey> key_set(stream_keys.begin(), stream_keys.end());
const size_t expected_size = NetworkAnonymizationKey::IsPartitioningEnabled()
? stream_keys.size()
: stream_keys.size() - 1;
ASSERT_EQ(key_set.size(), expected_size);
}
TEST(HttpStreamKeyTest, Anonymization) {
for (const bool enabled : {false, true}) {
SCOPED_TRACE(enabled ? "Anonymization enabled" : "Anonymization disabled");
base::test::ScopedFeatureList feature_list;
if (enabled) {
feature_list.InitAndEnableFeature(
features::kPartitionConnectionsByNetworkIsolationKey);
} else {
feature_list.InitAndDisableFeature(
features::kPartitionConnectionsByNetworkIsolationKey);
}
const HttpStreamKey key(kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true);
const HttpStreamKey anonymized_key(
kHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey::CreateSameSite(
SchemefulSite(GURL("http://a.test/"))),
SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true);
if (enabled) {
EXPECT_NE(key, anonymized_key);
} else {
EXPECT_EQ(key, anonymized_key);
}
}
}
TEST(HttpStreamKeyTest, ToSpdySessionKey) {
const url::SchemeHostPort kHttpHost("http", "example.com", 80);
const url::SchemeHostPort kHttpsHost("https", "example.com", 443);
SpdySessionKey http_key =
HttpStreamKey(kHttpHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true)
.CalculateSpdySessionKey();
ASSERT_TRUE(http_key.host_port_pair().IsEmpty());
SpdySessionKey https_key =
HttpStreamKey(kHttpsHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true)
.CalculateSpdySessionKey();
ASSERT_EQ(https_key,
SpdySessionKey(HostPortPair::FromSchemeHostPort(kHttpsHost),
PRIVACY_MODE_DISABLED, ProxyChain::Direct(),
SessionUsage::kDestination, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_verification_network_fetches=*/true));
}
TEST(HttpStreamKeyTest, CalculateQuicSessionAliasKey) {
const url::SchemeHostPort kHttpHost("http", "example.com", 80);
const url::SchemeHostPort kHttpsHost("https", "example.com", 443);
const url::SchemeHostPort kHttpsAliasHost("https", "alt.example.com", 443);
QuicSessionAliasKey http_key =
HttpStreamKey(kHttpHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true)
.CalculateQuicSessionAliasKey();
ASSERT_TRUE(http_key.session_key().host().empty());
ASSERT_FALSE(http_key.destination().IsValid());
QuicSessionAliasKey https_key =
HttpStreamKey(kHttpsHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true)
.CalculateQuicSessionAliasKey();
ASSERT_EQ(https_key.session_key(),
QuicSessionKey(HostPortPair::FromSchemeHostPort(kHttpsHost),
PRIVACY_MODE_DISABLED, ProxyChain::Direct(),
SessionUsage::kDestination, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*require_dns_https_alpn=*/false));
ASSERT_EQ(https_key.destination(), kHttpsHost);
QuicSessionAliasKey different_origin_key =
HttpStreamKey(kHttpsHost, PRIVACY_MODE_DISABLED, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*disable_cert_network_fetches=*/true)
.CalculateQuicSessionAliasKey(kHttpsAliasHost);
ASSERT_EQ(different_origin_key.session_key(),
QuicSessionKey(HostPortPair::FromSchemeHostPort(kHttpsHost),
PRIVACY_MODE_DISABLED, ProxyChain::Direct(),
SessionUsage::kDestination, SocketTag(),
NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
/*require_dns_https_alpn=*/false));
ASSERT_EQ(different_origin_key.destination(), kHttpsAliasHost);
}
} // namespace net