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

Side by Side Diff: webkit/quota/quota_database_unittest.cc

Issue 7168019: Implement QM::GetOriginsModifiedSince for browser data deleter support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update Created 9 years, 6 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 <algorithm> 5 #include <algorithm>
6 #include <iterator> 6 #include <iterator>
7 #include <set> 7 #include <set>
8 8
9 #include "app/sql/connection.h" 9 #include "app/sql/connection.h"
10 #include "app/sql/statement.h" 10 #include "app/sql/statement.h"
(...skipping 20 matching lines...) Expand all
31 } 31 }
32 }; 32 };
33 } // namespace 33 } // namespace
34 34
35 namespace quota { 35 namespace quota {
36 36
37 class QuotaDatabaseTest : public testing::Test { 37 class QuotaDatabaseTest : public testing::Test {
38 protected: 38 protected:
39 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; 39 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry;
40 typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback; 40 typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback;
41 typedef QuotaDatabase::LastAccessTimeTableEntry LastAccessTimeTableEntry; 41 typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry;
42 typedef QuotaDatabase::LastAccessTimeTableCallback 42 typedef QuotaDatabase::OriginInfoTableCallback
43 LastAccessTimeTableCallback; 43 OriginInfoTableCallback;
44 44
45 template <typename Iterator> 45 template <typename Iterator>
46 bool AssignQuotaTable( 46 bool AssignQuotaTable(
47 QuotaDatabase* quota_database, Iterator itr, Iterator end) { 47 QuotaDatabase* quota_database, Iterator itr, Iterator end) {
48 if (!quota_database->LazyOpen(true)) 48 if (!quota_database->LazyOpen(true))
49 return false; 49 return false;
50 50
51 for (; itr != end; ++itr) { 51 for (; itr != end; ++itr) {
52 const char* kSql = 52 const char* kSql =
53 "INSERT INTO HostQuotaTable" 53 "INSERT INTO HostQuotaTable"
(...skipping 10 matching lines...) Expand all
64 statement.BindInt64(2, itr->quota); 64 statement.BindInt64(2, itr->quota);
65 if (!statement.Run()) 65 if (!statement.Run())
66 return false; 66 return false;
67 } 67 }
68 68
69 quota_database->Commit(); 69 quota_database->Commit();
70 return true; 70 return true;
71 } 71 }
72 72
73 template <typename Iterator> 73 template <typename Iterator>
74 bool AssignLastAccessTimeTable( 74 bool AssignOriginInfoTable(
75 QuotaDatabase* quota_database, Iterator itr, Iterator end) { 75 QuotaDatabase* quota_database, Iterator itr, Iterator end) {
76 if (!quota_database->LazyOpen(true)) 76 if (!quota_database->LazyOpen(true))
77 return false; 77 return false;
78 78
79 for (; itr != end; ++itr) { 79 for (; itr != end; ++itr) {
80 const char* kSql = 80 const char* kSql =
81 "INSERT INTO OriginLastAccessTable" 81 "INSERT INTO OriginInfoTable"
82 " (origin, type, used_count, last_access_time)" 82 " (origin, type, used_count, last_access_time, last_modified_time)"
83 " VALUES (?, ?, ?, ?)"; 83 " VALUES (?, ?, ?, ?, ?)";
84 sql::Statement statement; 84 sql::Statement statement;
85 statement.Assign( 85 statement.Assign(
86 quota_database->db_->GetCachedStatement( 86 quota_database->db_->GetCachedStatement(
87 SQL_FROM_HERE, kSql)); 87 SQL_FROM_HERE, kSql));
88 EXPECT_TRUE(statement.is_valid()); 88 EXPECT_TRUE(statement.is_valid());
89 89
90 statement.BindString(0, itr->origin.spec()); 90 statement.BindString(0, itr->origin.spec());
91 statement.BindInt(1, static_cast<int>(itr->type)); 91 statement.BindInt(1, static_cast<int>(itr->type));
92 statement.BindInt(2, itr->used_count); 92 statement.BindInt(2, itr->used_count);
93 statement.BindInt64(3, itr->last_access_time.ToInternalValue()); 93 statement.BindInt64(3, itr->last_access_time.ToInternalValue());
94 statement.BindInt64(4, itr->last_modified_time.ToInternalValue());
94 if (!statement.Run()) 95 if (!statement.Run())
95 return false; 96 return false;
96 } 97 }
97 98
98 quota_database->Commit(); 99 quota_database->Commit();
99 return true; 100 return true;
100 } 101 }
101 102
102 void LazyOpen(const FilePath& kDbFile) { 103 void LazyOpen(const FilePath& kDbFile) {
103 QuotaDatabase db(kDbFile); 104 QuotaDatabase db(kDbFile);
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 217
217 exceptions.insert(kOrigin3); 218 exceptions.insert(kOrigin3);
218 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, 219 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
219 NULL, &origin)); 220 NULL, &origin));
220 EXPECT_TRUE(origin.is_empty()); 221 EXPECT_TRUE(origin.is_empty());
221 222
222 EXPECT_TRUE(db.SetOriginLastAccessTime( 223 EXPECT_TRUE(db.SetOriginLastAccessTime(
223 kOrigin1, kStorageTypeTemporary, base::Time::Now())); 224 kOrigin1, kStorageTypeTemporary, base::Time::Now()));
224 225
225 // Delete origin/type last access time information. 226 // Delete origin/type last access time information.
226 EXPECT_TRUE(db.DeleteOriginLastAccessTime(kOrigin3, kStorageTypeTemporary)); 227 EXPECT_TRUE(db.DeleteOriginInfo(kOrigin3, kStorageTypeTemporary));
227 228
228 // Querying again to see if the deletion has worked. 229 // Querying again to see if the deletion has worked.
229 exceptions.clear(); 230 exceptions.clear();
230 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, 231 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
231 NULL, &origin)); 232 NULL, &origin));
232 EXPECT_EQ(kOrigin2.spec(), origin.spec()); 233 EXPECT_EQ(kOrigin2.spec(), origin.spec());
233 234
234 exceptions.insert(kOrigin1); 235 exceptions.insert(kOrigin1);
235 exceptions.insert(kOrigin2); 236 exceptions.insert(kOrigin2);
236 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, 237 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
237 NULL, &origin)); 238 NULL, &origin));
238 EXPECT_TRUE(origin.is_empty()); 239 EXPECT_TRUE(origin.is_empty());
239 } 240 }
240 241
241 void RegisterOrigins(const FilePath& kDbFile) { 242 void OriginLastModifiedSince(const FilePath& kDbFile) {
243 QuotaDatabase db(kDbFile);
244 ASSERT_TRUE(db.LazyOpen(true));
245
246 std::set<GURL> origins;
247 EXPECT_TRUE(db.GetOriginsModifiedSince(
248 kStorageTypeTemporary, &origins, base::Time()));
249 EXPECT_TRUE(origins.empty());
250
251 const GURL kOrigin1("http://a/");
252 const GURL kOrigin2("http://b/");
253 const GURL kOrigin3("http://c/");
254
255 // Report last mod time for the test origins.
256 EXPECT_TRUE(db.SetOriginLastModifiedTime(
257 kOrigin1, kStorageTypeTemporary, base::Time::FromInternalValue(10)));
258 EXPECT_TRUE(db.SetOriginLastModifiedTime(
259 kOrigin2, kStorageTypeTemporary, base::Time::FromInternalValue(20)));
260 EXPECT_TRUE(db.SetOriginLastModifiedTime(
261 kOrigin3, kStorageTypeTemporary, base::Time::FromInternalValue(30)));
262
263 EXPECT_TRUE(db.GetOriginsModifiedSince(
264 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(15)));
265 EXPECT_EQ(2U, origins.size());
266 EXPECT_EQ(0U, origins.count(kOrigin1));
267 EXPECT_EQ(1U, origins.count(kOrigin2));
268 EXPECT_EQ(1U, origins.count(kOrigin3));
269
270 EXPECT_TRUE(db.GetOriginsModifiedSince(
271 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(25)));
272 EXPECT_EQ(1U, origins.size());
273 EXPECT_EQ(0U, origins.count(kOrigin1));
274 EXPECT_EQ(0U, origins.count(kOrigin2));
275 EXPECT_EQ(1U, origins.count(kOrigin3));
276
277 EXPECT_TRUE(db.GetOriginsModifiedSince(
278 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(35)));
279 EXPECT_TRUE(origins.empty());
280
281 // Update origin1's mod time but for persistent storage.
282 EXPECT_TRUE(db.SetOriginLastModifiedTime(
283 kOrigin1, kStorageTypePersistent, base::Time::FromInternalValue(40)));
284
285 // Must have no effects on temporary origins info.
286 EXPECT_TRUE(db.GetOriginsModifiedSince(
287 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(15)));
288 EXPECT_EQ(2U, origins.size());
289 EXPECT_EQ(0U, origins.count(kOrigin1));
290 EXPECT_EQ(1U, origins.count(kOrigin2));
291 EXPECT_EQ(1U, origins.count(kOrigin3));
292
293 // One more update for persistent origin2.
294 EXPECT_TRUE(db.SetOriginLastModifiedTime(
295 kOrigin2, kStorageTypePersistent, base::Time::FromInternalValue(50)));
296
297 EXPECT_TRUE(db.GetOriginsModifiedSince(
298 kStorageTypePersistent, &origins, base::Time::FromInternalValue(35)));
299 EXPECT_EQ(2U, origins.size());
300 EXPECT_EQ(1U, origins.count(kOrigin1));
301 EXPECT_EQ(1U, origins.count(kOrigin2));
302 EXPECT_EQ(0U, origins.count(kOrigin3));
303
304 EXPECT_TRUE(db.GetOriginsModifiedSince(
305 kStorageTypePersistent, &origins, base::Time::FromInternalValue(45)));
306 EXPECT_EQ(1U, origins.size());
307 EXPECT_EQ(0U, origins.count(kOrigin1));
308 EXPECT_EQ(1U, origins.count(kOrigin2));
309 EXPECT_EQ(0U, origins.count(kOrigin3));
310 }
311
312 void RegisterInitialOriginInfo(const FilePath& kDbFile) {
242 QuotaDatabase db(kDbFile); 313 QuotaDatabase db(kDbFile);
243 314
244 const GURL kOrigins[] = { 315 const GURL kOrigins[] = {
245 GURL("http://a/"), 316 GURL("http://a/"),
246 GURL("http://b/"), 317 GURL("http://b/"),
247 GURL("http://c/") }; 318 GURL("http://c/") };
248 std::set<GURL> origins(kOrigins, kOrigins + ARRAYSIZE_UNSAFE(kOrigins)); 319 std::set<GURL> origins(kOrigins, kOrigins + ARRAYSIZE_UNSAFE(kOrigins));
249 320
250 EXPECT_TRUE(db.RegisterOrigins(origins, 321 EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kStorageTypeTemporary));
251 kStorageTypeTemporary,
252 base::Time()));
253 322
254 int used_count = -1; 323 int used_count = -1;
255 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), 324 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"),
256 kStorageTypeTemporary, 325 kStorageTypeTemporary,
257 &used_count)); 326 &used_count));
258 EXPECT_EQ(0, used_count); 327 EXPECT_EQ(0, used_count);
259 328
260 EXPECT_TRUE(db.SetOriginLastAccessTime( 329 EXPECT_TRUE(db.SetOriginLastAccessTime(
261 GURL("http://a/"), kStorageTypeTemporary, 330 GURL("http://a/"), kStorageTypeTemporary,
262 base::Time::FromDoubleT(1.0))); 331 base::Time::FromDoubleT(1.0)));
263 used_count = -1; 332 used_count = -1;
264 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), 333 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"),
265 kStorageTypeTemporary, 334 kStorageTypeTemporary,
266 &used_count)); 335 &used_count));
267 EXPECT_EQ(1, used_count); 336 EXPECT_EQ(1, used_count);
268 337
269 EXPECT_TRUE(db.RegisterOrigins(origins, 338 EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kStorageTypeTemporary));
270 kStorageTypeTemporary,
271 base::Time()));
272 339
273 used_count = -1; 340 used_count = -1;
274 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), 341 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"),
275 kStorageTypeTemporary, 342 kStorageTypeTemporary,
276 &used_count)); 343 &used_count));
277 EXPECT_EQ(1, used_count); 344 EXPECT_EQ(1, used_count);
278 } 345 }
279 346
280 template <typename EntryType> 347 template <typename EntryType>
281 struct EntryVerifier { 348 struct EntryVerifier {
(...skipping 23 matching lines...) Expand all
305 372
306 typedef EntryVerifier<QuotaTableEntry> Verifier; 373 typedef EntryVerifier<QuotaTableEntry> Verifier;
307 Verifier verifier(begin, end); 374 Verifier verifier(begin, end);
308 EXPECT_TRUE(db.DumpQuotaTable( 375 EXPECT_TRUE(db.DumpQuotaTable(
309 new QuotaTableCallback( 376 new QuotaTableCallback(
310 base::Bind(&Verifier::Run, 377 base::Bind(&Verifier::Run,
311 base::Unretained(&verifier))))); 378 base::Unretained(&verifier)))));
312 EXPECT_TRUE(verifier.table.empty()); 379 EXPECT_TRUE(verifier.table.empty());
313 } 380 }
314 381
315 void DumpLastAccessTimeTable(const FilePath& kDbFile) { 382 void DumpOriginInfoTable(const FilePath& kDbFile) {
316 base::Time now(base::Time::Now()); 383 base::Time now(base::Time::Now());
317 LastAccessTimeTableEntry kTableEntries[] = { 384 OriginInfoTableEntry kTableEntries[] = {
318 {GURL("http://go/"), kStorageTypeTemporary, 2147483647, now}, 385 {GURL("http://go/"), kStorageTypeTemporary, 2147483647, now, now},
319 {GURL("http://oo/"), kStorageTypeTemporary, 0, now}, 386 {GURL("http://oo/"), kStorageTypeTemporary, 0, now, now},
320 {GURL("http://gle/"), kStorageTypeTemporary, 1, now}, 387 {GURL("http://gle/"), kStorageTypeTemporary, 1, now, now},
321 }; 388 };
322 LastAccessTimeTableEntry* begin = kTableEntries; 389 OriginInfoTableEntry* begin = kTableEntries;
323 LastAccessTimeTableEntry* end = kTableEntries + 390 OriginInfoTableEntry* end = kTableEntries + ARRAYSIZE_UNSAFE(kTableEntries);
324 ARRAYSIZE_UNSAFE(kTableEntries);
325 391
326 QuotaDatabase db(kDbFile); 392 QuotaDatabase db(kDbFile);
327 EXPECT_TRUE(AssignLastAccessTimeTable(&db, begin, end)); 393 EXPECT_TRUE(AssignOriginInfoTable(&db, begin, end));
328 394
329 typedef EntryVerifier<LastAccessTimeTableEntry> Verifier; 395 typedef EntryVerifier<OriginInfoTableEntry> Verifier;
330 Verifier verifier(begin, end); 396 Verifier verifier(begin, end);
331 EXPECT_TRUE(db.DumpLastAccessTimeTable( 397 EXPECT_TRUE(db.DumpOriginInfoTable(
332 new LastAccessTimeTableCallback( 398 new OriginInfoTableCallback(
333 base::Bind(&Verifier::Run, 399 base::Bind(&Verifier::Run,
334 base::Unretained(&verifier))))); 400 base::Unretained(&verifier)))));
335 EXPECT_TRUE(verifier.table.empty()); 401 EXPECT_TRUE(verifier.table.empty());
336 } 402 }
337 }; 403 };
338 404
339 TEST_F(QuotaDatabaseTest, LazyOpen) { 405 TEST_F(QuotaDatabaseTest, LazyOpen) {
340 ScopedTempDir data_dir; 406 ScopedTempDir data_dir;
341 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); 407 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
342 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); 408 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
(...skipping 18 matching lines...) Expand all
361 } 427 }
362 428
363 TEST_F(QuotaDatabaseTest, OriginLastAccessTimeLRU) { 429 TEST_F(QuotaDatabaseTest, OriginLastAccessTimeLRU) {
364 ScopedTempDir data_dir; 430 ScopedTempDir data_dir;
365 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); 431 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
366 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); 432 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
367 OriginLastAccessTimeLRU(kDbFile); 433 OriginLastAccessTimeLRU(kDbFile);
368 OriginLastAccessTimeLRU(FilePath()); 434 OriginLastAccessTimeLRU(FilePath());
369 } 435 }
370 436
437 TEST_F(QuotaDatabaseTest, OriginLastModifiedSince) {
438 ScopedTempDir data_dir;
439 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
440 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
441 OriginLastModifiedSince(kDbFile);
442 OriginLastModifiedSince(FilePath());
443 }
444
371 TEST_F(QuotaDatabaseTest, BootstrapFlag) { 445 TEST_F(QuotaDatabaseTest, BootstrapFlag) {
372 ScopedTempDir data_dir; 446 ScopedTempDir data_dir;
373 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); 447 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
374 448
375 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); 449 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
376 QuotaDatabase db(kDbFile); 450 QuotaDatabase db(kDbFile);
377 451
378 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped()); 452 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped());
379 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(true)); 453 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(true));
380 EXPECT_TRUE(db.IsOriginDatabaseBootstrapped()); 454 EXPECT_TRUE(db.IsOriginDatabaseBootstrapped());
381 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(false)); 455 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(false));
382 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped()); 456 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped());
383 } 457 }
384 458
385 TEST_F(QuotaDatabaseTest, RegisterOrigins) { 459 TEST_F(QuotaDatabaseTest, RegisterInitialOriginInfo) {
386 ScopedTempDir data_dir; 460 ScopedTempDir data_dir;
387 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); 461 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
388 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); 462 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
389 RegisterOrigins(kDbFile); 463 RegisterInitialOriginInfo(kDbFile);
390 RegisterOrigins(FilePath()); 464 RegisterInitialOriginInfo(FilePath());
391 } 465 }
392 466
393 TEST_F(QuotaDatabaseTest, DumpQuotaTable) { 467 TEST_F(QuotaDatabaseTest, DumpQuotaTable) {
394 ScopedTempDir data_dir; 468 ScopedTempDir data_dir;
395 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); 469 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
396 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); 470 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
397 DumpQuotaTable(kDbFile); 471 DumpQuotaTable(kDbFile);
398 DumpQuotaTable(FilePath()); 472 DumpQuotaTable(FilePath());
399 } 473 }
400 474
401 TEST_F(QuotaDatabaseTest, DumpLastAccessTimeTable) { 475 TEST_F(QuotaDatabaseTest, DumpOriginInfoTable) {
402 ScopedTempDir data_dir; 476 ScopedTempDir data_dir;
403 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); 477 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
404 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); 478 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
405 DumpLastAccessTimeTable(kDbFile); 479 DumpOriginInfoTable(kDbFile);
406 DumpLastAccessTimeTable(FilePath()); 480 DumpOriginInfoTable(FilePath());
407 } 481 }
408 } // namespace quota 482 } // namespace quota
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698