200 lines
7.1 KiB
C++
200 lines
7.1 KiB
C++
// Copyright 2019 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/socket/client_socket_pool.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "base/test/scoped_feature_list.h"
|
|
#include "net/base/features.h"
|
|
#include "net/base/host_port_pair.h"
|
|
#include "net/base/network_anonymization_key.h"
|
|
#include "net/base/privacy_mode.h"
|
|
#include "net/base/schemeful_site.h"
|
|
#include "net/dns/public/secure_dns_policy.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
#include "url/gurl.h"
|
|
#include "url/scheme_host_port.h"
|
|
#include "url/url_constants.h"
|
|
|
|
namespace net {
|
|
|
|
namespace {
|
|
|
|
TEST(ClientSocketPool, GroupIdOperators) {
|
|
base::test::ScopedFeatureList feature_list;
|
|
feature_list.InitAndEnableFeature(
|
|
features::kPartitionConnectionsByNetworkIsolationKey);
|
|
|
|
// Each of these lists is in "<" order, as defined by Group::operator< on the
|
|
// corresponding field.
|
|
|
|
const uint16_t kPorts[] = {
|
|
80,
|
|
81,
|
|
443,
|
|
};
|
|
|
|
const char* kSchemes[] = {
|
|
url::kHttpScheme,
|
|
url::kHttpsScheme,
|
|
};
|
|
|
|
const char* kHosts[] = {
|
|
"a",
|
|
"b",
|
|
"c",
|
|
};
|
|
|
|
const PrivacyMode kPrivacyModes[] = {
|
|
PrivacyMode::PRIVACY_MODE_DISABLED,
|
|
PrivacyMode::PRIVACY_MODE_ENABLED,
|
|
};
|
|
|
|
const SchemefulSite kSiteA(GURL("http://a.test/"));
|
|
const SchemefulSite kSiteB(GURL("http://b.test/"));
|
|
const NetworkAnonymizationKey kNetworkAnonymizationKeys[] = {
|
|
NetworkAnonymizationKey::CreateSameSite(kSiteA),
|
|
NetworkAnonymizationKey::CreateSameSite(kSiteB),
|
|
};
|
|
|
|
const SecureDnsPolicy kDisableSecureDnsValues[] = {SecureDnsPolicy::kAllow,
|
|
SecureDnsPolicy::kDisable};
|
|
|
|
// All previously created |group_ids|. They should all be less than the
|
|
// current group under consideration.
|
|
std::vector<ClientSocketPool::GroupId> group_ids;
|
|
|
|
// Iterate through all sets of group ids, from least to greatest.
|
|
for (const auto& port : kPorts) {
|
|
SCOPED_TRACE(port);
|
|
for (const char* scheme : kSchemes) {
|
|
SCOPED_TRACE(scheme);
|
|
for (const char* host : kHosts) {
|
|
SCOPED_TRACE(host);
|
|
for (const auto& privacy_mode : kPrivacyModes) {
|
|
SCOPED_TRACE(privacy_mode);
|
|
for (const auto& network_anonymization_key :
|
|
kNetworkAnonymizationKeys) {
|
|
SCOPED_TRACE(network_anonymization_key.ToDebugString());
|
|
for (const auto& secure_dns_policy : kDisableSecureDnsValues) {
|
|
ClientSocketPool::GroupId group_id(
|
|
url::SchemeHostPort(scheme, host, port), privacy_mode,
|
|
network_anonymization_key, secure_dns_policy);
|
|
for (const auto& lower_group_id : group_ids) {
|
|
EXPECT_FALSE(lower_group_id == group_id);
|
|
EXPECT_TRUE(lower_group_id < group_id);
|
|
EXPECT_FALSE(group_id < lower_group_id);
|
|
}
|
|
|
|
group_ids.push_back(group_id);
|
|
|
|
// Compare |group_id| to itself. Use two different copies of
|
|
// |group_id|'s value, since to protect against bugs where an
|
|
// object only equals itself.
|
|
EXPECT_TRUE(group_ids.back() == group_id);
|
|
EXPECT_FALSE(group_ids.back() < group_id);
|
|
EXPECT_FALSE(group_id < group_ids.back());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TEST(ClientSocketPool, GroupIdToString) {
|
|
base::test::ScopedFeatureList feature_list;
|
|
feature_list.InitAndEnableFeature(
|
|
features::kPartitionConnectionsByNetworkIsolationKey);
|
|
|
|
EXPECT_EQ("http://foo <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpScheme, "foo", 80),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
EXPECT_EQ("http://bar:443 <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpScheme, "bar", 443),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
EXPECT_EQ("pm/http://bar <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpScheme, "bar", 80),
|
|
PrivacyMode::PRIVACY_MODE_ENABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
|
|
EXPECT_EQ("https://foo:80 <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpsScheme, "foo", 80),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
EXPECT_EQ("https://bar <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpsScheme, "bar", 443),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
EXPECT_EQ("pm/https://bar:80 <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpsScheme, "bar", 80),
|
|
PrivacyMode::PRIVACY_MODE_ENABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
|
|
EXPECT_EQ("https://foo <https://foo.test cross_site>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpsScheme, "foo", 443),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED,
|
|
NetworkAnonymizationKey::CreateCrossSite(
|
|
SchemefulSite(GURL("https://foo.test"))),
|
|
SecureDnsPolicy::kAllow)
|
|
.ToString());
|
|
|
|
EXPECT_EQ("dsd/pm/https://bar:80 <null>",
|
|
ClientSocketPool::GroupId(
|
|
url::SchemeHostPort(url::kHttpsScheme, "bar", 80),
|
|
PrivacyMode::PRIVACY_MODE_ENABLED, NetworkAnonymizationKey(),
|
|
SecureDnsPolicy::kDisable)
|
|
.ToString());
|
|
}
|
|
|
|
TEST(ClientSocketPool, PartitionConnectionsByNetworkIsolationKeyDisabled) {
|
|
const SchemefulSite kSiteFoo(GURL("https://foo.com"));
|
|
const SchemefulSite kSiteBar(GURL("https://bar.com"));
|
|
base::test::ScopedFeatureList feature_list;
|
|
feature_list.InitAndDisableFeature(
|
|
features::kPartitionConnectionsByNetworkIsolationKey);
|
|
|
|
ClientSocketPool::GroupId group_id1(
|
|
url::SchemeHostPort(url::kHttpsScheme, "foo", 443),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED,
|
|
NetworkAnonymizationKey::CreateSameSite(kSiteFoo),
|
|
SecureDnsPolicy::kAllow);
|
|
|
|
ClientSocketPool::GroupId group_id2(
|
|
url::SchemeHostPort(url::kHttpsScheme, "foo", 443),
|
|
PrivacyMode::PRIVACY_MODE_DISABLED,
|
|
NetworkAnonymizationKey::CreateSameSite(kSiteBar),
|
|
SecureDnsPolicy::kAllow);
|
|
|
|
EXPECT_FALSE(group_id1.network_anonymization_key().IsFullyPopulated());
|
|
EXPECT_FALSE(group_id2.network_anonymization_key().IsFullyPopulated());
|
|
EXPECT_EQ(group_id1.network_anonymization_key(),
|
|
group_id2.network_anonymization_key());
|
|
EXPECT_EQ(group_id1, group_id2);
|
|
|
|
EXPECT_EQ("https://foo", group_id1.ToString());
|
|
EXPECT_EQ("https://foo", group_id2.ToString());
|
|
}
|
|
|
|
} // namespace
|
|
|
|
} // namespace net
|