Index: chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc |
diff --git a/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc b/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc |
index f6b2ea53e5d6256627f657fcf7a7f69dd12bb2c1..4b9acb904bf4ecde2d92ce75cd8b2d5962319f3f 100644 |
--- a/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc |
+++ b/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc |
@@ -50,30 +50,55 @@ class SQLitePersistentCookieStoreTest : public testing::Test { |
*cookies = cookies_; |
} |
+ void DestroyStore() { |
+ store_ = NULL; |
+ // Make sure we wait until the destructor has run by waiting for all pending |
+ // tasks on the DB thread to run. |
+ scoped_refptr<base::ThreadTestHelper> helper( |
+ new base::ThreadTestHelper( |
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); |
+ ASSERT_TRUE(helper->Run()); |
+ } |
+ |
+ void CreateAndLoad( |
+ bool restore_old_session_cookies, |
+ std::vector<net::CookieMonster::CanonicalCookie*>* cookies) { |
+ store_ = new SQLitePersistentCookieStore( |
+ temp_dir_.path().Append(chrome::kCookieFilename), |
+ restore_old_session_cookies); |
+ Load(cookies); |
+ } |
+ |
+ void InitializeStore(bool restore_old_session_cookies) { |
+ std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
+ CreateAndLoad(restore_old_session_cookies, &cookies); |
+ ASSERT_EQ(0u, cookies.size()); |
+ } |
+ |
// 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(); |
} |
+ // Adds a persistent cookie to store_. |
+ void AddCookie(const std::string& name, |
+ const std::string& value, |
+ const std::string& domain, |
+ const std::string& path, |
+ const base::Time& creation) { |
+ store_->AddCookie( |
+ net::CookieMonster::CanonicalCookie(GURL(), name, value, domain, path, |
+ std::string(), std::string(), |
+ creation, creation, creation, |
+ false, false, true, true)); |
+ } |
+ |
virtual void SetUp() { |
ui_thread_.Start(); |
db_thread_.Start(); |
io_thread_.Start(); |
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir_.path().Append(chrome::kCookieFilename), false); |
- std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
- Load(&cookies); |
- ASSERT_EQ(0u, cookies.size()); |
- // Make sure the store gets written at least once. |
- store_->AddCookie( |
- net::CookieMonster::CanonicalCookie(GURL(), "A", "B", "http://foo.bar", |
- "/", std::string(), std::string(), |
- base::Time::Now(), |
- base::Time::Now(), |
- base::Time::Now(), |
- false, false, true, true)); |
} |
protected: |
@@ -89,13 +114,11 @@ class SQLitePersistentCookieStoreTest : public testing::Test { |
}; |
TEST_F(SQLitePersistentCookieStoreTest, KeepOnDestruction) { |
+ InitializeStore(false); |
+ // Put some data - any data - on disk, to have something to keep. |
+ AddCookie("A", "B", "http://foo.bar", "/", base::Time::Now()); |
store_->SetClearLocalStateOnExit(false); |
- store_ = NULL; |
- // Make sure we wait until the destructor has run. |
- scoped_refptr<base::ThreadTestHelper> helper( |
- new base::ThreadTestHelper( |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); |
- ASSERT_TRUE(helper->Run()); |
+ DestroyStore(); |
ASSERT_TRUE(file_util::PathExists( |
temp_dir_.path().Append(chrome::kCookieFilename))); |
@@ -104,16 +127,11 @@ TEST_F(SQLitePersistentCookieStoreTest, KeepOnDestruction) { |
} |
TEST_F(SQLitePersistentCookieStoreTest, RemoveOnDestruction) { |
+ InitializeStore(false); |
+ // Put some data - any data - on disk, to have something to remove. |
+ AddCookie("A", "B", "http://foo.bar", "/", base::Time::Now()); |
store_->SetClearLocalStateOnExit(true); |
- // Replace the store effectively destroying the current one and forcing it |
- // to write it's data to disk. Then we can see if after loading it again it |
- // is still there. |
- store_ = NULL; |
- // Make sure we wait until the destructor has run. |
- scoped_refptr<base::ThreadTestHelper> helper( |
- new base::ThreadTestHelper( |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); |
- ASSERT_TRUE(helper->Run()); |
+ DestroyStore(); |
ASSERT_FALSE(file_util::PathExists( |
temp_dir_.path().Append(chrome::kCookieFilename))); |
@@ -121,21 +139,15 @@ TEST_F(SQLitePersistentCookieStoreTest, RemoveOnDestruction) { |
// Test if data is stored as expected in the SQLite database. |
TEST_F(SQLitePersistentCookieStoreTest, TestPersistance) { |
- std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
+ InitializeStore(false); |
+ AddCookie("A", "B", "http://foo.bar", "/", base::Time::Now()); |
// Replace the store effectively destroying the current one and forcing it |
// to write it's data to disk. Then we can see if after loading it again it |
// is still there. |
- 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), false); |
- |
+ DestroyStore(); |
// Reload and test for persistence |
- Load(&cookies); |
+ std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
+ CreateAndLoad(false, &cookies); |
ASSERT_EQ(1U, cookies.size()); |
ASSERT_STREQ("http://foo.bar", cookies[0]->Domain().c_str()); |
ASSERT_STREQ("A", cookies[0]->Name().c_str()); |
@@ -143,48 +155,28 @@ TEST_F(SQLitePersistentCookieStoreTest, TestPersistance) { |
// Now delete the cookie and check persistence again. |
store_->DeleteCookie(*cookies[0]); |
- store_ = NULL; |
- // Make sure we wait until the destructor has run. |
- ASSERT_TRUE(helper->Run()); |
+ DestroyStore(); |
STLDeleteContainerPointers(cookies.begin(), cookies.end()); |
cookies.clear(); |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir_.path().Append(chrome::kCookieFilename), false); |
// Reload and check if the cookie has been removed. |
- Load(&cookies); |
+ CreateAndLoad(false, &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, true)); |
+ InitializeStore(false); |
+ base::Time t = base::Time::Now(); |
+ AddCookie("A", "B", "http://foo.bar", "/", t); |
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, true)); |
+ AddCookie("A", "B", "www.aaa.com", "/", t); |
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, 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()); |
+ AddCookie("A", "B", "travel.aaa.com", "/", t); |
+ t += base::TimeDelta::FromInternalValue(10); |
+ AddCookie("A", "B", "www.bbb.com", "/", t); |
+ DestroyStore(); |
store_ = new SQLitePersistentCookieStore( |
temp_dir_.path().Append(chrome::kCookieFilename), false); |
@@ -236,6 +228,7 @@ TEST_F(SQLitePersistentCookieStoreTest, TestLoadCookiesForKey) { |
// Test that we can force the database to be written by calling Flush(). |
TEST_F(SQLitePersistentCookieStoreTest, TestFlush) { |
+ InitializeStore(false); |
// File timestamps don't work well on all platforms, so we'll determine |
// whether the DB file has been modified by checking its size. |
FilePath path = temp_dir_.path().Append(chrome::kCookieFilename); |
@@ -249,12 +242,7 @@ TEST_F(SQLitePersistentCookieStoreTest, TestFlush) { |
base::Time t = base::Time::Now() + base::TimeDelta::FromMicroseconds(c); |
std::string name(1, c); |
std::string value(1000, c); |
- store_->AddCookie( |
- net::CookieMonster::CanonicalCookie(GURL(), name, value, |
- "http://foo.bar", "/", |
- std::string(), std::string(), |
- t, t, t, |
- false, false, true, true)); |
+ AddCookie(name, value, "http://foo.bar", "/", t); |
} |
// Call Flush() and wait until the DB thread is idle. |
@@ -289,6 +277,10 @@ class CallbackCounter : public base::RefCountedThreadSafe<CallbackCounter> { |
// Test that we can get a completion callback after a Flush(). |
TEST_F(SQLitePersistentCookieStoreTest, TestFlushCompletionCallback) { |
+ InitializeStore(false); |
+ // Put some data - any data - on disk, so that Flush is not a no-op. |
+ AddCookie("A", "B", "http://foo.bar", "/", base::Time::Now()); |
+ |
scoped_refptr<CallbackCounter> counter(new CallbackCounter()); |
// Callback shouldn't be invoked until we call Flush(). |
@@ -306,16 +298,7 @@ TEST_F(SQLitePersistentCookieStoreTest, TestFlushCompletionCallback) { |
// Test loading old session cookies from the disk. |
TEST_F(SQLitePersistentCookieStoreTest, TestLoadOldSessionCookies) { |
- std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
- |
- // Use a separate cookie store for this test. |
- ScopedTempDir temp_dir; |
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), true); |
- // Make sure the database is initialized. |
- Load(&cookies); |
- ASSERT_EQ(0u, cookies.size()); |
+ InitializeStore(true); |
// Add a session cookie. |
store_->AddCookie( |
@@ -325,36 +308,25 @@ TEST_F(SQLitePersistentCookieStoreTest, TestLoadOldSessionCookies) { |
base::Time::Now(), false, false, true, false /*is_persistent*/)); |
// Force the store to write its data to the disk. |
- 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()); |
+ DestroyStore(); |
- // Create a store that loads session cookies. |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), true); |
+ // Create a store that loads session cookies and test that the session cookie |
+ // was loaded. |
+ std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
+ CreateAndLoad(true, &cookies); |
- // Reload and test that the session cookie was loaded. |
- Load(&cookies); |
ASSERT_EQ(1U, cookies.size()); |
ASSERT_STREQ("http://sessioncookie.com", cookies[0]->Domain().c_str()); |
ASSERT_STREQ("C", cookies[0]->Name().c_str()); |
ASSERT_STREQ("D", cookies[0]->Value().c_str()); |
+ |
+ STLDeleteContainerPointers(cookies.begin(), cookies.end()); |
+ cookies.clear(); |
} |
// Test loading old session cookies from the disk. |
TEST_F(SQLitePersistentCookieStoreTest, TestDontLoadOldSessionCookies) { |
- std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
- // Use a separate cookie store for this test. |
- ScopedTempDir temp_dir; |
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), true); |
- // Make sure the database is initialized. |
- Load(&cookies); |
- ASSERT_EQ(0u, cookies.size()); |
+ InitializeStore(true); |
// Add a session cookie. |
store_->AddCookie( |
@@ -364,48 +336,26 @@ TEST_F(SQLitePersistentCookieStoreTest, TestDontLoadOldSessionCookies) { |
base::Time::Now(), false, false, true, false /*is_persistent*/)); |
// Force the store to write its data to the disk. |
- 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()); |
- |
- // Create a store that doesn't load old session cookies. |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), false); |
+ DestroyStore(); |
- // Reload and test that the session cookie was not loaded. |
- Load(&cookies); |
+ // Create a store that doesn't load old session cookies and test that the |
+ // session cookie was not loaded. |
+ std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
+ CreateAndLoad(false, &cookies); |
ASSERT_EQ(0U, cookies.size()); |
// The store should also delete the session cookie. Wait until that has been |
// done. |
- store_ = NULL; |
- helper = new base::ThreadTestHelper( |
- BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)); |
- ASSERT_TRUE(helper->Run()); |
- |
- // Create a store that loads old session cookies. |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), true); |
+ DestroyStore(); |
- // Reload and test that the session cookie is gone. |
- Load(&cookies); |
+ // Create a store that loads old session cookies and test that the session |
+ // cookie is gone. |
+ CreateAndLoad(true, &cookies); |
ASSERT_EQ(0U, cookies.size()); |
} |
TEST_F(SQLitePersistentCookieStoreTest, PersistHasExpiresAndIsPersistent) { |
- std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
- |
- // Use a separate cookie store for this test. |
- ScopedTempDir temp_dir; |
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), true); |
- // Make sure the database is initialized. |
- Load(&cookies); |
- ASSERT_EQ(0u, cookies.size()); |
+ InitializeStore(true); |
// Add a session cookie with has_expires = false, and another session cookie |
// with has_expires = true. |
@@ -433,20 +383,12 @@ TEST_F(SQLitePersistentCookieStoreTest, PersistHasExpiresAndIsPersistent) { |
true /* is_persistent */)); |
// Force the store to write its data to the disk. |
- 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()); |
+ DestroyStore(); |
- // Create a store that loads session cookies. |
- store_ = new SQLitePersistentCookieStore( |
- temp_dir.path().Append(chrome::kCookieFilename), true); |
- |
- // Reload and test that the the DoesExpire and IsPersistent attributes are |
- // restored. |
- Load(&cookies); |
+ // Create a store that loads session cookies and test that the the DoesExpire |
+ // and IsPersistent attributes are restored. |
+ std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
+ CreateAndLoad(true, &cookies); |
ASSERT_EQ(3U, cookies.size()); |
std::map<std::string, net::CookieMonster::CanonicalCookie*> cookie_map; |
@@ -462,4 +404,7 @@ TEST_F(SQLitePersistentCookieStoreTest, PersistHasExpiresAndIsPersistent) { |
EXPECT_TRUE(cookie_map["persistent"]->DoesExpire()); |
EXPECT_TRUE(cookie_map["persistent"]->IsPersistent()); |
+ |
+ STLDeleteContainerPointers(cookies.begin(), cookies.end()); |
+ cookies.clear(); |
} |