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 // Tests common functionality used by the Chrome Extensions Cookies API
      6 // implementation.
      7 
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 #include "base/values.h"
     11 #include "chrome/browser/extensions/api/cookies/cookies_api_constants.h"
     12 #include "chrome/browser/extensions/api/cookies/cookies_helpers.h"
     13 #include "chrome/common/extensions/api/cookies.h"
     14 #include "chrome/test/base/testing_profile.h"
     15 #include "net/cookies/canonical_cookie.h"
     16 #include "net/cookies/cookie_constants.h"
     17 #include "url/gurl.h"
     18 
     19 using extensions::api::cookies::Cookie;
     20 using extensions::api::cookies::CookieStore;
     21 
     22 namespace GetAll = extensions::api::cookies::GetAll;
     23 
     24 namespace extensions {
     25 
     26 namespace keys = cookies_api_constants;
     27 
     28 namespace {
     29 
     30 struct DomainMatchCase {
     31   const char* filter;
     32   const char* domain;
     33   const bool matches;
     34 };
     35 
     36 }  // namespace
     37 
     38 class ExtensionCookiesTest : public testing::Test {
     39 };
     40 
     41 TEST_F(ExtensionCookiesTest, StoreIdProfileConversion) {
     42   TestingProfile::Builder profile_builder;
     43   TestingProfile::Builder otr_profile_builder;
     44   otr_profile_builder.SetIncognito();
     45   scoped_ptr<TestingProfile> profile = profile_builder.Build();
     46   scoped_ptr<TestingProfile> otr_profile = otr_profile_builder.Build();
     47   otr_profile->SetOriginalProfile(profile.get());
     48   profile->SetOffTheRecordProfile(otr_profile.PassAs<Profile>());
     49 
     50   EXPECT_EQ(std::string("0"),
     51             cookies_helpers::GetStoreIdFromProfile(profile.get()));
     52   EXPECT_EQ(profile.get(),
     53             cookies_helpers::ChooseProfileFromStoreId(
     54                 "0", profile.get(), true));
     55   EXPECT_EQ(profile.get(),
     56             cookies_helpers::ChooseProfileFromStoreId(
     57                 "0", profile.get(), false));
     58   EXPECT_EQ(profile->GetOffTheRecordProfile(),
     59             cookies_helpers::ChooseProfileFromStoreId(
     60                 "1", profile.get(), true));
     61   EXPECT_EQ(NULL,
     62             cookies_helpers::ChooseProfileFromStoreId(
     63                 "1", profile.get(), false));
     64 
     65   EXPECT_EQ(std::string("1"),
     66             cookies_helpers::GetStoreIdFromProfile(
     67                 profile->GetOffTheRecordProfile()));
     68   EXPECT_EQ(NULL,
     69             cookies_helpers::ChooseProfileFromStoreId(
     70                 "0", profile->GetOffTheRecordProfile(), true));
     71   EXPECT_EQ(NULL,
     72             cookies_helpers::ChooseProfileFromStoreId(
     73                 "0", profile->GetOffTheRecordProfile(), false));
     74   EXPECT_EQ(profile->GetOffTheRecordProfile(),
     75             cookies_helpers::ChooseProfileFromStoreId(
     76                 "1", profile->GetOffTheRecordProfile(), true));
     77   EXPECT_EQ(profile->GetOffTheRecordProfile(),
     78             cookies_helpers::ChooseProfileFromStoreId(
     79                 "1", profile->GetOffTheRecordProfile(), false));
     80 }
     81 
     82 TEST_F(ExtensionCookiesTest, ExtensionTypeCreation) {
     83   net::CanonicalCookie canonical_cookie1(
     84       GURL(), "ABC", "DEF", "www.foobar.com", "/",
     85       base::Time(), base::Time(), base::Time(),
     86       false, false, net::COOKIE_PRIORITY_DEFAULT);
     87   scoped_ptr<Cookie> cookie1(
     88       cookies_helpers::CreateCookie(
     89           canonical_cookie1, "some cookie store"));
     90   EXPECT_EQ("ABC", cookie1->name);
     91   EXPECT_EQ("DEF", cookie1->value);
     92   EXPECT_EQ("www.foobar.com", cookie1->domain);
     93   EXPECT_TRUE(cookie1->host_only);
     94   EXPECT_EQ("/", cookie1->path);
     95   EXPECT_FALSE(cookie1->secure);
     96   EXPECT_FALSE(cookie1->http_only);
     97   EXPECT_TRUE(cookie1->session);
     98   EXPECT_FALSE(cookie1->expiration_date.get());
     99   EXPECT_EQ("some cookie store", cookie1->store_id);
    100 
    101   net::CanonicalCookie canonical_cookie2(
    102       GURL(), "ABC", "DEF", ".foobar.com", "/",
    103       base::Time(), base::Time::FromDoubleT(10000), base::Time(),
    104       false, false, net::COOKIE_PRIORITY_DEFAULT);
    105   scoped_ptr<Cookie> cookie2(
    106       cookies_helpers::CreateCookie(
    107           canonical_cookie2, "some cookie store"));
    108   EXPECT_FALSE(cookie2->host_only);
    109   EXPECT_FALSE(cookie2->session);
    110   ASSERT_TRUE(cookie2->expiration_date.get());
    111   EXPECT_EQ(10000, *cookie2->expiration_date);
    112 
    113   TestingProfile profile;
    114   base::ListValue* tab_ids_list = new base::ListValue();
    115   std::vector<int> tab_ids;
    116   scoped_ptr<CookieStore> cookie_store(
    117       cookies_helpers::CreateCookieStore(&profile, tab_ids_list));
    118   EXPECT_EQ("0", cookie_store->id);
    119   EXPECT_EQ(tab_ids, cookie_store->tab_ids);
    120 }
    121 
    122 TEST_F(ExtensionCookiesTest, GetURLFromCanonicalCookie) {
    123   net::CanonicalCookie cookie1(
    124       GURL(), "ABC", "DEF", "www.foobar.com", "/", base::Time(), base::Time(),
    125       base::Time(), false, false, net::COOKIE_PRIORITY_DEFAULT);
    126   EXPECT_EQ("http://www.foobar.com/",
    127             cookies_helpers::GetURLFromCanonicalCookie(
    128                 cookie1).spec());
    129 
    130   net::CanonicalCookie cookie2(
    131       GURL(), "ABC", "DEF", ".helloworld.com", "/", base::Time(), base::Time(),
    132       base::Time(), true, false, net::COOKIE_PRIORITY_DEFAULT);
    133   EXPECT_EQ("https://helloworld.com/",
    134             cookies_helpers::GetURLFromCanonicalCookie(
    135                 cookie2).spec());
    136 }
    137 
    138 TEST_F(ExtensionCookiesTest, EmptyDictionary) {
    139   base::DictionaryValue dict;
    140   GetAll::Params::Details details;
    141   bool rv = GetAll::Params::Details::Populate(dict, &details);
    142   ASSERT_TRUE(rv);
    143   cookies_helpers::MatchFilter filter(&details);
    144   net::CanonicalCookie cookie;
    145   EXPECT_TRUE(filter.MatchesCookie(cookie));
    146 }
    147 
    148 TEST_F(ExtensionCookiesTest, DomainMatching) {
    149   const DomainMatchCase tests[] = {
    150     { "bar.com", "bar.com", true },
    151     { ".bar.com", "bar.com", true },
    152     { "bar.com", "foo.bar.com", true },
    153     { "bar.com", "bar.foo.com", false },
    154     { ".bar.com", ".foo.bar.com", true },
    155     { ".bar.com", "baz.foo.bar.com", true },
    156     { "foo.bar.com", ".bar.com", false }
    157   };
    158 
    159   for (size_t i = 0; i < arraysize(tests); ++i) {
    160     // Build up the Params struct.
    161     base::ListValue args;
    162     base::DictionaryValue* dict = new base::DictionaryValue();
    163     dict->SetString(keys::kDomainKey, std::string(tests[i].filter));
    164     args.Set(0, dict);
    165     scoped_ptr<GetAll::Params> params(GetAll::Params::Create(args));
    166 
    167     cookies_helpers::MatchFilter filter(&params->details);
    168     net::CanonicalCookie cookie(GURL(),
    169                                 std::string(),
    170                                 std::string(),
    171                                 tests[i].domain,
    172                                 std::string(),
    173                                 base::Time(),
    174                                 base::Time(),
    175                                 base::Time(),
    176                                 false,
    177                                 false,
    178                                 net::COOKIE_PRIORITY_DEFAULT);
    179     EXPECT_EQ(tests[i].matches, filter.MatchesCookie(cookie));
    180   }
    181 }
    182 
    183 TEST_F(ExtensionCookiesTest, DecodeUTF8WithErrorHandling) {
    184   net::CanonicalCookie canonical_cookie(GURL(),
    185                                         std::string(),
    186                                         "011Q255bNX_1!yd\203e+",
    187                                         "test.com",
    188                                         "/path\203",
    189                                         base::Time(),
    190                                         base::Time(),
    191                                         base::Time(),
    192                                         false,
    193                                         false,
    194                                         net::COOKIE_PRIORITY_DEFAULT);
    195   scoped_ptr<Cookie> cookie(
    196       cookies_helpers::CreateCookie(
    197           canonical_cookie, "some cookie store"));
    198   EXPECT_EQ(std::string("011Q255bNX_1!yd\xEF\xBF\xBD" "e+"), cookie->value);
    199   EXPECT_EQ(std::string(), cookie->path);
    200 }
    201 
    202 }  // namespace extensions
    203