| Index: webkit/quota/quota_database_unittest.cc
|
| diff --git a/webkit/quota/quota_database_unittest.cc b/webkit/quota/quota_database_unittest.cc
|
| index 6e80c851555619ac1025fff2c8c6d43ded08aad4..bbb0006988ae9ae670ad106df1a4ed3e565343d0 100644
|
| --- a/webkit/quota/quota_database_unittest.cc
|
| +++ b/webkit/quota/quota_database_unittest.cc
|
| @@ -7,6 +7,10 @@
|
| #include <set>
|
|
|
| #include "app/sql/connection.h"
|
| +#include "app/sql/statement.h"
|
| +#include "app/sql/transaction.h"
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| #include "base/file_util.h"
|
| #include "base/scoped_temp_dir.h"
|
| #include "googleurl/src/gurl.h"
|
| @@ -25,13 +29,75 @@ class TestErrorDelegate : public sql::ErrorDelegate {
|
| return error;
|
| }
|
| };
|
| -
|
| } // namespace
|
|
|
| namespace quota {
|
|
|
| class QuotaDatabaseTest : public testing::Test {
|
| protected:
|
| + typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry;
|
| + typedef QuotaDatabase::QuotaTableCallback QuotaTableCallback;
|
| + typedef QuotaDatabase::LastAccessTimeTableEntry LastAccessTimeTableEntry;
|
| + typedef QuotaDatabase::LastAccessTimeTableCallback
|
| + LastAccessTimeTableCallback;
|
| +
|
| + template <typename Iterator>
|
| + bool AssignQuotaTable(
|
| + QuotaDatabase* quota_database, Iterator itr, Iterator end) {
|
| + if (!quota_database->LazyOpen(true))
|
| + return false;
|
| +
|
| + for (; itr != end; ++itr) {
|
| + const char* kSql =
|
| + "INSERT INTO HostQuotaTable"
|
| + " (host, type, quota)"
|
| + " VALUES (?, ?, ?)";
|
| + sql::Statement statement;
|
| + statement.Assign(
|
| + quota_database->db_->GetCachedStatement(
|
| + SQL_FROM_HERE, kSql));
|
| + EXPECT_TRUE(statement.is_valid());
|
| +
|
| + statement.BindString(0, itr->host);
|
| + statement.BindInt(1, static_cast<int>(itr->type));
|
| + statement.BindInt64(2, itr->quota);
|
| + if (!statement.Run())
|
| + return false;
|
| + }
|
| +
|
| + quota_database->Commit();
|
| + return true;
|
| + }
|
| +
|
| + template <typename Iterator>
|
| + bool AssignLastAccessTimeTable(
|
| + QuotaDatabase* quota_database, Iterator itr, Iterator end) {
|
| + if (!quota_database->LazyOpen(true))
|
| + return false;
|
| +
|
| + for (; itr != end; ++itr) {
|
| + const char* kSql =
|
| + "INSERT INTO OriginLastAccessTable"
|
| + " (origin, type, used_count, last_access_time)"
|
| + " VALUES (?, ?, ?, ?)";
|
| + sql::Statement statement;
|
| + statement.Assign(
|
| + quota_database->db_->GetCachedStatement(
|
| + SQL_FROM_HERE, kSql));
|
| + EXPECT_TRUE(statement.is_valid());
|
| +
|
| + statement.BindString(0, itr->origin.spec());
|
| + statement.BindInt(1, static_cast<int>(itr->type));
|
| + statement.BindInt(2, itr->used_count);
|
| + statement.BindInt64(3, itr->last_access_time.ToInternalValue());
|
| + if (!statement.Run())
|
| + return false;
|
| + }
|
| +
|
| + quota_database->Commit();
|
| + return true;
|
| + }
|
| +
|
| void LazyOpen(const FilePath& kDbFile) {
|
| QuotaDatabase db(kDbFile);
|
| EXPECT_FALSE(db.LazyOpen(false));
|
| @@ -192,6 +258,64 @@ class QuotaDatabaseTest : public testing::Test {
|
| &used_count));
|
| EXPECT_EQ(1, used_count);
|
| }
|
| +
|
| + template <typename EntryType>
|
| + struct EntryVerifier {
|
| + std::set<EntryType> table;
|
| +
|
| + template <typename Iterator>
|
| + EntryVerifier(Iterator itr, Iterator end)
|
| + : table(itr, end) {}
|
| +
|
| + bool Run(const EntryType& entry) {
|
| + EXPECT_EQ(1u, table.erase(entry));
|
| + return true;
|
| + }
|
| + };
|
| +
|
| + void DumpQuotaTable(const FilePath& kDbFile) {
|
| + QuotaTableEntry kTableEntries[] = {
|
| + {"http://go/", kStorageTypeTemporary, 1},
|
| + {"http://oo/", kStorageTypeTemporary, 2},
|
| + {"http://gle/", kStorageTypePersistent, 3}
|
| + };
|
| + QuotaTableEntry* begin = kTableEntries;
|
| + QuotaTableEntry* end = kTableEntries + ARRAYSIZE_UNSAFE(kTableEntries);
|
| +
|
| + QuotaDatabase db(kDbFile);
|
| + EXPECT_TRUE(AssignQuotaTable(&db, begin, end));
|
| +
|
| + typedef EntryVerifier<QuotaTableEntry> Verifier;
|
| + Verifier verifier(begin, end);
|
| + EXPECT_TRUE(db.DumpQuotaTable(
|
| + new QuotaTableCallback(
|
| + base::Bind(&Verifier::Run,
|
| + base::Unretained(&verifier)))));
|
| + EXPECT_TRUE(verifier.table.empty());
|
| + }
|
| +
|
| + void DumpLastAccessTimeTable(const FilePath& kDbFile) {
|
| + base::Time now(base::Time::Now());
|
| + LastAccessTimeTableEntry kTableEntries[] = {
|
| + {GURL("http://go/"), kStorageTypeTemporary, 2147483647, now},
|
| + {GURL("http://oo/"), kStorageTypeTemporary, 0, now},
|
| + {GURL("http://gle/"), kStorageTypeTemporary, 1, now},
|
| + };
|
| + LastAccessTimeTableEntry* begin = kTableEntries;
|
| + LastAccessTimeTableEntry* end = kTableEntries +
|
| + ARRAYSIZE_UNSAFE(kTableEntries);
|
| +
|
| + QuotaDatabase db(kDbFile);
|
| + EXPECT_TRUE(AssignLastAccessTimeTable(&db, begin, end));
|
| +
|
| + typedef EntryVerifier<LastAccessTimeTableEntry> Verifier;
|
| + Verifier verifier(begin, end);
|
| + EXPECT_TRUE(db.DumpLastAccessTimeTable(
|
| + new LastAccessTimeTableCallback(
|
| + base::Bind(&Verifier::Run,
|
| + base::Unretained(&verifier)))));
|
| + EXPECT_TRUE(verifier.table.empty());
|
| + }
|
| };
|
|
|
| TEST_F(QuotaDatabaseTest, LazyOpen) {
|
| @@ -247,4 +371,20 @@ TEST_F(QuotaDatabaseTest, RegisterOrigins) {
|
| RegisterOrigins(kDbFile);
|
| RegisterOrigins(FilePath());
|
| }
|
| +
|
| +TEST_F(QuotaDatabaseTest, DumpQuotaTable) {
|
| + ScopedTempDir data_dir;
|
| + ASSERT_TRUE(data_dir.CreateUniqueTempDir());
|
| + const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
|
| + DumpQuotaTable(kDbFile);
|
| + DumpQuotaTable(FilePath());
|
| +}
|
| +
|
| +TEST_F(QuotaDatabaseTest, DumpLastAccessTimeTable) {
|
| + ScopedTempDir data_dir;
|
| + ASSERT_TRUE(data_dir.CreateUniqueTempDir());
|
| + const FilePath kDbFile = data_dir.path().AppendASCII("quota_manager.db");
|
| + DumpLastAccessTimeTable(kDbFile);
|
| + DumpLastAccessTimeTable(FilePath());
|
| +}
|
| } // namespace quota
|
|
|