OLD | NEW |
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/meta_table.h" | |
11 #include "app/sql/statement.h" | 10 #include "app/sql/statement.h" |
12 #include "app/sql/transaction.h" | 11 #include "app/sql/transaction.h" |
13 #include "base/bind.h" | 12 #include "base/bind.h" |
14 #include "base/callback.h" | 13 #include "base/callback.h" |
15 #include "base/file_util.h" | 14 #include "base/file_util.h" |
16 #include "base/scoped_temp_dir.h" | 15 #include "base/scoped_temp_dir.h" |
17 #include "googleurl/src/gurl.h" | 16 #include "googleurl/src/gurl.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
19 #include "webkit/quota/mock_special_storage_policy.h" | 18 #include "webkit/quota/mock_special_storage_policy.h" |
20 #include "webkit/quota/quota_database.h" | 19 #include "webkit/quota/quota_database.h" |
21 | 20 |
22 namespace quota { | |
23 namespace { | 21 namespace { |
24 | 22 |
25 const base::Time kZeroTime; | 23 const base::Time kZeroTime; |
26 | 24 |
27 class TestErrorDelegate : public sql::ErrorDelegate { | 25 class TestErrorDelegate : public sql::ErrorDelegate { |
28 public: | 26 public: |
29 virtual ~TestErrorDelegate() { } | 27 virtual ~TestErrorDelegate() { } |
30 virtual int OnError( | 28 virtual int OnError( |
31 int error, sql::Connection* connection, sql::Statement* stmt) { | 29 int error, sql::Connection* connection, sql::Statement* stmt) { |
32 return error; | 30 return error; |
33 } | 31 } |
34 }; | 32 }; |
| 33 } // namespace |
35 | 34 |
36 } // namespace | 35 namespace quota { |
37 | 36 |
38 class QuotaDatabaseTest : public testing::Test { | 37 class QuotaDatabaseTest : public testing::Test { |
39 protected: | 38 protected: |
40 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; | 39 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; |
41 typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback; | 40 typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback; |
42 typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry; | 41 typedef QuotaDatabase::LastAccessTimeTableEntry LastAccessTimeTableEntry; |
43 typedef QuotaDatabase::OriginInfoTableCallback | 42 typedef QuotaDatabase::LastAccessTimeTableCallback |
44 OriginInfoTableCallback; | 43 LastAccessTimeTableCallback; |
| 44 |
| 45 template <typename Iterator> |
| 46 bool AssignQuotaTable( |
| 47 QuotaDatabase* quota_database, Iterator itr, Iterator end) { |
| 48 if (!quota_database->LazyOpen(true)) |
| 49 return false; |
| 50 |
| 51 for (; itr != end; ++itr) { |
| 52 const char* kSql = |
| 53 "INSERT INTO HostQuotaTable" |
| 54 " (host, type, quota)" |
| 55 " VALUES (?, ?, ?)"; |
| 56 sql::Statement statement; |
| 57 statement.Assign( |
| 58 quota_database->db_->GetCachedStatement( |
| 59 SQL_FROM_HERE, kSql)); |
| 60 EXPECT_TRUE(statement.is_valid()); |
| 61 |
| 62 statement.BindString(0, itr->host); |
| 63 statement.BindInt(1, static_cast<int>(itr->type)); |
| 64 statement.BindInt64(2, itr->quota); |
| 65 if (!statement.Run()) |
| 66 return false; |
| 67 } |
| 68 |
| 69 quota_database->Commit(); |
| 70 return true; |
| 71 } |
| 72 |
| 73 template <typename Iterator> |
| 74 bool AssignLastAccessTimeTable( |
| 75 QuotaDatabase* quota_database, Iterator itr, Iterator end) { |
| 76 if (!quota_database->LazyOpen(true)) |
| 77 return false; |
| 78 |
| 79 for (; itr != end; ++itr) { |
| 80 const char* kSql = |
| 81 "INSERT INTO OriginLastAccessTable" |
| 82 " (origin, type, used_count, last_access_time)" |
| 83 " VALUES (?, ?, ?, ?)"; |
| 84 sql::Statement statement; |
| 85 statement.Assign( |
| 86 quota_database->db_->GetCachedStatement( |
| 87 SQL_FROM_HERE, kSql)); |
| 88 EXPECT_TRUE(statement.is_valid()); |
| 89 |
| 90 statement.BindString(0, itr->origin.spec()); |
| 91 statement.BindInt(1, static_cast<int>(itr->type)); |
| 92 statement.BindInt(2, itr->used_count); |
| 93 statement.BindInt64(3, itr->last_access_time.ToInternalValue()); |
| 94 if (!statement.Run()) |
| 95 return false; |
| 96 } |
| 97 |
| 98 quota_database->Commit(); |
| 99 return true; |
| 100 } |
45 | 101 |
46 void LazyOpen(const FilePath& kDbFile) { | 102 void LazyOpen(const FilePath& kDbFile) { |
47 QuotaDatabase db(kDbFile); | 103 QuotaDatabase db(kDbFile); |
48 EXPECT_FALSE(db.LazyOpen(false)); | 104 EXPECT_FALSE(db.LazyOpen(false)); |
49 ASSERT_TRUE(db.LazyOpen(true)); | 105 ASSERT_TRUE(db.LazyOpen(true)); |
50 EXPECT_TRUE(db.db_.get()); | 106 EXPECT_TRUE(db.db_.get()); |
51 EXPECT_TRUE(kDbFile.empty() || file_util::PathExists(kDbFile)); | 107 EXPECT_TRUE(kDbFile.empty() || file_util::PathExists(kDbFile)); |
52 } | 108 } |
53 | 109 |
54 void UpgradeSchemaV2toV3(const FilePath& kDbFile) { | |
55 const QuotaTableEntry entries[] = { | |
56 { "a", kStorageTypeTemporary, 1 }, | |
57 { "b", kStorageTypeTemporary, 2 }, | |
58 { "c", kStorageTypePersistent, 3 }, | |
59 }; | |
60 | |
61 CreateV2Database(kDbFile, entries, ARRAYSIZE_UNSAFE(entries)); | |
62 | |
63 QuotaDatabase db(kDbFile); | |
64 EXPECT_TRUE(db.LazyOpen(true)); | |
65 EXPECT_TRUE(db.db_.get()); | |
66 | |
67 typedef EntryVerifier<QuotaTableEntry> Verifier; | |
68 Verifier verifier(entries, entries + ARRAYSIZE_UNSAFE(entries)); | |
69 EXPECT_TRUE(db.DumpQuotaTable( | |
70 new QuotaTableCallback( | |
71 base::Bind(&Verifier::Run, | |
72 base::Unretained(&verifier))))); | |
73 EXPECT_TRUE(verifier.table.empty()); | |
74 } | |
75 | |
76 void HostQuota(const FilePath& kDbFile) { | 110 void HostQuota(const FilePath& kDbFile) { |
77 QuotaDatabase db(kDbFile); | 111 QuotaDatabase db(kDbFile); |
78 ASSERT_TRUE(db.LazyOpen(true)); | 112 ASSERT_TRUE(db.LazyOpen(true)); |
79 | 113 |
80 const char* kHost = "foo.com"; | 114 const char* kHost = "foo.com"; |
81 const int kQuota1 = 13579; | 115 const int kQuota1 = 13579; |
82 const int kQuota2 = kQuota1 + 1024; | 116 const int kQuota2 = kQuota1 + 1024; |
83 | 117 |
84 int64 quota = -1; | 118 int64 quota = -1; |
85 EXPECT_FALSE(db.GetHostQuota(kHost, kStorageTypeTemporary, "a)); | 119 EXPECT_FALSE(db.GetHostQuota(kHost, kStorageTypeTemporary, "a)); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 216 |
183 exceptions.insert(kOrigin3); | 217 exceptions.insert(kOrigin3); |
184 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, | 218 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, |
185 NULL, &origin)); | 219 NULL, &origin)); |
186 EXPECT_TRUE(origin.is_empty()); | 220 EXPECT_TRUE(origin.is_empty()); |
187 | 221 |
188 EXPECT_TRUE(db.SetOriginLastAccessTime( | 222 EXPECT_TRUE(db.SetOriginLastAccessTime( |
189 kOrigin1, kStorageTypeTemporary, base::Time::Now())); | 223 kOrigin1, kStorageTypeTemporary, base::Time::Now())); |
190 | 224 |
191 // Delete origin/type last access time information. | 225 // Delete origin/type last access time information. |
192 EXPECT_TRUE(db.DeleteOriginInfo(kOrigin3, kStorageTypeTemporary)); | 226 EXPECT_TRUE(db.DeleteOriginLastAccessTime(kOrigin3, kStorageTypeTemporary)); |
193 | 227 |
194 // Querying again to see if the deletion has worked. | 228 // Querying again to see if the deletion has worked. |
195 exceptions.clear(); | 229 exceptions.clear(); |
196 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, | 230 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, |
197 NULL, &origin)); | 231 NULL, &origin)); |
198 EXPECT_EQ(kOrigin2.spec(), origin.spec()); | 232 EXPECT_EQ(kOrigin2.spec(), origin.spec()); |
199 | 233 |
200 exceptions.insert(kOrigin1); | 234 exceptions.insert(kOrigin1); |
201 exceptions.insert(kOrigin2); | 235 exceptions.insert(kOrigin2); |
202 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, | 236 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions, |
203 NULL, &origin)); | 237 NULL, &origin)); |
204 EXPECT_TRUE(origin.is_empty()); | 238 EXPECT_TRUE(origin.is_empty()); |
205 } | 239 } |
206 | 240 |
207 void OriginLastModifiedSince(const FilePath& kDbFile) { | 241 void RegisterOrigins(const FilePath& kDbFile) { |
208 QuotaDatabase db(kDbFile); | |
209 ASSERT_TRUE(db.LazyOpen(true)); | |
210 | |
211 std::set<GURL> origins; | |
212 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
213 kStorageTypeTemporary, &origins, base::Time())); | |
214 EXPECT_TRUE(origins.empty()); | |
215 | |
216 const GURL kOrigin1("http://a/"); | |
217 const GURL kOrigin2("http://b/"); | |
218 const GURL kOrigin3("http://c/"); | |
219 | |
220 // Report last mod time for the test origins. | |
221 EXPECT_TRUE(db.SetOriginLastModifiedTime( | |
222 kOrigin1, kStorageTypeTemporary, base::Time::FromInternalValue(10))); | |
223 EXPECT_TRUE(db.SetOriginLastModifiedTime( | |
224 kOrigin2, kStorageTypeTemporary, base::Time::FromInternalValue(20))); | |
225 EXPECT_TRUE(db.SetOriginLastModifiedTime( | |
226 kOrigin3, kStorageTypeTemporary, base::Time::FromInternalValue(30))); | |
227 | |
228 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
229 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(15))); | |
230 EXPECT_EQ(2U, origins.size()); | |
231 EXPECT_EQ(0U, origins.count(kOrigin1)); | |
232 EXPECT_EQ(1U, origins.count(kOrigin2)); | |
233 EXPECT_EQ(1U, origins.count(kOrigin3)); | |
234 | |
235 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
236 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(25))); | |
237 EXPECT_EQ(1U, origins.size()); | |
238 EXPECT_EQ(0U, origins.count(kOrigin1)); | |
239 EXPECT_EQ(0U, origins.count(kOrigin2)); | |
240 EXPECT_EQ(1U, origins.count(kOrigin3)); | |
241 | |
242 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
243 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(35))); | |
244 EXPECT_TRUE(origins.empty()); | |
245 | |
246 // Update origin1's mod time but for persistent storage. | |
247 EXPECT_TRUE(db.SetOriginLastModifiedTime( | |
248 kOrigin1, kStorageTypePersistent, base::Time::FromInternalValue(40))); | |
249 | |
250 // Must have no effects on temporary origins info. | |
251 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
252 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(15))); | |
253 EXPECT_EQ(2U, origins.size()); | |
254 EXPECT_EQ(0U, origins.count(kOrigin1)); | |
255 EXPECT_EQ(1U, origins.count(kOrigin2)); | |
256 EXPECT_EQ(1U, origins.count(kOrigin3)); | |
257 | |
258 // One more update for persistent origin2. | |
259 EXPECT_TRUE(db.SetOriginLastModifiedTime( | |
260 kOrigin2, kStorageTypePersistent, base::Time::FromInternalValue(50))); | |
261 | |
262 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
263 kStorageTypePersistent, &origins, base::Time::FromInternalValue(35))); | |
264 EXPECT_EQ(2U, origins.size()); | |
265 EXPECT_EQ(1U, origins.count(kOrigin1)); | |
266 EXPECT_EQ(1U, origins.count(kOrigin2)); | |
267 EXPECT_EQ(0U, origins.count(kOrigin3)); | |
268 | |
269 EXPECT_TRUE(db.GetOriginsModifiedSince( | |
270 kStorageTypePersistent, &origins, base::Time::FromInternalValue(45))); | |
271 EXPECT_EQ(1U, origins.size()); | |
272 EXPECT_EQ(0U, origins.count(kOrigin1)); | |
273 EXPECT_EQ(1U, origins.count(kOrigin2)); | |
274 EXPECT_EQ(0U, origins.count(kOrigin3)); | |
275 } | |
276 | |
277 void RegisterInitialOriginInfo(const FilePath& kDbFile) { | |
278 QuotaDatabase db(kDbFile); | 242 QuotaDatabase db(kDbFile); |
279 | 243 |
280 const GURL kOrigins[] = { | 244 const GURL kOrigins[] = { |
281 GURL("http://a/"), | 245 GURL("http://a/"), |
282 GURL("http://b/"), | 246 GURL("http://b/"), |
283 GURL("http://c/") }; | 247 GURL("http://c/") }; |
284 std::set<GURL> origins(kOrigins, kOrigins + ARRAYSIZE_UNSAFE(kOrigins)); | 248 std::set<GURL> origins(kOrigins, kOrigins + ARRAYSIZE_UNSAFE(kOrigins)); |
285 | 249 |
286 EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kStorageTypeTemporary)); | 250 EXPECT_TRUE(db.RegisterOrigins(origins, |
| 251 kStorageTypeTemporary, |
| 252 base::Time())); |
287 | 253 |
288 int used_count = -1; | 254 int used_count = -1; |
289 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), | 255 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), |
290 kStorageTypeTemporary, | 256 kStorageTypeTemporary, |
291 &used_count)); | 257 &used_count)); |
292 EXPECT_EQ(0, used_count); | 258 EXPECT_EQ(0, used_count); |
293 | 259 |
294 EXPECT_TRUE(db.SetOriginLastAccessTime( | 260 EXPECT_TRUE(db.SetOriginLastAccessTime( |
295 GURL("http://a/"), kStorageTypeTemporary, | 261 GURL("http://a/"), kStorageTypeTemporary, |
296 base::Time::FromDoubleT(1.0))); | 262 base::Time::FromDoubleT(1.0))); |
297 used_count = -1; | 263 used_count = -1; |
298 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), | 264 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), |
299 kStorageTypeTemporary, | 265 kStorageTypeTemporary, |
300 &used_count)); | 266 &used_count)); |
301 EXPECT_EQ(1, used_count); | 267 EXPECT_EQ(1, used_count); |
302 | 268 |
303 EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kStorageTypeTemporary)); | 269 EXPECT_TRUE(db.RegisterOrigins(origins, |
| 270 kStorageTypeTemporary, |
| 271 base::Time())); |
304 | 272 |
305 used_count = -1; | 273 used_count = -1; |
306 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), | 274 EXPECT_TRUE(db.FindOriginUsedCount(GURL("http://a/"), |
307 kStorageTypeTemporary, | 275 kStorageTypeTemporary, |
308 &used_count)); | 276 &used_count)); |
309 EXPECT_EQ(1, used_count); | 277 EXPECT_EQ(1, used_count); |
310 } | 278 } |
311 | 279 |
312 template <typename EntryType> | 280 template <typename EntryType> |
313 struct EntryVerifier { | 281 struct EntryVerifier { |
(...skipping 12 matching lines...) Expand all Loading... |
326 void DumpQuotaTable(const FilePath& kDbFile) { | 294 void DumpQuotaTable(const FilePath& kDbFile) { |
327 QuotaTableEntry kTableEntries[] = { | 295 QuotaTableEntry kTableEntries[] = { |
328 {"http://go/", kStorageTypeTemporary, 1}, | 296 {"http://go/", kStorageTypeTemporary, 1}, |
329 {"http://oo/", kStorageTypeTemporary, 2}, | 297 {"http://oo/", kStorageTypeTemporary, 2}, |
330 {"http://gle/", kStorageTypePersistent, 3} | 298 {"http://gle/", kStorageTypePersistent, 3} |
331 }; | 299 }; |
332 QuotaTableEntry* begin = kTableEntries; | 300 QuotaTableEntry* begin = kTableEntries; |
333 QuotaTableEntry* end = kTableEntries + ARRAYSIZE_UNSAFE(kTableEntries); | 301 QuotaTableEntry* end = kTableEntries + ARRAYSIZE_UNSAFE(kTableEntries); |
334 | 302 |
335 QuotaDatabase db(kDbFile); | 303 QuotaDatabase db(kDbFile); |
336 EXPECT_TRUE(db.LazyOpen(true)); | 304 EXPECT_TRUE(AssignQuotaTable(&db, begin, end)); |
337 AssignQuotaTable(db.db_.get(), begin, end); | |
338 db.Commit(); | |
339 | 305 |
340 typedef EntryVerifier<QuotaTableEntry> Verifier; | 306 typedef EntryVerifier<QuotaTableEntry> Verifier; |
341 Verifier verifier(begin, end); | 307 Verifier verifier(begin, end); |
342 EXPECT_TRUE(db.DumpQuotaTable( | 308 EXPECT_TRUE(db.DumpQuotaTable( |
343 new QuotaTableCallback( | 309 new QuotaTableCallback( |
344 base::Bind(&Verifier::Run, | 310 base::Bind(&Verifier::Run, |
345 base::Unretained(&verifier))))); | 311 base::Unretained(&verifier))))); |
346 EXPECT_TRUE(verifier.table.empty()); | 312 EXPECT_TRUE(verifier.table.empty()); |
347 } | 313 } |
348 | 314 |
349 void DumpOriginInfoTable(const FilePath& kDbFile) { | 315 void DumpLastAccessTimeTable(const FilePath& kDbFile) { |
350 base::Time now(base::Time::Now()); | 316 base::Time now(base::Time::Now()); |
351 OriginInfoTableEntry kTableEntries[] = { | 317 LastAccessTimeTableEntry kTableEntries[] = { |
352 {GURL("http://go/"), kStorageTypeTemporary, 2147483647, now, now}, | 318 {GURL("http://go/"), kStorageTypeTemporary, 2147483647, now}, |
353 {GURL("http://oo/"), kStorageTypeTemporary, 0, now, now}, | 319 {GURL("http://oo/"), kStorageTypeTemporary, 0, now}, |
354 {GURL("http://gle/"), kStorageTypeTemporary, 1, now, now}, | 320 {GURL("http://gle/"), kStorageTypeTemporary, 1, now}, |
355 }; | 321 }; |
356 OriginInfoTableEntry* begin = kTableEntries; | 322 LastAccessTimeTableEntry* begin = kTableEntries; |
357 OriginInfoTableEntry* end = kTableEntries + ARRAYSIZE_UNSAFE(kTableEntries); | 323 LastAccessTimeTableEntry* end = kTableEntries + |
| 324 ARRAYSIZE_UNSAFE(kTableEntries); |
358 | 325 |
359 QuotaDatabase db(kDbFile); | 326 QuotaDatabase db(kDbFile); |
360 EXPECT_TRUE(db.LazyOpen(true)); | 327 EXPECT_TRUE(AssignLastAccessTimeTable(&db, begin, end)); |
361 AssignOriginInfoTable(db.db_.get(), begin, end); | |
362 db.Commit(); | |
363 | 328 |
364 typedef EntryVerifier<OriginInfoTableEntry> Verifier; | 329 typedef EntryVerifier<LastAccessTimeTableEntry> Verifier; |
365 Verifier verifier(begin, end); | 330 Verifier verifier(begin, end); |
366 EXPECT_TRUE(db.DumpOriginInfoTable( | 331 EXPECT_TRUE(db.DumpLastAccessTimeTable( |
367 new OriginInfoTableCallback( | 332 new LastAccessTimeTableCallback( |
368 base::Bind(&Verifier::Run, | 333 base::Bind(&Verifier::Run, |
369 base::Unretained(&verifier))))); | 334 base::Unretained(&verifier))))); |
370 EXPECT_TRUE(verifier.table.empty()); | 335 EXPECT_TRUE(verifier.table.empty()); |
371 } | 336 } |
372 | |
373 private: | |
374 template <typename Iterator> | |
375 void AssignQuotaTable(sql::Connection* db, Iterator itr, Iterator end) { | |
376 ASSERT_NE(db, (sql::Connection*)NULL); | |
377 for (; itr != end; ++itr) { | |
378 const char* kSql = | |
379 "INSERT INTO HostQuotaTable" | |
380 " (host, type, quota)" | |
381 " VALUES (?, ?, ?)"; | |
382 sql::Statement statement; | |
383 statement.Assign(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | |
384 ASSERT_TRUE(statement.is_valid()); | |
385 | |
386 statement.BindString(0, itr->host); | |
387 statement.BindInt(1, static_cast<int>(itr->type)); | |
388 statement.BindInt64(2, itr->quota); | |
389 EXPECT_TRUE(statement.Run()); | |
390 } | |
391 } | |
392 | |
393 template <typename Iterator> | |
394 void AssignOriginInfoTable(sql::Connection* db, Iterator itr, Iterator end) { | |
395 ASSERT_NE(db, (sql::Connection*)NULL); | |
396 for (; itr != end; ++itr) { | |
397 const char* kSql = | |
398 "INSERT INTO OriginInfoTable" | |
399 " (origin, type, used_count, last_access_time, last_modified_time)" | |
400 " VALUES (?, ?, ?, ?, ?)"; | |
401 sql::Statement statement; | |
402 statement.Assign(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | |
403 ASSERT_TRUE(statement.is_valid()); | |
404 | |
405 statement.BindString(0, itr->origin.spec()); | |
406 statement.BindInt(1, static_cast<int>(itr->type)); | |
407 statement.BindInt(2, itr->used_count); | |
408 statement.BindInt64(3, itr->last_access_time.ToInternalValue()); | |
409 statement.BindInt64(4, itr->last_modified_time.ToInternalValue()); | |
410 EXPECT_TRUE(statement.Run()); | |
411 } | |
412 } | |
413 | |
414 bool OpenDatabase(sql::Connection* db, const FilePath& kDbFile) { | |
415 if (kDbFile.empty()) { | |
416 db->OpenInMemory(); | |
417 return true; | |
418 } | |
419 if (!file_util::CreateDirectory(kDbFile.DirName())) | |
420 return false; | |
421 if (!db->Open(kDbFile)) | |
422 return false; | |
423 db->Preload(); | |
424 return true; | |
425 } | |
426 | |
427 // Create V2 database and populate some data. | |
428 void CreateV2Database( | |
429 const FilePath& kDbFile, | |
430 const QuotaTableEntry* entries, | |
431 size_t entries_size) { | |
432 scoped_ptr<sql::Connection> db(new sql::Connection); | |
433 scoped_ptr<sql::MetaTable> meta_table(new sql::MetaTable); | |
434 | |
435 // V2 schema definitions. | |
436 static const int kCurrentVersion = 2; | |
437 static const int kCompatibleVersion = 2; | |
438 static const char kHostQuotaTable[] = "HostQuotaTable"; | |
439 static const char kOriginLastAccessTable[] = "OriginLastAccessTable"; | |
440 static const QuotaDatabase::TableSchema kTables[] = { | |
441 { kHostQuotaTable, | |
442 "(host TEXT NOT NULL," | |
443 " type INTEGER NOT NULL," | |
444 " quota INTEGER," | |
445 " UNIQUE(host, type))" }, | |
446 { kOriginLastAccessTable, | |
447 "(origin TEXT NOT NULL," | |
448 " type INTEGER NOT NULL," | |
449 " used_count INTEGER," | |
450 " last_access_time INTEGER," | |
451 " UNIQUE(origin, type))" }, | |
452 }; | |
453 static const QuotaDatabase::IndexSchema kIndexes[] = { | |
454 { "HostIndex", | |
455 kHostQuotaTable, | |
456 "(host)", | |
457 false }, | |
458 { "OriginLastAccessIndex", | |
459 kOriginLastAccessTable, | |
460 "(origin, last_access_time)", | |
461 false }, | |
462 }; | |
463 | |
464 ASSERT_TRUE(OpenDatabase(db.get(), kDbFile)); | |
465 EXPECT_TRUE(QuotaDatabase::CreateSchema( | |
466 db.get(), meta_table.get(), | |
467 kCurrentVersion, kCompatibleVersion, | |
468 kTables, ARRAYSIZE_UNSAFE(kTables), | |
469 kIndexes, ARRAYSIZE_UNSAFE(kIndexes))); | |
470 | |
471 // V2 and V3 QuotaTable are compatible, so we can simply use | |
472 // AssignQuotaTable to poplulate v2 database here. | |
473 db->BeginTransaction(); | |
474 AssignQuotaTable(db.get(), entries, entries + entries_size); | |
475 db->CommitTransaction(); | |
476 } | |
477 }; | 337 }; |
478 | 338 |
479 TEST_F(QuotaDatabaseTest, LazyOpen) { | 339 TEST_F(QuotaDatabaseTest, LazyOpen) { |
480 ScopedTempDir data_dir; | 340 ScopedTempDir data_dir; |
481 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 341 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
482 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 342 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
483 LazyOpen(kDbFile); | 343 LazyOpen(kDbFile); |
484 LazyOpen(FilePath()); | 344 LazyOpen(FilePath()); |
485 } | 345 } |
486 | 346 |
487 TEST_F(QuotaDatabaseTest, UpgradeSchema) { | |
488 ScopedTempDir data_dir; | |
489 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | |
490 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | |
491 UpgradeSchemaV2toV3(kDbFile); | |
492 } | |
493 | |
494 TEST_F(QuotaDatabaseTest, HostQuota) { | 347 TEST_F(QuotaDatabaseTest, HostQuota) { |
495 ScopedTempDir data_dir; | 348 ScopedTempDir data_dir; |
496 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 349 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
497 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 350 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
498 HostQuota(kDbFile); | 351 HostQuota(kDbFile); |
499 HostQuota(FilePath()); | 352 HostQuota(FilePath()); |
500 } | 353 } |
501 | 354 |
502 TEST_F(QuotaDatabaseTest, GlobalQuota) { | 355 TEST_F(QuotaDatabaseTest, GlobalQuota) { |
503 ScopedTempDir data_dir; | 356 ScopedTempDir data_dir; |
504 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 357 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
505 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 358 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
506 GlobalQuota(kDbFile); | 359 GlobalQuota(kDbFile); |
507 GlobalQuota(FilePath()); | 360 GlobalQuota(FilePath()); |
508 } | 361 } |
509 | 362 |
510 TEST_F(QuotaDatabaseTest, OriginLastAccessTimeLRU) { | 363 TEST_F(QuotaDatabaseTest, OriginLastAccessTimeLRU) { |
511 ScopedTempDir data_dir; | 364 ScopedTempDir data_dir; |
512 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 365 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
513 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 366 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
514 OriginLastAccessTimeLRU(kDbFile); | 367 OriginLastAccessTimeLRU(kDbFile); |
515 OriginLastAccessTimeLRU(FilePath()); | 368 OriginLastAccessTimeLRU(FilePath()); |
516 } | 369 } |
517 | 370 |
518 TEST_F(QuotaDatabaseTest, OriginLastModifiedSince) { | |
519 ScopedTempDir data_dir; | |
520 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | |
521 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | |
522 OriginLastModifiedSince(kDbFile); | |
523 OriginLastModifiedSince(FilePath()); | |
524 } | |
525 | |
526 TEST_F(QuotaDatabaseTest, BootstrapFlag) { | 371 TEST_F(QuotaDatabaseTest, BootstrapFlag) { |
527 ScopedTempDir data_dir; | 372 ScopedTempDir data_dir; |
528 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 373 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
529 | 374 |
530 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 375 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
531 QuotaDatabase db(kDbFile); | 376 QuotaDatabase db(kDbFile); |
532 | 377 |
533 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped()); | 378 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped()); |
534 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(true)); | 379 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(true)); |
535 EXPECT_TRUE(db.IsOriginDatabaseBootstrapped()); | 380 EXPECT_TRUE(db.IsOriginDatabaseBootstrapped()); |
536 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(false)); | 381 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(false)); |
537 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped()); | 382 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped()); |
538 } | 383 } |
539 | 384 |
540 TEST_F(QuotaDatabaseTest, RegisterInitialOriginInfo) { | 385 TEST_F(QuotaDatabaseTest, RegisterOrigins) { |
541 ScopedTempDir data_dir; | 386 ScopedTempDir data_dir; |
542 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 387 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
543 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 388 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
544 RegisterInitialOriginInfo(kDbFile); | 389 RegisterOrigins(kDbFile); |
545 RegisterInitialOriginInfo(FilePath()); | 390 RegisterOrigins(FilePath()); |
546 } | 391 } |
547 | 392 |
548 TEST_F(QuotaDatabaseTest, DumpQuotaTable) { | 393 TEST_F(QuotaDatabaseTest, DumpQuotaTable) { |
549 ScopedTempDir data_dir; | 394 ScopedTempDir data_dir; |
550 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 395 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
551 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 396 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
552 DumpQuotaTable(kDbFile); | 397 DumpQuotaTable(kDbFile); |
553 DumpQuotaTable(FilePath()); | 398 DumpQuotaTable(FilePath()); |
554 } | 399 } |
555 | 400 |
556 TEST_F(QuotaDatabaseTest, DumpOriginInfoTable) { | 401 TEST_F(QuotaDatabaseTest, DumpLastAccessTimeTable) { |
557 ScopedTempDir data_dir; | 402 ScopedTempDir data_dir; |
558 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); | 403 ASSERT_TRUE(data_dir.CreateUniqueTempDir()); |
559 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); | 404 const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db"); |
560 DumpOriginInfoTable(kDbFile); | 405 DumpLastAccessTimeTable(kDbFile); |
561 DumpOriginInfoTable(FilePath()); | 406 DumpLastAccessTimeTable(FilePath()); |
562 } | 407 } |
563 } // namespace quota | 408 } // namespace quota |
OLD | NEW |