// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Tests common functionality used by the Chrome Extensions Cookies API
// implementation.
#include "testing/gtest/include/gtest/gtest.h"
#include "base/values.h"
#include "chrome/browser/extensions/extension_cookies_api_constants.h"
#include "chrome/browser/extensions/extension_cookies_helpers.h"
#include "chrome/test/testing_profile.h"
#include "googleurl/src/gurl.h"
namespace keys = extension_cookies_api_constants;
namespace {
struct DomainMatchCase {
const char* filter;
const char* domain;
const bool matches;
};
// A test profile that supports linking with another profile for incognito support.
class OtrTestingProfile : public TestingProfile {
public:
OtrTestingProfile() : linked_profile_(NULL) {}
virtual Profile* GetOriginalProfile() {
if (IsOffTheRecord())
return linked_profile_;
else
return this;
}
virtual Profile* GetOffTheRecordProfile() {
if (IsOffTheRecord())
return this;
else
return linked_profile_;
}
virtual bool HasOffTheRecordProfile() {
return (!IsOffTheRecord() && linked_profile_);
}
static void LinkProfiles(OtrTestingProfile* profile1,
OtrTestingProfile* profile2) {
profile1->set_linked_profile(profile2);
profile2->set_linked_profile(profile1);
}
void set_linked_profile(OtrTestingProfile* profile) {
linked_profile_ = profile;
}
private:
OtrTestingProfile* linked_profile_;
};
} // namespace
class ExtensionCookiesTest : public testing::Test {
};
TEST_F(ExtensionCookiesTest, StoreIdProfileConversion) {
OtrTestingProfile profile, otrProfile;
otrProfile.set_incognito(true);
OtrTestingProfile::LinkProfiles(&profile, &otrProfile);
EXPECT_EQ(std::string("0"),
extension_cookies_helpers::GetStoreIdFromProfile(&profile));
EXPECT_EQ(&profile,
extension_cookies_helpers::ChooseProfileFromStoreId(
"0", &profile, true));
EXPECT_EQ(&profile,
extension_cookies_helpers::ChooseProfileFromStoreId(
"0", &profile, false));
EXPECT_EQ(&otrProfile,
extension_cookies_helpers::ChooseProfileFromStoreId(
"1", &profile, true));
EXPECT_EQ(NULL,
extension_cookies_helpers::ChooseProfileFromStoreId(
"1", &profile, false));
EXPECT_EQ(std::string("1"),
extension_cookies_helpers::GetStoreIdFromProfile(&otrProfile));
EXPECT_EQ(NULL,
extension_cookies_helpers::ChooseProfileFromStoreId(
"0", &otrProfile, true));
EXPECT_EQ(NULL,
extension_cookies_helpers::ChooseProfileFromStoreId(
"0", &otrProfile, false));
EXPECT_EQ(&otrProfile,
extension_cookies_helpers::ChooseProfileFromStoreId(
"1", &otrProfile, true));
EXPECT_EQ(&otrProfile,
extension_cookies_helpers::ChooseProfileFromStoreId(
"1", &otrProfile, false));
}
TEST_F(ExtensionCookiesTest, ExtensionTypeCreation) {
std::string string_value;
bool boolean_value;
double double_value;
Value* value;
net::CookieMonster::CanonicalCookie cookie1(
GURL(), "ABC", "DEF", "www.foobar.com", "/", base::Time(), base::Time(),
base::Time(), false, false, false);
scoped_ptr<DictionaryValue> cookie_value1(
extension_cookies_helpers::CreateCookieValue(
cookie1, "some cookie store"));
EXPECT_TRUE(cookie_value1->GetString(keys::kNameKey, &string_value));
EXPECT_EQ("ABC", string_value);
EXPECT_TRUE(cookie_value1->GetString(keys::kValueKey, &string_value));
EXPECT_EQ("DEF", string_value);
EXPECT_TRUE(cookie_value1->GetString(keys::kDomainKey, &string_value));
EXPECT_EQ("www.foobar.com", string_value);
EXPECT_TRUE(cookie_value1->GetBoolean(keys::kHostOnlyKey, &boolean_value));
EXPECT_TRUE(boolean_value);
EXPECT_TRUE(cookie_value1->GetString(keys::kPathKey, &string_value));
EXPECT_EQ("/", string_value);
EXPECT_TRUE(cookie_value1->GetBoolean(keys::kSecureKey, &boolean_value));
EXPECT_FALSE(boolean_value);
EXPECT_TRUE(cookie_value1->GetBoolean(keys::kHttpOnlyKey, &boolean_value));
EXPECT_FALSE(boolean_value);
EXPECT_TRUE(cookie_value1->GetBoolean(keys::kSessionKey, &boolean_value));
EXPECT_TRUE(boolean_value);
EXPECT_FALSE(
cookie_value1->GetDouble(keys::kExpirationDateKey, &double_value));
EXPECT_TRUE(cookie_value1->GetString(keys::kStoreIdKey, &string_value));
EXPECT_EQ("some cookie store", string_value);
net::CookieMonster::CanonicalCookie cookie2(
GURL(), "ABC", "DEF", ".foobar.com", "/",
base::Time(), base::Time::FromDoubleT(10000), base::Time(),
false, false, true);
scoped_ptr<DictionaryValue> cookie_value2(
extension_cookies_helpers::CreateCookieValue(
cookie2, "some cookie store"));
EXPECT_TRUE(cookie_value2->GetBoolean(keys::kHostOnlyKey, &boolean_value));
EXPECT_FALSE(boolean_value);
EXPECT_TRUE(cookie_value2->GetBoolean(keys::kSessionKey, &boolean_value));
EXPECT_FALSE(boolean_value);
EXPECT_TRUE(
cookie_value2->GetDouble(keys::kExpirationDateKey, &double_value));
EXPECT_EQ(10000, double_value);
TestingProfile profile;
ListValue* tab_ids = new ListValue();
scoped_ptr<DictionaryValue> cookie_store_value(
extension_cookies_helpers::CreateCookieStoreValue(&profile, tab_ids));
EXPECT_TRUE(cookie_store_value->GetString(keys::kIdKey, &string_value));
EXPECT_EQ("0", string_value);
EXPECT_TRUE(cookie_store_value->Get(keys::kTabIdsKey, &value));
EXPECT_EQ(tab_ids, value);
}
TEST_F(ExtensionCookiesTest, GetURLFromCanonicalCookie) {
net::CookieMonster::CanonicalCookie cookie1(
GURL(), "ABC", "DEF", "www.foobar.com", "/", base::Time(), base::Time(),
base::Time(), false, false, false);
EXPECT_EQ("http://www.foobar.com/",
extension_cookies_helpers::GetURLFromCanonicalCookie(
cookie1).spec());
net::CookieMonster::CanonicalCookie cookie2(
GURL(), "ABC", "DEF", ".helloworld.com", "/", base::Time(), base::Time(),
base::Time(), true, false, false);
EXPECT_EQ("https://helloworld.com/",
extension_cookies_helpers::GetURLFromCanonicalCookie(
cookie2).spec());
}
TEST_F(ExtensionCookiesTest, EmptyDictionary) {
scoped_ptr<DictionaryValue> details(new DictionaryValue());
extension_cookies_helpers::MatchFilter filter(details.get());
std::string domain;
net::CookieMonster::CanonicalCookie cookie;
EXPECT_TRUE(filter.MatchesCookie(cookie));
}
TEST_F(ExtensionCookiesTest, DomainMatching) {
const DomainMatchCase tests[] = {
{ "bar.com", "bar.com", true },
{ ".bar.com", "bar.com", true },
{ "bar.com", "foo.bar.com", true },
{ "bar.com", "bar.foo.com", false },
{ ".bar.com", ".foo.bar.com", true },
{ ".bar.com", "baz.foo.bar.com", true },
{ "foo.bar.com", ".bar.com", false }
};
scoped_ptr<DictionaryValue> details(new DictionaryValue());
for (size_t i = 0; i < arraysize(tests); ++i) {
details->SetString(keys::kDomainKey, std::string(tests[i].filter));
extension_cookies_helpers::MatchFilter filter(details.get());
net::CookieMonster::CanonicalCookie cookie(GURL(), "", "", tests[i].domain,
"", base::Time(), base::Time(),
base::Time(), false, false,
false);
EXPECT_EQ(tests[i].matches, filter.MatchesCookie(cookie));
}
}