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

Side by Side Diff: content/browser/quota/quota_database_unittest.cc

Issue 2368913003: Populate storage_unittests target. (Closed)
Patch Set: Removed unnecessary include from storage/browser/blob/blob_storage_context_unittest.cc. Created 4 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
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <stddef.h>
6 #include <stdint.h>
7
8 #include <algorithm>
9 #include <iterator>
10 #include <set>
11
12 #include "base/bind.h"
13 #include "base/callback.h"
14 #include "base/files/file_util.h"
15 #include "base/files/scoped_temp_dir.h"
16 #include "base/macros.h"
17 #include "base/message_loop/message_loop.h"
18 #include "content/public/test/mock_special_storage_policy.h"
19 #include "sql/connection.h"
20 #include "sql/meta_table.h"
21 #include "sql/statement.h"
22 #include "sql/test/scoped_error_expecter.h"
23 #include "sql/test/test_helpers.h"
24 #include "storage/browser/quota/quota_database.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26 #include "url/gurl.h"
27
28 using storage::kStorageTypePersistent;
29 using storage::kStorageTypeTemporary;
30 using storage::QuotaDatabase;
31
32 namespace content {
33 namespace {
34
35 const base::Time kZeroTime;
36
37 const char kDBFileName[] = "quota_manager.db";
38
39 } // namespace
40
41 class QuotaDatabaseTest : public testing::Test {
42 protected:
43 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry;
44 typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback;
45 typedef QuotaDatabase::OriginInfoTableCallback
46 OriginInfoTableCallback;
47
48 void LazyOpen(const base::FilePath& kDbFile) {
49 QuotaDatabase db(kDbFile);
50 EXPECT_FALSE(db.LazyOpen(false));
51 ASSERT_TRUE(db.LazyOpen(true));
52 EXPECT_TRUE(db.db_.get());
53 EXPECT_TRUE(kDbFile.empty() || base::PathExists(kDbFile));
54 }
55
56 void Reopen(const base::FilePath& kDbFile) {
57 QuotaDatabase db(kDbFile);
58 ASSERT_TRUE(db.LazyOpen(false));
59 EXPECT_TRUE(db.db_.get());
60 EXPECT_TRUE(kDbFile.empty() || base::PathExists(kDbFile));
61 }
62
63 void UpgradeSchemaV2toV5(const base::FilePath& kDbFile) {
64 const QuotaTableEntry entries[] = {
65 QuotaTableEntry("a", kStorageTypeTemporary, 1),
66 QuotaTableEntry("b", kStorageTypeTemporary, 2),
67 QuotaTableEntry("c", kStorageTypePersistent, 3),
68 };
69
70 CreateV2Database(kDbFile, entries, arraysize(entries));
71
72 QuotaDatabase db(kDbFile);
73 EXPECT_TRUE(db.LazyOpen(true));
74 EXPECT_TRUE(db.db_.get());
75
76 typedef EntryVerifier<QuotaTableEntry> Verifier;
77 Verifier verifier(entries, entries + arraysize(entries));
78 EXPECT_TRUE(db.DumpQuotaTable(
79 base::Bind(&Verifier::Run, base::Unretained(&verifier))));
80 EXPECT_TRUE(verifier.table.empty());
81
82 EXPECT_TRUE(db.db_->DoesTableExist("EvictionInfoTable"));
83 EXPECT_TRUE(db.db_->DoesIndexExist("sqlite_autoindex_EvictionInfoTable_1"));
84 }
85
86 void HostQuota(const base::FilePath& kDbFile) {
87 QuotaDatabase db(kDbFile);
88 ASSERT_TRUE(db.LazyOpen(true));
89
90 const char* kHost = "foo.com";
91 const int kQuota1 = 13579;
92 const int kQuota2 = kQuota1 + 1024;
93
94 int64_t quota = -1;
95 EXPECT_FALSE(db.GetHostQuota(kHost, kStorageTypeTemporary, &quota));
96 EXPECT_FALSE(db.GetHostQuota(kHost, kStorageTypePersistent, &quota));
97
98 // Insert quota for temporary.
99 EXPECT_TRUE(db.SetHostQuota(kHost, kStorageTypeTemporary, kQuota1));
100 EXPECT_TRUE(db.GetHostQuota(kHost, kStorageTypeTemporary, &quota));
101 EXPECT_EQ(kQuota1, quota);
102
103 // Update quota for temporary.
104 EXPECT_TRUE(db.SetHostQuota(kHost, kStorageTypeTemporary, kQuota2));
105 EXPECT_TRUE(db.GetHostQuota(kHost, kStorageTypeTemporary, &quota));
106 EXPECT_EQ(kQuota2, quota);
107
108 // Quota for persistent must not be updated.
109 EXPECT_FALSE(db.GetHostQuota(kHost, kStorageTypePersistent, &quota));
110
111 // Delete temporary storage quota.
112 EXPECT_TRUE(db.DeleteHostQuota(kHost, kStorageTypeTemporary));
113 EXPECT_FALSE(db.GetHostQuota(kHost, kStorageTypeTemporary, &quota));
114 }
115
116 void GlobalQuota(const base::FilePath& kDbFile) {
117 QuotaDatabase db(kDbFile);
118 ASSERT_TRUE(db.LazyOpen(true));
119
120 const char* kTempQuotaKey = QuotaDatabase::kTemporaryQuotaOverrideKey;
121 const char* kAvailSpaceKey = QuotaDatabase::kDesiredAvailableSpaceKey;
122
123 int64_t value = 0;
124 const int64_t kValue1 = 456;
125 const int64_t kValue2 = 123000;
126 EXPECT_FALSE(db.GetQuotaConfigValue(kTempQuotaKey, &value));
127 EXPECT_FALSE(db.GetQuotaConfigValue(kAvailSpaceKey, &value));
128
129 EXPECT_TRUE(db.SetQuotaConfigValue(kTempQuotaKey, kValue1));
130 EXPECT_TRUE(db.GetQuotaConfigValue(kTempQuotaKey, &value));
131 EXPECT_EQ(kValue1, value);
132
133 EXPECT_TRUE(db.SetQuotaConfigValue(kTempQuotaKey, kValue2));
134 EXPECT_TRUE(db.GetQuotaConfigValue(kTempQuotaKey, &value));
135 EXPECT_EQ(kValue2, value);
136
137 EXPECT_TRUE(db.SetQuotaConfigValue(kAvailSpaceKey, kValue1));
138 EXPECT_TRUE(db.GetQuotaConfigValue(kAvailSpaceKey, &value));
139 EXPECT_EQ(kValue1, value);
140
141 EXPECT_TRUE(db.SetQuotaConfigValue(kAvailSpaceKey, kValue2));
142 EXPECT_TRUE(db.GetQuotaConfigValue(kAvailSpaceKey, &value));
143 EXPECT_EQ(kValue2, value);
144 }
145
146 void OriginLastAccessTimeLRU(const base::FilePath& kDbFile) {
147 QuotaDatabase db(kDbFile);
148 ASSERT_TRUE(db.LazyOpen(true));
149
150 std::set<GURL> exceptions;
151 GURL origin;
152 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
153 NULL, &origin));
154 EXPECT_TRUE(origin.is_empty());
155
156 const GURL kOrigin1("http://a/");
157 const GURL kOrigin2("http://b/");
158 const GURL kOrigin3("http://c/");
159 const GURL kOrigin4("http://p/");
160
161 // Adding three temporary storages, and
162 EXPECT_TRUE(db.SetOriginLastAccessTime(
163 kOrigin1, kStorageTypeTemporary, base::Time::FromInternalValue(10)));
164 EXPECT_TRUE(db.SetOriginLastAccessTime(
165 kOrigin2, kStorageTypeTemporary, base::Time::FromInternalValue(20)));
166 EXPECT_TRUE(db.SetOriginLastAccessTime(
167 kOrigin3, kStorageTypeTemporary, base::Time::FromInternalValue(30)));
168
169 // one persistent.
170 EXPECT_TRUE(db.SetOriginLastAccessTime(
171 kOrigin4, kStorageTypePersistent, base::Time::FromInternalValue(40)));
172
173 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
174 NULL, &origin));
175 EXPECT_EQ(kOrigin1.spec(), origin.spec());
176
177 // Test that unlimited origins are exluded from eviction, but
178 // protected origins are not excluded.
179 scoped_refptr<MockSpecialStoragePolicy> policy(
180 new MockSpecialStoragePolicy);
181 policy->AddUnlimited(kOrigin1);
182 policy->AddProtected(kOrigin2);
183 EXPECT_TRUE(db.GetLRUOrigin(
184 kStorageTypeTemporary, exceptions, policy.get(), &origin));
185 EXPECT_EQ(kOrigin2.spec(), origin.spec());
186
187 // Test that durable origins are excluded from eviction.
188 policy->AddDurable(kOrigin2);
189 EXPECT_TRUE(db.GetLRUOrigin(
190 kStorageTypeTemporary, exceptions, policy.get(), &origin));
191 EXPECT_EQ(kOrigin3.spec(), origin.spec());
192
193 exceptions.insert(kOrigin1);
194 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
195 NULL, &origin));
196 EXPECT_EQ(kOrigin2.spec(), origin.spec());
197
198 exceptions.insert(kOrigin2);
199 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
200 NULL, &origin));
201 EXPECT_EQ(kOrigin3.spec(), origin.spec());
202
203 exceptions.insert(kOrigin3);
204 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
205 NULL, &origin));
206 EXPECT_TRUE(origin.is_empty());
207
208 EXPECT_TRUE(db.SetOriginLastAccessTime(
209 kOrigin1, kStorageTypeTemporary, base::Time::Now()));
210
211 // Delete origin/type last access time information.
212 EXPECT_TRUE(db.DeleteOriginInfo(kOrigin3, kStorageTypeTemporary));
213
214 // Querying again to see if the deletion has worked.
215 exceptions.clear();
216 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
217 NULL, &origin));
218 EXPECT_EQ(kOrigin2.spec(), origin.spec());
219
220 exceptions.insert(kOrigin1);
221 exceptions.insert(kOrigin2);
222 EXPECT_TRUE(db.GetLRUOrigin(kStorageTypeTemporary, exceptions,
223 NULL, &origin));
224 EXPECT_TRUE(origin.is_empty());
225 }
226
227 void OriginLastModifiedSince(const base::FilePath& kDbFile) {
228 QuotaDatabase db(kDbFile);
229 ASSERT_TRUE(db.LazyOpen(true));
230
231 std::set<GURL> origins;
232 EXPECT_TRUE(db.GetOriginsModifiedSince(
233 kStorageTypeTemporary, &origins, base::Time()));
234 EXPECT_TRUE(origins.empty());
235
236 const GURL kOrigin1("http://a/");
237 const GURL kOrigin2("http://b/");
238 const GURL kOrigin3("http://c/");
239
240 // Report last mod time for the test origins.
241 EXPECT_TRUE(db.SetOriginLastModifiedTime(
242 kOrigin1, kStorageTypeTemporary, base::Time::FromInternalValue(0)));
243 EXPECT_TRUE(db.SetOriginLastModifiedTime(
244 kOrigin2, kStorageTypeTemporary, base::Time::FromInternalValue(10)));
245 EXPECT_TRUE(db.SetOriginLastModifiedTime(
246 kOrigin3, kStorageTypeTemporary, base::Time::FromInternalValue(20)));
247
248 EXPECT_TRUE(db.GetOriginsModifiedSince(
249 kStorageTypeTemporary, &origins, base::Time()));
250 EXPECT_EQ(3U, origins.size());
251 EXPECT_EQ(1U, origins.count(kOrigin1));
252 EXPECT_EQ(1U, origins.count(kOrigin2));
253 EXPECT_EQ(1U, origins.count(kOrigin3));
254
255 EXPECT_TRUE(db.GetOriginsModifiedSince(
256 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(5)));
257 EXPECT_EQ(2U, origins.size());
258 EXPECT_EQ(0U, origins.count(kOrigin1));
259 EXPECT_EQ(1U, origins.count(kOrigin2));
260 EXPECT_EQ(1U, origins.count(kOrigin3));
261
262 EXPECT_TRUE(db.GetOriginsModifiedSince(
263 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(15)));
264 EXPECT_EQ(1U, origins.size());
265 EXPECT_EQ(0U, origins.count(kOrigin1));
266 EXPECT_EQ(0U, origins.count(kOrigin2));
267 EXPECT_EQ(1U, origins.count(kOrigin3));
268
269 EXPECT_TRUE(db.GetOriginsModifiedSince(
270 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(25)));
271 EXPECT_TRUE(origins.empty());
272
273 // Update origin1's mod time but for persistent storage.
274 EXPECT_TRUE(db.SetOriginLastModifiedTime(
275 kOrigin1, kStorageTypePersistent, base::Time::FromInternalValue(30)));
276
277 // Must have no effects on temporary origins info.
278 EXPECT_TRUE(db.GetOriginsModifiedSince(
279 kStorageTypeTemporary, &origins, base::Time::FromInternalValue(5)));
280 EXPECT_EQ(2U, origins.size());
281 EXPECT_EQ(0U, origins.count(kOrigin1));
282 EXPECT_EQ(1U, origins.count(kOrigin2));
283 EXPECT_EQ(1U, origins.count(kOrigin3));
284
285 // One more update for persistent origin2.
286 EXPECT_TRUE(db.SetOriginLastModifiedTime(
287 kOrigin2, kStorageTypePersistent, base::Time::FromInternalValue(40)));
288
289 EXPECT_TRUE(db.GetOriginsModifiedSince(
290 kStorageTypePersistent, &origins, base::Time::FromInternalValue(25)));
291 EXPECT_EQ(2U, origins.size());
292 EXPECT_EQ(1U, origins.count(kOrigin1));
293 EXPECT_EQ(1U, origins.count(kOrigin2));
294 EXPECT_EQ(0U, origins.count(kOrigin3));
295
296 EXPECT_TRUE(db.GetOriginsModifiedSince(
297 kStorageTypePersistent, &origins, base::Time::FromInternalValue(35)));
298 EXPECT_EQ(1U, origins.size());
299 EXPECT_EQ(0U, origins.count(kOrigin1));
300 EXPECT_EQ(1U, origins.count(kOrigin2));
301 EXPECT_EQ(0U, origins.count(kOrigin3));
302 }
303
304 void OriginLastEvicted(const base::FilePath& kDbFile) {
305 QuotaDatabase db(kDbFile);
306 ASSERT_TRUE(db.LazyOpen(true));
307
308 const GURL kOrigin1("http://a/");
309 const GURL kOrigin2("http://b/");
310 const GURL kOrigin3("http://c/");
311
312 base::Time last_eviction_time;
313 EXPECT_FALSE(db.GetOriginLastEvictionTime(kOrigin1, kStorageTypeTemporary,
314 &last_eviction_time));
315 EXPECT_EQ(base::Time(), last_eviction_time);
316
317 // Report last eviction time for the test origins.
318 EXPECT_TRUE(db.SetOriginLastEvictionTime(
319 kOrigin1, kStorageTypeTemporary, base::Time::FromInternalValue(10)));
320 EXPECT_TRUE(db.SetOriginLastEvictionTime(
321 kOrigin2, kStorageTypeTemporary, base::Time::FromInternalValue(20)));
322 EXPECT_TRUE(db.SetOriginLastEvictionTime(
323 kOrigin3, kStorageTypeTemporary, base::Time::FromInternalValue(30)));
324
325 EXPECT_TRUE(db.GetOriginLastEvictionTime(kOrigin1, kStorageTypeTemporary,
326 &last_eviction_time));
327 EXPECT_EQ(base::Time::FromInternalValue(10), last_eviction_time);
328 EXPECT_TRUE(db.GetOriginLastEvictionTime(kOrigin2, kStorageTypeTemporary,
329 &last_eviction_time));
330 EXPECT_EQ(base::Time::FromInternalValue(20), last_eviction_time);
331 EXPECT_TRUE(db.GetOriginLastEvictionTime(kOrigin3, kStorageTypeTemporary,
332 &last_eviction_time));
333 EXPECT_EQ(base::Time::FromInternalValue(30), last_eviction_time);
334
335 // Delete last eviction times for the test origins.
336 EXPECT_TRUE(
337 db.DeleteOriginLastEvictionTime(kOrigin1, kStorageTypeTemporary));
338 EXPECT_TRUE(
339 db.DeleteOriginLastEvictionTime(kOrigin2, kStorageTypeTemporary));
340 EXPECT_TRUE(
341 db.DeleteOriginLastEvictionTime(kOrigin3, kStorageTypeTemporary));
342
343 last_eviction_time = base::Time();
344 EXPECT_FALSE(db.GetOriginLastEvictionTime(kOrigin1, kStorageTypeTemporary,
345 &last_eviction_time));
346 EXPECT_EQ(base::Time(), last_eviction_time);
347 EXPECT_FALSE(db.GetOriginLastEvictionTime(kOrigin2, kStorageTypeTemporary,
348 &last_eviction_time));
349 EXPECT_EQ(base::Time(), last_eviction_time);
350 EXPECT_FALSE(db.GetOriginLastEvictionTime(kOrigin3, kStorageTypeTemporary,
351 &last_eviction_time));
352 EXPECT_EQ(base::Time(), last_eviction_time);
353
354 // Deleting an origin that is not present should not fail.
355 EXPECT_TRUE(db.DeleteOriginLastEvictionTime(GURL("http://notpresent.com"),
356 kStorageTypeTemporary));
357 }
358
359 void RegisterInitialOriginInfo(const base::FilePath& kDbFile) {
360 QuotaDatabase db(kDbFile);
361
362 const GURL kOrigins[] = {
363 GURL("http://a/"),
364 GURL("http://b/"),
365 GURL("http://c/") };
366 std::set<GURL> origins(kOrigins, kOrigins + arraysize(kOrigins));
367
368 EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kStorageTypeTemporary));
369
370 QuotaDatabase::OriginInfoTableEntry info;
371 info.used_count = -1;
372 EXPECT_TRUE(db.GetOriginInfo(
373 GURL("http://a/"), kStorageTypeTemporary, &info));
374 EXPECT_EQ(0, info.used_count);
375
376 EXPECT_TRUE(db.SetOriginLastAccessTime(
377 GURL("http://a/"), kStorageTypeTemporary,
378 base::Time::FromDoubleT(1.0)));
379 info.used_count = -1;
380 EXPECT_TRUE(db.GetOriginInfo(
381 GURL("http://a/"), kStorageTypeTemporary, &info));
382 EXPECT_EQ(1, info.used_count);
383
384 EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kStorageTypeTemporary));
385
386 info.used_count = -1;
387 EXPECT_TRUE(db.GetOriginInfo(
388 GURL("http://a/"), kStorageTypeTemporary, &info));
389 EXPECT_EQ(1, info.used_count);
390 }
391
392 template <typename EntryType>
393 struct EntryVerifier {
394 std::set<EntryType> table;
395
396 template <typename Iterator>
397 EntryVerifier(Iterator itr, Iterator end)
398 : table(itr, end) {}
399
400 bool Run(const EntryType& entry) {
401 EXPECT_EQ(1u, table.erase(entry));
402 return true;
403 }
404 };
405
406 void DumpQuotaTable(const base::FilePath& kDbFile) {
407 QuotaTableEntry kTableEntries[] = {
408 QuotaTableEntry("http://go/", kStorageTypeTemporary, 1),
409 QuotaTableEntry("http://oo/", kStorageTypeTemporary, 2),
410 QuotaTableEntry("http://gle/", kStorageTypePersistent, 3)
411 };
412 QuotaTableEntry* begin = kTableEntries;
413 QuotaTableEntry* end = kTableEntries + arraysize(kTableEntries);
414
415 QuotaDatabase db(kDbFile);
416 EXPECT_TRUE(db.LazyOpen(true));
417 AssignQuotaTable(db.db_.get(), begin, end);
418 db.Commit();
419
420 typedef EntryVerifier<QuotaTableEntry> Verifier;
421 Verifier verifier(begin, end);
422 EXPECT_TRUE(db.DumpQuotaTable(
423 base::Bind(&Verifier::Run, base::Unretained(&verifier))));
424 EXPECT_TRUE(verifier.table.empty());
425 }
426
427 void DumpOriginInfoTable(const base::FilePath& kDbFile) {
428 base::Time now(base::Time::Now());
429 typedef QuotaDatabase::OriginInfoTableEntry Entry;
430 Entry kTableEntries[] = {
431 Entry(GURL("http://go/"), kStorageTypeTemporary, 2147483647, now, now),
432 Entry(GURL("http://oo/"), kStorageTypeTemporary, 0, now, now),
433 Entry(GURL("http://gle/"), kStorageTypeTemporary, 1, now, now),
434 };
435 Entry* begin = kTableEntries;
436 Entry* end = kTableEntries + arraysize(kTableEntries);
437
438 QuotaDatabase db(kDbFile);
439 EXPECT_TRUE(db.LazyOpen(true));
440 AssignOriginInfoTable(db.db_.get(), begin, end);
441 db.Commit();
442
443 typedef EntryVerifier<Entry> Verifier;
444 Verifier verifier(begin, end);
445 EXPECT_TRUE(db.DumpOriginInfoTable(
446 base::Bind(&Verifier::Run, base::Unretained(&verifier))));
447 EXPECT_TRUE(verifier.table.empty());
448 }
449
450 void GetOriginInfo(const base::FilePath& kDbFile) {
451 const GURL kOrigin = GURL("http://go/");
452 typedef QuotaDatabase::OriginInfoTableEntry Entry;
453 Entry kTableEntries[] = {
454 Entry(kOrigin, kStorageTypeTemporary, 100, base::Time(), base::Time())};
455 Entry* begin = kTableEntries;
456 Entry* end = kTableEntries + arraysize(kTableEntries);
457
458 QuotaDatabase db(kDbFile);
459 EXPECT_TRUE(db.LazyOpen(true));
460 AssignOriginInfoTable(db.db_.get(), begin, end);
461 db.Commit();
462
463 {
464 Entry entry;
465 EXPECT_TRUE(db.GetOriginInfo(kOrigin, kStorageTypeTemporary, &entry));
466 EXPECT_EQ(kTableEntries[0].type, entry.type);
467 EXPECT_EQ(kTableEntries[0].origin, entry.origin);
468 EXPECT_EQ(kTableEntries[0].used_count, entry.used_count);
469 EXPECT_EQ(kTableEntries[0].last_access_time, entry.last_access_time);
470 EXPECT_EQ(kTableEntries[0].last_modified_time, entry.last_modified_time);
471 }
472
473 {
474 Entry entry;
475 EXPECT_FALSE(db.GetOriginInfo(GURL("http://notpresent.org/"),
476 kStorageTypeTemporary, &entry));
477 }
478 }
479
480 private:
481 template <typename Iterator>
482 void AssignQuotaTable(sql::Connection* db, Iterator itr, Iterator end) {
483 ASSERT_NE(db, (sql::Connection*)NULL);
484 for (; itr != end; ++itr) {
485 const char* kSql =
486 "INSERT INTO HostQuotaTable"
487 " (host, type, quota)"
488 " VALUES (?, ?, ?)";
489 sql::Statement statement;
490 statement.Assign(db->GetCachedStatement(SQL_FROM_HERE, kSql));
491 ASSERT_TRUE(statement.is_valid());
492
493 statement.BindString(0, itr->host);
494 statement.BindInt(1, static_cast<int>(itr->type));
495 statement.BindInt64(2, itr->quota);
496 EXPECT_TRUE(statement.Run());
497 }
498 }
499
500 template <typename Iterator>
501 void AssignOriginInfoTable(sql::Connection* db, Iterator itr, Iterator end) {
502 ASSERT_NE(db, (sql::Connection*)NULL);
503 for (; itr != end; ++itr) {
504 const char* kSql =
505 "INSERT INTO OriginInfoTable"
506 " (origin, type, used_count, last_access_time, last_modified_time)"
507 " VALUES (?, ?, ?, ?, ?)";
508 sql::Statement statement;
509 statement.Assign(db->GetCachedStatement(SQL_FROM_HERE, kSql));
510 ASSERT_TRUE(statement.is_valid());
511
512 statement.BindString(0, itr->origin.spec());
513 statement.BindInt(1, static_cast<int>(itr->type));
514 statement.BindInt(2, itr->used_count);
515 statement.BindInt64(3, itr->last_access_time.ToInternalValue());
516 statement.BindInt64(4, itr->last_modified_time.ToInternalValue());
517 EXPECT_TRUE(statement.Run());
518 }
519 }
520
521 bool OpenDatabase(sql::Connection* db, const base::FilePath& kDbFile) {
522 if (kDbFile.empty()) {
523 return db->OpenInMemory();
524 }
525 if (!base::CreateDirectory(kDbFile.DirName()))
526 return false;
527 if (!db->Open(kDbFile))
528 return false;
529 db->Preload();
530 return true;
531 }
532
533 // Create V2 database and populate some data.
534 void CreateV2Database(
535 const base::FilePath& kDbFile,
536 const QuotaTableEntry* entries,
537 size_t entries_size) {
538 std::unique_ptr<sql::Connection> db(new sql::Connection);
539 std::unique_ptr<sql::MetaTable> meta_table(new sql::MetaTable);
540
541 // V2 schema definitions.
542 static const int kCurrentVersion = 2;
543 static const int kCompatibleVersion = 2;
544 static const char kHostQuotaTable[] = "HostQuotaTable";
545 static const char kOriginLastAccessTable[] = "OriginLastAccessTable";
546 static const QuotaDatabase::TableSchema kTables[] = {
547 { kHostQuotaTable,
548 "(host TEXT NOT NULL,"
549 " type INTEGER NOT NULL,"
550 " quota INTEGER,"
551 " UNIQUE(host, type))" },
552 { kOriginLastAccessTable,
553 "(origin TEXT NOT NULL,"
554 " type INTEGER NOT NULL,"
555 " used_count INTEGER,"
556 " last_access_time INTEGER,"
557 " UNIQUE(origin, type))" },
558 };
559 static const QuotaDatabase::IndexSchema kIndexes[] = {
560 { "HostIndex",
561 kHostQuotaTable,
562 "(host)",
563 false },
564 { "OriginLastAccessIndex",
565 kOriginLastAccessTable,
566 "(origin, last_access_time)",
567 false },
568 };
569
570 ASSERT_TRUE(OpenDatabase(db.get(), kDbFile));
571 EXPECT_TRUE(QuotaDatabase::CreateSchema(
572 db.get(), meta_table.get(),
573 kCurrentVersion, kCompatibleVersion,
574 kTables, arraysize(kTables),
575 kIndexes, arraysize(kIndexes)));
576
577 // V2 and V3 QuotaTable are compatible, so we can simply use
578 // AssignQuotaTable to poplulate v2 database here.
579 db->BeginTransaction();
580 AssignQuotaTable(db.get(), entries, entries + entries_size);
581 db->CommitTransaction();
582 }
583
584 base::MessageLoop message_loop_;
585 };
586
587 TEST_F(QuotaDatabaseTest, LazyOpen) {
588 base::ScopedTempDir data_dir;
589 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
590 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
591 LazyOpen(kDbFile);
592 LazyOpen(base::FilePath());
593 }
594
595 TEST_F(QuotaDatabaseTest, UpgradeSchema) {
596 base::ScopedTempDir data_dir;
597 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
598 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
599 UpgradeSchemaV2toV5(kDbFile);
600 }
601
602 TEST_F(QuotaDatabaseTest, HostQuota) {
603 base::ScopedTempDir data_dir;
604 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
605 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
606 HostQuota(kDbFile);
607 HostQuota(base::FilePath());
608 }
609
610 TEST_F(QuotaDatabaseTest, GlobalQuota) {
611 base::ScopedTempDir data_dir;
612 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
613 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
614 GlobalQuota(kDbFile);
615 GlobalQuota(base::FilePath());
616 }
617
618 TEST_F(QuotaDatabaseTest, OriginLastAccessTimeLRU) {
619 base::ScopedTempDir data_dir;
620 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
621 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
622 OriginLastAccessTimeLRU(kDbFile);
623 OriginLastAccessTimeLRU(base::FilePath());
624 }
625
626 TEST_F(QuotaDatabaseTest, OriginLastModifiedSince) {
627 base::ScopedTempDir data_dir;
628 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
629 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
630 OriginLastModifiedSince(kDbFile);
631 OriginLastModifiedSince(base::FilePath());
632 }
633
634 TEST_F(QuotaDatabaseTest, OriginLastEvicted) {
635 base::ScopedTempDir data_dir;
636 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
637 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
638 OriginLastEvicted(kDbFile);
639 OriginLastEvicted(base::FilePath());
640 }
641
642 TEST_F(QuotaDatabaseTest, BootstrapFlag) {
643 base::ScopedTempDir data_dir;
644 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
645
646 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
647 QuotaDatabase db(kDbFile);
648
649 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped());
650 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(true));
651 EXPECT_TRUE(db.IsOriginDatabaseBootstrapped());
652 EXPECT_TRUE(db.SetOriginDatabaseBootstrapped(false));
653 EXPECT_FALSE(db.IsOriginDatabaseBootstrapped());
654 }
655
656 TEST_F(QuotaDatabaseTest, RegisterInitialOriginInfo) {
657 base::ScopedTempDir data_dir;
658 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
659 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
660 RegisterInitialOriginInfo(kDbFile);
661 RegisterInitialOriginInfo(base::FilePath());
662 }
663
664 TEST_F(QuotaDatabaseTest, DumpQuotaTable) {
665 base::ScopedTempDir data_dir;
666 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
667 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
668 DumpQuotaTable(kDbFile);
669 DumpQuotaTable(base::FilePath());
670 }
671
672 TEST_F(QuotaDatabaseTest, DumpOriginInfoTable) {
673 base::ScopedTempDir data_dir;
674 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
675 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
676 DumpOriginInfoTable(kDbFile);
677 DumpOriginInfoTable(base::FilePath());
678 }
679
680 TEST_F(QuotaDatabaseTest, GetOriginInfo) {
681 GetOriginInfo(base::FilePath());
682 }
683
684 TEST_F(QuotaDatabaseTest, OpenCorruptedDatabase) {
685 base::ScopedTempDir data_dir;
686 ASSERT_TRUE(data_dir.CreateUniqueTempDir());
687 const base::FilePath kDbFile = data_dir.GetPath().AppendASCII(kDBFileName);
688 LazyOpen(kDbFile);
689 ASSERT_TRUE(sql::test::CorruptSizeInHeader(kDbFile));
690 {
691 sql::test::ScopedErrorExpecter expecter;
692 expecter.ExpectError(SQLITE_CORRUPT);
693 Reopen(kDbFile);
694 EXPECT_TRUE(expecter.SawExpectedErrors());
695 }
696 }
697
698 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/quota/quota_backend_impl_unittest.cc ('k') | content/browser/quota/quota_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698