1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/socket/client_socket_pool.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/test/scoped_feature_list.h"
11 #include "net/base/features.h"
12 #include "net/base/host_port_pair.h"
13 #include "net/base/network_anonymization_key.h"
14 #include "net/base/privacy_mode.h"
15 #include "net/base/schemeful_site.h"
16 #include "net/dns/public/secure_dns_policy.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "url/gurl.h"
19 #include "url/scheme_host_port.h"
20 #include "url/url_constants.h"
21
22 namespace net {
23
24 namespace {
25
TEST(ClientSocketPool,GroupIdOperators)26 TEST(ClientSocketPool, GroupIdOperators) {
27 base::test::ScopedFeatureList feature_list;
28 feature_list.InitAndEnableFeature(
29 features::kPartitionConnectionsByNetworkIsolationKey);
30
31 // Each of these lists is in "<" order, as defined by Group::operator< on the
32 // corresponding field.
33
34 const uint16_t kPorts[] = {
35 80,
36 81,
37 443,
38 };
39
40 const char* kSchemes[] = {
41 url::kHttpScheme,
42 url::kHttpsScheme,
43 };
44
45 const char* kHosts[] = {
46 "a",
47 "b",
48 "c",
49 };
50
51 const PrivacyMode kPrivacyModes[] = {
52 PrivacyMode::PRIVACY_MODE_DISABLED,
53 PrivacyMode::PRIVACY_MODE_ENABLED,
54 };
55
56 const SchemefulSite kSiteA(GURL("http://a.test/"));
57 const SchemefulSite kSiteB(GURL("http://b.test/"));
58 const NetworkAnonymizationKey kNetworkAnonymizationKeys[] = {
59 NetworkAnonymizationKey::CreateSameSite(kSiteA),
60 NetworkAnonymizationKey::CreateSameSite(kSiteB),
61 };
62
63 const SecureDnsPolicy kDisableSecureDnsValues[] = {SecureDnsPolicy::kAllow,
64 SecureDnsPolicy::kDisable};
65
66 // All previously created |group_ids|. They should all be less than the
67 // current group under consideration.
68 std::vector<ClientSocketPool::GroupId> group_ids;
69
70 // Iterate through all sets of group ids, from least to greatest.
71 for (const auto& port : kPorts) {
72 SCOPED_TRACE(port);
73 for (const char* scheme : kSchemes) {
74 SCOPED_TRACE(scheme);
75 for (const char* host : kHosts) {
76 SCOPED_TRACE(host);
77 for (const auto& privacy_mode : kPrivacyModes) {
78 SCOPED_TRACE(privacy_mode);
79 for (const auto& network_anonymization_key :
80 kNetworkAnonymizationKeys) {
81 SCOPED_TRACE(network_anonymization_key.ToDebugString());
82 for (const auto& secure_dns_policy : kDisableSecureDnsValues) {
83 ClientSocketPool::GroupId group_id(
84 url::SchemeHostPort(scheme, host, port), privacy_mode,
85 network_anonymization_key, secure_dns_policy);
86 for (const auto& lower_group_id : group_ids) {
87 EXPECT_FALSE(lower_group_id == group_id);
88 EXPECT_TRUE(lower_group_id < group_id);
89 EXPECT_FALSE(group_id < lower_group_id);
90 }
91
92 group_ids.push_back(group_id);
93
94 // Compare |group_id| to itself. Use two different copies of
95 // |group_id|'s value, since to protect against bugs where an
96 // object only equals itself.
97 EXPECT_TRUE(group_ids.back() == group_id);
98 EXPECT_FALSE(group_ids.back() < group_id);
99 EXPECT_FALSE(group_id < group_ids.back());
100 }
101 }
102 }
103 }
104 }
105 }
106 }
107
TEST(ClientSocketPool,GroupIdToString)108 TEST(ClientSocketPool, GroupIdToString) {
109 base::test::ScopedFeatureList feature_list;
110 feature_list.InitAndEnableFeature(
111 features::kPartitionConnectionsByNetworkIsolationKey);
112
113 EXPECT_EQ("http://foo <null>",
114 ClientSocketPool::GroupId(
115 url::SchemeHostPort(url::kHttpScheme, "foo", 80),
116 PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
117 SecureDnsPolicy::kAllow)
118 .ToString());
119 EXPECT_EQ("http://bar:443 <null>",
120 ClientSocketPool::GroupId(
121 url::SchemeHostPort(url::kHttpScheme, "bar", 443),
122 PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
123 SecureDnsPolicy::kAllow)
124 .ToString());
125 EXPECT_EQ("pm/http://bar <null>",
126 ClientSocketPool::GroupId(
127 url::SchemeHostPort(url::kHttpScheme, "bar", 80),
128 PrivacyMode::PRIVACY_MODE_ENABLED, NetworkAnonymizationKey(),
129 SecureDnsPolicy::kAllow)
130 .ToString());
131
132 EXPECT_EQ("https://foo:80 <null>",
133 ClientSocketPool::GroupId(
134 url::SchemeHostPort(url::kHttpsScheme, "foo", 80),
135 PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
136 SecureDnsPolicy::kAllow)
137 .ToString());
138 EXPECT_EQ("https://bar <null>",
139 ClientSocketPool::GroupId(
140 url::SchemeHostPort(url::kHttpsScheme, "bar", 443),
141 PrivacyMode::PRIVACY_MODE_DISABLED, NetworkAnonymizationKey(),
142 SecureDnsPolicy::kAllow)
143 .ToString());
144 EXPECT_EQ("pm/https://bar:80 <null>",
145 ClientSocketPool::GroupId(
146 url::SchemeHostPort(url::kHttpsScheme, "bar", 80),
147 PrivacyMode::PRIVACY_MODE_ENABLED, NetworkAnonymizationKey(),
148 SecureDnsPolicy::kAllow)
149 .ToString());
150
151 EXPECT_EQ("https://foo <https://foo.test cross_site>",
152 ClientSocketPool::GroupId(
153 url::SchemeHostPort(url::kHttpsScheme, "foo", 443),
154 PrivacyMode::PRIVACY_MODE_DISABLED,
155 NetworkAnonymizationKey::CreateCrossSite(
156 SchemefulSite(GURL("https://foo.test"))),
157 SecureDnsPolicy::kAllow)
158 .ToString());
159
160 EXPECT_EQ("dsd/pm/https://bar:80 <null>",
161 ClientSocketPool::GroupId(
162 url::SchemeHostPort(url::kHttpsScheme, "bar", 80),
163 PrivacyMode::PRIVACY_MODE_ENABLED, NetworkAnonymizationKey(),
164 SecureDnsPolicy::kDisable)
165 .ToString());
166 }
167
TEST(ClientSocketPool,PartitionConnectionsByNetworkIsolationKeyDisabled)168 TEST(ClientSocketPool, PartitionConnectionsByNetworkIsolationKeyDisabled) {
169 const SchemefulSite kSiteFoo(GURL("https://foo.com"));
170 const SchemefulSite kSiteBar(GURL("https://bar.com"));
171 base::test::ScopedFeatureList feature_list;
172 feature_list.InitAndDisableFeature(
173 features::kPartitionConnectionsByNetworkIsolationKey);
174
175 ClientSocketPool::GroupId group_id1(
176 url::SchemeHostPort(url::kHttpsScheme, "foo", 443),
177 PrivacyMode::PRIVACY_MODE_DISABLED,
178 NetworkAnonymizationKey::CreateSameSite(kSiteFoo),
179 SecureDnsPolicy::kAllow);
180
181 ClientSocketPool::GroupId group_id2(
182 url::SchemeHostPort(url::kHttpsScheme, "foo", 443),
183 PrivacyMode::PRIVACY_MODE_DISABLED,
184 NetworkAnonymizationKey::CreateSameSite(kSiteBar),
185 SecureDnsPolicy::kAllow);
186
187 EXPECT_FALSE(group_id1.network_anonymization_key().IsFullyPopulated());
188 EXPECT_FALSE(group_id2.network_anonymization_key().IsFullyPopulated());
189 EXPECT_EQ(group_id1.network_anonymization_key(),
190 group_id2.network_anonymization_key());
191 EXPECT_EQ(group_id1, group_id2);
192
193 EXPECT_EQ("https://foo", group_id1.ToString());
194 EXPECT_EQ("https://foo", group_id2.ToString());
195 }
196
197 } // namespace
198
199 } // namespace net
200