blob: 72dbc9940bce567cb32c68e41c9a6257381c4764 [file] [log] [blame]
[email protected]ebfe3172012-07-12 12:21:411// Copyright (c) 2012 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 <string>
6
[email protected]ab2d75c82013-04-19 18:39:047#include "net/cookies/cookie_constants.h"
[email protected]ebfe3172012-07-12 12:21:418#include "net/cookies/parsed_cookie.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace net {
12
[email protected]ebfe3172012-07-12 12:21:4113TEST(ParsedCookieTest, TestBasic) {
14 ParsedCookie pc("a=b");
15 EXPECT_TRUE(pc.IsValid());
16 EXPECT_FALSE(pc.IsSecure());
17 EXPECT_EQ("a", pc.Name());
18 EXPECT_EQ("b", pc.Value());
19}
20
[email protected]8fbe410412014-07-28 17:17:4121TEST(ParsedCookieTest, TestEmpty) {
Mike Westaa303152020-01-08 18:26:3222 const char* kTestCookieLines[]{"", " ", "=", "=;", " =;",
23 "= ;", " = ;", ";", " ;", " ; ",
24 "\t", "\t;", "\t=\t", "\t=", "=\t"};
jww03e6ff8c2016-08-17 19:19:5825
Mike Westaa303152020-01-08 18:26:3226 for (const char* test : kTestCookieLines) {
27 ParsedCookie pc(test);
28 EXPECT_FALSE(pc.IsValid());
jww03e6ff8c2016-08-17 19:19:5829 }
[email protected]8fbe410412014-07-28 17:17:4130}
31
[email protected]ebfe3172012-07-12 12:21:4132TEST(ParsedCookieTest, TestQuoted) {
33 // These are some quoting cases which the major browsers all
34 // handle differently. I've tested Internet Explorer 6, Opera 9.6,
35 // Firefox 3, and Safari Windows 3.2.1. We originally tried to match
36 // Firefox closely, however we now match Internet Explorer and Safari.
Ryan Sleevi435a3a22018-05-15 02:16:0737 const struct {
38 const char* input;
39 const char* expected;
40 } kTests[] = {
mkwstbe84af312015-02-20 08:52:4541 // Trailing whitespace after a quoted value. The whitespace after
42 // the quote is stripped in all browsers.
Ryan Sleevi435a3a22018-05-15 02:16:0743 {"\"zzz \" ", "\"zzz \""},
mkwstbe84af312015-02-20 08:52:4544 // Handling a quoted value with a ';', like FOO="zz;pp" ;
45 // IE and Safari: "zz;
46 // Firefox and Opera: "zz;pp"
Ryan Sleevi435a3a22018-05-15 02:16:0747 {"\"zz;pp\" ;", "\"zz"},
mkwstbe84af312015-02-20 08:52:4548 // Handling a value with multiple quoted parts, like FOO="zzz " "ppp" ;
49 // IE and Safari: "zzz " "ppp";
50 // Firefox: "zzz ";
51 // Opera: <rejects cookie>
Ryan Sleevi435a3a22018-05-15 02:16:0752 {
53 "\"zzz \" \"ppp\" ", "\"zzz \" \"ppp\"",
54 },
mkwstbe84af312015-02-20 08:52:4555 // A quote in a value that didn't start quoted. like FOO=A"B ;
56 // IE, Safari, and Firefox: A"B;
57 // Opera: <rejects cookie>
Ryan Sleevi435a3a22018-05-15 02:16:0758 {
59 "A\"B", "A\"B",
60 }};
[email protected]ebfe3172012-07-12 12:21:4161
Ryan Sleevi435a3a22018-05-15 02:16:0762 for (const auto& test : kTests) {
63 ParsedCookie pc(std::string("aBc=") + test.input +
64 " ; path=\"/\" ; httponly ");
[email protected]ebfe3172012-07-12 12:21:4165 EXPECT_TRUE(pc.IsValid());
66 EXPECT_FALSE(pc.IsSecure());
67 EXPECT_TRUE(pc.IsHttpOnly());
68 EXPECT_TRUE(pc.HasPath());
69 EXPECT_EQ("aBc", pc.Name());
Ryan Sleevi435a3a22018-05-15 02:16:0770 EXPECT_EQ(test.expected, pc.Value());
[email protected]ebfe3172012-07-12 12:21:4171
72 // If a path was quoted, the path attribute keeps the quotes. This will
73 // make the cookie effectively useless, but path parameters aren't supposed
74 // to be quoted. Bug 1261605.
75 EXPECT_EQ("\"/\"", pc.Path());
76 }
77}
78
79TEST(ParsedCookieTest, TestNameless) {
80 ParsedCookie pc("BLAHHH; path=/; secure;");
81 EXPECT_TRUE(pc.IsValid());
82 EXPECT_TRUE(pc.IsSecure());
83 EXPECT_TRUE(pc.HasPath());
84 EXPECT_EQ("/", pc.Path());
85 EXPECT_EQ("", pc.Name());
86 EXPECT_EQ("BLAHHH", pc.Value());
[email protected]ab2d75c82013-04-19 18:39:0487 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:4188}
89
90TEST(ParsedCookieTest, TestAttributeCase) {
mkwste1a29582016-03-15 10:07:5291 ParsedCookie pc(
92 "BLAHHH; Path=/; sECuRe; httpONLY; sAmESitE=StrIct; pRIoRitY=hIgH");
[email protected]ebfe3172012-07-12 12:21:4193 EXPECT_TRUE(pc.IsValid());
94 EXPECT_TRUE(pc.IsSecure());
95 EXPECT_TRUE(pc.IsHttpOnly());
mkwste1a29582016-03-15 10:07:5296 EXPECT_EQ(CookieSameSite::STRICT_MODE, pc.SameSite());
[email protected]ebfe3172012-07-12 12:21:4197 EXPECT_TRUE(pc.HasPath());
98 EXPECT_EQ("/", pc.Path());
99 EXPECT_EQ("", pc.Name());
100 EXPECT_EQ("BLAHHH", pc.Value());
[email protected]ab2d75c82013-04-19 18:39:04101 EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority());
mkwstae819bb2015-02-23 05:10:31102 EXPECT_EQ(5U, pc.NumberOfAttributes());
[email protected]ebfe3172012-07-12 12:21:41103}
104
105TEST(ParsedCookieTest, TestDoubleQuotedNameless) {
106 ParsedCookie pc("\"BLA\\\"HHH\"; path=/; secure;");
107 EXPECT_TRUE(pc.IsValid());
108 EXPECT_TRUE(pc.IsSecure());
109 EXPECT_TRUE(pc.HasPath());
110 EXPECT_EQ("/", pc.Path());
111 EXPECT_EQ("", pc.Name());
112 EXPECT_EQ("\"BLA\\\"HHH\"", pc.Value());
[email protected]ab2d75c82013-04-19 18:39:04113 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41114 EXPECT_EQ(2U, pc.NumberOfAttributes());
115}
116
117TEST(ParsedCookieTest, QuoteOffTheEnd) {
118 ParsedCookie pc("a=\"B");
119 EXPECT_TRUE(pc.IsValid());
120 EXPECT_EQ("a", pc.Name());
121 EXPECT_EQ("\"B", pc.Value());
[email protected]ab2d75c82013-04-19 18:39:04122 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41123 EXPECT_EQ(0U, pc.NumberOfAttributes());
124}
125
126TEST(ParsedCookieTest, MissingName) {
127 ParsedCookie pc("=ABC");
128 EXPECT_TRUE(pc.IsValid());
129 EXPECT_EQ("", pc.Name());
130 EXPECT_EQ("ABC", pc.Value());
[email protected]ab2d75c82013-04-19 18:39:04131 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41132 EXPECT_EQ(0U, pc.NumberOfAttributes());
133}
134
135TEST(ParsedCookieTest, MissingValue) {
136 ParsedCookie pc("ABC=; path = /wee");
137 EXPECT_TRUE(pc.IsValid());
138 EXPECT_EQ("ABC", pc.Name());
139 EXPECT_EQ("", pc.Value());
140 EXPECT_TRUE(pc.HasPath());
141 EXPECT_EQ("/wee", pc.Path());
[email protected]ab2d75c82013-04-19 18:39:04142 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41143 EXPECT_EQ(1U, pc.NumberOfAttributes());
144}
145
146TEST(ParsedCookieTest, Whitespace) {
mkwste1a29582016-03-15 10:07:52147 ParsedCookie pc(" A = BC ;secure;;; samesite = lax ");
[email protected]ebfe3172012-07-12 12:21:41148 EXPECT_TRUE(pc.IsValid());
149 EXPECT_EQ("A", pc.Name());
150 EXPECT_EQ("BC", pc.Value());
151 EXPECT_FALSE(pc.HasPath());
152 EXPECT_FALSE(pc.HasDomain());
153 EXPECT_TRUE(pc.IsSecure());
mkwstae819bb2015-02-23 05:10:31154 EXPECT_FALSE(pc.IsHttpOnly());
mkwste1a29582016-03-15 10:07:52155 EXPECT_EQ(CookieSameSite::LAX_MODE, pc.SameSite());
[email protected]ab2d75c82013-04-19 18:39:04156 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41157 // We parse anything between ; as attributes, so we end up with two
158 // attributes with an empty string name and value.
159 EXPECT_EQ(4U, pc.NumberOfAttributes());
160}
161TEST(ParsedCookieTest, MultipleEquals) {
162 ParsedCookie pc(" A=== BC ;secure;;; httponly");
163 EXPECT_TRUE(pc.IsValid());
164 EXPECT_EQ("A", pc.Name());
165 EXPECT_EQ("== BC", pc.Value());
166 EXPECT_FALSE(pc.HasPath());
167 EXPECT_FALSE(pc.HasDomain());
168 EXPECT_TRUE(pc.IsSecure());
169 EXPECT_TRUE(pc.IsHttpOnly());
Lily Chen324657c2019-04-19 14:09:44170 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite());
[email protected]ab2d75c82013-04-19 18:39:04171 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41172 EXPECT_EQ(4U, pc.NumberOfAttributes());
173}
174
[email protected]ebfe3172012-07-12 12:21:41175TEST(ParsedCookieTest, QuotedTrailingWhitespace) {
mkwstbe84af312015-02-20 08:52:45176 ParsedCookie pc(
177 "ANCUUID=\"zohNumRKgI0oxyhSsV3Z7D\" ; "
178 "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
179 "path=/ ; ");
[email protected]ebfe3172012-07-12 12:21:41180 EXPECT_TRUE(pc.IsValid());
181 EXPECT_EQ("ANCUUID", pc.Name());
182 // Stripping whitespace after the quotes matches all other major browsers.
183 EXPECT_EQ("\"zohNumRKgI0oxyhSsV3Z7D\"", pc.Value());
184 EXPECT_TRUE(pc.HasExpires());
185 EXPECT_TRUE(pc.HasPath());
186 EXPECT_EQ("/", pc.Path());
[email protected]ab2d75c82013-04-19 18:39:04187 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41188 EXPECT_EQ(2U, pc.NumberOfAttributes());
189}
190
191TEST(ParsedCookieTest, TrailingWhitespace) {
mkwstbe84af312015-02-20 08:52:45192 ParsedCookie pc(
193 "ANCUUID=zohNumRKgI0oxyhSsV3Z7D ; "
194 "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
195 "path=/ ; ");
[email protected]ebfe3172012-07-12 12:21:41196 EXPECT_TRUE(pc.IsValid());
197 EXPECT_EQ("ANCUUID", pc.Name());
198 EXPECT_EQ("zohNumRKgI0oxyhSsV3Z7D", pc.Value());
199 EXPECT_TRUE(pc.HasExpires());
200 EXPECT_TRUE(pc.HasPath());
201 EXPECT_EQ("/", pc.Path());
[email protected]ab2d75c82013-04-19 18:39:04202 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
[email protected]ebfe3172012-07-12 12:21:41203 EXPECT_EQ(2U, pc.NumberOfAttributes());
204}
205
mkwstbadf4bf2017-05-15 10:49:13206TEST(ParsedCookieTest, LotsOfPairs) {
207 for (int i = 1; i < 100; i++) {
208 std::string blankpairs;
209 blankpairs.resize(i, ';');
[email protected]ebfe3172012-07-12 12:21:41210
mkwstbadf4bf2017-05-15 10:49:13211 ParsedCookie c("a=b;" + blankpairs + "secure");
212 EXPECT_EQ("a", c.Name());
213 EXPECT_EQ("b", c.Value());
214 EXPECT_TRUE(c.IsValid());
215 EXPECT_TRUE(c.IsSecure());
216 }
[email protected]ebfe3172012-07-12 12:21:41217}
218
219// TODO(erikwright): some better test cases for invalid cookies.
[email protected]ebfe3172012-07-12 12:21:41220TEST(ParsedCookieTest, InvalidTooLong) {
221 std::string maxstr;
222 maxstr.resize(ParsedCookie::kMaxCookieSize, 'a');
223
224 ParsedCookie pc1(maxstr);
225 EXPECT_TRUE(pc1.IsValid());
226
227 ParsedCookie pc2(maxstr + "A");
228 EXPECT_FALSE(pc2.IsValid());
229}
230
[email protected]ebfe3172012-07-12 12:21:41231TEST(ParsedCookieTest, EmbeddedTerminator) {
232 ParsedCookie pc1("AAA=BB\0ZYX");
233 ParsedCookie pc2("AAA=BB\rZYX");
234 ParsedCookie pc3("AAA=BB\nZYX");
235 EXPECT_TRUE(pc1.IsValid());
236 EXPECT_EQ("AAA", pc1.Name());
237 EXPECT_EQ("BB", pc1.Value());
238 EXPECT_TRUE(pc2.IsValid());
239 EXPECT_EQ("AAA", pc2.Name());
240 EXPECT_EQ("BB", pc2.Value());
241 EXPECT_TRUE(pc3.IsValid());
242 EXPECT_EQ("AAA", pc3.Name());
243 EXPECT_EQ("BB", pc3.Value());
244}
245
246TEST(ParsedCookieTest, ParseTokensAndValues) {
mkwstbe84af312015-02-20 08:52:45247 EXPECT_EQ("hello", ParsedCookie::ParseTokenString("hello\nworld"));
248 EXPECT_EQ("fs!!@", ParsedCookie::ParseTokenString("fs!!@;helloworld"));
[email protected]ebfe3172012-07-12 12:21:41249 EXPECT_EQ("hello world\tgood",
250 ParsedCookie::ParseTokenString("hello world\tgood\rbye"));
mkwstbe84af312015-02-20 08:52:45251 EXPECT_EQ("A", ParsedCookie::ParseTokenString("A=B=C;D=E"));
252 EXPECT_EQ("hello", ParsedCookie::ParseValueString("hello\nworld"));
253 EXPECT_EQ("fs!!@", ParsedCookie::ParseValueString("fs!!@;helloworld"));
[email protected]ebfe3172012-07-12 12:21:41254 EXPECT_EQ("hello world\tgood",
255 ParsedCookie::ParseValueString("hello world\tgood\rbye"));
mkwstbe84af312015-02-20 08:52:45256 EXPECT_EQ("A=B=C", ParsedCookie::ParseValueString("A=B=C;D=E"));
[email protected]ebfe3172012-07-12 12:21:41257}
258
[email protected]64527a52012-08-02 13:37:41259TEST(ParsedCookieTest, SerializeCookieLine) {
mkwstbe84af312015-02-20 08:52:45260 const char input[] =
261 "ANCUUID=zohNumRKgI0oxyhSsV3Z7D ; "
262 "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
263 "path=/ ; priority=low ; ";
264 const char output[] =
265 "ANCUUID=zohNumRKgI0oxyhSsV3Z7D; "
266 "expires=Sun, 18-Apr-2027 21:06:29 GMT; "
267 "path=/; priority=low";
[email protected]64527a52012-08-02 13:37:41268 ParsedCookie pc(input);
269 EXPECT_EQ(output, pc.ToCookieLine());
270}
271
[email protected]64527a52012-08-02 13:37:41272TEST(ParsedCookieTest, SetNameAndValue) {
Mike Westaa303152020-01-08 18:26:32273 ParsedCookie cookie("a=b");
274 EXPECT_TRUE(cookie.IsValid());
275 EXPECT_TRUE(cookie.SetDomain("foobar.com"));
276 EXPECT_TRUE(cookie.SetName("name"));
277 EXPECT_TRUE(cookie.SetValue("value"));
278 EXPECT_EQ("name=value; domain=foobar.com", cookie.ToCookieLine());
279 EXPECT_TRUE(cookie.IsValid());
[email protected]64527a52012-08-02 13:37:41280
281 // We don't test
282 // ParsedCookie invalid("@foo=bar");
283 // EXPECT_FALSE(invalid.IsValid());
284 // here because we are slightly more tolerant to invalid cookie names and
285 // values that are set by webservers. We only enforce a correct name and
286 // value if set via SetName() and SetValue().
287
288 ParsedCookie pc("name=value");
289 EXPECT_TRUE(pc.IsValid());
290
291 // Set invalid name / value.
292 EXPECT_FALSE(pc.SetName("@foobar"));
293 EXPECT_EQ("name=value", pc.ToCookieLine());
294 EXPECT_TRUE(pc.IsValid());
295
[email protected]64527a52012-08-02 13:37:41296 EXPECT_FALSE(pc.SetValue("foo bar"));
297 EXPECT_EQ("name=value", pc.ToCookieLine());
298 EXPECT_TRUE(pc.IsValid());
299
300 EXPECT_FALSE(pc.SetValue("\"foobar"));
301 EXPECT_EQ("name=value", pc.ToCookieLine());
302 EXPECT_TRUE(pc.IsValid());
303
304 // Set valid name / value
jww03e6ff8c2016-08-17 19:19:58305 EXPECT_TRUE(pc.SetName(std::string()));
306 EXPECT_EQ("=value", pc.ToCookieLine());
307 EXPECT_TRUE(pc.IsValid());
308
[email protected]64527a52012-08-02 13:37:41309 EXPECT_TRUE(pc.SetName("test"));
310 EXPECT_EQ("test=value", pc.ToCookieLine());
311 EXPECT_TRUE(pc.IsValid());
312
313 EXPECT_TRUE(pc.SetValue("\"foobar\""));
314 EXPECT_EQ("test=\"foobar\"", pc.ToCookieLine());
315 EXPECT_TRUE(pc.IsValid());
316
[email protected]007b3f82013-04-09 08:46:45317 EXPECT_TRUE(pc.SetValue(std::string()));
[email protected]64527a52012-08-02 13:37:41318 EXPECT_EQ("test=", pc.ToCookieLine());
319 EXPECT_TRUE(pc.IsValid());
320}
321
322TEST(ParsedCookieTest, SetAttributes) {
323 ParsedCookie pc("name=value");
324 EXPECT_TRUE(pc.IsValid());
325
326 // Clear an unset attribute.
[email protected]007b3f82013-04-09 08:46:45327 EXPECT_TRUE(pc.SetDomain(std::string()));
[email protected]64527a52012-08-02 13:37:41328 EXPECT_FALSE(pc.HasDomain());
329 EXPECT_EQ("name=value", pc.ToCookieLine());
330 EXPECT_TRUE(pc.IsValid());
331
332 // Set a string containing an invalid character
333 EXPECT_FALSE(pc.SetDomain("foo;bar"));
334 EXPECT_FALSE(pc.HasDomain());
335 EXPECT_EQ("name=value", pc.ToCookieLine());
336 EXPECT_TRUE(pc.IsValid());
337
338 // Set all other attributes and check that they are appended in order.
339 EXPECT_TRUE(pc.SetDomain("domain.com"));
340 EXPECT_TRUE(pc.SetPath("/"));
[email protected]64527a52012-08-02 13:37:41341 EXPECT_TRUE(pc.SetExpires("Sun, 18-Apr-2027 21:06:29 GMT"));
342 EXPECT_TRUE(pc.SetMaxAge("12345"));
343 EXPECT_TRUE(pc.SetIsSecure(true));
344 EXPECT_TRUE(pc.SetIsHttpOnly(true));
[email protected]ab2d75c82013-04-19 18:39:04345 EXPECT_TRUE(pc.SetIsHttpOnly(true));
mkwste1a29582016-03-15 10:07:52346 EXPECT_TRUE(pc.SetSameSite("LAX"));
[email protected]ab2d75c82013-04-19 18:39:04347 EXPECT_TRUE(pc.SetPriority("HIGH"));
mkwstbe84af312015-02-20 08:52:45348 EXPECT_EQ(
349 "name=value; domain=domain.com; path=/; "
350 "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
mkwste1a29582016-03-15 10:07:52351 "httponly; samesite=LAX; priority=HIGH",
mkwstbe84af312015-02-20 08:52:45352 pc.ToCookieLine());
[email protected]64527a52012-08-02 13:37:41353 EXPECT_TRUE(pc.HasDomain());
354 EXPECT_TRUE(pc.HasPath());
[email protected]64527a52012-08-02 13:37:41355 EXPECT_TRUE(pc.HasExpires());
356 EXPECT_TRUE(pc.HasMaxAge());
357 EXPECT_TRUE(pc.IsSecure());
358 EXPECT_TRUE(pc.IsHttpOnly());
mkwste1a29582016-03-15 10:07:52359 EXPECT_EQ(CookieSameSite::LAX_MODE, pc.SameSite());
[email protected]ab2d75c82013-04-19 18:39:04360 EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority());
[email protected]64527a52012-08-02 13:37:41361
362 // Clear one attribute from the middle.
[email protected]dedec0b2013-02-28 04:50:10363 EXPECT_TRUE(pc.SetPath("/foo"));
[email protected]64527a52012-08-02 13:37:41364 EXPECT_TRUE(pc.HasDomain());
365 EXPECT_TRUE(pc.HasPath());
[email protected]64527a52012-08-02 13:37:41366 EXPECT_TRUE(pc.HasExpires());
[email protected]64527a52012-08-02 13:37:41367 EXPECT_TRUE(pc.IsSecure());
368 EXPECT_TRUE(pc.IsHttpOnly());
mkwstbe84af312015-02-20 08:52:45369 EXPECT_EQ(
370 "name=value; domain=domain.com; path=/foo; "
371 "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
mkwste1a29582016-03-15 10:07:52372 "httponly; samesite=LAX; priority=HIGH",
mkwstbe84af312015-02-20 08:52:45373 pc.ToCookieLine());
[email protected]ab2d75c82013-04-19 18:39:04374
375 // Set priority to medium.
376 EXPECT_TRUE(pc.SetPriority("medium"));
mkwstbe84af312015-02-20 08:52:45377 EXPECT_EQ(
378 "name=value; domain=domain.com; path=/foo; "
379 "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
mkwste1a29582016-03-15 10:07:52380 "httponly; samesite=LAX; priority=medium",
mkwstbe84af312015-02-20 08:52:45381 pc.ToCookieLine());
[email protected]64527a52012-08-02 13:37:41382
383 // Clear the rest and change the name and value.
[email protected]007b3f82013-04-09 08:46:45384 EXPECT_TRUE(pc.SetDomain(std::string()));
385 EXPECT_TRUE(pc.SetPath(std::string()));
386 EXPECT_TRUE(pc.SetExpires(std::string()));
387 EXPECT_TRUE(pc.SetMaxAge(std::string()));
[email protected]64527a52012-08-02 13:37:41388 EXPECT_TRUE(pc.SetIsSecure(false));
389 EXPECT_TRUE(pc.SetIsHttpOnly(false));
mkwste1a29582016-03-15 10:07:52390 EXPECT_TRUE(pc.SetSameSite(std::string()));
[email protected]64527a52012-08-02 13:37:41391 EXPECT_TRUE(pc.SetName("name2"));
392 EXPECT_TRUE(pc.SetValue("value2"));
[email protected]ab2d75c82013-04-19 18:39:04393 EXPECT_TRUE(pc.SetPriority(std::string()));
[email protected]64527a52012-08-02 13:37:41394 EXPECT_FALSE(pc.HasDomain());
395 EXPECT_FALSE(pc.HasPath());
[email protected]64527a52012-08-02 13:37:41396 EXPECT_FALSE(pc.HasExpires());
397 EXPECT_FALSE(pc.HasMaxAge());
398 EXPECT_FALSE(pc.IsSecure());
399 EXPECT_FALSE(pc.IsHttpOnly());
Lily Chen324657c2019-04-19 14:09:44400 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite());
[email protected]64527a52012-08-02 13:37:41401 EXPECT_EQ("name2=value2", pc.ToCookieLine());
402}
403
jww03e6ff8c2016-08-17 19:19:58404// Set the domain attribute twice in a cookie line. If the second attribute's
405// value is empty, it shoud be ignored.
406//
407// This is de facto standard behavior, per https://crbug.com/601786.
408TEST(ParsedCookieTest, MultipleDomainAttributes) {
409 ParsedCookie pc1("name=value; domain=foo.com; domain=bar.com");
410 EXPECT_EQ("bar.com", pc1.Domain());
411 ParsedCookie pc2("name=value; domain=foo.com; domain=");
412 EXPECT_EQ("foo.com", pc2.Domain());
413}
414
[email protected]ab2d75c82013-04-19 18:39:04415TEST(ParsedCookieTest, SetPriority) {
416 ParsedCookie pc("name=value");
417 EXPECT_TRUE(pc.IsValid());
418
419 EXPECT_EQ("name=value", pc.ToCookieLine());
420 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
421
422 // Test each priority, expect case-insensitive compare.
423 EXPECT_TRUE(pc.SetPriority("high"));
424 EXPECT_EQ("name=value; priority=high", pc.ToCookieLine());
425 EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority());
426
427 EXPECT_TRUE(pc.SetPriority("mEDium"));
428 EXPECT_EQ("name=value; priority=mEDium", pc.ToCookieLine());
429 EXPECT_EQ(COOKIE_PRIORITY_MEDIUM, pc.Priority());
430
431 EXPECT_TRUE(pc.SetPriority("LOW"));
432 EXPECT_EQ("name=value; priority=LOW", pc.ToCookieLine());
433 EXPECT_EQ(COOKIE_PRIORITY_LOW, pc.Priority());
434
435 // Interpret invalid priority values as COOKIE_PRIORITY_DEFAULT.
436 EXPECT_TRUE(pc.SetPriority("Blah"));
437 EXPECT_EQ("name=value; priority=Blah", pc.ToCookieLine());
438 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
439
440 EXPECT_TRUE(pc.SetPriority("lowerest"));
441 EXPECT_EQ("name=value; priority=lowerest", pc.ToCookieLine());
442 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
443
444 EXPECT_TRUE(pc.SetPriority(""));
445 EXPECT_EQ("name=value", pc.ToCookieLine());
446 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
447}
448
mkwste1a29582016-03-15 10:07:52449TEST(ParsedCookieTest, SetSameSite) {
450 ParsedCookie pc("name=value");
451 EXPECT_TRUE(pc.IsValid());
452
453 EXPECT_EQ("name=value", pc.ToCookieLine());
Lily Chen324657c2019-04-19 14:09:44454 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite());
mkwste1a29582016-03-15 10:07:52455
Eric Lawrence5fbb75e92018-04-12 20:39:53456 // Test each samesite directive, expect case-insensitive compare.
mkwste1a29582016-03-15 10:07:52457 EXPECT_TRUE(pc.SetSameSite("strict"));
458 EXPECT_EQ("name=value; samesite=strict", pc.ToCookieLine());
459 EXPECT_EQ(CookieSameSite::STRICT_MODE, pc.SameSite());
mkwst1a9ce0d2016-04-06 19:44:21460 EXPECT_TRUE(pc.IsValid());
mkwste1a29582016-03-15 10:07:52461
462 EXPECT_TRUE(pc.SetSameSite("lAx"));
463 EXPECT_EQ("name=value; samesite=lAx", pc.ToCookieLine());
464 EXPECT_EQ(CookieSameSite::LAX_MODE, pc.SameSite());
mkwst1a9ce0d2016-04-06 19:44:21465 EXPECT_TRUE(pc.IsValid());
mkwste1a29582016-03-15 10:07:52466
467 EXPECT_TRUE(pc.SetSameSite("LAX"));
468 EXPECT_EQ("name=value; samesite=LAX", pc.ToCookieLine());
469 EXPECT_EQ(CookieSameSite::LAX_MODE, pc.SameSite());
mkwst1a9ce0d2016-04-06 19:44:21470 EXPECT_TRUE(pc.IsValid());
mkwste1a29582016-03-15 10:07:52471
Lily Chen324657c2019-04-19 14:09:44472 EXPECT_TRUE(pc.SetSameSite("None"));
473 EXPECT_EQ("name=value; samesite=None", pc.ToCookieLine());
474 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, pc.SameSite());
475 EXPECT_TRUE(pc.IsValid());
476
477 EXPECT_TRUE(pc.SetSameSite("NONE"));
478 EXPECT_EQ("name=value; samesite=NONE", pc.ToCookieLine());
479 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, pc.SameSite());
480 EXPECT_TRUE(pc.IsValid());
481
Eric Lawrence5fbb75e92018-04-12 20:39:53482 // Remove the SameSite attribute.
mkwste1a29582016-03-15 10:07:52483 EXPECT_TRUE(pc.SetSameSite(""));
484 EXPECT_EQ("name=value", pc.ToCookieLine());
Lily Chen324657c2019-04-19 14:09:44485 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite());
mkwst1a9ce0d2016-04-06 19:44:21486 EXPECT_TRUE(pc.IsValid());
487
488 EXPECT_TRUE(pc.SetSameSite("Blah"));
Eric Lawrence5fbb75e92018-04-12 20:39:53489 EXPECT_EQ("name=value; samesite=Blah", pc.ToCookieLine());
Lily Chen324657c2019-04-19 14:09:44490 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite());
Eric Lawrence5fbb75e92018-04-12 20:39:53491 EXPECT_TRUE(pc.IsValid());
mkwst1a9ce0d2016-04-06 19:44:21492}
493
Lily Chen9a9c08a92019-09-18 00:18:16494// Test that the correct enum value is returned for the SameSite attribute
495// string.
496TEST(ParsedCookieTest, CookieSameSiteStringEnum) {
497 ParsedCookie pc("name=value; SameSite");
498 CookieSameSiteString actual = CookieSameSiteString::kLax;
499 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite(&actual));
500 EXPECT_EQ(CookieSameSiteString::kEmptyString, actual);
501
502 pc.SetSameSite("Strict");
503 EXPECT_EQ(CookieSameSite::STRICT_MODE, pc.SameSite(&actual));
504 EXPECT_EQ(CookieSameSiteString::kStrict, actual);
505
506 pc.SetSameSite("Lax");
507 EXPECT_EQ(CookieSameSite::LAX_MODE, pc.SameSite(&actual));
508 EXPECT_EQ(CookieSameSiteString::kLax, actual);
509
510 pc.SetSameSite("None");
511 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, pc.SameSite(&actual));
512 EXPECT_EQ(CookieSameSiteString::kNone, actual);
513
514 pc.SetSameSite("Extended");
Caleb Raittof1af4b32019-10-28 20:02:31515 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite(&actual));
Lily Chen9a9c08a92019-09-18 00:18:16516 EXPECT_EQ(CookieSameSiteString::kExtended, actual);
517
518 pc.SetSameSite("Bananas");
519 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc.SameSite(&actual));
520 EXPECT_EQ(CookieSameSiteString::kUnrecognized, actual);
521
522 ParsedCookie pc2("no_samesite=1");
523 EXPECT_EQ(CookieSameSite::UNSPECIFIED, pc2.SameSite(&actual));
524 EXPECT_EQ(CookieSameSiteString::kUnspecified, actual);
525}
526
Daniel McArdle7c8bd14d2019-06-18 22:57:33527TEST(ParsedCookieTest, SettersInputValidation) {
528 ParsedCookie pc("name=foobar");
529 EXPECT_TRUE(pc.SetPath("baz"));
530 EXPECT_EQ(pc.ToCookieLine(), "name=foobar; path=baz");
531
532 EXPECT_TRUE(pc.SetPath(" baz "));
533 EXPECT_EQ(pc.ToCookieLine(), "name=foobar; path=baz");
534
535 EXPECT_TRUE(pc.SetPath(" "));
536 EXPECT_EQ(pc.ToCookieLine(), "name=foobar");
537
538 EXPECT_TRUE(pc.SetDomain(" baz "));
539 EXPECT_EQ(pc.ToCookieLine(), "name=foobar; domain=baz");
540
541 // Invalid characters
542 EXPECT_FALSE(pc.SetPath(" baz\n "));
543 EXPECT_FALSE(pc.SetPath("f;oo"));
544 EXPECT_FALSE(pc.SetPath("\r"));
545 EXPECT_FALSE(pc.SetPath("\a"));
546 EXPECT_FALSE(pc.SetPath("\t"));
547 EXPECT_FALSE(pc.SetSameSite("\r"));
548}
549
Daniel McArdleef614252019-06-24 21:56:38550TEST(ParsedCookieTest, ToCookieLineSpecialTokens) {
551 // Special tokens "secure" and "httponly" should be treated as any other name
552 // when they are in the first position.
553 {
554 ParsedCookie pc("");
555 pc.SetName("secure");
556 EXPECT_EQ(pc.ToCookieLine(), "secure=");
557 }
558 {
559 ParsedCookie pc("secure");
560 EXPECT_EQ(pc.ToCookieLine(), "=secure");
561 }
562 {
563 ParsedCookie pc("secure=foo");
564 EXPECT_EQ(pc.ToCookieLine(), "secure=foo");
565 }
566 {
567 ParsedCookie pc("foo=secure");
568 EXPECT_EQ(pc.ToCookieLine(), "foo=secure");
569 }
570 {
571 ParsedCookie pc("httponly=foo");
572 EXPECT_EQ(pc.ToCookieLine(), "httponly=foo");
573 }
574 {
575 ParsedCookie pc("foo");
576 pc.SetName("secure");
577 EXPECT_EQ(pc.ToCookieLine(), "secure=foo");
578 }
579 {
580 ParsedCookie pc("bar");
581 pc.SetName("httponly");
582 EXPECT_EQ(pc.ToCookieLine(), "httponly=bar");
583 }
584 {
585 ParsedCookie pc("foo=bar; baz=bob");
586 EXPECT_EQ(pc.ToCookieLine(), "foo=bar; baz=bob");
587 }
588 // Outside of the first position, the value associated with a special name
589 // should not be printed.
590 {
591 ParsedCookie pc("name=foo; secure");
592 EXPECT_EQ(pc.ToCookieLine(), "name=foo; secure");
593 }
594 {
595 ParsedCookie pc("name=foo; secure=bar");
596 EXPECT_EQ(pc.ToCookieLine(), "name=foo; secure");
597 }
598 {
599 ParsedCookie pc("name=foo; httponly=baz");
600 EXPECT_EQ(pc.ToCookieLine(), "name=foo; httponly");
601 }
602 {
603 ParsedCookie pc("name=foo; bar=secure");
604 EXPECT_EQ(pc.ToCookieLine(), "name=foo; bar=secure");
605 }
606}
607
Eric Lawrence5fbb75e92018-04-12 20:39:53608TEST(ParsedCookieTest, SameSiteValues) {
mkwst1a9ce0d2016-04-06 19:44:21609 struct TestCase {
610 const char* cookie;
611 bool valid;
612 CookieSameSite mode;
613 } cases[]{{"n=v; samesite=strict", true, CookieSameSite::STRICT_MODE},
614 {"n=v; samesite=lax", true, CookieSameSite::LAX_MODE},
Lily Chen324657c2019-04-19 14:09:44615 {"n=v; samesite=none", true, CookieSameSite::NO_RESTRICTION},
616 {"n=v; samesite=boo", true, CookieSameSite::UNSPECIFIED},
617 {"n=v; samesite", true, CookieSameSite::UNSPECIFIED},
618 {"n=v", true, CookieSameSite::UNSPECIFIED}};
mkwst1a9ce0d2016-04-06 19:44:21619
620 for (const auto& test : cases) {
621 SCOPED_TRACE(test.cookie);
622 ParsedCookie pc(test.cookie);
623 EXPECT_EQ(test.valid, pc.IsValid());
624 EXPECT_EQ(test.mode, pc.SameSite());
625 }
mkwste1a29582016-03-15 10:07:52626}
627
[email protected]6210ce52013-09-20 03:33:14628TEST(ParsedCookieTest, InvalidNonAlphanumericChars) {
629 ParsedCookie pc1("name=\x05");
mkwstbe84af312015-02-20 08:52:45630 ParsedCookie pc2(
631 "name=foo"
632 "\x1c"
633 "bar");
634 ParsedCookie pc3(
635 "name=foobar"
636 "\x11");
637 ParsedCookie pc4(
638 "name=\x02"
639 "foobar");
[email protected]6210ce52013-09-20 03:33:14640
641 ParsedCookie pc5("\x05=value");
mkwstbe84af312015-02-20 08:52:45642 ParsedCookie pc6(
643 "foo"
644 "\x05"
645 "bar=value");
646 ParsedCookie pc7(
647 "foobar"
648 "\x05"
649 "=value");
650 ParsedCookie pc8(
651 "\x05"
652 "foobar"
653 "=value");
[email protected]6210ce52013-09-20 03:33:14654
mkwstbe84af312015-02-20 08:52:45655 ParsedCookie pc9(
656 "foo"
657 "\x05"
658 "bar"
659 "=foo"
660 "\x05"
661 "bar");
[email protected]6210ce52013-09-20 03:33:14662
mkwstbe84af312015-02-20 08:52:45663 ParsedCookie pc10(
664 "foo=bar;ba"
665 "\x05"
666 "z=boo");
667 ParsedCookie pc11(
668 "foo=bar;baz=bo"
669 "\x05"
670 "o");
671 ParsedCookie pc12(
672 "foo=bar;ba"
673 "\05"
674 "z=bo"
675 "\x05"
676 "o");
[email protected]6210ce52013-09-20 03:33:14677
678 EXPECT_FALSE(pc1.IsValid());
679 EXPECT_FALSE(pc2.IsValid());
680 EXPECT_FALSE(pc3.IsValid());
681 EXPECT_FALSE(pc4.IsValid());
682 EXPECT_FALSE(pc5.IsValid());
683 EXPECT_FALSE(pc6.IsValid());
684 EXPECT_FALSE(pc7.IsValid());
685 EXPECT_FALSE(pc8.IsValid());
686 EXPECT_FALSE(pc9.IsValid());
687 EXPECT_FALSE(pc10.IsValid());
688 EXPECT_FALSE(pc11.IsValid());
689 EXPECT_FALSE(pc12.IsValid());
690}
691
692TEST(ParsedCookieTest, ValidNonAlphanumericChars) {
693 // Note that some of these words are pasted backwords thanks to poor vim bidi
694 // support. This should not affect the tests, however.
thestig9d3bb0c2015-01-24 00:49:51695 const char pc1_literal[] = "name=العربية";
696 const char pc2_literal[] = "name=普通話";
697 const char pc3_literal[] = "name=ภาษาไทย";
698 const char pc4_literal[] = "name=עִבְרִית";
699 const char pc5_literal[] = "العربية=value";
700 const char pc6_literal[] = "普通話=value";
701 const char pc7_literal[] = "ภาษาไทย=value";
702 const char pc8_literal[] = "עִבְרִית=value";
[email protected]6210ce52013-09-20 03:33:14703 ParsedCookie pc1(pc1_literal);
704 ParsedCookie pc2(pc2_literal);
705 ParsedCookie pc3(pc3_literal);
706 ParsedCookie pc4(pc4_literal);
707 ParsedCookie pc5(pc5_literal);
708 ParsedCookie pc6(pc6_literal);
709 ParsedCookie pc7(pc7_literal);
710 ParsedCookie pc8(pc8_literal);
711
712 EXPECT_TRUE(pc1.IsValid());
713 EXPECT_EQ(pc1_literal, pc1.ToCookieLine());
714 EXPECT_TRUE(pc2.IsValid());
715 EXPECT_EQ(pc2_literal, pc2.ToCookieLine());
716 EXPECT_TRUE(pc3.IsValid());
717 EXPECT_EQ(pc3_literal, pc3.ToCookieLine());
718 EXPECT_TRUE(pc4.IsValid());
719 EXPECT_EQ(pc4_literal, pc4.ToCookieLine());
720 EXPECT_TRUE(pc5.IsValid());
721 EXPECT_EQ(pc5_literal, pc5.ToCookieLine());
722 EXPECT_TRUE(pc6.IsValid());
723 EXPECT_EQ(pc6_literal, pc6.ToCookieLine());
724 EXPECT_TRUE(pc7.IsValid());
725 EXPECT_EQ(pc7_literal, pc7.ToCookieLine());
726 EXPECT_TRUE(pc8.IsValid());
727 EXPECT_EQ(pc8_literal, pc8.ToCookieLine());
728}
bncd479b3c2017-05-24 18:54:53729
730} // namespace net