Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(645)

Side by Side Diff: chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc

Issue 7864008: Split initial load of cookies by domains (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/scoped_temp_dir.h" 9 #include "base/scoped_temp_dir.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "base/test/thread_test_helper.h" 12 #include "base/test/thread_test_helper.h"
13 #include "base/time.h" 13 #include "base/time.h"
14 #include "chrome/browser/net/sqlite_persistent_cookie_store.h" 14 #include "chrome/browser/net/sqlite_persistent_cookie_store.h"
15 #include "chrome/common/chrome_constants.h" 15 #include "chrome/common/chrome_constants.h"
16 #include "content/browser/browser_thread.h" 16 #include "content/browser/browser_thread.h"
17 #include "googleurl/src/gurl.h" 17 #include "googleurl/src/gurl.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 #include "testing/platform_test.h"
erikwright (departed) 2011/10/06 17:16:47 platform_test is probably not required anymore?
guohui 2011/10/06 18:34:54 Done.
19 20
20 class SQLitePersistentCookieStoreTest : public testing::Test { 21 class SQLitePersistentCookieStoreTest : public testing::Test {
21 public: 22 public:
22 SQLitePersistentCookieStoreTest() 23 SQLitePersistentCookieStoreTest()
23 : ui_thread_(BrowserThread::UI), 24 : ui_thread_(BrowserThread::UI),
24 db_thread_(BrowserThread::DB), 25 db_thread_(BrowserThread::DB),
25 io_thread_(BrowserThread::IO), 26 io_thread_(BrowserThread::IO),
26 event_(false, false) { 27 event_(false, false),
erikwright (departed) 2011/10/06 17:16:47 Remame these to "loaded_event_", "key_loaded_event
guohui 2011/10/06 18:34:54 Done.
28 event_key_(false, false),
29 event_db_(true, false) {
27 } 30 }
28 31
29 protected:
30 void OnLoaded( 32 void OnLoaded(
31 const std::vector<net::CookieMonster::CanonicalCookie*>& cookies) { 33 const std::vector<net::CookieMonster::CanonicalCookie*>& cookies) {
32 cookies_ = cookies; 34 cookies_ = cookies;
33 event_.Signal(); 35 event_.Signal();
34 } 36 }
35 37
36 bool Load(std::vector<net::CookieMonster::CanonicalCookie*>* cookies) { 38 void OnKeyLoaded(
37 bool result = 39 const std::vector<net::CookieMonster::CanonicalCookie*>& cookies) {
38 store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded, 40 cookies_ = cookies;
41 event_key_.Signal();
42 }
43
44 void Load(std::vector<net::CookieMonster::CanonicalCookie*>* cookies) {
45 store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
39 base::Unretained(this))); 46 base::Unretained(this)));
40 event_.Wait(); 47 event_.Wait();
41 *cookies = cookies_; 48 *cookies = cookies_;
42 return result; 49 }
50
51 void Wait() {
erikwright (departed) 2011/10/06 17:16:47 For clarity of who is waiting on/signaling what, e
guohui 2011/10/06 18:34:54 Done.
52 event_db_.Wait();
43 } 53 }
44 54
45 virtual void SetUp() { 55 virtual void SetUp() {
46 ui_thread_.Start(); 56 ui_thread_.Start();
47 db_thread_.Start(); 57 db_thread_.Start();
48 io_thread_.Start(); 58 io_thread_.Start();
49 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 59 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
50 store_ = new SQLitePersistentCookieStore( 60 store_ = new SQLitePersistentCookieStore(
51 temp_dir_.path().Append(chrome::kCookieFilename)); 61 temp_dir_.path().Append(chrome::kCookieFilename));
52 std::vector<net::CookieMonster::CanonicalCookie*> cookies; 62 std::vector<net::CookieMonster::CanonicalCookie*> cookies;
53 ASSERT_TRUE(Load(&cookies)); 63 Load(&cookies);
54 ASSERT_EQ(0u, cookies.size()); 64 ASSERT_EQ(0u, cookies.size());
55 // Make sure the store gets written at least once. 65 // Make sure the store gets written at least once.
56 store_->AddCookie( 66 store_->AddCookie(
57 net::CookieMonster::CanonicalCookie(GURL(), "A", "B", "http://foo.bar", 67 net::CookieMonster::CanonicalCookie(GURL(), "A", "B", "http://foo.bar",
58 "/", std::string(), std::string(), 68 "/", std::string(), std::string(),
59 base::Time::Now(), 69 base::Time::Now(),
60 base::Time::Now(), 70 base::Time::Now(),
61 base::Time::Now(), 71 base::Time::Now(),
62 false, false, true)); 72 false, false, true));
63 } 73 }
64 74
75 protected:
65 BrowserThread ui_thread_; 76 BrowserThread ui_thread_;
66 BrowserThread db_thread_; 77 BrowserThread db_thread_;
67 BrowserThread io_thread_; 78 BrowserThread io_thread_;
68 base::WaitableEvent event_; 79 base::WaitableEvent event_;
80 base::WaitableEvent event_key_;
81 base::WaitableEvent event_db_;
69 std::vector<net::CookieMonster::CanonicalCookie*> cookies_; 82 std::vector<net::CookieMonster::CanonicalCookie*> cookies_;
70 ScopedTempDir temp_dir_; 83 ScopedTempDir temp_dir_;
71 scoped_refptr<SQLitePersistentCookieStore> store_; 84 scoped_refptr<SQLitePersistentCookieStore> store_;
72 }; 85 };
73 86
74 TEST_F(SQLitePersistentCookieStoreTest, KeepOnDestruction) { 87 TEST_F(SQLitePersistentCookieStoreTest, KeepOnDestruction) {
75 store_->SetClearLocalStateOnExit(false); 88 store_->SetClearLocalStateOnExit(false);
76 store_ = NULL; 89 store_ = NULL;
77 // Make sure we wait until the destructor has run. 90 // Make sure we wait until the destructor has run.
78 scoped_refptr<base::ThreadTestHelper> helper( 91 scoped_refptr<base::ThreadTestHelper> helper(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 store_ = NULL; 124 store_ = NULL;
112 scoped_refptr<base::ThreadTestHelper> helper( 125 scoped_refptr<base::ThreadTestHelper> helper(
113 new base::ThreadTestHelper( 126 new base::ThreadTestHelper(
114 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); 127 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
115 // Make sure we wait until the destructor has run. 128 // Make sure we wait until the destructor has run.
116 ASSERT_TRUE(helper->Run()); 129 ASSERT_TRUE(helper->Run());
117 store_ = new SQLitePersistentCookieStore( 130 store_ = new SQLitePersistentCookieStore(
118 temp_dir_.path().Append(chrome::kCookieFilename)); 131 temp_dir_.path().Append(chrome::kCookieFilename));
119 132
120 // Reload and test for persistence 133 // Reload and test for persistence
121 ASSERT_TRUE(Load(&cookies)); 134 Load(&cookies);
122 ASSERT_EQ(1U, cookies.size()); 135 ASSERT_EQ(1U, cookies.size());
123 ASSERT_STREQ("http://foo.bar", cookies[0]->Domain().c_str()); 136 ASSERT_STREQ("http://foo.bar", cookies[0]->Domain().c_str());
124 ASSERT_STREQ("A", cookies[0]->Name().c_str()); 137 ASSERT_STREQ("A", cookies[0]->Name().c_str());
125 ASSERT_STREQ("B", cookies[0]->Value().c_str()); 138 ASSERT_STREQ("B", cookies[0]->Value().c_str());
126 139
127 // Now delete the cookie and check persistence again. 140 // Now delete the cookie and check persistence again.
128 store_->DeleteCookie(*cookies[0]); 141 store_->DeleteCookie(*cookies[0]);
129 store_ = NULL; 142 store_ = NULL;
130 // Make sure we wait until the destructor has run. 143 // Make sure we wait until the destructor has run.
131 ASSERT_TRUE(helper->Run()); 144 ASSERT_TRUE(helper->Run());
132 STLDeleteContainerPointers(cookies.begin(), cookies.end()); 145 STLDeleteContainerPointers(cookies.begin(), cookies.end());
133 cookies.clear(); 146 cookies.clear();
134 store_ = new SQLitePersistentCookieStore( 147 store_ = new SQLitePersistentCookieStore(
135 temp_dir_.path().Append(chrome::kCookieFilename)); 148 temp_dir_.path().Append(chrome::kCookieFilename));
136 149
137 // Reload and check if the cookie has been removed. 150 // Reload and check if the cookie has been removed.
138 ASSERT_TRUE(Load(&cookies)); 151 Load(&cookies);
139 ASSERT_EQ(0U, cookies.size()); 152 ASSERT_EQ(0U, cookies.size());
140 } 153 }
141 154
155 // Test that priority load of cookies for a specfic domain key could be
156 // completed before the entire store is loaded
157 TEST_F(SQLitePersistentCookieStoreTest, TestLoadCookiesForKey) {
158 std::vector<net::CookieMonster::CanonicalCookie*> cookies;
159 base::Time t = base::Time::Now() + base::TimeDelta::FromInternalValue(10);
160 // A foo.bar cookie was already added in setup.
161 store_->AddCookie(
162 net::CookieMonster::CanonicalCookie(GURL(), "A", "B",
163 "www.aaa.com", "/",
164 std::string(), std::string(),
165 t, t, t, false, false, true));
166 t += base::TimeDelta::FromInternalValue(10);
167 store_->AddCookie(
168 net::CookieMonster::CanonicalCookie(GURL(), "A", "B",
169 "www.bbb.com", "/",
170 std::string(), std::string(),
171 t, t, t, false, false, true));
172 store_ = NULL;
173
174 scoped_refptr<base::ThreadTestHelper> helper(
175 new base::ThreadTestHelper(
176 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
177 // Make sure we wait until the destructor has run.
178 ASSERT_TRUE(helper->Run());
179
180 // The store is expected to have three cookies, each with a distinct eTLD+1.
181 store_ = new SQLitePersistentCookieStore(
182 temp_dir_.path().Append(chrome::kCookieFilename));
183 // The event db_thread_ makes sure that the DB thread waits until both Load
erikwright (departed) 2011/10/06 17:16:47 "The event db_thread_ ..." => "Posting a blocking
guohui 2011/10/06 18:34:54 Done.
184 // and LoadCookiesForKey have been posted to its task queue.
185 db_thread_.PostTask(BrowserThread::DB, FROM_HERE,
186 base::Bind(&SQLitePersistentCookieStoreTest::Wait, base::Unretained(this)));
187 store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
188 base::Unretained(this)));
189 store_->LoadCookiesForKey("aaa.com",
190 base::Bind(&SQLitePersistentCookieStoreTest::OnKeyLoaded,
191 base::Unretained(this)));
192 db_thread_.PostTask(BrowserThread::DB, FROM_HERE,
193 base::Bind(&SQLitePersistentCookieStoreTest::Wait, base::Unretained(this)));
194
195 event_db_.Signal();
erikwright (departed) 2011/10/06 17:16:47 In the sample code I provided, there were some com
guohui 2011/10/06 18:34:54 Done.
196 event_key_.Wait();
197 ASSERT_EQ(event_.IsSignaled(), false);
198 std::set<std::string> cookies_loaded;
199 for (std::vector<net::CookieMonster::CanonicalCookie*>::iterator
200 it = cookies_.begin(); it != cookies_.end(); ++it)
201 cookies_loaded.insert((*it)->Domain().c_str());
202 ASSERT_EQ(cookies_loaded.find("www.aaa.com") != cookies_loaded.end(), true);
203
erikwright (departed) 2011/10/06 17:16:47 Can you also assert that cookies_loaded.size() is
guohui 2011/10/06 18:34:54 Done.
204 event_db_.Signal();
205 event_.Wait();
206 for (std::vector<net::CookieMonster::CanonicalCookie*>::iterator
207 it = cookies_.begin(); it != cookies_.end(); ++it)
208 cookies_loaded.insert((*it)->Domain().c_str());
209 ASSERT_EQ(3U, cookies_loaded.size());
210 ASSERT_EQ(cookies_loaded.find("http://foo.bar") != cookies_loaded.end(),
211 true);
212 ASSERT_EQ(cookies_loaded.find("www.bbb.com") != cookies_loaded.end(), true);
213 }
214
142 // Test that we can force the database to be written by calling Flush(). 215 // Test that we can force the database to be written by calling Flush().
143 TEST_F(SQLitePersistentCookieStoreTest, TestFlush) { 216 TEST_F(SQLitePersistentCookieStoreTest, TestFlush) {
144 // File timestamps don't work well on all platforms, so we'll determine 217 // File timestamps don't work well on all platforms, so we'll determine
145 // whether the DB file has been modified by checking its size. 218 // whether the DB file has been modified by checking its size.
146 FilePath path = temp_dir_.path().Append(chrome::kCookieFilename); 219 FilePath path = temp_dir_.path().Append(chrome::kCookieFilename);
147 base::PlatformFileInfo info; 220 base::PlatformFileInfo info;
148 ASSERT_TRUE(file_util::GetFileInfo(path, &info)); 221 ASSERT_TRUE(file_util::GetFileInfo(path, &info));
149 int64 base_size = info.size; 222 int64 base_size = info.size;
150 223
151 // Write some large cookies, so the DB will have to expand by several KB. 224 // Write some large cookies, so the DB will have to expand by several KB.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 274
202 store_->Flush(NewRunnableMethod(counter.get(), &CallbackCounter::Callback)); 275 store_->Flush(NewRunnableMethod(counter.get(), &CallbackCounter::Callback));
203 276
204 scoped_refptr<base::ThreadTestHelper> helper( 277 scoped_refptr<base::ThreadTestHelper> helper(
205 new base::ThreadTestHelper( 278 new base::ThreadTestHelper(
206 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); 279 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
207 ASSERT_TRUE(helper->Run()); 280 ASSERT_TRUE(helper->Run());
208 281
209 ASSERT_EQ(1, counter->callback_count()); 282 ASSERT_EQ(1, counter->callback_count());
210 } 283 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698