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 "net/cookies/canonical_cookie.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "net/cookies/cookie_constants.h" 9 #include "net/cookies/cookie_options.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 #include "url/gurl.h" 12 13 namespace net { 14 15 TEST(CanonicalCookieTest, GetCookieSourceFromURL) { 16 EXPECT_EQ("http://example.com/", 17 CanonicalCookie::GetCookieSourceFromURL( 18 GURL("http://example.com"))); 19 EXPECT_EQ("http://example.com/", 20 CanonicalCookie::GetCookieSourceFromURL( 21 GURL("http://example.com/"))); 22 EXPECT_EQ("http://example.com/", 23 CanonicalCookie::GetCookieSourceFromURL( 24 GURL("http://example.com/test"))); 25 EXPECT_EQ("file:///tmp/test.html", 26 CanonicalCookie::GetCookieSourceFromURL( 27 GURL("file:///tmp/test.html"))); 28 EXPECT_EQ("http://example.com/", 29 CanonicalCookie::GetCookieSourceFromURL( 30 GURL("http://example.com:1234/"))); 31 EXPECT_EQ("http://example.com/", 32 CanonicalCookie::GetCookieSourceFromURL( 33 GURL("https://example.com/"))); 34 EXPECT_EQ("http://example.com/", 35 CanonicalCookie::GetCookieSourceFromURL( 36 GURL("http://user:pwd@example.com/"))); 37 EXPECT_EQ("http://example.com/", 38 CanonicalCookie::GetCookieSourceFromURL( 39 GURL("http://example.com/test?foo"))); 40 EXPECT_EQ("http://example.com/", 41 CanonicalCookie::GetCookieSourceFromURL( 42 GURL("http://example.com/test#foo"))); 43 } 44 45 TEST(CanonicalCookieTest, Constructor) { 46 GURL url("http://www.example.com/test"); 47 base::Time current_time = base::Time::Now(); 48 49 CanonicalCookie cookie(url, "A", "2", "www.example.com", "/test", 50 current_time, base::Time(), current_time, false, false, 51 COOKIE_PRIORITY_DEFAULT); 52 EXPECT_EQ(url.GetOrigin().spec(), cookie.Source()); 53 EXPECT_EQ("A", cookie.Name()); 54 EXPECT_EQ("2", cookie.Value()); 55 EXPECT_EQ("www.example.com", cookie.Domain()); 56 EXPECT_EQ("/test", cookie.Path()); 57 EXPECT_FALSE(cookie.IsSecure()); 58 59 CanonicalCookie cookie2(url, 60 "A", 61 "2", 62 std::string(), 63 std::string(), 64 current_time, 65 base::Time(), 66 current_time, 67 false, 68 false, 69 COOKIE_PRIORITY_DEFAULT); 70 EXPECT_EQ(url.GetOrigin().spec(), cookie.Source()); 71 EXPECT_EQ("A", cookie2.Name()); 72 EXPECT_EQ("2", cookie2.Value()); 73 EXPECT_EQ("", cookie2.Domain()); 74 EXPECT_EQ("", cookie2.Path()); 75 EXPECT_FALSE(cookie2.IsSecure()); 76 77 } 78 79 TEST(CanonicalCookieTest, Create) { 80 // Test creating cookies from a cookie string. 81 GURL url("http://www.example.com/test/foo.html"); 82 base::Time creation_time = base::Time::Now(); 83 CookieOptions options; 84 85 scoped_ptr<CanonicalCookie> cookie( 86 CanonicalCookie::Create(url, "A=2", creation_time, options)); 87 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); 88 EXPECT_EQ("A", cookie->Name()); 89 EXPECT_EQ("2", cookie->Value()); 90 EXPECT_EQ("www.example.com", cookie->Domain()); 91 EXPECT_EQ("/test", cookie->Path()); 92 EXPECT_FALSE(cookie->IsSecure()); 93 94 GURL url2("http://www.foo.com"); 95 cookie.reset(CanonicalCookie::Create(url2, "B=1", creation_time, options)); 96 EXPECT_EQ(url2.GetOrigin().spec(), cookie->Source()); 97 EXPECT_EQ("B", cookie->Name()); 98 EXPECT_EQ("1", cookie->Value()); 99 EXPECT_EQ("www.foo.com", cookie->Domain()); 100 EXPECT_EQ("/", cookie->Path()); 101 EXPECT_FALSE(cookie->IsSecure()); 102 103 // Test creating secure cookies. RFC 6265 allows insecure urls to set secure 104 // cookies. 105 cookie.reset( 106 CanonicalCookie::Create(url, "A=2; Secure", creation_time, options)); 107 EXPECT_TRUE(cookie.get()); 108 EXPECT_TRUE(cookie->IsSecure()); 109 110 // Test creating http only cookies. 111 cookie.reset( 112 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, options)); 113 EXPECT_FALSE(cookie.get()); 114 CookieOptions httponly_options; 115 httponly_options.set_include_httponly(); 116 cookie.reset( 117 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, 118 httponly_options)); 119 EXPECT_TRUE(cookie->IsHttpOnly()); 120 121 // Test the creating cookies using specific parameter instead of a cookie 122 // string. 123 cookie.reset(CanonicalCookie::Create( 124 url, "A", "2", "www.example.com", "/test", creation_time, base::Time(), 125 false, false, COOKIE_PRIORITY_DEFAULT)); 126 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); 127 EXPECT_EQ("A", cookie->Name()); 128 EXPECT_EQ("2", cookie->Value()); 129 EXPECT_EQ(".www.example.com", cookie->Domain()); 130 EXPECT_EQ("/test", cookie->Path()); 131 EXPECT_FALSE(cookie->IsSecure()); 132 133 cookie.reset(CanonicalCookie::Create( 134 url, "A", "2", ".www.example.com", "/test", creation_time, base::Time(), 135 false, false, COOKIE_PRIORITY_DEFAULT)); 136 EXPECT_EQ(url.GetOrigin().spec(), cookie->Source()); 137 EXPECT_EQ("A", cookie->Name()); 138 EXPECT_EQ("2", cookie->Value()); 139 EXPECT_EQ(".www.example.com", cookie->Domain()); 140 EXPECT_EQ("/test", cookie->Path()); 141 EXPECT_FALSE(cookie->IsSecure()); 142 } 143 144 TEST(CanonicalCookieTest, EmptyExpiry) { 145 GURL url("http://www7.ipdl.inpit.go.jp/Tokujitu/tjkta.ipdl?N0000=108"); 146 base::Time creation_time = base::Time::Now(); 147 CookieOptions options; 148 149 std::string cookie_line = 150 "ACSTM=20130308043820420042; path=/; domain=ipdl.inpit.go.jp; Expires="; 151 scoped_ptr<CanonicalCookie> cookie(CanonicalCookie::Create( 152 url, cookie_line, creation_time, options)); 153 EXPECT_TRUE(cookie.get()); 154 EXPECT_FALSE(cookie->IsPersistent()); 155 EXPECT_FALSE(cookie->IsExpired(creation_time)); 156 EXPECT_EQ(base::Time(), cookie->ExpiryDate()); 157 158 // With a stale server time 159 options.set_server_time(creation_time - base::TimeDelta::FromHours(1)); 160 cookie.reset(CanonicalCookie::Create( 161 url, cookie_line, creation_time, options)); 162 EXPECT_TRUE(cookie.get()); 163 EXPECT_FALSE(cookie->IsPersistent()); 164 EXPECT_FALSE(cookie->IsExpired(creation_time)); 165 EXPECT_EQ(base::Time(), cookie->ExpiryDate()); 166 167 // With a future server time 168 options.set_server_time(creation_time + base::TimeDelta::FromHours(1)); 169 cookie.reset(CanonicalCookie::Create( 170 url, cookie_line, creation_time, options)); 171 EXPECT_TRUE(cookie.get()); 172 EXPECT_FALSE(cookie->IsPersistent()); 173 EXPECT_FALSE(cookie->IsExpired(creation_time)); 174 EXPECT_EQ(base::Time(), cookie->ExpiryDate()); 175 } 176 177 TEST(CanonicalCookieTest, IsEquivalent) { 178 GURL url("http://www.example.com/"); 179 std::string cookie_name = "A"; 180 std::string cookie_value = "2EDA-EF"; 181 std::string cookie_domain = ".www.example.com"; 182 std::string cookie_path = "/"; 183 base::Time creation_time = base::Time::Now(); 184 base::Time last_access_time = creation_time; 185 base::Time expiration_time = creation_time + base::TimeDelta::FromDays(2); 186 bool secure(false); 187 bool httponly(false); 188 189 // Test that a cookie is equivalent to itself. 190 scoped_ptr<CanonicalCookie> cookie( 191 new CanonicalCookie(url, cookie_name, cookie_value, cookie_domain, 192 cookie_path, creation_time, expiration_time, 193 last_access_time, secure, httponly, 194 COOKIE_PRIORITY_MEDIUM)); 195 EXPECT_TRUE(cookie->IsEquivalent(*cookie)); 196 197 // Test that two identical cookies are equivalent. 198 scoped_ptr<CanonicalCookie> other_cookie( 199 new CanonicalCookie(url, cookie_name, cookie_value, cookie_domain, 200 cookie_path, creation_time, expiration_time, 201 last_access_time, secure, httponly, 202 COOKIE_PRIORITY_MEDIUM)); 203 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); 204 205 // Tests that use different variations of attribute values that 206 // DON'T affect cookie equivalence. 207 other_cookie.reset(new CanonicalCookie(url, cookie_name, "2", cookie_domain, 208 cookie_path, creation_time, 209 expiration_time, last_access_time, 210 secure, httponly, 211 COOKIE_PRIORITY_HIGH)); 212 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); 213 214 base::Time other_creation_time = 215 creation_time + base::TimeDelta::FromMinutes(2); 216 other_cookie.reset(new CanonicalCookie(url, cookie_name, "2", cookie_domain, 217 cookie_path, other_creation_time, 218 expiration_time, last_access_time, 219 secure, httponly, 220 COOKIE_PRIORITY_MEDIUM)); 221 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); 222 223 other_cookie.reset(new CanonicalCookie(url, cookie_name, cookie_name, 224 cookie_domain, cookie_path, 225 creation_time, expiration_time, 226 last_access_time, true, httponly, 227 COOKIE_PRIORITY_LOW)); 228 EXPECT_TRUE(cookie->IsEquivalent(*other_cookie)); 229 230 // Tests that use different variations of attribute values that 231 // DO affect cookie equivalence. 232 other_cookie.reset(new CanonicalCookie(url, "B", cookie_value, cookie_domain, 233 cookie_path, creation_time, 234 expiration_time, last_access_time, 235 secure, httponly, 236 COOKIE_PRIORITY_MEDIUM)); 237 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); 238 239 other_cookie.reset(new CanonicalCookie(url, cookie_name, cookie_value, 240 "www.example.com", cookie_path, 241 creation_time, expiration_time, 242 last_access_time, secure, httponly, 243 COOKIE_PRIORITY_MEDIUM)); 244 EXPECT_TRUE(cookie->IsDomainCookie()); 245 EXPECT_FALSE(other_cookie->IsDomainCookie()); 246 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); 247 248 other_cookie.reset(new CanonicalCookie(url, cookie_name, cookie_value, 249 ".example.com", cookie_path, 250 creation_time, expiration_time, 251 last_access_time, secure, httponly, 252 COOKIE_PRIORITY_MEDIUM)); 253 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); 254 255 other_cookie.reset(new CanonicalCookie(url, cookie_name, cookie_value, 256 cookie_domain, "/test/0", 257 creation_time, expiration_time, 258 last_access_time, secure, httponly, 259 COOKIE_PRIORITY_MEDIUM)); 260 EXPECT_FALSE(cookie->IsEquivalent(*other_cookie)); 261 } 262 263 TEST(CanonicalCookieTest, IsDomainMatch) { 264 GURL url("http://www.example.com/test/foo.html"); 265 base::Time creation_time = base::Time::Now(); 266 CookieOptions options; 267 268 scoped_ptr<CanonicalCookie> cookie( 269 CanonicalCookie::Create(url, "A=2", creation_time, options)); 270 EXPECT_TRUE(cookie->IsHostCookie()); 271 EXPECT_TRUE(cookie->IsDomainMatch("www.example.com")); 272 EXPECT_TRUE(cookie->IsDomainMatch("www.example.com")); 273 EXPECT_FALSE(cookie->IsDomainMatch("foo.www.example.com")); 274 EXPECT_FALSE(cookie->IsDomainMatch("www0.example.com")); 275 EXPECT_FALSE(cookie->IsDomainMatch("example.com")); 276 277 cookie.reset( 278 CanonicalCookie::Create(url, "A=2; Domain=www.example.com", creation_time, 279 options)); 280 EXPECT_TRUE(cookie->IsDomainCookie()); 281 EXPECT_TRUE(cookie->IsDomainMatch("www.example.com")); 282 EXPECT_TRUE(cookie->IsDomainMatch("www.example.com")); 283 EXPECT_TRUE(cookie->IsDomainMatch("foo.www.example.com")); 284 EXPECT_FALSE(cookie->IsDomainMatch("www0.example.com")); 285 EXPECT_FALSE(cookie->IsDomainMatch("example.com")); 286 287 cookie.reset( 288 CanonicalCookie::Create(url, "A=2; Domain=.www.example.com", 289 creation_time, options)); 290 EXPECT_TRUE(cookie->IsDomainMatch("www.example.com")); 291 EXPECT_TRUE(cookie->IsDomainMatch("www.example.com")); 292 EXPECT_TRUE(cookie->IsDomainMatch("foo.www.example.com")); 293 EXPECT_FALSE(cookie->IsDomainMatch("www0.example.com")); 294 EXPECT_FALSE(cookie->IsDomainMatch("example.com")); 295 } 296 297 TEST(CanonicalCookieTest, IsOnPath) { 298 base::Time creation_time = base::Time::Now(); 299 CookieOptions options; 300 301 scoped_ptr<CanonicalCookie> cookie( 302 CanonicalCookie::Create(GURL("http://www.example.com"), 303 "A=2", creation_time, options)); 304 EXPECT_TRUE(cookie->IsOnPath("/")); 305 EXPECT_TRUE(cookie->IsOnPath("/test")); 306 EXPECT_TRUE(cookie->IsOnPath("/test/bar.html")); 307 308 // Test the empty string edge case. 309 EXPECT_FALSE(cookie->IsOnPath(std::string())); 310 311 cookie.reset( 312 CanonicalCookie::Create(GURL("http://www.example.com/test/foo.html"), 313 "A=2", creation_time, options)); 314 EXPECT_FALSE(cookie->IsOnPath("/")); 315 EXPECT_TRUE(cookie->IsOnPath("/test")); 316 EXPECT_TRUE(cookie->IsOnPath("/test/bar.html")); 317 EXPECT_TRUE(cookie->IsOnPath("/test/sample/bar.html")); 318 } 319 320 TEST(CanonicalCookieTest, IncludeForRequestURL) { 321 GURL url("http://www.example.com"); 322 base::Time creation_time = base::Time::Now(); 323 CookieOptions options; 324 325 scoped_ptr<CanonicalCookie> cookie( 326 CanonicalCookie::Create(url, "A=2", creation_time, options)); 327 EXPECT_TRUE(cookie->IncludeForRequestURL(url, options)); 328 EXPECT_TRUE(cookie->IncludeForRequestURL( 329 GURL("http://www.example.com/foo/bar"), options)); 330 EXPECT_TRUE(cookie->IncludeForRequestURL( 331 GURL("https://www.example.com/foo/bar"), options)); 332 EXPECT_FALSE(cookie->IncludeForRequestURL(GURL("https://sub.example.com"), 333 options)); 334 EXPECT_FALSE(cookie->IncludeForRequestURL(GURL("https://sub.www.example.com"), 335 options)); 336 337 // Test that cookie with a cookie path that does not match the url path are 338 // not included. 339 cookie.reset(CanonicalCookie::Create(url, "A=2; Path=/foo/bar", creation_time, 340 options)); 341 EXPECT_FALSE(cookie->IncludeForRequestURL(url, options)); 342 EXPECT_TRUE(cookie->IncludeForRequestURL( 343 GURL("http://www.example.com/foo/bar/index.html"), options)); 344 345 // Test that a secure cookie is not included for a non secure URL. 346 GURL secure_url("https://www.example.com"); 347 cookie.reset(CanonicalCookie::Create(secure_url, "A=2; Secure", creation_time, 348 options)); 349 EXPECT_TRUE(cookie->IsSecure()); 350 EXPECT_TRUE(cookie->IncludeForRequestURL(secure_url, options)); 351 EXPECT_FALSE(cookie->IncludeForRequestURL(url, options)); 352 353 // Test that http only cookies are only included if the include httponly flag 354 // is set on the cookie options. 355 options.set_include_httponly(); 356 cookie.reset( 357 CanonicalCookie::Create(url, "A=2; HttpOnly", creation_time, options)); 358 EXPECT_TRUE(cookie->IsHttpOnly()); 359 EXPECT_TRUE(cookie->IncludeForRequestURL(url, options)); 360 options.set_exclude_httponly(); 361 EXPECT_FALSE(cookie->IncludeForRequestURL(url, options)); 362 } 363 364 } // namespace net 365