cookie_inclusion_status_unittest.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. // Copyright 2020 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_inclusion_status.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. namespace net {
  7. TEST(CookieInclusionStatusTest, IncludeStatus) {
  8. int num_exclusion_reasons =
  9. static_cast<int>(CookieInclusionStatus::NUM_EXCLUSION_REASONS);
  10. int num_warning_reasons =
  11. static_cast<int>(CookieInclusionStatus::NUM_WARNING_REASONS);
  12. // Zero-argument constructor
  13. CookieInclusionStatus status;
  14. EXPECT_TRUE(status.IsInclude());
  15. for (int i = 0; i < num_exclusion_reasons; ++i) {
  16. EXPECT_FALSE(status.HasExclusionReason(
  17. static_cast<CookieInclusionStatus::ExclusionReason>(i)));
  18. }
  19. for (int i = 0; i < num_warning_reasons; ++i) {
  20. EXPECT_FALSE(status.HasWarningReason(
  21. static_cast<CookieInclusionStatus::WarningReason>(i)));
  22. }
  23. EXPECT_FALSE(
  24. status.HasExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR));
  25. }
  26. TEST(CookieInclusionStatusTest, ExcludeStatus) {
  27. int num_exclusion_reasons =
  28. static_cast<int>(CookieInclusionStatus::NUM_EXCLUSION_REASONS);
  29. // Test exactly one exclusion reason and multiple (two) exclusion reasons.
  30. for (int i = 0; i < num_exclusion_reasons; ++i) {
  31. auto reason1 = static_cast<CookieInclusionStatus::ExclusionReason>(i);
  32. CookieInclusionStatus status_one_reason(reason1);
  33. EXPECT_FALSE(status_one_reason.IsInclude());
  34. EXPECT_TRUE(status_one_reason.HasExclusionReason(reason1));
  35. EXPECT_TRUE(status_one_reason.HasOnlyExclusionReason(reason1));
  36. for (int j = 0; j < num_exclusion_reasons; ++j) {
  37. if (i == j)
  38. continue;
  39. auto reason2 = static_cast<CookieInclusionStatus::ExclusionReason>(j);
  40. EXPECT_FALSE(status_one_reason.HasExclusionReason(reason2));
  41. EXPECT_FALSE(status_one_reason.HasOnlyExclusionReason(reason2));
  42. CookieInclusionStatus status_two_reasons = status_one_reason;
  43. status_two_reasons.AddExclusionReason(reason2);
  44. EXPECT_FALSE(status_two_reasons.IsInclude());
  45. EXPECT_TRUE(status_two_reasons.HasExclusionReason(reason1));
  46. EXPECT_TRUE(status_two_reasons.HasExclusionReason(reason2));
  47. EXPECT_FALSE(status_two_reasons.HasOnlyExclusionReason(reason1));
  48. EXPECT_FALSE(status_two_reasons.HasOnlyExclusionReason(reason2));
  49. }
  50. }
  51. }
  52. TEST(CookieInclusionStatusTest, AddExclusionReason) {
  53. CookieInclusionStatus status;
  54. status.AddWarningReason(
  55. CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_LAX_ALLOW_UNSAFE);
  56. status.AddExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR);
  57. EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
  58. {CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR}));
  59. // Adding an exclusion reason other than
  60. // EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX or
  61. // EXCLUDE_SAMESITE_NONE_INSECURE should clear any SameSite warning.
  62. EXPECT_FALSE(status.ShouldWarn());
  63. status = CookieInclusionStatus();
  64. status.AddWarningReason(
  65. CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT);
  66. status.AddExclusionReason(
  67. CookieInclusionStatus::EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX);
  68. EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
  69. {CookieInclusionStatus::EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX}));
  70. EXPECT_TRUE(status.HasExactlyWarningReasonsForTesting(
  71. {CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT}));
  72. }
  73. TEST(CookieInclusionStatusTest, CheckEachWarningReason) {
  74. CookieInclusionStatus status;
  75. int num_warning_reasons =
  76. static_cast<int>(CookieInclusionStatus::NUM_WARNING_REASONS);
  77. EXPECT_FALSE(status.ShouldWarn());
  78. for (int i = 0; i < num_warning_reasons; ++i) {
  79. auto reason = static_cast<CookieInclusionStatus::WarningReason>(i);
  80. status.AddWarningReason(reason);
  81. EXPECT_TRUE(status.IsInclude());
  82. EXPECT_TRUE(status.ShouldWarn());
  83. EXPECT_TRUE(status.HasWarningReason(reason));
  84. for (int j = 0; j < num_warning_reasons; ++j) {
  85. if (i == j)
  86. continue;
  87. EXPECT_FALSE(status.HasWarningReason(
  88. static_cast<CookieInclusionStatus::WarningReason>(j)));
  89. }
  90. status.RemoveWarningReason(reason);
  91. EXPECT_FALSE(status.ShouldWarn());
  92. }
  93. }
  94. TEST(CookieInclusionStatusTest, RemoveExclusionReason) {
  95. CookieInclusionStatus status(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR);
  96. ASSERT_TRUE(
  97. status.HasExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR));
  98. status.RemoveExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR);
  99. EXPECT_FALSE(
  100. status.HasExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR));
  101. // Removing a nonexistent exclusion reason doesn't do anything.
  102. ASSERT_FALSE(
  103. status.HasExclusionReason(CookieInclusionStatus::NUM_EXCLUSION_REASONS));
  104. status.RemoveExclusionReason(CookieInclusionStatus::NUM_EXCLUSION_REASONS);
  105. EXPECT_FALSE(
  106. status.HasExclusionReason(CookieInclusionStatus::NUM_EXCLUSION_REASONS));
  107. }
  108. TEST(CookieInclusionStatusTest, RemoveWarningReason) {
  109. CookieInclusionStatus status(
  110. CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
  111. CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE);
  112. EXPECT_TRUE(status.ShouldWarn());
  113. ASSERT_TRUE(status.HasWarningReason(
  114. CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE));
  115. status.RemoveWarningReason(
  116. CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE);
  117. EXPECT_FALSE(status.ShouldWarn());
  118. EXPECT_FALSE(status.HasWarningReason(
  119. CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE));
  120. // Removing a nonexistent warning reason doesn't do anything.
  121. ASSERT_FALSE(status.HasWarningReason(
  122. CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT));
  123. status.RemoveWarningReason(
  124. CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT);
  125. EXPECT_FALSE(status.ShouldWarn());
  126. EXPECT_FALSE(status.HasWarningReason(
  127. CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT));
  128. }
  129. TEST(CookieInclusionStatusTest, HasDowngradeWarning) {
  130. std::vector<CookieInclusionStatus::WarningReason> downgrade_warnings = {
  131. CookieInclusionStatus::WARN_STRICT_LAX_DOWNGRADE_STRICT_SAMESITE,
  132. CookieInclusionStatus::WARN_STRICT_CROSS_DOWNGRADE_STRICT_SAMESITE,
  133. CookieInclusionStatus::WARN_STRICT_CROSS_DOWNGRADE_LAX_SAMESITE,
  134. CookieInclusionStatus::WARN_LAX_CROSS_DOWNGRADE_STRICT_SAMESITE,
  135. CookieInclusionStatus::WARN_LAX_CROSS_DOWNGRADE_LAX_SAMESITE,
  136. };
  137. CookieInclusionStatus empty_status;
  138. EXPECT_FALSE(empty_status.HasDowngradeWarning());
  139. CookieInclusionStatus not_downgrade;
  140. not_downgrade.AddWarningReason(
  141. CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT);
  142. EXPECT_FALSE(not_downgrade.HasDowngradeWarning());
  143. for (auto warning : downgrade_warnings) {
  144. CookieInclusionStatus status;
  145. status.AddWarningReason(warning);
  146. CookieInclusionStatus::WarningReason reason;
  147. EXPECT_TRUE(status.HasDowngradeWarning(&reason));
  148. EXPECT_EQ(warning, reason);
  149. }
  150. }
  151. TEST(CookieInclusionStatusTest, ShouldRecordDowngradeMetrics) {
  152. EXPECT_TRUE(CookieInclusionStatus::MakeFromReasonsForTesting({})
  153. .ShouldRecordDowngradeMetrics());
  154. EXPECT_TRUE(CookieInclusionStatus::MakeFromReasonsForTesting(
  155. {
  156. CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT,
  157. })
  158. .ShouldRecordDowngradeMetrics());
  159. EXPECT_TRUE(CookieInclusionStatus::MakeFromReasonsForTesting(
  160. {
  161. CookieInclusionStatus::EXCLUDE_SAMESITE_LAX,
  162. })
  163. .ShouldRecordDowngradeMetrics());
  164. EXPECT_TRUE(CookieInclusionStatus::MakeFromReasonsForTesting(
  165. {
  166. CookieInclusionStatus::
  167. EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX,
  168. })
  169. .ShouldRecordDowngradeMetrics());
  170. // Note: the following cases cannot occur under normal circumstances.
  171. EXPECT_TRUE(CookieInclusionStatus::MakeFromReasonsForTesting(
  172. {
  173. CookieInclusionStatus::
  174. EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX,
  175. CookieInclusionStatus::EXCLUDE_SAMESITE_LAX,
  176. })
  177. .ShouldRecordDowngradeMetrics());
  178. EXPECT_FALSE(CookieInclusionStatus::MakeFromReasonsForTesting(
  179. {
  180. CookieInclusionStatus::EXCLUDE_SAMESITE_NONE_INSECURE,
  181. CookieInclusionStatus::EXCLUDE_SAMESITE_LAX,
  182. })
  183. .ShouldRecordDowngradeMetrics());
  184. }
  185. TEST(CookieInclusionStatusTest, RemoveExclusionReasons) {
  186. CookieInclusionStatus status =
  187. CookieInclusionStatus::MakeFromReasonsForTesting({
  188. CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
  189. CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT,
  190. CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
  191. });
  192. ASSERT_TRUE(status.HasExactlyExclusionReasonsForTesting({
  193. CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
  194. CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT,
  195. CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
  196. }));
  197. status.RemoveExclusionReasons(
  198. {CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
  199. CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
  200. CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT});
  201. EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({
  202. CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
  203. }));
  204. // Removing a nonexistent exclusion reason doesn't do anything.
  205. ASSERT_FALSE(
  206. status.HasExclusionReason(CookieInclusionStatus::NUM_EXCLUSION_REASONS));
  207. status.RemoveExclusionReasons({CookieInclusionStatus::NUM_EXCLUSION_REASONS});
  208. EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({
  209. CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
  210. }));
  211. }
  212. TEST(CookieInclusionStatusTest, ValidateExclusionAndWarningFromWire) {
  213. uint32_t exclusion_reasons = 0ul;
  214. uint32_t warning_reasons = 0ul;
  215. EXPECT_TRUE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  216. exclusion_reasons, warning_reasons));
  217. exclusion_reasons = static_cast<uint32_t>(~0ul);
  218. warning_reasons = static_cast<uint32_t>(~0ul);
  219. EXPECT_FALSE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  220. exclusion_reasons, warning_reasons));
  221. EXPECT_FALSE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  222. exclusion_reasons, 0u));
  223. EXPECT_FALSE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  224. 0u, warning_reasons));
  225. exclusion_reasons = (1u << CookieInclusionStatus::EXCLUDE_DOMAIN_MISMATCH);
  226. warning_reasons = (1u << CookieInclusionStatus::WARN_TREATED_AS_SAMEPARTY);
  227. EXPECT_TRUE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  228. exclusion_reasons, warning_reasons));
  229. exclusion_reasons = (1u << CookieInclusionStatus::NUM_EXCLUSION_REASONS);
  230. warning_reasons = (1u << CookieInclusionStatus::NUM_WARNING_REASONS);
  231. EXPECT_FALSE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  232. exclusion_reasons, warning_reasons));
  233. exclusion_reasons =
  234. (1u << (CookieInclusionStatus::NUM_EXCLUSION_REASONS - 1));
  235. warning_reasons = (1u << (CookieInclusionStatus::NUM_WARNING_REASONS - 1));
  236. EXPECT_TRUE(CookieInclusionStatus::ValidateExclusionAndWarningFromWire(
  237. exclusion_reasons, warning_reasons));
  238. }
  239. } // namespace net