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.
7 #include "net/cookies/cookie_constants.h"
8 #include "net/cookies/parsed_cookie.h"
9 #include "testing/gtest/include/gtest/gtest.h"
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());
21 TEST(ParsedCookieTest
, TestQuoted
) {
22 // These are some quoting cases which the major browsers all
23 // handle differently. I've tested Internet Explorer 6, Opera 9.6,
24 // Firefox 3, and Safari Windows 3.2.1. We originally tried to match
25 // Firefox closely, however we now match Internet Explorer and Safari.
26 const char* values
[] = {
27 // Trailing whitespace after a quoted value. The whitespace after
28 // the quote is stripped in all browsers.
29 "\"zzz \" ", "\"zzz \"",
30 // Handling a quoted value with a ';', like FOO="zz;pp" ;
31 // IE and Safari: "zz;
32 // Firefox and Opera: "zz;pp"
33 "\"zz;pp\" ;", "\"zz",
34 // Handling a value with multiple quoted parts, like FOO="zzz " "ppp" ;
35 // IE and Safari: "zzz " "ppp";
37 // Opera: <rejects cookie>
38 "\"zzz \" \"ppp\" ", "\"zzz \" \"ppp\"",
39 // A quote in a value that didn't start quoted. like FOO=A"B ;
40 // IE, Safari, and Firefox: A"B;
41 // Opera: <rejects cookie>
45 for (size_t i
= 0; i
< arraysize(values
); i
+= 2) {
46 std::string
input(values
[i
]);
47 std::string
expected(values
[i
+ 1]);
49 ParsedCookie
pc("aBc=" + input
+ " ; path=\"/\" ; httponly ");
50 EXPECT_TRUE(pc
.IsValid());
51 EXPECT_FALSE(pc
.IsSecure());
52 EXPECT_TRUE(pc
.IsHttpOnly());
53 EXPECT_TRUE(pc
.HasPath());
54 EXPECT_EQ("aBc", pc
.Name());
55 EXPECT_EQ(expected
, pc
.Value());
57 // If a path was quoted, the path attribute keeps the quotes. This will
58 // make the cookie effectively useless, but path parameters aren't supposed
59 // to be quoted. Bug 1261605.
60 EXPECT_EQ("\"/\"", pc
.Path());
64 TEST(ParsedCookieTest
, TestNameless
) {
65 ParsedCookie
pc("BLAHHH; path=/; secure;");
66 EXPECT_TRUE(pc
.IsValid());
67 EXPECT_TRUE(pc
.IsSecure());
68 EXPECT_TRUE(pc
.HasPath());
69 EXPECT_EQ("/", pc
.Path());
70 EXPECT_EQ("", pc
.Name());
71 EXPECT_EQ("BLAHHH", pc
.Value());
72 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
75 TEST(ParsedCookieTest
, TestAttributeCase
) {
76 ParsedCookie
pc("BLAHHH; Path=/; sECuRe; httpONLY; pRIoRitY=hIgH");
77 EXPECT_TRUE(pc
.IsValid());
78 EXPECT_TRUE(pc
.IsSecure());
79 EXPECT_TRUE(pc
.IsHttpOnly());
80 EXPECT_TRUE(pc
.HasPath());
81 EXPECT_EQ("/", pc
.Path());
82 EXPECT_EQ("", pc
.Name());
83 EXPECT_EQ("BLAHHH", pc
.Value());
84 EXPECT_EQ(COOKIE_PRIORITY_HIGH
, pc
.Priority());
85 EXPECT_EQ(4U, pc
.NumberOfAttributes());
88 TEST(ParsedCookieTest
, TestDoubleQuotedNameless
) {
89 ParsedCookie
pc("\"BLA\\\"HHH\"; path=/; secure;");
90 EXPECT_TRUE(pc
.IsValid());
91 EXPECT_TRUE(pc
.IsSecure());
92 EXPECT_TRUE(pc
.HasPath());
93 EXPECT_EQ("/", pc
.Path());
94 EXPECT_EQ("", pc
.Name());
95 EXPECT_EQ("\"BLA\\\"HHH\"", pc
.Value());
96 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
97 EXPECT_EQ(2U, pc
.NumberOfAttributes());
100 TEST(ParsedCookieTest
, QuoteOffTheEnd
) {
101 ParsedCookie
pc("a=\"B");
102 EXPECT_TRUE(pc
.IsValid());
103 EXPECT_EQ("a", pc
.Name());
104 EXPECT_EQ("\"B", pc
.Value());
105 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
106 EXPECT_EQ(0U, pc
.NumberOfAttributes());
109 TEST(ParsedCookieTest
, MissingName
) {
110 ParsedCookie
pc("=ABC");
111 EXPECT_TRUE(pc
.IsValid());
112 EXPECT_EQ("", pc
.Name());
113 EXPECT_EQ("ABC", pc
.Value());
114 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
115 EXPECT_EQ(0U, pc
.NumberOfAttributes());
118 TEST(ParsedCookieTest
, MissingValue
) {
119 ParsedCookie
pc("ABC=; path = /wee");
120 EXPECT_TRUE(pc
.IsValid());
121 EXPECT_EQ("ABC", pc
.Name());
122 EXPECT_EQ("", pc
.Value());
123 EXPECT_TRUE(pc
.HasPath());
124 EXPECT_EQ("/wee", pc
.Path());
125 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
126 EXPECT_EQ(1U, pc
.NumberOfAttributes());
129 TEST(ParsedCookieTest
, Whitespace
) {
130 ParsedCookie
pc(" A = BC ;secure;;; httponly");
131 EXPECT_TRUE(pc
.IsValid());
132 EXPECT_EQ("A", pc
.Name());
133 EXPECT_EQ("BC", pc
.Value());
134 EXPECT_FALSE(pc
.HasPath());
135 EXPECT_FALSE(pc
.HasDomain());
136 EXPECT_TRUE(pc
.IsSecure());
137 EXPECT_TRUE(pc
.IsHttpOnly());
138 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
139 // We parse anything between ; as attributes, so we end up with two
140 // attributes with an empty string name and value.
141 EXPECT_EQ(4U, pc
.NumberOfAttributes());
143 TEST(ParsedCookieTest
, MultipleEquals
) {
144 ParsedCookie
pc(" A=== BC ;secure;;; httponly");
145 EXPECT_TRUE(pc
.IsValid());
146 EXPECT_EQ("A", pc
.Name());
147 EXPECT_EQ("== BC", pc
.Value());
148 EXPECT_FALSE(pc
.HasPath());
149 EXPECT_FALSE(pc
.HasDomain());
150 EXPECT_TRUE(pc
.IsSecure());
151 EXPECT_TRUE(pc
.IsHttpOnly());
152 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
153 EXPECT_EQ(4U, pc
.NumberOfAttributes());
156 TEST(ParsedCookieTest
, QuotedTrailingWhitespace
) {
157 ParsedCookie
pc("ANCUUID=\"zohNumRKgI0oxyhSsV3Z7D\" ; "
158 "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
160 EXPECT_TRUE(pc
.IsValid());
161 EXPECT_EQ("ANCUUID", pc
.Name());
162 // Stripping whitespace after the quotes matches all other major browsers.
163 EXPECT_EQ("\"zohNumRKgI0oxyhSsV3Z7D\"", pc
.Value());
164 EXPECT_TRUE(pc
.HasExpires());
165 EXPECT_TRUE(pc
.HasPath());
166 EXPECT_EQ("/", pc
.Path());
167 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
168 EXPECT_EQ(2U, pc
.NumberOfAttributes());
171 TEST(ParsedCookieTest
, TrailingWhitespace
) {
172 ParsedCookie
pc("ANCUUID=zohNumRKgI0oxyhSsV3Z7D ; "
173 "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
175 EXPECT_TRUE(pc
.IsValid());
176 EXPECT_EQ("ANCUUID", pc
.Name());
177 EXPECT_EQ("zohNumRKgI0oxyhSsV3Z7D", pc
.Value());
178 EXPECT_TRUE(pc
.HasExpires());
179 EXPECT_TRUE(pc
.HasPath());
180 EXPECT_EQ("/", pc
.Path());
181 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
182 EXPECT_EQ(2U, pc
.NumberOfAttributes());
185 TEST(ParsedCookieTest
, TooManyPairs
) {
186 std::string blankpairs
;
187 blankpairs
.resize(ParsedCookie::kMaxPairs
- 1, ';');
189 ParsedCookie
pc1(blankpairs
+ "secure");
190 EXPECT_TRUE(pc1
.IsValid());
191 EXPECT_TRUE(pc1
.IsSecure());
193 ParsedCookie
pc2(blankpairs
+ ";secure");
194 EXPECT_TRUE(pc2
.IsValid());
195 EXPECT_FALSE(pc2
.IsSecure());
198 // TODO(erikwright): some better test cases for invalid cookies.
199 TEST(ParsedCookieTest
, InvalidWhitespace
) {
200 ParsedCookie
pc(" ");
201 EXPECT_FALSE(pc
.IsValid());
204 TEST(ParsedCookieTest
, InvalidTooLong
) {
206 maxstr
.resize(ParsedCookie::kMaxCookieSize
, 'a');
208 ParsedCookie
pc1(maxstr
);
209 EXPECT_TRUE(pc1
.IsValid());
211 ParsedCookie
pc2(maxstr
+ "A");
212 EXPECT_FALSE(pc2
.IsValid());
215 TEST(ParsedCookieTest
, InvalidEmpty
) {
216 ParsedCookie
pc((std::string()));
217 EXPECT_FALSE(pc
.IsValid());
220 TEST(ParsedCookieTest
, EmbeddedTerminator
) {
221 ParsedCookie
pc1("AAA=BB\0ZYX");
222 ParsedCookie
pc2("AAA=BB\rZYX");
223 ParsedCookie
pc3("AAA=BB\nZYX");
224 EXPECT_TRUE(pc1
.IsValid());
225 EXPECT_EQ("AAA", pc1
.Name());
226 EXPECT_EQ("BB", pc1
.Value());
227 EXPECT_TRUE(pc2
.IsValid());
228 EXPECT_EQ("AAA", pc2
.Name());
229 EXPECT_EQ("BB", pc2
.Value());
230 EXPECT_TRUE(pc3
.IsValid());
231 EXPECT_EQ("AAA", pc3
.Name());
232 EXPECT_EQ("BB", pc3
.Value());
235 TEST(ParsedCookieTest
, ParseTokensAndValues
) {
237 ParsedCookie::ParseTokenString("hello\nworld"));
239 ParsedCookie::ParseTokenString("fs!!@;helloworld"));
240 EXPECT_EQ("hello world\tgood",
241 ParsedCookie::ParseTokenString("hello world\tgood\rbye"));
243 ParsedCookie::ParseTokenString("A=B=C;D=E"));
245 ParsedCookie::ParseValueString("hello\nworld"));
247 ParsedCookie::ParseValueString("fs!!@;helloworld"));
248 EXPECT_EQ("hello world\tgood",
249 ParsedCookie::ParseValueString("hello world\tgood\rbye"));
251 ParsedCookie::ParseValueString("A=B=C;D=E"));
254 TEST(ParsedCookieTest
, SerializeCookieLine
) {
255 const char input
[] = "ANCUUID=zohNumRKgI0oxyhSsV3Z7D ; "
256 "expires=Sun, 18-Apr-2027 21:06:29 GMT ; "
257 "path=/ ; priority=low ; ";
258 const char output
[] = "ANCUUID=zohNumRKgI0oxyhSsV3Z7D; "
259 "expires=Sun, 18-Apr-2027 21:06:29 GMT; "
260 "path=/; priority=low";
261 ParsedCookie
pc(input
);
262 EXPECT_EQ(output
, pc
.ToCookieLine());
266 TEST(ParsedCookieTest
, SetNameAndValue
) {
267 ParsedCookie
empty((std::string()));
268 EXPECT_FALSE(empty
.IsValid());
269 EXPECT_FALSE(empty
.SetDomain("foobar.com"));
270 EXPECT_TRUE(empty
.SetName("name"));
271 EXPECT_TRUE(empty
.SetValue("value"));
272 EXPECT_EQ("name=value", empty
.ToCookieLine());
273 EXPECT_TRUE(empty
.IsValid());
276 // ParsedCookie invalid("@foo=bar");
277 // EXPECT_FALSE(invalid.IsValid());
278 // here because we are slightly more tolerant to invalid cookie names and
279 // values that are set by webservers. We only enforce a correct name and
280 // value if set via SetName() and SetValue().
282 ParsedCookie
pc("name=value");
283 EXPECT_TRUE(pc
.IsValid());
285 // Set invalid name / value.
286 EXPECT_FALSE(pc
.SetName("@foobar"));
287 EXPECT_EQ("name=value", pc
.ToCookieLine());
288 EXPECT_TRUE(pc
.IsValid());
290 EXPECT_FALSE(pc
.SetName(std::string()));
291 EXPECT_EQ("name=value", pc
.ToCookieLine());
292 EXPECT_TRUE(pc
.IsValid());
294 EXPECT_FALSE(pc
.SetValue("foo bar"));
295 EXPECT_EQ("name=value", pc
.ToCookieLine());
296 EXPECT_TRUE(pc
.IsValid());
298 EXPECT_FALSE(pc
.SetValue("\"foobar"));
299 EXPECT_EQ("name=value", pc
.ToCookieLine());
300 EXPECT_TRUE(pc
.IsValid());
302 // Set valid name / value
303 EXPECT_TRUE(pc
.SetName("test"));
304 EXPECT_EQ("test=value", pc
.ToCookieLine());
305 EXPECT_TRUE(pc
.IsValid());
307 EXPECT_TRUE(pc
.SetValue("\"foobar\""));
308 EXPECT_EQ("test=\"foobar\"", pc
.ToCookieLine());
309 EXPECT_TRUE(pc
.IsValid());
311 EXPECT_TRUE(pc
.SetValue(std::string()));
312 EXPECT_EQ("test=", pc
.ToCookieLine());
313 EXPECT_TRUE(pc
.IsValid());
316 TEST(ParsedCookieTest
, SetAttributes
) {
317 ParsedCookie
pc("name=value");
318 EXPECT_TRUE(pc
.IsValid());
320 // Clear an unset attribute.
321 EXPECT_TRUE(pc
.SetDomain(std::string()));
322 EXPECT_FALSE(pc
.HasDomain());
323 EXPECT_EQ("name=value", pc
.ToCookieLine());
324 EXPECT_TRUE(pc
.IsValid());
326 // Set a string containing an invalid character
327 EXPECT_FALSE(pc
.SetDomain("foo;bar"));
328 EXPECT_FALSE(pc
.HasDomain());
329 EXPECT_EQ("name=value", pc
.ToCookieLine());
330 EXPECT_TRUE(pc
.IsValid());
332 // Set all other attributes and check that they are appended in order.
333 EXPECT_TRUE(pc
.SetDomain("domain.com"));
334 EXPECT_TRUE(pc
.SetPath("/"));
335 EXPECT_TRUE(pc
.SetExpires("Sun, 18-Apr-2027 21:06:29 GMT"));
336 EXPECT_TRUE(pc
.SetMaxAge("12345"));
337 EXPECT_TRUE(pc
.SetIsSecure(true));
338 EXPECT_TRUE(pc
.SetIsHttpOnly(true));
339 EXPECT_TRUE(pc
.SetIsHttpOnly(true));
340 EXPECT_TRUE(pc
.SetPriority("HIGH"));
341 EXPECT_EQ("name=value; domain=domain.com; path=/; "
342 "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
343 "httponly; priority=HIGH",
345 EXPECT_TRUE(pc
.HasDomain());
346 EXPECT_TRUE(pc
.HasPath());
347 EXPECT_TRUE(pc
.HasExpires());
348 EXPECT_TRUE(pc
.HasMaxAge());
349 EXPECT_TRUE(pc
.IsSecure());
350 EXPECT_TRUE(pc
.IsHttpOnly());
351 EXPECT_EQ(COOKIE_PRIORITY_HIGH
, pc
.Priority());
353 // Clear one attribute from the middle.
354 EXPECT_TRUE(pc
.SetPath("/foo"));
355 EXPECT_TRUE(pc
.HasDomain());
356 EXPECT_TRUE(pc
.HasPath());
357 EXPECT_TRUE(pc
.HasExpires());
358 EXPECT_TRUE(pc
.IsSecure());
359 EXPECT_TRUE(pc
.IsHttpOnly());
360 EXPECT_EQ("name=value; domain=domain.com; path=/foo; "
361 "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
362 "httponly; priority=HIGH",
365 // Set priority to medium.
366 EXPECT_TRUE(pc
.SetPriority("medium"));
367 EXPECT_EQ("name=value; domain=domain.com; path=/foo; "
368 "expires=Sun, 18-Apr-2027 21:06:29 GMT; max-age=12345; secure; "
369 "httponly; priority=medium",
372 // Clear the rest and change the name and value.
373 EXPECT_TRUE(pc
.SetDomain(std::string()));
374 EXPECT_TRUE(pc
.SetPath(std::string()));
375 EXPECT_TRUE(pc
.SetExpires(std::string()));
376 EXPECT_TRUE(pc
.SetMaxAge(std::string()));
377 EXPECT_TRUE(pc
.SetIsSecure(false));
378 EXPECT_TRUE(pc
.SetIsHttpOnly(false));
379 EXPECT_TRUE(pc
.SetName("name2"));
380 EXPECT_TRUE(pc
.SetValue("value2"));
381 EXPECT_TRUE(pc
.SetPriority(std::string()));
382 EXPECT_FALSE(pc
.HasDomain());
383 EXPECT_FALSE(pc
.HasPath());
384 EXPECT_FALSE(pc
.HasExpires());
385 EXPECT_FALSE(pc
.HasMaxAge());
386 EXPECT_FALSE(pc
.IsSecure());
387 EXPECT_FALSE(pc
.IsHttpOnly());
388 EXPECT_EQ("name2=value2", pc
.ToCookieLine());
391 TEST(ParsedCookieTest
, SetPriority
) {
392 ParsedCookie
pc("name=value");
393 EXPECT_TRUE(pc
.IsValid());
395 EXPECT_EQ("name=value", pc
.ToCookieLine());
396 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
398 // Test each priority, expect case-insensitive compare.
399 EXPECT_TRUE(pc
.SetPriority("high"));
400 EXPECT_EQ("name=value; priority=high", pc
.ToCookieLine());
401 EXPECT_EQ(COOKIE_PRIORITY_HIGH
, pc
.Priority());
403 EXPECT_TRUE(pc
.SetPriority("mEDium"));
404 EXPECT_EQ("name=value; priority=mEDium", pc
.ToCookieLine());
405 EXPECT_EQ(COOKIE_PRIORITY_MEDIUM
, pc
.Priority());
407 EXPECT_TRUE(pc
.SetPriority("LOW"));
408 EXPECT_EQ("name=value; priority=LOW", pc
.ToCookieLine());
409 EXPECT_EQ(COOKIE_PRIORITY_LOW
, pc
.Priority());
411 // Interpret invalid priority values as COOKIE_PRIORITY_DEFAULT.
412 EXPECT_TRUE(pc
.SetPriority("Blah"));
413 EXPECT_EQ("name=value; priority=Blah", pc
.ToCookieLine());
414 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
416 EXPECT_TRUE(pc
.SetPriority("lowerest"));
417 EXPECT_EQ("name=value; priority=lowerest", pc
.ToCookieLine());
418 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
420 EXPECT_TRUE(pc
.SetPriority(""));
421 EXPECT_EQ("name=value", pc
.ToCookieLine());
422 EXPECT_EQ(COOKIE_PRIORITY_DEFAULT
, pc
.Priority());
425 TEST(ParsedCookieTest
, InvalidNonAlphanumericChars
) {
426 ParsedCookie
pc1("name=\x05");
427 ParsedCookie
pc2("name=foo" "\x1c" "bar");
428 ParsedCookie
pc3("name=foobar" "\x11");
429 ParsedCookie
pc4("name=\x02" "foobar");
431 ParsedCookie
pc5("\x05=value");
432 ParsedCookie
pc6("foo" "\x05" "bar=value");
433 ParsedCookie
pc7("foobar" "\x05" "=value");
434 ParsedCookie
pc8("\x05" "foobar" "=value");
436 ParsedCookie
pc9("foo" "\x05" "bar" "=foo" "\x05" "bar");
438 ParsedCookie
pc10("foo=bar;ba" "\x05" "z=boo");
439 ParsedCookie
pc11("foo=bar;baz=bo" "\x05" "o");
440 ParsedCookie
pc12("foo=bar;ba" "\05" "z=bo" "\x05" "o");
442 EXPECT_FALSE(pc1
.IsValid());
443 EXPECT_FALSE(pc2
.IsValid());
444 EXPECT_FALSE(pc3
.IsValid());
445 EXPECT_FALSE(pc4
.IsValid());
446 EXPECT_FALSE(pc5
.IsValid());
447 EXPECT_FALSE(pc6
.IsValid());
448 EXPECT_FALSE(pc7
.IsValid());
449 EXPECT_FALSE(pc8
.IsValid());
450 EXPECT_FALSE(pc9
.IsValid());
451 EXPECT_FALSE(pc10
.IsValid());
452 EXPECT_FALSE(pc11
.IsValid());
453 EXPECT_FALSE(pc12
.IsValid());
456 TEST(ParsedCookieTest
, ValidNonAlphanumericChars
) {
457 // Note that some of these words are pasted backwords thanks to poor vim bidi
458 // support. This should not affect the tests, however.
459 const char* pc1_literal
= "name=العربية";
460 const char* pc2_literal
= "name=普通話";
461 const char* pc3_literal
= "name=ภาษาไทย";
462 const char* pc4_literal
= "name=עִבְרִית";
463 const char* pc5_literal
= "العربية=value";
464 const char* pc6_literal
= "普通話=value";
465 const char* pc7_literal
= "ภาษาไทย=value";
466 const char* pc8_literal
= "עִבְרִית=value";
467 ParsedCookie
pc1(pc1_literal
);
468 ParsedCookie
pc2(pc2_literal
);
469 ParsedCookie
pc3(pc3_literal
);
470 ParsedCookie
pc4(pc4_literal
);
471 ParsedCookie
pc5(pc5_literal
);
472 ParsedCookie
pc6(pc6_literal
);
473 ParsedCookie
pc7(pc7_literal
);
474 ParsedCookie
pc8(pc8_literal
);
476 EXPECT_TRUE(pc1
.IsValid());
477 EXPECT_EQ(pc1_literal
, pc1
.ToCookieLine());
478 EXPECT_TRUE(pc2
.IsValid());
479 EXPECT_EQ(pc2_literal
, pc2
.ToCookieLine());
480 EXPECT_TRUE(pc3
.IsValid());
481 EXPECT_EQ(pc3_literal
, pc3
.ToCookieLine());
482 EXPECT_TRUE(pc4
.IsValid());
483 EXPECT_EQ(pc4_literal
, pc4
.ToCookieLine());
484 EXPECT_TRUE(pc5
.IsValid());
485 EXPECT_EQ(pc5_literal
, pc5
.ToCookieLine());
486 EXPECT_TRUE(pc6
.IsValid());
487 EXPECT_EQ(pc6_literal
, pc6
.ToCookieLine());
488 EXPECT_TRUE(pc7
.IsValid());
489 EXPECT_EQ(pc7_literal
, pc7
.ToCookieLine());
490 EXPECT_TRUE(pc8
.IsValid());
491 EXPECT_EQ(pc8_literal
, pc8
.ToCookieLine());