blob: 2ea50787594a51783f9ea2ad3f8e2b77334a5e99 [file] [log] [blame]
Jihwan Marc Kim3e132f12020-05-20 17:33:191// 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
9namespace net {
10
11TEST(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 Kim3e132f12020-05-20 17:33:1918 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
31TEST(CookieInclusionStatusTest, ExcludeStatus) {
32 int num_exclusion_reasons =
33 static_cast<int>(CookieInclusionStatus::NUM_EXCLUSION_REASONS);
Lily Chen70c537a2020-07-20 18:02:0934 // Test exactly one exclusion reason and multiple (two) exclusion reasons.
Jihwan Marc Kim3e132f12020-05-20 17:33:1935 for (int i = 0; i < num_exclusion_reasons; ++i) {
Lily Chen70c537a2020-07-20 18:02:0936 auto reason1 = static_cast<CookieInclusionStatus::ExclusionReason>(i);
37 CookieInclusionStatus status_one_reason(reason1);
Lily Chen70c537a2020-07-20 18:02:0938 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 Kim3e132f12020-05-20 17:33:1942 for (int j = 0; j < num_exclusion_reasons; ++j) {
43 if (i == j)
44 continue;
Lily Chen70c537a2020-07-20 18:02:0945 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 Chen70c537a2020-07-20 18:02:0952 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 Kim3e132f12020-05-20 17:33:1957 }
58 }
59}
60
Jihwan Marc Kim3e132f12020-05-20 17:33:1961TEST(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 Kim3e132f12020-05-20 17:33:1966 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 Kim3e132f12020-05-20 17:33:1978 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
84TEST(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 Kim3e132f12020-05-20 17:33:1993 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
107TEST(CookieInclusionStatusTest, RemoveExclusionReason) {
108 CookieInclusionStatus status(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR);
Jihwan Marc Kim3e132f12020-05-20 17:33:19109 ASSERT_TRUE(
110 status.HasExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR));
111
112 status.RemoveExclusionReason(CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR);
Jihwan Marc Kim3e132f12020-05-20 17:33:19113 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 Kim3e132f12020-05-20 17:33:19120 EXPECT_FALSE(
121 status.HasExclusionReason(CookieInclusionStatus::NUM_EXCLUSION_REASONS));
122}
123
124TEST(CookieInclusionStatusTest, RemoveWarningReason) {
125 CookieInclusionStatus status(
126 CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
127 CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE);
Jihwan Marc Kim3e132f12020-05-20 17:33:19128 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 Kim3e132f12020-05-20 17:33:19134 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 Kim3e132f12020-05-20 17:33:19143 EXPECT_FALSE(status.ShouldWarn());
144 EXPECT_FALSE(status.HasWarningReason(
145 CookieInclusionStatus::WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT));
146}
147
148TEST(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}
cfredric2c5cfa62020-11-16 19:59:25174
175TEST(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
cfredric05c78ac2021-01-06 18:10:26214TEST(CookieInclusionStatusTest, RemoveExclusionReasons) {
215 CookieInclusionStatus status =
216 CookieInclusionStatus::MakeFromReasonsForTesting({
217 CookieInclusionStatus::EXCLUDE_UNKNOWN_ERROR,
218 CookieInclusionStatus::EXCLUDE_SAMESITE_STRICT,
219 CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
220 });
cfredric05c78ac2021-01-06 18:10:26221 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});
cfredric05c78ac2021-01-06 18:10:26231 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});
cfredric05c78ac2021-01-06 18:10:26239 EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({
240 CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
241 }));
242}
243
Matt Reichhoff4b2311eef2021-10-01 20:56:59244TEST(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 Kim3e132f12020-05-20 17:33:19277} // namespace net