cookie_partition_key_collection_unittest.cc 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Copyright 2021 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/cookies/cookie_partition_key_collection.h"
  5. #include "base/run_loop.h"
  6. #include "base/test/bind.h"
  7. #include "base/test/task_environment.h"
  8. #include "net/cookies/test_cookie_access_delegate.h"
  9. #include "testing/gmock/include/gmock/gmock.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace net {
  12. using testing::UnorderedElementsAre;
  13. namespace {
  14. // Synchronous wrapper around CookiePartitionKeyCollection::FirstPartySetify.
  15. // Spins the event loop.
  16. CookiePartitionKeyCollection FirstPartySetifyAndWait(
  17. const CookiePartitionKeyCollection& collection,
  18. const CookieAccessDelegate* cookie_access_delegate) {
  19. base::RunLoop run_loop;
  20. CookiePartitionKeyCollection canonicalized_collection;
  21. absl::optional<CookiePartitionKeyCollection> maybe_collection =
  22. collection.FirstPartySetify(
  23. cookie_access_delegate,
  24. base::BindLambdaForTesting([&](CookiePartitionKeyCollection result) {
  25. canonicalized_collection = result;
  26. run_loop.Quit();
  27. }));
  28. if (maybe_collection.has_value())
  29. return maybe_collection.value();
  30. run_loop.Run();
  31. return canonicalized_collection;
  32. }
  33. } // namespace
  34. TEST(CookiePartitionKeyCollectionTest, EmptySet) {
  35. CookiePartitionKeyCollection key_collection;
  36. EXPECT_TRUE(key_collection.IsEmpty());
  37. EXPECT_FALSE(key_collection.ContainsAllKeys());
  38. EXPECT_EQ(0u, key_collection.PartitionKeys().size());
  39. }
  40. TEST(CookiePartitionKeyCollectionTest, SingletonSet) {
  41. CookiePartitionKeyCollection key_collection(
  42. CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com")));
  43. EXPECT_FALSE(key_collection.IsEmpty());
  44. EXPECT_FALSE(key_collection.ContainsAllKeys());
  45. EXPECT_THAT(key_collection.PartitionKeys(),
  46. UnorderedElementsAre(CookiePartitionKey::FromURLForTesting(
  47. GURL("https://www.foo.com"))));
  48. }
  49. TEST(CookiePartitionKeyCollectionTest, MultipleElements) {
  50. CookiePartitionKeyCollection key_collection({
  51. CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com")),
  52. CookiePartitionKey::FromURLForTesting(GURL("https://www.bar.com")),
  53. });
  54. EXPECT_FALSE(key_collection.IsEmpty());
  55. EXPECT_FALSE(key_collection.ContainsAllKeys());
  56. EXPECT_THAT(key_collection.PartitionKeys(),
  57. UnorderedElementsAre(CookiePartitionKey::FromURLForTesting(
  58. GURL("https://subdomain.foo.com")),
  59. CookiePartitionKey::FromURLForTesting(
  60. GURL("https://www.bar.com"))));
  61. }
  62. TEST(CookiePartitionKeyCollectionTest, ContainsAll) {
  63. CookiePartitionKeyCollection key_collection =
  64. CookiePartitionKeyCollection::ContainsAll();
  65. EXPECT_FALSE(key_collection.IsEmpty());
  66. EXPECT_TRUE(key_collection.ContainsAllKeys());
  67. }
  68. TEST(CookiePartitionKeyCollectionTest, FromOptional) {
  69. CookiePartitionKeyCollection key_collection =
  70. CookiePartitionKeyCollection::FromOptional(absl::nullopt);
  71. EXPECT_TRUE(key_collection.IsEmpty());
  72. EXPECT_FALSE(key_collection.ContainsAllKeys());
  73. key_collection = CookiePartitionKeyCollection::FromOptional(
  74. absl::make_optional<CookiePartitionKey>(
  75. CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"))));
  76. EXPECT_FALSE(key_collection.IsEmpty());
  77. EXPECT_FALSE(key_collection.ContainsAllKeys());
  78. EXPECT_THAT(key_collection.PartitionKeys(),
  79. UnorderedElementsAre(CookiePartitionKey::FromURLForTesting(
  80. GURL("https://www.foo.com"))));
  81. }
  82. TEST(CookiePartitionKeyCollectionTest, FirstPartySetify) {
  83. base::test::TaskEnvironment env;
  84. const GURL kOwnerURL("https://owner.com");
  85. const SchemefulSite kOwnerSite(kOwnerURL);
  86. const CookiePartitionKey kOwnerPartitionKey =
  87. CookiePartitionKey::FromURLForTesting(kOwnerURL);
  88. const GURL kMemberURL("https://member.com");
  89. const SchemefulSite kMemberSite(kMemberURL);
  90. const CookiePartitionKey kMemberPartitionKey =
  91. CookiePartitionKey::FromURLForTesting(kMemberURL);
  92. const GURL kNonMemberURL("https://nonmember.com");
  93. const CookiePartitionKey kNonMemberPartitionKey =
  94. CookiePartitionKey::FromURLForTesting(kNonMemberURL);
  95. TestCookieAccessDelegate delegate;
  96. delegate.SetFirstPartySets({
  97. {kOwnerSite, net::FirstPartySetEntry(kOwnerSite, net::SiteType::kPrimary,
  98. absl::nullopt)},
  99. {kMemberSite,
  100. net::FirstPartySetEntry(kOwnerSite, net::SiteType::kAssociated, 0)},
  101. });
  102. CookiePartitionKeyCollection empty_key_collection;
  103. EXPECT_TRUE(
  104. FirstPartySetifyAndWait(empty_key_collection, &delegate).IsEmpty());
  105. EXPECT_TRUE(FirstPartySetifyAndWait(empty_key_collection, nullptr).IsEmpty());
  106. CookiePartitionKeyCollection contains_all_keys =
  107. CookiePartitionKeyCollection::ContainsAll();
  108. EXPECT_TRUE(
  109. FirstPartySetifyAndWait(contains_all_keys, &delegate).ContainsAllKeys());
  110. EXPECT_TRUE(
  111. FirstPartySetifyAndWait(contains_all_keys, nullptr).ContainsAllKeys());
  112. // An owner site of an FPS should not have its partition key changed.
  113. EXPECT_THAT(FirstPartySetifyAndWait(
  114. CookiePartitionKeyCollection(kOwnerPartitionKey), &delegate)
  115. .PartitionKeys(),
  116. UnorderedElementsAre(kOwnerPartitionKey));
  117. // A member site should have its partition key changed to the owner site.
  118. EXPECT_THAT(FirstPartySetifyAndWait(
  119. CookiePartitionKeyCollection(kMemberPartitionKey), &delegate)
  120. .PartitionKeys(),
  121. UnorderedElementsAre(kOwnerPartitionKey));
  122. // A member site's partition key should not change if the CookieAccessDelegate
  123. // is null.
  124. EXPECT_THAT(FirstPartySetifyAndWait(
  125. CookiePartitionKeyCollection(kMemberPartitionKey), nullptr)
  126. .PartitionKeys(),
  127. UnorderedElementsAre(kMemberPartitionKey));
  128. // A non-member site should not have its partition key changed.
  129. EXPECT_THAT(
  130. FirstPartySetifyAndWait(
  131. CookiePartitionKeyCollection(kNonMemberPartitionKey), &delegate)
  132. .PartitionKeys(),
  133. UnorderedElementsAre(kNonMemberPartitionKey));
  134. // A key collection that contains a member site and non-member site should be
  135. // changed to include the owner site and the unmodified non-member site.
  136. EXPECT_THAT(FirstPartySetifyAndWait(
  137. CookiePartitionKeyCollection(
  138. {kMemberPartitionKey, kNonMemberPartitionKey}),
  139. &delegate)
  140. .PartitionKeys(),
  141. UnorderedElementsAre(kOwnerPartitionKey, kNonMemberPartitionKey));
  142. // Test that FirstPartySetify does not modify partition keys with nonces.
  143. const CookiePartitionKey kNoncedPartitionKey =
  144. CookiePartitionKey::FromURLForTesting(kMemberURL,
  145. base::UnguessableToken::Create());
  146. EXPECT_THAT(
  147. FirstPartySetifyAndWait(
  148. CookiePartitionKeyCollection({kNoncedPartitionKey}), &delegate)
  149. .PartitionKeys(),
  150. UnorderedElementsAre(kNoncedPartitionKey));
  151. EXPECT_THAT(
  152. FirstPartySetifyAndWait(CookiePartitionKeyCollection(
  153. {kNoncedPartitionKey, kMemberPartitionKey}),
  154. &delegate)
  155. .PartitionKeys(),
  156. UnorderedElementsAre(kNoncedPartitionKey, kOwnerPartitionKey));
  157. }
  158. TEST(CookiePartitionKeyCollectionTest, Contains) {
  159. const CookiePartitionKey kPartitionKey =
  160. CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"));
  161. const CookiePartitionKey kOtherPartitionKey =
  162. CookiePartitionKey::FromURLForTesting(GURL("https://www.bar.com"));
  163. struct TestCase {
  164. const CookiePartitionKeyCollection keychain;
  165. const CookiePartitionKey key;
  166. bool expects_contains;
  167. } test_cases[] = {
  168. // Empty keychain
  169. {CookiePartitionKeyCollection(), kPartitionKey, false},
  170. // Singleton keychain with key
  171. {CookiePartitionKeyCollection(kPartitionKey), kPartitionKey, true},
  172. // Singleton keychain with different key
  173. {CookiePartitionKeyCollection(kOtherPartitionKey), kPartitionKey, false},
  174. // Multiple keys
  175. {CookiePartitionKeyCollection({kPartitionKey, kOtherPartitionKey}),
  176. kPartitionKey, true},
  177. // Contains all keys
  178. {CookiePartitionKeyCollection::ContainsAll(), kPartitionKey, true},
  179. };
  180. for (const auto& test_case : test_cases) {
  181. EXPECT_EQ(test_case.expects_contains,
  182. test_case.keychain.Contains(test_case.key));
  183. }
  184. }
  185. } // namespace net