client_socket_pool_unittest.cc 7.1 KB

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