summaryrefslogtreecommitdiffstats
path: root/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
diff options
context:
space:
mode:
authorguohui@google.com <guohui@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-17 17:35:04 +0000
committerguohui@google.com <guohui@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-17 17:35:04 +0000
commit8562034e402a7a8e778896f817d1fdcfb3d934c9 (patch)
tree7e209a3b76da5d81981363b39e2867edbf84b54c /chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
parentf5796891ec99f4977eb1761166a33a6b22f459fd (diff)
downloadchromium_src-8562034e402a7a8e778896f817d1fdcfb3d934c9.zip
chromium_src-8562034e402a7a8e778896f817d1fdcfb3d934c9.tar.gz
chromium_src-8562034e402a7a8e778896f817d1fdcfb3d934c9.tar.bz2
The change list splits loading of cookies from DB by the domain key(eTLD+1).
BUG=52909 TEST=NONE TBR=rdsmith@chromium.org Review URL: http://codereview.chromium.org/8318006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105836 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc')
-rw-r--r--chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc114
1 files changed, 102 insertions, 12 deletions
diff --git a/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc b/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
index 942ca83..55b22d7 100644
--- a/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
+++ b/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
@@ -23,23 +23,34 @@ class SQLitePersistentCookieStoreTest : public testing::Test {
: ui_thread_(BrowserThread::UI),
db_thread_(BrowserThread::DB),
io_thread_(BrowserThread::IO),
- event_(false, false) {
+ loaded_event_(false, false),
+ key_loaded_event_(false, false),
+ db_thread_event_(false, false) {
}
- protected:
void OnLoaded(
const std::vector<net::CookieMonster::CanonicalCookie*>& cookies) {
cookies_ = cookies;
- event_.Signal();
+ loaded_event_.Signal();
+ }
+
+ void OnKeyLoaded(
+ const std::vector<net::CookieMonster::CanonicalCookie*>& cookies) {
+ cookies_ = cookies;
+ key_loaded_event_.Signal();
}
- bool Load(std::vector<net::CookieMonster::CanonicalCookie*>* cookies) {
- bool result =
- store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
+ void Load(std::vector<net::CookieMonster::CanonicalCookie*>* cookies) {
+ store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
base::Unretained(this)));
- event_.Wait();
+ loaded_event_.Wait();
*cookies = cookies_;
- return result;
+ }
+
+ // We have to create this method to wrap WaitableEvent::Wait, since we cannot
+ // bind a non-void returning method as a Closure.
+ void WaitOnDBEvent() {
+ db_thread_event_.Wait();
}
virtual void SetUp() {
@@ -50,7 +61,7 @@ class SQLitePersistentCookieStoreTest : public testing::Test {
store_ = new SQLitePersistentCookieStore(
temp_dir_.path().Append(chrome::kCookieFilename));
std::vector<net::CookieMonster::CanonicalCookie*> cookies;
- ASSERT_TRUE(Load(&cookies));
+ Load(&cookies);
ASSERT_EQ(0u, cookies.size());
// Make sure the store gets written at least once.
store_->AddCookie(
@@ -62,10 +73,13 @@ class SQLitePersistentCookieStoreTest : public testing::Test {
false, false, true));
}
+ protected:
BrowserThread ui_thread_;
BrowserThread db_thread_;
BrowserThread io_thread_;
- base::WaitableEvent event_;
+ base::WaitableEvent loaded_event_;
+ base::WaitableEvent key_loaded_event_;
+ base::WaitableEvent db_thread_event_;
std::vector<net::CookieMonster::CanonicalCookie*> cookies_;
ScopedTempDir temp_dir_;
scoped_refptr<SQLitePersistentCookieStore> store_;
@@ -118,7 +132,7 @@ TEST_F(SQLitePersistentCookieStoreTest, TestPersistance) {
temp_dir_.path().Append(chrome::kCookieFilename));
// Reload and test for persistence
- ASSERT_TRUE(Load(&cookies));
+ Load(&cookies);
ASSERT_EQ(1U, cookies.size());
ASSERT_STREQ("http://foo.bar", cookies[0]->Domain().c_str());
ASSERT_STREQ("A", cookies[0]->Name().c_str());
@@ -135,10 +149,86 @@ TEST_F(SQLitePersistentCookieStoreTest, TestPersistance) {
temp_dir_.path().Append(chrome::kCookieFilename));
// Reload and check if the cookie has been removed.
- ASSERT_TRUE(Load(&cookies));
+ Load(&cookies);
ASSERT_EQ(0U, cookies.size());
}
+// Test that priority load of cookies for a specfic domain key could be
+// completed before the entire store is loaded
+TEST_F(SQLitePersistentCookieStoreTest, TestLoadCookiesForKey) {
+ base::Time t = base::Time::Now() + base::TimeDelta::FromInternalValue(10);
+ // A foo.bar cookie was already added in setup.
+ store_->AddCookie(
+ net::CookieMonster::CanonicalCookie(GURL(), "A", "B",
+ "www.aaa.com", "/",
+ std::string(), std::string(),
+ t, t, t, false, false, true));
+ t += base::TimeDelta::FromInternalValue(10);
+ store_->AddCookie(
+ net::CookieMonster::CanonicalCookie(GURL(), "A", "B",
+ "travel.aaa.com", "/",
+ std::string(), std::string(),
+ t, t, t, false, false, true));
+ t += base::TimeDelta::FromInternalValue(10);
+ store_->AddCookie(
+ net::CookieMonster::CanonicalCookie(GURL(), "A", "B",
+ "www.bbb.com", "/",
+ std::string(), std::string(),
+ t, t, t, false, false, true));
+ store_ = NULL;
+
+ scoped_refptr<base::ThreadTestHelper> helper(
+ new base::ThreadTestHelper(
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
+ // Make sure we wait until the destructor has run.
+ ASSERT_TRUE(helper->Run());
+
+ store_ = new SQLitePersistentCookieStore(
+ temp_dir_.path().Append(chrome::kCookieFilename));
+ // Posting a blocking task to db_thread_ makes sure that the DB thread waits
+ // until both Load and LoadCookiesForKey have been posted to its task queue.
+ db_thread_.PostTask(BrowserThread::DB, FROM_HERE,
+ base::Bind(&SQLitePersistentCookieStoreTest::WaitOnDBEvent,
+ base::Unretained(this)));
+ store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
+ base::Unretained(this)));
+ store_->LoadCookiesForKey("aaa.com",
+ base::Bind(&SQLitePersistentCookieStoreTest::OnKeyLoaded,
+ base::Unretained(this)));
+ db_thread_.PostTask(BrowserThread::DB, FROM_HERE,
+ base::Bind(&SQLitePersistentCookieStoreTest::WaitOnDBEvent,
+ base::Unretained(this)));
+
+ // Now the DB-thread queue contains:
+ // (active:)
+ // 1. Wait (on db_event)
+ // (pending:)
+ // 2. "Init And Chain-Load First Domain"
+ // 3. Priority Load (aaa.com)
+ // 4. Wait (on db_event)
+ db_thread_event_.Signal();
+ key_loaded_event_.Wait();
+ ASSERT_EQ(loaded_event_.IsSignaled(), false);
+ std::set<std::string> cookies_loaded;
+ for (std::vector<net::CookieMonster::CanonicalCookie*>::iterator
+ it = cookies_.begin(); it != cookies_.end(); ++it)
+ cookies_loaded.insert((*it)->Domain().c_str());
+ ASSERT_GT(4U, cookies_loaded.size());
+ ASSERT_EQ(cookies_loaded.find("www.aaa.com") != cookies_loaded.end(), true);
+ ASSERT_EQ(cookies_loaded.find("travel.aaa.com") != cookies_loaded.end(),
+ true);
+
+ db_thread_event_.Signal();
+ loaded_event_.Wait();
+ for (std::vector<net::CookieMonster::CanonicalCookie*>::iterator
+ it = cookies_.begin(); it != cookies_.end(); ++it)
+ cookies_loaded.insert((*it)->Domain().c_str());
+ ASSERT_EQ(4U, cookies_loaded.size());
+ ASSERT_EQ(cookies_loaded.find("http://foo.bar") != cookies_loaded.end(),
+ true);
+ ASSERT_EQ(cookies_loaded.find("www.bbb.com") != cookies_loaded.end(), true);
+}
+
// Test that we can force the database to be written by calling Flush().
TEST_F(SQLitePersistentCookieStoreTest, TestFlush) {
// File timestamps don't work well on all platforms, so we'll determine