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