• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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