OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 | 6 |
7 #include "net/cookies/cookie_constants.h" | 7 #include "net/cookies/cookie_constants.h" |
8 #include "net/cookies/parsed_cookie.h" | 8 #include "net/cookies/parsed_cookie.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
11 namespace net { | 11 namespace net { |
12 | 12 |
13 TEST(ParsedCookieTest, TestBasic) { | 13 TEST(ParsedCookieTest, TestBasic) { |
14 ParsedCookie pc("a=b"); | 14 ParsedCookie pc("a=b"); |
15 EXPECT_TRUE(pc.IsValid()); | 15 EXPECT_TRUE(pc.IsValid()); |
16 EXPECT_FALSE(pc.IsSecure()); | 16 EXPECT_FALSE(pc.IsSecure()); |
17 EXPECT_EQ("a", pc.Name()); | 17 EXPECT_EQ("a", pc.Name()); |
18 EXPECT_EQ("b", pc.Value()); | 18 EXPECT_EQ("b", pc.Value()); |
19 } | 19 } |
20 | 20 |
21 // De facto standard behavior, per https://crbug.com/601786. | |
21 TEST(ParsedCookieTest, TestEmpty) { | 22 TEST(ParsedCookieTest, TestEmpty) { |
22 ParsedCookie pc1("=; path=/; secure;"); | 23 ParsedCookie pc1("=; path=/; secure;"); |
23 EXPECT_FALSE(pc1.IsValid()); | 24 EXPECT_TRUE(pc1.IsValid()); |
24 ParsedCookie pc2("= ; path=/; secure;"); | 25 ParsedCookie pc2("= ; path=/; secure;"); |
25 EXPECT_FALSE(pc2.IsValid()); | 26 EXPECT_TRUE(pc2.IsValid()); |
26 ParsedCookie pc3(" =; path=/; secure;"); | 27 ParsedCookie pc3(" =; path=/; secure;"); |
27 EXPECT_FALSE(pc3.IsValid()); | 28 EXPECT_TRUE(pc3.IsValid()); |
28 ParsedCookie pc4(" = ; path=/; secure;"); | 29 ParsedCookie pc4(" = ; path=/; secure;"); |
29 EXPECT_FALSE(pc4.IsValid()); | 30 EXPECT_TRUE(pc4.IsValid()); |
30 ParsedCookie pc5(" ; path=/; secure;"); | 31 ParsedCookie pc5(" ; path=/; secure;"); |
31 EXPECT_FALSE(pc5.IsValid()); | 32 EXPECT_TRUE(pc5.IsValid()); |
32 ParsedCookie pc6("; path=/; secure;"); | 33 ParsedCookie pc6("; path=/; secure;"); |
33 EXPECT_FALSE(pc6.IsValid()); | 34 EXPECT_TRUE(pc6.IsValid()); |
35 ParsedCookie pc7("\t; path=/; secure;"); | |
36 EXPECT_TRUE(pc7.IsValid()); | |
mmenke
2016/08/15 21:11:03
We should check the actual value, too, right? Als
mmenke
2016/08/15 21:11:03
We should also check ";" and "=" (With no extra st
mmenke
2016/08/15 21:11:03
optional: Suggest merging ValidOnlyWhitespace and
jww
2016/08/16 02:24:23
Good calls all around. I've done all of your sugge
| |
34 } | 37 } |
35 | 38 |
36 TEST(ParsedCookieTest, TestQuoted) { | 39 TEST(ParsedCookieTest, TestQuoted) { |
37 // These are some quoting cases which the major browsers all | 40 // These are some quoting cases which the major browsers all |
38 // handle differently. I've tested Internet Explorer 6, Opera 9.6, | 41 // handle differently. I've tested Internet Explorer 6, Opera 9.6, |
39 // Firefox 3, and Safari Windows 3.2.1. We originally tried to match | 42 // Firefox 3, and Safari Windows 3.2.1. We originally tried to match |
40 // Firefox closely, however we now match Internet Explorer and Safari. | 43 // Firefox closely, however we now match Internet Explorer and Safari. |
41 const char* const values[] = { | 44 const char* const values[] = { |
42 // Trailing whitespace after a quoted value. The whitespace after | 45 // Trailing whitespace after a quoted value. The whitespace after |
43 // the quote is stripped in all browsers. | 46 // the quote is stripped in all browsers. |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
214 ParsedCookie pc1("a=b;" + blankpairs + "secure"); | 217 ParsedCookie pc1("a=b;" + blankpairs + "secure"); |
215 EXPECT_TRUE(pc1.IsValid()); | 218 EXPECT_TRUE(pc1.IsValid()); |
216 EXPECT_TRUE(pc1.IsSecure()); | 219 EXPECT_TRUE(pc1.IsSecure()); |
217 | 220 |
218 ParsedCookie pc2("a=b;" + blankpairs + ";secure"); | 221 ParsedCookie pc2("a=b;" + blankpairs + ";secure"); |
219 EXPECT_TRUE(pc2.IsValid()); | 222 EXPECT_TRUE(pc2.IsValid()); |
220 EXPECT_FALSE(pc2.IsSecure()); | 223 EXPECT_FALSE(pc2.IsSecure()); |
221 } | 224 } |
222 | 225 |
223 // TODO(erikwright): some better test cases for invalid cookies. | 226 // TODO(erikwright): some better test cases for invalid cookies. |
224 TEST(ParsedCookieTest, InvalidWhitespace) { | |
225 ParsedCookie pc(" "); | |
226 EXPECT_FALSE(pc.IsValid()); | |
227 } | |
228 | |
229 TEST(ParsedCookieTest, InvalidTooLong) { | 227 TEST(ParsedCookieTest, InvalidTooLong) { |
230 std::string maxstr; | 228 std::string maxstr; |
231 maxstr.resize(ParsedCookie::kMaxCookieSize, 'a'); | 229 maxstr.resize(ParsedCookie::kMaxCookieSize, 'a'); |
232 | 230 |
233 ParsedCookie pc1(maxstr); | 231 ParsedCookie pc1(maxstr); |
234 EXPECT_TRUE(pc1.IsValid()); | 232 EXPECT_TRUE(pc1.IsValid()); |
235 | 233 |
236 ParsedCookie pc2(maxstr + "A"); | 234 ParsedCookie pc2(maxstr + "A"); |
237 EXPECT_FALSE(pc2.IsValid()); | 235 EXPECT_FALSE(pc2.IsValid()); |
238 } | 236 } |
239 | 237 |
240 TEST(ParsedCookieTest, InvalidEmpty) { | 238 // De facto standard behavior, per https://crbug.com/601786. |
239 TEST(ParsedCookieTest, ValidOnlyWhitespace) { | |
240 ParsedCookie pc(" "); | |
241 EXPECT_TRUE(pc.IsValid()); | |
242 } | |
243 | |
244 // De facto standard behavior, per https://crbug.com/601786. | |
245 TEST(ParsedCookieTest, ValidEmpty) { | |
241 ParsedCookie pc((std::string())); | 246 ParsedCookie pc((std::string())); |
242 EXPECT_FALSE(pc.IsValid()); | 247 EXPECT_TRUE(pc.IsValid()); |
243 } | 248 } |
244 | 249 |
245 TEST(ParsedCookieTest, EmbeddedTerminator) { | 250 TEST(ParsedCookieTest, EmbeddedTerminator) { |
246 ParsedCookie pc1("AAA=BB\0ZYX"); | 251 ParsedCookie pc1("AAA=BB\0ZYX"); |
247 ParsedCookie pc2("AAA=BB\rZYX"); | 252 ParsedCookie pc2("AAA=BB\rZYX"); |
248 ParsedCookie pc3("AAA=BB\nZYX"); | 253 ParsedCookie pc3("AAA=BB\nZYX"); |
249 EXPECT_TRUE(pc1.IsValid()); | 254 EXPECT_TRUE(pc1.IsValid()); |
250 EXPECT_EQ("AAA", pc1.Name()); | 255 EXPECT_EQ("AAA", pc1.Name()); |
251 EXPECT_EQ("BB", pc1.Value()); | 256 EXPECT_EQ("BB", pc1.Value()); |
252 EXPECT_TRUE(pc2.IsValid()); | 257 EXPECT_TRUE(pc2.IsValid()); |
(...skipping 25 matching lines...) Expand all Loading... | |
278 const char output[] = | 283 const char output[] = |
279 "ANCUUID=zohNumRKgI0oxyhSsV3Z7D; " | 284 "ANCUUID=zohNumRKgI0oxyhSsV3Z7D; " |
280 "expires=Sun, 18-Apr-2027 21:06:29 GMT; " | 285 "expires=Sun, 18-Apr-2027 21:06:29 GMT; " |
281 "path=/; priority=low"; | 286 "path=/; priority=low"; |
282 ParsedCookie pc(input); | 287 ParsedCookie pc(input); |
283 EXPECT_EQ(output, pc.ToCookieLine()); | 288 EXPECT_EQ(output, pc.ToCookieLine()); |
284 } | 289 } |
285 | 290 |
286 TEST(ParsedCookieTest, SetNameAndValue) { | 291 TEST(ParsedCookieTest, SetNameAndValue) { |
287 ParsedCookie empty((std::string())); | 292 ParsedCookie empty((std::string())); |
288 EXPECT_FALSE(empty.IsValid()); | 293 EXPECT_TRUE(empty.IsValid()); |
289 EXPECT_FALSE(empty.SetDomain("foobar.com")); | 294 EXPECT_TRUE(empty.SetDomain("foobar.com")); |
290 EXPECT_TRUE(empty.SetName("name")); | 295 EXPECT_TRUE(empty.SetName("name")); |
291 EXPECT_TRUE(empty.SetValue("value")); | 296 EXPECT_TRUE(empty.SetValue("value")); |
292 EXPECT_EQ("name=value", empty.ToCookieLine()); | 297 EXPECT_EQ("name=value; domain=foobar.com", empty.ToCookieLine()); |
293 EXPECT_TRUE(empty.IsValid()); | 298 EXPECT_TRUE(empty.IsValid()); |
294 | 299 |
295 // We don't test | 300 // We don't test |
296 // ParsedCookie invalid("@foo=bar"); | 301 // ParsedCookie invalid("@foo=bar"); |
297 // EXPECT_FALSE(invalid.IsValid()); | 302 // EXPECT_FALSE(invalid.IsValid()); |
298 // here because we are slightly more tolerant to invalid cookie names and | 303 // here because we are slightly more tolerant to invalid cookie names and |
299 // values that are set by webservers. We only enforce a correct name and | 304 // values that are set by webservers. We only enforce a correct name and |
300 // value if set via SetName() and SetValue(). | 305 // value if set via SetName() and SetValue(). |
301 | 306 |
302 ParsedCookie pc("name=value"); | 307 ParsedCookie pc("name=value"); |
303 EXPECT_TRUE(pc.IsValid()); | 308 EXPECT_TRUE(pc.IsValid()); |
304 | 309 |
305 // Set invalid name / value. | 310 // Set invalid name / value. |
306 EXPECT_FALSE(pc.SetName("@foobar")); | 311 EXPECT_FALSE(pc.SetName("@foobar")); |
307 EXPECT_EQ("name=value", pc.ToCookieLine()); | 312 EXPECT_EQ("name=value", pc.ToCookieLine()); |
308 EXPECT_TRUE(pc.IsValid()); | 313 EXPECT_TRUE(pc.IsValid()); |
309 | 314 |
310 EXPECT_FALSE(pc.SetName(std::string())); | 315 EXPECT_FALSE(pc.SetName(std::string())); |
mmenke
2016/08/15 21:11:03
Hrm...we allow unnamed cookies, but SetName doesn'
jww
2016/08/16 02:24:23
Good catch! Indeed, that doesn't make sense, so I'
| |
311 EXPECT_EQ("name=value", pc.ToCookieLine()); | 316 EXPECT_EQ("name=value", pc.ToCookieLine()); |
312 EXPECT_TRUE(pc.IsValid()); | 317 EXPECT_TRUE(pc.IsValid()); |
313 | 318 |
314 EXPECT_FALSE(pc.SetValue("foo bar")); | 319 EXPECT_FALSE(pc.SetValue("foo bar")); |
315 EXPECT_EQ("name=value", pc.ToCookieLine()); | 320 EXPECT_EQ("name=value", pc.ToCookieLine()); |
316 EXPECT_TRUE(pc.IsValid()); | 321 EXPECT_TRUE(pc.IsValid()); |
317 | 322 |
318 EXPECT_FALSE(pc.SetValue("\"foobar")); | 323 EXPECT_FALSE(pc.SetValue("\"foobar")); |
319 EXPECT_EQ("name=value", pc.ToCookieLine()); | 324 EXPECT_EQ("name=value", pc.ToCookieLine()); |
320 EXPECT_TRUE(pc.IsValid()); | 325 EXPECT_TRUE(pc.IsValid()); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
408 EXPECT_FALSE(pc.HasDomain()); | 413 EXPECT_FALSE(pc.HasDomain()); |
409 EXPECT_FALSE(pc.HasPath()); | 414 EXPECT_FALSE(pc.HasPath()); |
410 EXPECT_FALSE(pc.HasExpires()); | 415 EXPECT_FALSE(pc.HasExpires()); |
411 EXPECT_FALSE(pc.HasMaxAge()); | 416 EXPECT_FALSE(pc.HasMaxAge()); |
412 EXPECT_FALSE(pc.IsSecure()); | 417 EXPECT_FALSE(pc.IsSecure()); |
413 EXPECT_FALSE(pc.IsHttpOnly()); | 418 EXPECT_FALSE(pc.IsHttpOnly()); |
414 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, pc.SameSite()); | 419 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, pc.SameSite()); |
415 EXPECT_EQ("name2=value2", pc.ToCookieLine()); | 420 EXPECT_EQ("name2=value2", pc.ToCookieLine()); |
416 } | 421 } |
417 | 422 |
423 // Set the domain attribute twice in a cookie line. If the second attribute's | |
424 // value is empty, it shoud be ignored. | |
425 // | |
426 // This is de facto standard behavior, per https://crbug.com/601786. | |
427 TEST(ParsedCookieTest, MultipleDomainAttributes) { | |
428 ParsedCookie pc1("name=value; domain=foo.com; domain=bar.com"); | |
429 EXPECT_EQ("bar.com", pc1.Domain()); | |
430 ParsedCookie pc2("name=value; domain=foo.com; domain="); | |
431 EXPECT_EQ("foo.com", pc2.Domain()); | |
432 } | |
433 | |
418 TEST(ParsedCookieTest, SetPriority) { | 434 TEST(ParsedCookieTest, SetPriority) { |
419 ParsedCookie pc("name=value"); | 435 ParsedCookie pc("name=value"); |
420 EXPECT_TRUE(pc.IsValid()); | 436 EXPECT_TRUE(pc.IsValid()); |
421 | 437 |
422 EXPECT_EQ("name=value", pc.ToCookieLine()); | 438 EXPECT_EQ("name=value", pc.ToCookieLine()); |
423 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); | 439 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); |
424 | 440 |
425 // Test each priority, expect case-insensitive compare. | 441 // Test each priority, expect case-insensitive compare. |
426 EXPECT_TRUE(pc.SetPriority("high")); | 442 EXPECT_TRUE(pc.SetPriority("high")); |
427 EXPECT_EQ("name=value; priority=high", pc.ToCookieLine()); | 443 EXPECT_EQ("name=value; priority=high", pc.ToCookieLine()); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
594 EXPECT_TRUE(pc5.IsValid()); | 610 EXPECT_TRUE(pc5.IsValid()); |
595 EXPECT_EQ(pc5_literal, pc5.ToCookieLine()); | 611 EXPECT_EQ(pc5_literal, pc5.ToCookieLine()); |
596 EXPECT_TRUE(pc6.IsValid()); | 612 EXPECT_TRUE(pc6.IsValid()); |
597 EXPECT_EQ(pc6_literal, pc6.ToCookieLine()); | 613 EXPECT_EQ(pc6_literal, pc6.ToCookieLine()); |
598 EXPECT_TRUE(pc7.IsValid()); | 614 EXPECT_TRUE(pc7.IsValid()); |
599 EXPECT_EQ(pc7_literal, pc7.ToCookieLine()); | 615 EXPECT_EQ(pc7_literal, pc7.ToCookieLine()); |
600 EXPECT_TRUE(pc8.IsValid()); | 616 EXPECT_TRUE(pc8.IsValid()); |
601 EXPECT_EQ(pc8_literal, pc8.ToCookieLine()); | 617 EXPECT_EQ(pc8_literal, pc8.ToCookieLine()); |
602 } | 618 } |
603 } | 619 } |
OLD | NEW |