| Index: webkit/database/database_tracker_unittest.cc
|
| diff --git a/webkit/database/database_tracker_unittest.cc b/webkit/database/database_tracker_unittest.cc
|
| index f10a8ce2bb7bb5e9ead5c670cf07de5958120c52..c6404b1980baa7e3cef6bbec63bff0dfbd935b03 100644
|
| --- a/webkit/database/database_tracker_unittest.cc
|
| +++ b/webkit/database/database_tracker_unittest.cc
|
| @@ -5,6 +5,8 @@
|
| #include "base/file_path.h"
|
| #include "base/file_util.h"
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop_proxy.h"
|
| +#include "base/platform_file.h"
|
| #include "base/scoped_temp_dir.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -184,7 +186,7 @@ class DatabaseTracker_TestHelper_Test {
|
| ScopedTempDir temp_dir;
|
| ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| scoped_refptr<DatabaseTracker> tracker(
|
| - new DatabaseTracker(temp_dir.path(), incognito_mode,
|
| + new DatabaseTracker(temp_dir.path(), incognito_mode, false,
|
| new TestSpecialStoragePolicy,
|
| NULL, NULL));
|
|
|
| @@ -287,7 +289,7 @@ class DatabaseTracker_TestHelper_Test {
|
| ScopedTempDir temp_dir;
|
| ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| scoped_refptr<DatabaseTracker> tracker(
|
| - new DatabaseTracker(temp_dir.path(), incognito_mode,
|
| + new DatabaseTracker(temp_dir.path(), incognito_mode, false,
|
| new TestSpecialStoragePolicy,
|
| NULL, NULL));
|
|
|
| @@ -407,14 +409,14 @@ class DatabaseTracker_TestHelper_Test {
|
| // Trying to delete an origin with databases in use should fail
|
| tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
|
| &database_size);
|
| - EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1));
|
| + EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1, false));
|
| origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
|
| EXPECT_TRUE(origin1_info);
|
| EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1));
|
| tracker->DatabaseClosed(kOrigin1, kDB1);
|
|
|
| // Delete an origin that doesn't have any database in use
|
| - EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1));
|
| + EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1, false));
|
| origins_info.clear();
|
| EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
|
| EXPECT_EQ(size_t(1), origins_info.size());
|
| @@ -438,7 +440,7 @@ class DatabaseTracker_TestHelper_Test {
|
| scoped_refptr<TestQuotaManagerProxy> test_quota_proxy(
|
| new TestQuotaManagerProxy);
|
| scoped_refptr<DatabaseTracker> tracker(
|
| - new DatabaseTracker(temp_dir.path(), false /* incognito */,
|
| + new DatabaseTracker(temp_dir.path(), false /* incognito */, false,
|
| NULL, test_quota_proxy, NULL));
|
| EXPECT_TRUE(test_quota_proxy->registered_client_);
|
|
|
| @@ -516,6 +518,102 @@ class DatabaseTracker_TestHelper_Test {
|
| crashed_renderer_connections.RemoveAllConnections();
|
| test_quota_proxy->SimulateQuotaManagerDestroyed();
|
| }
|
| +
|
| + static void DatabaseTrackerClearLocalStateOnExit() {
|
| + int64 database_size = 0;
|
| + const string16 kOrigin1 =
|
| + DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url));
|
| + const string16 kOrigin2 =
|
| + DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url));
|
| + const string16 kDB1 = ASCIIToUTF16("db1");
|
| + const string16 kDB2 = ASCIIToUTF16("db2");
|
| + const string16 kDB3 = ASCIIToUTF16("db3");
|
| + const string16 kDescription = ASCIIToUTF16("database_description");
|
| +
|
| + // Initialize the tracker database.
|
| + ScopedTempDir temp_dir;
|
| + ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| + FilePath origin1_db_dir;
|
| + {
|
| + scoped_refptr<DatabaseTracker> tracker(
|
| + new DatabaseTracker(
|
| + temp_dir.path(), false, true,
|
| + new TestSpecialStoragePolicy,
|
| + NULL,
|
| + base::MessageLoopProxy::CreateForCurrentThread()));
|
| +
|
| + // Open three new databases.
|
| + tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
|
| + &database_size);
|
| + EXPECT_EQ(0, database_size);
|
| + tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
|
| + &database_size);
|
| + EXPECT_EQ(0, database_size);
|
| + tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
|
| + &database_size);
|
| + EXPECT_EQ(0, database_size);
|
| +
|
| + // Write some data to each file.
|
| + FilePath db_file;
|
| + db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1);
|
| + EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName()));
|
| + EXPECT_TRUE(EnsureFileOfSize(db_file, 1));
|
| +
|
| + db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2);
|
| + EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName()));
|
| + EXPECT_TRUE(EnsureFileOfSize(db_file, 2));
|
| +
|
| + db_file = tracker->GetFullDBFilePath(kOrigin1, kDB3);
|
| + EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName()));
|
| + EXPECT_TRUE(EnsureFileOfSize(db_file, 3));
|
| +
|
| + // Store the origin database directory as long as it still exists.
|
| + origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB3).DirName();
|
| +
|
| + tracker->DatabaseModified(kOrigin1, kDB1);
|
| + tracker->DatabaseModified(kOrigin2, kDB2);
|
| + tracker->DatabaseModified(kOrigin1, kDB3);
|
| +
|
| + // Close all databases but one database.
|
| + tracker->DatabaseClosed(kOrigin1, kDB1);
|
| + tracker->DatabaseClosed(kOrigin2, kDB2);
|
| +
|
| + // Keep an open file handle to the last database.
|
| + base::PlatformFile file_handle = base::CreatePlatformFile(
|
| + tracker->GetFullDBFilePath(kOrigin1, kDB3),
|
| + base::PLATFORM_FILE_READ |
|
| + base::PLATFORM_FILE_WRITE |
|
| + base::PLATFORM_FILE_EXCLUSIVE_READ |
|
| + base::PLATFORM_FILE_EXCLUSIVE_WRITE |
|
| + base::PLATFORM_FILE_OPEN_ALWAYS |
|
| + base::PLATFORM_FILE_SHARE_DELETE,
|
| + NULL, NULL);
|
| +
|
| + tracker->Shutdown();
|
| +
|
| + base::ClosePlatformFile(file_handle);
|
| + tracker->DatabaseClosed(kOrigin1, kDB3);
|
| + }
|
| +
|
| + // At this point, the database tracker should be gone. Create a new one.
|
| + scoped_refptr<DatabaseTracker> tracker(
|
| + new DatabaseTracker(temp_dir.path(), false, false,
|
| + new TestSpecialStoragePolicy,
|
| + NULL, NULL));
|
| +
|
| + // Get all data for all origins.
|
| + std::vector<OriginInfo> origins_info;
|
| + EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
|
| + EXPECT_EQ(size_t(1), origins_info.size());
|
| + EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin());
|
| + EXPECT_EQ(FilePath(), tracker->GetFullDBFilePath(kOrigin1, kDB1));
|
| + EXPECT_TRUE(
|
| + file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2)));
|
| + EXPECT_EQ(FilePath(), tracker->GetFullDBFilePath(kOrigin1, kDB3));
|
| +
|
| + // The origin directory should be gone as well.
|
| + EXPECT_FALSE(file_util::PathExists(origin1_db_dir));
|
| + }
|
| };
|
|
|
| TEST(DatabaseTrackerTest, DeleteOpenDatabase) {
|
| @@ -539,4 +637,9 @@ TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) {
|
| DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration();
|
| }
|
|
|
| +TEST(DatabaseTrackerTest, DatabaseTrackerClearLocalStateOnExit) {
|
| + // Only works for regular mode.
|
| + DatabaseTracker_TestHelper_Test::DatabaseTrackerClearLocalStateOnExit();
|
| +}
|
| +
|
| } // namespace webkit_database
|
|
|