15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/cookie_constants.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/parsed_cookie.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TestBasic) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("a=b"); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.IsSecure()); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", pc.Name()); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", pc.Value()); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TestQuoted) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are some quoting cases which the major browsers all 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handle differently. I've tested Internet Explorer 6, Opera 9.6, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox 3, and Safari Windows 3.2.1. We originally tried to match 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox closely, however we now match Internet Explorer and Safari. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* values[] = { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trailing whitespace after a quoted value. The whitespace after 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the quote is stripped in all browsers. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"zzz \" ", "\"zzz \"", 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handling a quoted value with a ';', like FOO="zz;pp" ; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IE and Safari: "zz; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox and Opera: "zz;pp" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"zz;pp\" ;", "\"zz", 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handling a value with multiple quoted parts, like FOO="zzz " "ppp" ; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IE and Safari: "zzz " "ppp"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox: "zzz "; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opera: <rejects cookie> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"zzz \" \"ppp\" ", "\"zzz \" \"ppp\"", 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A quote in a value that didn't start quoted. like FOO=A"B ; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IE, Safari, and Firefox: A"B; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opera: <rejects cookie> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A\"B", "A\"B", 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(values); i += 2) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input(values[i]); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected(values[i + 1]); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("aBc=" + input + " ; path=\"/\" ; httponly "); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.IsSecure()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsHttpOnly()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("aBc", pc.Name()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected, pc.Value()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a path was quoted, the path attribute keeps the quotes. This will 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make the cookie effectively useless, but path parameters aren't supposed 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be quoted. Bug 1261605. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\"/\"", pc.Path()); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TestNameless) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("BLAHHH; path=/; secure;"); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/", pc.Path()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", pc.Name()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("BLAHHH", pc.Value()); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TestAttributeCase) { 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ParsedCookie pc("BLAHHH; Path=/; sECuRe; httpONLY; pRIoRitY=hIgH"); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsHttpOnly()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/", pc.Path()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", pc.Name()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("BLAHHH", pc.Value()); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority()); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(4U, pc.NumberOfAttributes()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TestDoubleQuotedNameless) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("\"BLA\\\"HHH\"; path=/; secure;"); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/", pc.Path()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", pc.Name()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\"BLA\\\"HHH\"", pc.Value()); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, pc.NumberOfAttributes()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, QuoteOffTheEnd) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("a=\"B"); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", pc.Name()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\"B", pc.Value()); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, pc.NumberOfAttributes()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, MissingName) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("=ABC"); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", pc.Name()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ABC", pc.Value()); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, pc.NumberOfAttributes()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, MissingValue) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("ABC=; path = /wee"); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ABC", pc.Name()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", pc.Value()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/wee", pc.Path()); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, pc.NumberOfAttributes()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, Whitespace) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc(" A = BC ;secure;;; httponly"); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("A", pc.Name()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("BC", pc.Value()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasPath()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasDomain()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsHttpOnly()); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We parse anything between ; as attributes, so we end up with two 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attributes with an empty string name and value. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4U, pc.NumberOfAttributes()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, MultipleEquals) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc(" A=== BC ;secure;;; httponly"); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("A", pc.Name()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("== BC", pc.Value()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasPath()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasDomain()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsHttpOnly()); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4U, pc.NumberOfAttributes()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, QuotedTrailingWhitespace) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("ANCUUID=\"zohNumRKgI0oxyhSsV3Z7D\" ; " 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT ; " 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "path=/ ; "); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ANCUUID", pc.Name()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stripping whitespace after the quotes matches all other major browsers. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\"zohNumRKgI0oxyhSsV3Z7D\"", pc.Value()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasExpires()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/", pc.Path()); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, pc.NumberOfAttributes()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TrailingWhitespace) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("ANCUUID=zohNumRKgI0oxyhSsV3Z7D ; " 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT ; " 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "path=/ ; "); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("ANCUUID", pc.Name()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("zohNumRKgI0oxyhSsV3Z7D", pc.Value()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasExpires()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/", pc.Path()); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, pc.NumberOfAttributes()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, TooManyPairs) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string blankpairs; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blankpairs.resize(ParsedCookie::kMaxPairs - 1, ';'); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc1(blankpairs + "secure"); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc1.IsValid()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc1.IsSecure()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc2(blankpairs + ";secure"); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc2.IsValid()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc2.IsSecure()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erikwright): some better test cases for invalid cookies. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, InvalidWhitespace) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc(" "); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.IsValid()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, InvalidTooLong) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string maxstr; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maxstr.resize(ParsedCookie::kMaxCookieSize, 'a'); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc1(maxstr); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc1.IsValid()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc2(maxstr + "A"); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc2.IsValid()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, InvalidEmpty) { 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ParsedCookie pc((std::string())); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.IsValid()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, EmbeddedTerminator) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc1("AAA=BB\0ZYX"); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc2("AAA=BB\rZYX"); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc3("AAA=BB\nZYX"); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc1.IsValid()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("AAA", pc1.Name()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("BB", pc1.Value()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc2.IsValid()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("AAA", pc2.Name()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("BB", pc2.Value()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc3.IsValid()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("AAA", pc3.Name()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("BB", pc3.Value()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, ParseTokensAndValues) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello", 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseTokenString("hello\nworld")); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fs!!@", 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseTokenString("fs!!@;helloworld")); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello world\tgood", 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseTokenString("hello world\tgood\rbye")); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("A", 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseTokenString("A=B=C;D=E")); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello", 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseValueString("hello\nworld")); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("fs!!@", 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseValueString("fs!!@;helloworld")); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello world\tgood", 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseValueString("hello world\tgood\rbye")); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("A=B=C", 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie::ParseValueString("A=B=C;D=E")); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, SerializeCookieLine) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char input[] = "ANCUUID=zohNumRKgI0oxyhSsV3Z7D ; " 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT ; " 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "path=/ ; priority=low ; "; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char output[] = "ANCUUID=zohNumRKgI0oxyhSsV3Z7D; " 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT; " 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "path=/; priority=low"; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc(input); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(output, pc.ToCookieLine()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, SetNameAndValue) { 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ParsedCookie empty((std::string())); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(empty.IsValid()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(empty.SetDomain("foobar.com")); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(empty.SetName("name")); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(empty.SetValue("value")); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", empty.ToCookieLine()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(empty.IsValid()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't test 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ParsedCookie invalid("@foo=bar"); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EXPECT_FALSE(invalid.IsValid()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here because we are slightly more tolerant to invalid cookie names and 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values that are set by webservers. We only enforce a correct name and 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value if set via SetName() and SetValue(). 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("name=value"); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set invalid name / value. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.SetName("@foobar")); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(pc.SetName(std::string())); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.SetValue("foo bar")); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.SetValue("\"foobar")); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set valid name / value 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetName("test")); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test=value", pc.ToCookieLine()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetValue("\"foobar\"")); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test=\"foobar\"", pc.ToCookieLine()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetValue(std::string())); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test=", pc.ToCookieLine()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ParsedCookieTest, SetAttributes) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParsedCookie pc("name=value"); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear an unset attribute. 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetDomain(std::string())); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasDomain()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set a string containing an invalid character 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.SetDomain("foo;bar")); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasDomain()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set all other attributes and check that they are appended in order. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetDomain("domain.com")); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetPath("/")); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetExpires("Sun, 18-Apr-2027 21:06:29 GMT")); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetMaxAge("12345")); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetIsSecure(true)); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetIsHttpOnly(true)); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetIsHttpOnly(true)); 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("HIGH")); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("name=value; domain=domain.com; path=/; " 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; " 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "httponly; priority=HIGH", 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc.ToCookieLine()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasDomain()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasExpires()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasMaxAge()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsHttpOnly()); 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear one attribute from the middle. 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(pc.SetPath("/foo")); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasDomain()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasPath()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.HasExpires()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsSecure()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.IsHttpOnly()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("name=value; domain=domain.com; path=/foo; " 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; " 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "httponly; priority=HIGH", 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pc.ToCookieLine()); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set priority to medium. 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("medium")); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value; domain=domain.com; path=/foo; " 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; " 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "httponly; priority=medium", 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc.ToCookieLine()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the rest and change the name and value. 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetDomain(std::string())); 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPath(std::string())); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetExpires(std::string())); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetMaxAge(std::string())); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetIsSecure(false)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetIsHttpOnly(false)); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetName("name2")); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc.SetValue("value2")); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority(std::string())); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasDomain()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasPath()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasExpires()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.HasMaxAge()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.IsSecure()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pc.IsHttpOnly()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name2=value2", pc.ToCookieLine()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParsedCookieTest, SetPriority) { 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ParsedCookie pc("name=value"); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.IsValid()); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test each priority, expect case-insensitive compare. 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("high")); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value; priority=high", pc.ToCookieLine()); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority()); 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("mEDium")); 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value; priority=mEDium", pc.ToCookieLine()); 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_MEDIUM, pc.Priority()); 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("LOW")); 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value; priority=LOW", pc.ToCookieLine()); 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_LOW, pc.Priority()); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Interpret invalid priority values as COOKIE_PRIORITY_DEFAULT. 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("Blah")); 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value; priority=Blah", pc.ToCookieLine()); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("lowerest")); 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value; priority=lowerest", pc.ToCookieLine()); 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(pc.SetPriority("")); 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("name=value", pc.ToCookieLine()); 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority()); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST(ParsedCookieTest, InvalidNonAlphanumericChars) { 42668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc1("name=\x05"); 42768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc2("name=foo" "\x1c" "bar"); 42868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc3("name=foobar" "\x11"); 42968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc4("name=\x02" "foobar"); 43068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc5("\x05=value"); 43268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc6("foo" "\x05" "bar=value"); 43368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc7("foobar" "\x05" "=value"); 43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc8("\x05" "foobar" "=value"); 43568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc9("foo" "\x05" "bar" "=foo" "\x05" "bar"); 43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc10("foo=bar;ba" "\x05" "z=boo"); 43968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc11("foo=bar;baz=bo" "\x05" "o"); 44068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc12("foo=bar;ba" "\05" "z=bo" "\x05" "o"); 44168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 44268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc1.IsValid()); 44368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc2.IsValid()); 44468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc3.IsValid()); 44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc4.IsValid()); 44668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc5.IsValid()); 44768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc6.IsValid()); 44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc7.IsValid()); 44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc8.IsValid()); 45068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc9.IsValid()); 45168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc10.IsValid()); 45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc11.IsValid()); 45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(pc12.IsValid()); 45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 45568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 45668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST(ParsedCookieTest, ValidNonAlphanumericChars) { 45768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Note that some of these words are pasted backwords thanks to poor vim bidi 45868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // support. This should not affect the tests, however. 45968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc1_literal = "name=العربية"; 46068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc2_literal = "name=普通話"; 46168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc3_literal = "name=ภาษาไทย"; 46268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc4_literal = "name=עִבְרִית"; 46368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc5_literal = "العربية=value"; 46468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc6_literal = "普通話=value"; 46568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc7_literal = "ภาษาไทย=value"; 46668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* pc8_literal = "עִבְרִית=value"; 46768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc1(pc1_literal); 46868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc2(pc2_literal); 46968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc3(pc3_literal); 47068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc4(pc4_literal); 47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc5(pc5_literal); 47268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc6(pc6_literal); 47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc7(pc7_literal); 47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ParsedCookie pc8(pc8_literal); 47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 47668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc1.IsValid()); 47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc1_literal, pc1.ToCookieLine()); 47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc2.IsValid()); 47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc2_literal, pc2.ToCookieLine()); 48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc3.IsValid()); 48168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc3_literal, pc3.ToCookieLine()); 48268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc4.IsValid()); 48368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc4_literal, pc4.ToCookieLine()); 48468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc5.IsValid()); 48568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc5_literal, pc5.ToCookieLine()); 48668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc6.IsValid()); 48768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc6_literal, pc6.ToCookieLine()); 48868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc7.IsValid()); 48968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc7_literal, pc7.ToCookieLine()); 49068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(pc8.IsValid()); 49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(pc8_literal, pc8.ToCookieLine()); 49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 49368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 495