Index: webkit/database/database_tracker_unittest.cc |
diff --git a/webkit/database/database_tracker_unittest.cc b/webkit/database/database_tracker_unittest.cc |
index 0ed707dff019e2b27372f5a1b9c9398359bab2de..55d13e14690424132419fa5b2d9b37a010f435aa 100644 |
--- a/webkit/database/database_tracker_unittest.cc |
+++ b/webkit/database/database_tracker_unittest.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -7,6 +7,8 @@ |
#include "base/scoped_ptr.h" |
#include "base/scoped_temp_dir.h" |
#include "base/string_util.h" |
+#include "base/time.h" |
+#include "net/base/test_completion_callback.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "webkit/database/database_tracker.h" |
@@ -28,6 +30,9 @@ class TestObserver : public webkit_database::DatabaseTracker::Observer { |
} |
virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, |
const string16& database_name) { |
+ new_notification_received_ = true; |
+ origin_identifier_ = origin_identifier; |
+ database_name_ = database_name; |
} |
bool DidReceiveNewNotification() { |
bool temp_new_notification_received = new_notification_received_; |
@@ -67,6 +72,101 @@ void CheckNotificationReceived(TestObserver* observer, |
namespace webkit_database { |
+TEST(DatabaseTrackerTest, DeleteOpenDatabase) { |
+ // Initialize the tracker database. |
+ ScopedTempDir temp_dir; |
+ EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
+ scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); |
+ |
+ // Create and open three databases. |
+ int64 database_size = 0; |
+ int64 space_available = 0; |
+ const string16 kOrigin1 = ASCIIToUTF16("origin1"); |
+ const string16 kOrigin2 = ASCIIToUTF16("origin2"); |
+ const string16 kDB1 = ASCIIToUTF16("db1"); |
+ const string16 kDB2 = ASCIIToUTF16("db2"); |
+ const string16 kDB3 = ASCIIToUTF16("db3"); |
+ const string16 kDescription = ASCIIToUTF16("database_description"); |
+ |
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
+ &database_size, &space_available); |
+ tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
+ &database_size, &space_available); |
+ tracker->DatabaseOpened(kOrigin2, kDB3, kDescription, 0, |
+ &database_size, &space_available); |
+ |
+ EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
+ FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
+ EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
+ FilePath::FromWStringHack(UTF16ToWide(kOrigin2))))); |
+ EXPECT_EQ(1, file_util::WriteFile( |
+ tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
+ EXPECT_EQ(2, file_util::WriteFile( |
+ tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); |
+ EXPECT_EQ(3, file_util::WriteFile( |
+ tracker->GetFullDBFilePath(kOrigin2, kDB3), "aaa", 3)); |
+ tracker->DatabaseModified(kOrigin1, kDB1); |
+ tracker->DatabaseModified(kOrigin2, kDB2); |
+ tracker->DatabaseModified(kOrigin2, kDB3); |
+ |
+ // Delete db1. Should also delete origin1. |
+ TestObserver observer; |
+ tracker->AddObserver(&observer); |
+ TestCompletionCallback callback; |
+ int result = tracker->DeleteDatabase(kOrigin1, kDB1, &callback); |
+ EXPECT_EQ(net::ERR_IO_PENDING, result); |
+ ASSERT_FALSE(callback.have_result()); |
+ EXPECT_TRUE(observer.DidReceiveNewNotification()); |
+ EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier()); |
+ EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName()); |
+ tracker->DatabaseClosed(kOrigin1, kDB1); |
+ result = callback.GetResult(result); |
+ EXPECT_EQ(net::OK, result); |
+ EXPECT_FALSE(file_util::PathExists(tracker->DatabaseDirectory().Append( |
+ FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
+ |
+ // Recreate db1. |
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
+ &database_size, &space_available); |
+ EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
+ FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
+ EXPECT_EQ(1, file_util::WriteFile( |
+ tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
+ tracker->DatabaseModified(kOrigin1, kDB1); |
+ |
+ // Setup file modification times. db1 and db2 are modified now, db3 three |
+ // days ago. |
+ EXPECT_TRUE(file_util::SetLastModifiedTime( |
+ tracker->GetFullDBFilePath(kOrigin1, kDB1), base::Time::Now())); |
+ EXPECT_TRUE(file_util::SetLastModifiedTime( |
+ tracker->GetFullDBFilePath(kOrigin2, kDB2), base::Time::Now())); |
+ base::Time three_days_ago = base::Time::Now(); |
+ three_days_ago -= base::TimeDelta::FromDays(3); |
+ EXPECT_TRUE(file_util::SetLastModifiedTime( |
+ tracker->GetFullDBFilePath(kOrigin2, kDB3), three_days_ago)); |
+ |
+ // Delete databases modified since yesterday. |
+ base::Time yesterday = base::Time::Now(); |
+ yesterday -= base::TimeDelta::FromDays(1); |
+ result = tracker->DeleteDataModifiedSince(yesterday, &callback); |
+ EXPECT_EQ(net::ERR_IO_PENDING, result); |
+ ASSERT_FALSE(callback.have_result()); |
+ EXPECT_TRUE(observer.DidReceiveNewNotification()); |
+ tracker->DatabaseClosed(kOrigin1, kDB1); |
+ tracker->DatabaseClosed(kOrigin2, kDB2); |
+ result = callback.GetResult(result); |
+ EXPECT_EQ(net::OK, result); |
+ EXPECT_FALSE(file_util::PathExists(tracker->DatabaseDirectory().Append( |
+ FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
+ EXPECT_FALSE( |
+ file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2))); |
+ EXPECT_TRUE( |
+ file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB3))); |
+ |
+ tracker->DatabaseClosed(kOrigin2, kDB3); |
+ tracker->RemoveObserver(&observer); |
+} |
+ |
TEST(DatabaseTrackerTest, TestIt) { |
// Initialize the tracker database. |
ScopedTempDir temp_dir; |
@@ -210,14 +310,14 @@ TEST(DatabaseTrackerTest, TestIt) { |
// Trying to delete a database in use should fail |
tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
&database_size, &space_available); |
- EXPECT_FALSE(tracker->DeleteDatabase(kOrigin1, kDB3)); |
+ EXPECT_FALSE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); |
origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
EXPECT_TRUE(origin1_info); |
EXPECT_EQ(6, origin1_info->GetDatabaseSize(kDB3)); |
tracker->DatabaseClosed(kOrigin1, kDB3); |
// Delete a database and make sure the space used by that origin is updated |
- EXPECT_TRUE(tracker->DeleteDatabase(kOrigin1, kDB3)); |
+ EXPECT_TRUE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); |
origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
EXPECT_TRUE(origin1_info); |
EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); |