Home | History | Annotate | Download | only in cookies
      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
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "net/cookies/cookie_constants.h"
      8 #include "net/cookies/parsed_cookie.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace net {
     12 
     13 TEST(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 
     21 TEST(ParsedCookieTest, TestEmpty) {
     22   ParsedCookie pc1("=; path=/; secure;");
     23   EXPECT_FALSE(pc1.IsValid());
     24   ParsedCookie pc2("= ; path=/; secure;");
     25   EXPECT_FALSE(pc2.IsValid());
     26   ParsedCookie pc3(" =; path=/; secure;");
     27   EXPECT_FALSE(pc3.IsValid());
     28   ParsedCookie pc4(" = ; path=/; secure;");
     29   EXPECT_FALSE(pc4.IsValid());
     30   ParsedCookie pc5(" ; path=/; secure;");
     31   EXPECT_FALSE(pc5.IsValid());
     32   ParsedCookie pc6("; path=/; secure;");
     33   EXPECT_FALSE(pc6.IsValid());
     34 }
     35 
     36 TEST(ParsedCookieTest, TestQuoted) {
     37   // These are some quoting cases which the major browsers all
     38   // 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
     40   // Firefox closely, however we now match Internet Explorer and Safari.
     41   const char* values[] = {
     42     // Trailing whitespace after a quoted value.  The whitespace after
     43     // the quote is stripped in all browsers.
     44     "\"zzz \"  ",              "\"zzz \"",
     45     // Handling a quoted value with a ';', like FOO="zz;pp"  ;
     46     // IE and Safari: "zz;
     47     // Firefox and Opera: "zz;pp"
     48     "\"zz;pp\" ;",             "\"zz",
     49     // Handling a value with multiple quoted parts, like FOO="zzz "   "ppp" ;
     50     // IE and Safari: "zzz "   "ppp";
     51     // Firefox: "zzz ";
     52     // Opera: <rejects cookie>
     53     "\"zzz \"   \"ppp\" ",     "\"zzz \"   \"ppp\"",
     54     // A quote in a value that didn't start quoted.  like FOO=A"B ;
     55     // IE, Safari, and Firefox: A"B;
     56     // Opera: <rejects cookie>
     57     "A\"B",                    "A\"B",
     58   };
     59 
     60   for (size_t i = 0; i < arraysize(values); i += 2) {
     61     std::string input(values[i]);
     62     std::string expected(values[i + 1]);
     63 
     64     ParsedCookie pc("aBc=" + input + " ; path=\"/\"  ; httponly ");
     65     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());
     70     EXPECT_EQ(expected, pc.Value());
     71 
     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 
     79 TEST(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());
     87   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
     88 }
     89 
     90 TEST(ParsedCookieTest, TestAttributeCase) {
     91   ParsedCookie pc("BLAHHH; Path=/; sECuRe; httpONLY; pRIoRitY=hIgH");
     92   EXPECT_TRUE(pc.IsValid());
     93   EXPECT_TRUE(pc.IsSecure());
     94   EXPECT_TRUE(pc.IsHttpOnly());
     95   EXPECT_TRUE(pc.HasPath());
     96   EXPECT_EQ("/", pc.Path());
     97   EXPECT_EQ("", pc.Name());
     98   EXPECT_EQ("BLAHHH", pc.Value());
     99   EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority());
    100   EXPECT_EQ(4U, pc.NumberOfAttributes());
    101 }
    102 
    103 TEST(ParsedCookieTest, TestDoubleQuotedNameless) {
    104   ParsedCookie pc("\"BLA\\\"HHH\"; path=/; secure;");
    105   EXPECT_TRUE(pc.IsValid());
    106   EXPECT_TRUE(pc.IsSecure());
    107   EXPECT_TRUE(pc.HasPath());
    108   EXPECT_EQ("/", pc.Path());
    109   EXPECT_EQ("", pc.Name());
    110   EXPECT_EQ("\"BLA\\\"HHH\"", pc.Value());
    111   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    112   EXPECT_EQ(2U, pc.NumberOfAttributes());
    113 }
    114 
    115 TEST(ParsedCookieTest, QuoteOffTheEnd) {
    116   ParsedCookie pc("a=\"B");
    117   EXPECT_TRUE(pc.IsValid());
    118   EXPECT_EQ("a", pc.Name());
    119   EXPECT_EQ("\"B", pc.Value());
    120   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    121   EXPECT_EQ(0U, pc.NumberOfAttributes());
    122 }
    123 
    124 TEST(ParsedCookieTest, MissingName) {
    125   ParsedCookie pc("=ABC");
    126   EXPECT_TRUE(pc.IsValid());
    127   EXPECT_EQ("", pc.Name());
    128   EXPECT_EQ("ABC", pc.Value());
    129   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    130   EXPECT_EQ(0U, pc.NumberOfAttributes());
    131 }
    132 
    133 TEST(ParsedCookieTest, MissingValue) {
    134   ParsedCookie pc("ABC=;  path = /wee");
    135   EXPECT_TRUE(pc.IsValid());
    136   EXPECT_EQ("ABC", pc.Name());
    137   EXPECT_EQ("", pc.Value());
    138   EXPECT_TRUE(pc.HasPath());
    139   EXPECT_EQ("/wee", pc.Path());
    140   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    141   EXPECT_EQ(1U, pc.NumberOfAttributes());
    142 }
    143 
    144 TEST(ParsedCookieTest, Whitespace) {
    145   ParsedCookie pc("  A  = BC  ;secure;;;   httponly");
    146   EXPECT_TRUE(pc.IsValid());
    147   EXPECT_EQ("A", pc.Name());
    148   EXPECT_EQ("BC", pc.Value());
    149   EXPECT_FALSE(pc.HasPath());
    150   EXPECT_FALSE(pc.HasDomain());
    151   EXPECT_TRUE(pc.IsSecure());
    152   EXPECT_TRUE(pc.IsHttpOnly());
    153   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    154   // We parse anything between ; as attributes, so we end up with two
    155   // attributes with an empty string name and value.
    156   EXPECT_EQ(4U, pc.NumberOfAttributes());
    157 }
    158 TEST(ParsedCookieTest, MultipleEquals) {
    159   ParsedCookie pc("  A=== BC  ;secure;;;   httponly");
    160   EXPECT_TRUE(pc.IsValid());
    161   EXPECT_EQ("A", pc.Name());
    162   EXPECT_EQ("== BC", pc.Value());
    163   EXPECT_FALSE(pc.HasPath());
    164   EXPECT_FALSE(pc.HasDomain());
    165   EXPECT_TRUE(pc.IsSecure());
    166   EXPECT_TRUE(pc.IsHttpOnly());
    167   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    168   EXPECT_EQ(4U, pc.NumberOfAttributes());
    169 }
    170 
    171 TEST(ParsedCookieTest, QuotedTrailingWhitespace) {
    172   ParsedCookie pc("ANCUUID=\"zohNumRKgI0oxyhSsV3Z7D\"  ; "
    173                       "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
    174                       "path=/  ;  ");
    175   EXPECT_TRUE(pc.IsValid());
    176   EXPECT_EQ("ANCUUID", pc.Name());
    177   // Stripping whitespace after the quotes matches all other major browsers.
    178   EXPECT_EQ("\"zohNumRKgI0oxyhSsV3Z7D\"", pc.Value());
    179   EXPECT_TRUE(pc.HasExpires());
    180   EXPECT_TRUE(pc.HasPath());
    181   EXPECT_EQ("/", pc.Path());
    182   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    183   EXPECT_EQ(2U, pc.NumberOfAttributes());
    184 }
    185 
    186 TEST(ParsedCookieTest, TrailingWhitespace) {
    187   ParsedCookie pc("ANCUUID=zohNumRKgI0oxyhSsV3Z7D  ; "
    188                       "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
    189                       "path=/  ;  ");
    190   EXPECT_TRUE(pc.IsValid());
    191   EXPECT_EQ("ANCUUID", pc.Name());
    192   EXPECT_EQ("zohNumRKgI0oxyhSsV3Z7D", pc.Value());
    193   EXPECT_TRUE(pc.HasExpires());
    194   EXPECT_TRUE(pc.HasPath());
    195   EXPECT_EQ("/", pc.Path());
    196   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    197   EXPECT_EQ(2U, pc.NumberOfAttributes());
    198 }
    199 
    200 TEST(ParsedCookieTest, TooManyPairs) {
    201   std::string blankpairs;
    202   blankpairs.resize(ParsedCookie::kMaxPairs - 2, ';');
    203 
    204   ParsedCookie pc1("a=b;" + blankpairs + "secure");
    205   EXPECT_TRUE(pc1.IsValid());
    206   EXPECT_TRUE(pc1.IsSecure());
    207 
    208   ParsedCookie pc2("a=b;" + blankpairs + ";secure");
    209   EXPECT_TRUE(pc2.IsValid());
    210   EXPECT_FALSE(pc2.IsSecure());
    211 }
    212 
    213 // TODO(erikwright): some better test cases for invalid cookies.
    214 TEST(ParsedCookieTest, InvalidWhitespace) {
    215   ParsedCookie pc("    ");
    216   EXPECT_FALSE(pc.IsValid());
    217 }
    218 
    219 TEST(ParsedCookieTest, InvalidTooLong) {
    220   std::string maxstr;
    221   maxstr.resize(ParsedCookie::kMaxCookieSize, 'a');
    222 
    223   ParsedCookie pc1(maxstr);
    224   EXPECT_TRUE(pc1.IsValid());
    225 
    226   ParsedCookie pc2(maxstr + "A");
    227   EXPECT_FALSE(pc2.IsValid());
    228 }
    229 
    230 TEST(ParsedCookieTest, InvalidEmpty) {
    231   ParsedCookie pc((std::string()));
    232   EXPECT_FALSE(pc.IsValid());
    233 }
    234 
    235 TEST(ParsedCookieTest, EmbeddedTerminator) {
    236   ParsedCookie pc1("AAA=BB\0ZYX");
    237   ParsedCookie pc2("AAA=BB\rZYX");
    238   ParsedCookie pc3("AAA=BB\nZYX");
    239   EXPECT_TRUE(pc1.IsValid());
    240   EXPECT_EQ("AAA", pc1.Name());
    241   EXPECT_EQ("BB", pc1.Value());
    242   EXPECT_TRUE(pc2.IsValid());
    243   EXPECT_EQ("AAA", pc2.Name());
    244   EXPECT_EQ("BB", pc2.Value());
    245   EXPECT_TRUE(pc3.IsValid());
    246   EXPECT_EQ("AAA", pc3.Name());
    247   EXPECT_EQ("BB", pc3.Value());
    248 }
    249 
    250 TEST(ParsedCookieTest, ParseTokensAndValues) {
    251   EXPECT_EQ("hello",
    252             ParsedCookie::ParseTokenString("hello\nworld"));
    253   EXPECT_EQ("fs!!@",
    254             ParsedCookie::ParseTokenString("fs!!@;helloworld"));
    255   EXPECT_EQ("hello world\tgood",
    256             ParsedCookie::ParseTokenString("hello world\tgood\rbye"));
    257   EXPECT_EQ("A",
    258             ParsedCookie::ParseTokenString("A=B=C;D=E"));
    259   EXPECT_EQ("hello",
    260             ParsedCookie::ParseValueString("hello\nworld"));
    261   EXPECT_EQ("fs!!@",
    262             ParsedCookie::ParseValueString("fs!!@;helloworld"));
    263   EXPECT_EQ("hello world\tgood",
    264             ParsedCookie::ParseValueString("hello world\tgood\rbye"));
    265   EXPECT_EQ("A=B=C",
    266             ParsedCookie::ParseValueString("A=B=C;D=E"));
    267 }
    268 
    269 TEST(ParsedCookieTest, SerializeCookieLine) {
    270   const char input[] = "ANCUUID=zohNumRKgI0oxyhSsV3Z7D  ; "
    271                        "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
    272                        "path=/  ;  priority=low  ;  ";
    273   const char output[] = "ANCUUID=zohNumRKgI0oxyhSsV3Z7D; "
    274                         "expires=Sun, 18-Apr-2027 21:06:29 GMT; "
    275                         "path=/; priority=low";
    276   ParsedCookie pc(input);
    277   EXPECT_EQ(output, pc.ToCookieLine());
    278 }
    279 
    280 
    281 TEST(ParsedCookieTest, SetNameAndValue) {
    282   ParsedCookie empty((std::string()));
    283   EXPECT_FALSE(empty.IsValid());
    284   EXPECT_FALSE(empty.SetDomain("foobar.com"));
    285   EXPECT_TRUE(empty.SetName("name"));
    286   EXPECT_TRUE(empty.SetValue("value"));
    287   EXPECT_EQ("name=value", empty.ToCookieLine());
    288   EXPECT_TRUE(empty.IsValid());
    289 
    290   // We don't test
    291   //   ParsedCookie invalid("@foo=bar");
    292   //   EXPECT_FALSE(invalid.IsValid());
    293   // here because we are slightly more tolerant to invalid cookie names and
    294   // values that are set by webservers. We only enforce a correct name and
    295   // value if set via SetName() and SetValue().
    296 
    297   ParsedCookie pc("name=value");
    298   EXPECT_TRUE(pc.IsValid());
    299 
    300   // Set invalid name / value.
    301   EXPECT_FALSE(pc.SetName("@foobar"));
    302   EXPECT_EQ("name=value", pc.ToCookieLine());
    303   EXPECT_TRUE(pc.IsValid());
    304 
    305   EXPECT_FALSE(pc.SetName(std::string()));
    306   EXPECT_EQ("name=value", pc.ToCookieLine());
    307   EXPECT_TRUE(pc.IsValid());
    308 
    309   EXPECT_FALSE(pc.SetValue("foo bar"));
    310   EXPECT_EQ("name=value", pc.ToCookieLine());
    311   EXPECT_TRUE(pc.IsValid());
    312 
    313   EXPECT_FALSE(pc.SetValue("\"foobar"));
    314   EXPECT_EQ("name=value", pc.ToCookieLine());
    315   EXPECT_TRUE(pc.IsValid());
    316 
    317   // Set valid name / value
    318   EXPECT_TRUE(pc.SetName("test"));
    319   EXPECT_EQ("test=value", pc.ToCookieLine());
    320   EXPECT_TRUE(pc.IsValid());
    321 
    322   EXPECT_TRUE(pc.SetValue("\"foobar\""));
    323   EXPECT_EQ("test=\"foobar\"", pc.ToCookieLine());
    324   EXPECT_TRUE(pc.IsValid());
    325 
    326   EXPECT_TRUE(pc.SetValue(std::string()));
    327   EXPECT_EQ("test=", pc.ToCookieLine());
    328   EXPECT_TRUE(pc.IsValid());
    329 }
    330 
    331 TEST(ParsedCookieTest, SetAttributes) {
    332   ParsedCookie pc("name=value");
    333   EXPECT_TRUE(pc.IsValid());
    334 
    335   // Clear an unset attribute.
    336   EXPECT_TRUE(pc.SetDomain(std::string()));
    337   EXPECT_FALSE(pc.HasDomain());
    338   EXPECT_EQ("name=value", pc.ToCookieLine());
    339   EXPECT_TRUE(pc.IsValid());
    340 
    341   // Set a string containing an invalid character
    342   EXPECT_FALSE(pc.SetDomain("foo;bar"));
    343   EXPECT_FALSE(pc.HasDomain());
    344   EXPECT_EQ("name=value", pc.ToCookieLine());
    345   EXPECT_TRUE(pc.IsValid());
    346 
    347   // Set all other attributes and check that they are appended in order.
    348   EXPECT_TRUE(pc.SetDomain("domain.com"));
    349   EXPECT_TRUE(pc.SetPath("/"));
    350   EXPECT_TRUE(pc.SetExpires("Sun, 18-Apr-2027 21:06:29 GMT"));
    351   EXPECT_TRUE(pc.SetMaxAge("12345"));
    352   EXPECT_TRUE(pc.SetIsSecure(true));
    353   EXPECT_TRUE(pc.SetIsHttpOnly(true));
    354   EXPECT_TRUE(pc.SetIsHttpOnly(true));
    355   EXPECT_TRUE(pc.SetPriority("HIGH"));
    356   EXPECT_EQ("name=value; domain=domain.com; path=/; "
    357             "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
    358             "httponly; priority=HIGH",
    359             pc.ToCookieLine());
    360   EXPECT_TRUE(pc.HasDomain());
    361   EXPECT_TRUE(pc.HasPath());
    362   EXPECT_TRUE(pc.HasExpires());
    363   EXPECT_TRUE(pc.HasMaxAge());
    364   EXPECT_TRUE(pc.IsSecure());
    365   EXPECT_TRUE(pc.IsHttpOnly());
    366   EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority());
    367 
    368   // Clear one attribute from the middle.
    369   EXPECT_TRUE(pc.SetPath("/foo"));
    370   EXPECT_TRUE(pc.HasDomain());
    371   EXPECT_TRUE(pc.HasPath());
    372   EXPECT_TRUE(pc.HasExpires());
    373   EXPECT_TRUE(pc.IsSecure());
    374   EXPECT_TRUE(pc.IsHttpOnly());
    375   EXPECT_EQ("name=value; domain=domain.com; path=/foo; "
    376             "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
    377             "httponly; priority=HIGH",
    378             pc.ToCookieLine());
    379 
    380   // Set priority to medium.
    381   EXPECT_TRUE(pc.SetPriority("medium"));
    382   EXPECT_EQ("name=value; domain=domain.com; path=/foo; "
    383             "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
    384             "httponly; priority=medium",
    385             pc.ToCookieLine());
    386 
    387   // Clear the rest and change the name and value.
    388   EXPECT_TRUE(pc.SetDomain(std::string()));
    389   EXPECT_TRUE(pc.SetPath(std::string()));
    390   EXPECT_TRUE(pc.SetExpires(std::string()));
    391   EXPECT_TRUE(pc.SetMaxAge(std::string()));
    392   EXPECT_TRUE(pc.SetIsSecure(false));
    393   EXPECT_TRUE(pc.SetIsHttpOnly(false));
    394   EXPECT_TRUE(pc.SetName("name2"));
    395   EXPECT_TRUE(pc.SetValue("value2"));
    396   EXPECT_TRUE(pc.SetPriority(std::string()));
    397   EXPECT_FALSE(pc.HasDomain());
    398   EXPECT_FALSE(pc.HasPath());
    399   EXPECT_FALSE(pc.HasExpires());
    400   EXPECT_FALSE(pc.HasMaxAge());
    401   EXPECT_FALSE(pc.IsSecure());
    402   EXPECT_FALSE(pc.IsHttpOnly());
    403   EXPECT_EQ("name2=value2", pc.ToCookieLine());
    404 }
    405 
    406 TEST(ParsedCookieTest, SetPriority) {
    407   ParsedCookie pc("name=value");
    408   EXPECT_TRUE(pc.IsValid());
    409 
    410   EXPECT_EQ("name=value", pc.ToCookieLine());
    411   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    412 
    413   // Test each priority, expect case-insensitive compare.
    414   EXPECT_TRUE(pc.SetPriority("high"));
    415   EXPECT_EQ("name=value; priority=high", pc.ToCookieLine());
    416   EXPECT_EQ(COOKIE_PRIORITY_HIGH, pc.Priority());
    417 
    418   EXPECT_TRUE(pc.SetPriority("mEDium"));
    419   EXPECT_EQ("name=value; priority=mEDium", pc.ToCookieLine());
    420   EXPECT_EQ(COOKIE_PRIORITY_MEDIUM, pc.Priority());
    421 
    422   EXPECT_TRUE(pc.SetPriority("LOW"));
    423   EXPECT_EQ("name=value; priority=LOW", pc.ToCookieLine());
    424   EXPECT_EQ(COOKIE_PRIORITY_LOW, pc.Priority());
    425 
    426   // Interpret invalid priority values as COOKIE_PRIORITY_DEFAULT.
    427   EXPECT_TRUE(pc.SetPriority("Blah"));
    428   EXPECT_EQ("name=value; priority=Blah", pc.ToCookieLine());
    429   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    430 
    431   EXPECT_TRUE(pc.SetPriority("lowerest"));
    432   EXPECT_EQ("name=value; priority=lowerest", pc.ToCookieLine());
    433   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    434 
    435   EXPECT_TRUE(pc.SetPriority(""));
    436   EXPECT_EQ("name=value", pc.ToCookieLine());
    437   EXPECT_EQ(COOKIE_PRIORITY_DEFAULT, pc.Priority());
    438 }
    439 
    440 TEST(ParsedCookieTest, InvalidNonAlphanumericChars) {
    441   ParsedCookie pc1("name=\x05");
    442   ParsedCookie pc2("name=foo" "\x1c" "bar");
    443   ParsedCookie pc3("name=foobar" "\x11");
    444   ParsedCookie pc4("name=\x02" "foobar");
    445 
    446   ParsedCookie pc5("\x05=value");
    447   ParsedCookie pc6("foo" "\x05" "bar=value");
    448   ParsedCookie pc7("foobar" "\x05" "=value");
    449   ParsedCookie pc8("\x05" "foobar" "=value");
    450 
    451   ParsedCookie pc9("foo" "\x05" "bar" "=foo" "\x05" "bar");
    452 
    453   ParsedCookie pc10("foo=bar;ba" "\x05" "z=boo");
    454   ParsedCookie pc11("foo=bar;baz=bo" "\x05" "o");
    455   ParsedCookie pc12("foo=bar;ba" "\05" "z=bo" "\x05" "o");
    456 
    457   EXPECT_FALSE(pc1.IsValid());
    458   EXPECT_FALSE(pc2.IsValid());
    459   EXPECT_FALSE(pc3.IsValid());
    460   EXPECT_FALSE(pc4.IsValid());
    461   EXPECT_FALSE(pc5.IsValid());
    462   EXPECT_FALSE(pc6.IsValid());
    463   EXPECT_FALSE(pc7.IsValid());
    464   EXPECT_FALSE(pc8.IsValid());
    465   EXPECT_FALSE(pc9.IsValid());
    466   EXPECT_FALSE(pc10.IsValid());
    467   EXPECT_FALSE(pc11.IsValid());
    468   EXPECT_FALSE(pc12.IsValid());
    469 }
    470 
    471 TEST(ParsedCookieTest, ValidNonAlphanumericChars) {
    472   // Note that some of these words are pasted backwords thanks to poor vim bidi
    473   // support. This should not affect the tests, however.
    474   const char* pc1_literal = "name=";
    475   const char* pc2_literal = "name=";
    476   const char* pc3_literal = "name=";
    477   const char* pc4_literal = "name=";
    478   const char* pc5_literal = "=value";
    479   const char* pc6_literal = "=value";
    480   const char* pc7_literal = "=value";
    481   const char* pc8_literal = "=value";
    482   ParsedCookie pc1(pc1_literal);
    483   ParsedCookie pc2(pc2_literal);
    484   ParsedCookie pc3(pc3_literal);
    485   ParsedCookie pc4(pc4_literal);
    486   ParsedCookie pc5(pc5_literal);
    487   ParsedCookie pc6(pc6_literal);
    488   ParsedCookie pc7(pc7_literal);
    489   ParsedCookie pc8(pc8_literal);
    490 
    491   EXPECT_TRUE(pc1.IsValid());
    492   EXPECT_EQ(pc1_literal, pc1.ToCookieLine());
    493   EXPECT_TRUE(pc2.IsValid());
    494   EXPECT_EQ(pc2_literal, pc2.ToCookieLine());
    495   EXPECT_TRUE(pc3.IsValid());
    496   EXPECT_EQ(pc3_literal, pc3.ToCookieLine());
    497   EXPECT_TRUE(pc4.IsValid());
    498   EXPECT_EQ(pc4_literal, pc4.ToCookieLine());
    499   EXPECT_TRUE(pc5.IsValid());
    500   EXPECT_EQ(pc5_literal, pc5.ToCookieLine());
    501   EXPECT_TRUE(pc6.IsValid());
    502   EXPECT_EQ(pc6_literal, pc6.ToCookieLine());
    503   EXPECT_TRUE(pc7.IsValid());
    504   EXPECT_EQ(pc7_literal, pc7.ToCookieLine());
    505   EXPECT_TRUE(pc8.IsValid());
    506   EXPECT_EQ(pc8_literal, pc8.ToCookieLine());
    507 }
    508 
    509 }
    510