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 "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