summaryrefslogtreecommitdiffstats
path: root/webkit/database/database_tracker_unittest.cc
diff options
context:
space:
mode:
authordumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-13 09:08:41 +0000
committerdumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-13 09:08:41 +0000
commitfe615f3a28aba7377b1ef177390b67927cc32290 (patch)
treeaac68857f269f74d0414627fb11657fde8706962 /webkit/database/database_tracker_unittest.cc
parent517507bd359f4ab111f6c119e4fdc9bcea145fbf (diff)
downloadchromium_src-fe615f3a28aba7377b1ef177390b67927cc32290.zip
chromium_src-fe615f3a28aba7377b1ef177390b67927cc32290.tar.gz
chromium_src-fe615f3a28aba7377b1ef177390b67927cc32290.tar.bz2
Support WebSQLDatabases in incognito mode.
BUG=43232 TEST=none Review URL: http://codereview.chromium.org/2746003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49644 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/database/database_tracker_unittest.cc')
-rw-r--r--webkit/database/database_tracker_unittest.cc629
1 files changed, 314 insertions, 315 deletions
diff --git a/webkit/database/database_tracker_unittest.cc b/webkit/database/database_tracker_unittest.cc
index 14bd480..8bb3f247 100644
--- a/webkit/database/database_tracker_unittest.cc
+++ b/webkit/database/database_tracker_unittest.cc
@@ -72,327 +72,326 @@ void CheckNotificationReceived(TestObserver* observer,
namespace webkit_database {
+// We declare a helper class, and make it a friend of DatabaseTracker using
+// the FRIEND_TEST() macro, and we implement all tests we want to run as
+// static methods of this class. Then we make our TEST() targets call these
+// static functions. This allows us to run each test in normal mode and
+// incognito mode without writing the same code twice.
+class DatabaseTracker_TestHelper_Test {
+ public:
+ static void TestDeleteOpenDatabase(bool incognito_mode) {
+ // Initialize the tracker database.
+ ScopedTempDir temp_dir;
+ EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
+ scoped_refptr<DatabaseTracker> tracker(
+ new DatabaseTracker(temp_dir.path(), incognito_mode));
+
+ // 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(
+ tracker->GetOriginDirectory(kOrigin1))))));
+ EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append(
+ FilePath::FromWStringHack(UTF16ToWide(
+ tracker->GetOriginDirectory(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(
+ tracker->GetOriginDirectory(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);
+ }
+
+ static void TestDatabaseTracker(bool incognito_mode) {
+ // Initialize the tracker database.
+ ScopedTempDir temp_dir;
+ EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
+ scoped_refptr<DatabaseTracker> tracker(
+ new DatabaseTracker(temp_dir.path(), incognito_mode));
+
+ // Add two observers.
+ TestObserver observer1;
+ TestObserver observer2;
+ tracker->AddObserver(&observer1);
+ tracker->AddObserver(&observer2);
+
+ // Open three new 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");
+
+ // Get the quota for kOrigin1 and kOrigin2
+ DatabaseTracker::CachedOriginInfo* origin1_info =
+ tracker->GetCachedOriginInfo(kOrigin1);
+ DatabaseTracker::CachedOriginInfo* origin2_info =
+ tracker->GetCachedOriginInfo(kOrigin1);
+ EXPECT_TRUE(origin1_info);
+ EXPECT_TRUE(origin2_info);
+ int64 origin1_quota = origin1_info->Quota();
+ int64 origin2_quota = origin2_info->Quota();
+ EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1));
+ EXPECT_EQ(origin2_quota, tracker->GetOriginSpaceAvailable(kOrigin2));
+
+ // Set a new quota for kOrigin1
+ origin1_quota *= 2;
+ tracker->SetOriginQuota(kOrigin1, origin1_quota);
+ origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
+ EXPECT_TRUE(origin1_info);
+ EXPECT_EQ(origin1_quota, origin1_info->Quota());
+
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
+ &database_size, &space_available);
+ EXPECT_EQ(0, database_size);
+ EXPECT_EQ(origin1_quota, space_available);
+ tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
+ &database_size, &space_available);
+ EXPECT_EQ(0, database_size);
+ EXPECT_EQ(origin2_quota, space_available);
+ tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
+ &database_size, &space_available);
+ EXPECT_EQ(0, database_size);
+ EXPECT_EQ(origin1_quota, space_available);
+
+ // Tell the tracker that a database has changed.
+ // Even though nothing has changed, the observers should be notified.
+ tracker->DatabaseModified(kOrigin1, kDB1);
+ CheckNotificationReceived(&observer1, kOrigin1, kDB1, 0, origin1_quota);
+ CheckNotificationReceived(&observer2, kOrigin1, kDB1, 0, origin1_quota);
+
+ // Write some data to each file and check that the listeners are
+ // called with the appropriate values.
+ EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append(
+ FilePath::FromWStringHack(UTF16ToWide(
+ tracker->GetOriginDirectory(kOrigin1))))));
+ EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append(
+ FilePath::FromWStringHack(UTF16ToWide(
+ tracker->GetOriginDirectory(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(4, file_util::WriteFile(
+ tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4));
+ tracker->DatabaseModified(kOrigin1, kDB1);
+ CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 1);
+ CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 1);
+ tracker->DatabaseModified(kOrigin2, kDB2);
+ CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2, origin2_quota - 2);
+ CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2, origin2_quota - 2);
+ tracker->DatabaseModified(kOrigin1, kDB3);
+ CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4, origin1_quota - 5);
+ CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4, origin1_quota - 5);
+
+ // Make sure the available space for kOrigin1 and kOrigin2 changed too.
+ EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1));
+ EXPECT_EQ(origin2_quota - 2, tracker->GetOriginSpaceAvailable(kOrigin2));
+
+ // Close all databases
+ tracker->DatabaseClosed(kOrigin1, kDB1);
+ tracker->DatabaseClosed(kOrigin2, kDB2);
+ tracker->DatabaseClosed(kOrigin1, kDB3);
+
+ // Open an existing database and check the reported size
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
+ &database_size, &space_available);
+ EXPECT_EQ(1, database_size);
+ EXPECT_EQ(origin1_quota - 5, space_available);
+
+ // Make sure that the observers are notified even if
+ // the size of the database hasn't changed.
+ EXPECT_EQ(1, file_util::WriteFile(
+ tracker->GetFullDBFilePath(kOrigin1, kDB1), "b", 1));
+ tracker->DatabaseModified(kOrigin1, kDB1);
+ CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 5);
+ CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 5);
+ tracker->DatabaseClosed(kOrigin1, kDB1);
+
+ // Remove an observer; this should clear all caches.
+ tracker->RemoveObserver(&observer2);
+
+ // Change kDB1's and kDB3's size and call tracker->DatabaseModified()
+ // for kDB1 only. If the caches were indeed cleared, then calling
+ // tracker->DatabaseModified() should re-populate the cache for
+ // kOrigin1 == kOrigin1, and thus, should pick up kDB3's size change too.
+ EXPECT_EQ(5, file_util::WriteFile(
+ tracker->GetFullDBFilePath(kOrigin1, kDB1), "ccccc", 5));
+ EXPECT_EQ(6, file_util::WriteFile(
+ tracker->GetFullDBFilePath(kOrigin1, kDB3), "dddddd", 6));
+ tracker->DatabaseModified(kOrigin1, kDB1);
+ CheckNotificationReceived(&observer1, kOrigin1, kDB1, 5,
+ origin1_quota - 11);
+ EXPECT_FALSE(observer2.DidReceiveNewNotification());
+ EXPECT_EQ(origin1_quota - 11, tracker->GetOriginSpaceAvailable(kOrigin1));
+
+ // Close the tracker database and clear all caches.
+ // Then make sure that DatabaseOpened() still returns the correct result.
+ tracker->CloseTrackerDatabaseAndClearCaches();
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
+ &database_size, &space_available);
+ EXPECT_EQ(5, database_size);
+ EXPECT_EQ(origin1_quota - 11, space_available);
+
+ // Close the tracker database and clear all caches. Then make sure that
+ // DatabaseModified() still calls the observers with correct values.
+ tracker->CloseTrackerDatabaseAndClearCaches();
+ tracker->DatabaseModified(kOrigin1, kDB3);
+ CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6,
+ origin1_quota - 11);
+ tracker->DatabaseClosed(kOrigin1, kDB1);
+
+ // Remove all observers.
+ tracker->RemoveObserver(&observer1);
+
+ // Trying to delete a database in use should fail
+ tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
+ &database_size, &space_available);
+ 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->DeleteClosedDatabase(kOrigin1, kDB3));
+ origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
+ EXPECT_TRUE(origin1_info);
+ EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1));
+ EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1));
+ EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3));
+
+ // Get all data for all origins
+ std::vector<OriginInfo> origins_info;
+ EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
+ EXPECT_EQ(size_t(2), origins_info.size());
+ EXPECT_EQ(kOrigin1, origins_info[0].GetOrigin());
+ EXPECT_EQ(5, origins_info[0].TotalSize());
+ EXPECT_EQ(origin1_quota, origins_info[0].Quota());
+ EXPECT_EQ(5, origins_info[0].GetDatabaseSize(kDB1));
+ EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3));
+
+ EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin());
+ EXPECT_EQ(2, origins_info[1].TotalSize());
+ EXPECT_EQ(origin2_quota, origins_info[1].Quota());
+
+ // Trying to delete an origin with databases in use should fail
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
+ &database_size, &space_available);
+ EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1));
+ origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
+ EXPECT_TRUE(origin1_info);
+ EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1));
+ tracker->DatabaseClosed(kOrigin1, kDB1);
+
+ // Delete an origin that doesn't have any database in use
+ EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1));
+ origins_info.clear();
+ EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
+ EXPECT_EQ(size_t(1), origins_info.size());
+ EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin());
+
+ origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
+ EXPECT_TRUE(origin1_info);
+ EXPECT_EQ(origin1_quota, origin1_info->Quota());
+ EXPECT_EQ(0, origin1_info->TotalSize());
+ EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1));
+ }
+};
+
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);
+ DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false);
+}
+
+TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) {
+ DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true);
}
TEST(DatabaseTrackerTest, DatabaseTracker) {
- // Initialize the tracker database.
- ScopedTempDir temp_dir;
- EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
- scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path()));
-
- // Add two observers.
- TestObserver observer1;
- TestObserver observer2;
- tracker->AddObserver(&observer1);
- tracker->AddObserver(&observer2);
-
- // Open three new 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");
-
- // Get the quota for kOrigin1 and kOrigin2
- DatabaseTracker::CachedOriginInfo* origin1_info =
- tracker->GetCachedOriginInfo(kOrigin1);
- DatabaseTracker::CachedOriginInfo* origin2_info =
- tracker->GetCachedOriginInfo(kOrigin1);
- EXPECT_TRUE(origin1_info);
- EXPECT_TRUE(origin2_info);
- int64 origin1_quota = origin1_info->Quota();
- int64 origin2_quota = origin2_info->Quota();
- EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1));
- EXPECT_EQ(origin2_quota, tracker->GetOriginSpaceAvailable(kOrigin2));
-
- // Set a new quota for kOrigin1
- origin1_quota *= 2;
- tracker->SetOriginQuota(kOrigin1, origin1_quota);
- origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
- EXPECT_TRUE(origin1_info);
- EXPECT_EQ(origin1_quota, origin1_info->Quota());
-
- tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
- &database_size, &space_available);
- EXPECT_EQ(0, database_size);
- EXPECT_EQ(origin1_quota, space_available);
- tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0,
- &database_size, &space_available);
- EXPECT_EQ(0, database_size);
- EXPECT_EQ(origin2_quota, space_available);
- tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
- &database_size, &space_available);
- EXPECT_EQ(0, database_size);
- EXPECT_EQ(origin1_quota, space_available);
-
- // Tell the tracker that a database has changed.
- // Even though nothing has changed, the observers should be notified.
- tracker->DatabaseModified(kOrigin1, kDB1);
- CheckNotificationReceived(&observer1, kOrigin1, kDB1, 0, origin1_quota);
- CheckNotificationReceived(&observer2, kOrigin1, kDB1, 0, origin1_quota);
-
- // Write some data to each file and check that the listeners are
- // called with the appropriate values.
- 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(4, file_util::WriteFile(
- tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4));
- tracker->DatabaseModified(kOrigin1, kDB1);
- CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 1);
- CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 1);
- tracker->DatabaseModified(kOrigin2, kDB2);
- CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2, origin2_quota - 2);
- CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2, origin2_quota - 2);
- tracker->DatabaseModified(kOrigin1, kDB3);
- CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4, origin1_quota - 5);
- CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4, origin1_quota - 5);
-
- // Make sure the available space for kOrigin1 and kOrigin2 changed accordingly
- EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1));
- EXPECT_EQ(origin2_quota - 2, tracker->GetOriginSpaceAvailable(kOrigin2));
-
- // Close all databases
- tracker->DatabaseClosed(kOrigin1, kDB1);
- tracker->DatabaseClosed(kOrigin2, kDB2);
- tracker->DatabaseClosed(kOrigin1, kDB3);
-
- // Open an existing database and check the reported size
- tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
- &database_size, &space_available);
- EXPECT_EQ(1, database_size);
- EXPECT_EQ(origin1_quota - 5, space_available);
-
- // Make sure that the observers are notified even if
- // the size of the database hasn't changed.
- EXPECT_EQ(1, file_util::WriteFile(
- tracker->GetFullDBFilePath(kOrigin1, kDB1), "b", 1));
- tracker->DatabaseModified(kOrigin1, kDB1);
- CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 5);
- CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 5);
- tracker->DatabaseClosed(kOrigin1, kDB1);
-
- // Remove an observer; this should clear all caches.
- tracker->RemoveObserver(&observer2);
-
- // Change kDB1's and kDB3's size and call tracker->DatabaseModified()
- // for kDB1 only. If the caches were indeed cleared, then calling
- // tracker->DatabaseModified() should re-populate the cache for
- // kOrigin1 == kOrigin1, and thus, should pick up kDB3's size change too.
- EXPECT_EQ(5, file_util::WriteFile(
- tracker->GetFullDBFilePath(kOrigin1, kDB1), "ccccc", 5));
- EXPECT_EQ(6, file_util::WriteFile(
- tracker->GetFullDBFilePath(kOrigin1, kDB3), "dddddd", 6));
- tracker->DatabaseModified(kOrigin1, kDB1);
- CheckNotificationReceived(&observer1, kOrigin1, kDB1, 5, origin1_quota - 11);
- EXPECT_FALSE(observer2.DidReceiveNewNotification());
- EXPECT_EQ(origin1_quota - 11, tracker->GetOriginSpaceAvailable(kOrigin1));
-
- // Close the tracker database and clear all caches.
- // Then make sure that DatabaseOpened() still returns the correct result.
- tracker->CloseTrackerDatabaseAndClearCaches();
- tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
- &database_size, &space_available);
- EXPECT_EQ(5, database_size);
- EXPECT_EQ(origin1_quota - 11, space_available);
-
- // Close the tracker database and clear all caches. Then make sure that
- // DatabaseModified() still calls the observers with correct values.
- tracker->CloseTrackerDatabaseAndClearCaches();
- tracker->DatabaseModified(kOrigin1, kDB3);
- CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6, origin1_quota - 11);
- tracker->DatabaseClosed(kOrigin1, kDB1);
-
- // Remove all observers.
- tracker->RemoveObserver(&observer1);
-
- // Trying to delete a database in use should fail
- tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0,
- &database_size, &space_available);
- 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->DeleteClosedDatabase(kOrigin1, kDB3));
- origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
- EXPECT_TRUE(origin1_info);
- EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1));
- EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1));
- EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3));
-
- // Get all data for all origins
- std::vector<OriginInfo> origins_info;
- EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
- EXPECT_EQ(size_t(2), origins_info.size());
- EXPECT_EQ(kOrigin1, origins_info[0].GetOrigin());
- EXPECT_EQ(5, origins_info[0].TotalSize());
- EXPECT_EQ(origin1_quota, origins_info[0].Quota());
- EXPECT_EQ(5, origins_info[0].GetDatabaseSize(kDB1));
- EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3));
-
- EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin());
- EXPECT_EQ(2, origins_info[1].TotalSize());
- EXPECT_EQ(origin2_quota, origins_info[1].Quota());
-
- // Trying to delete an origin with databases in use should fail
- tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0,
- &database_size, &space_available);
- EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1));
- origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
- EXPECT_TRUE(origin1_info);
- EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1));
- tracker->DatabaseClosed(kOrigin1, kDB1);
-
- // Delete an origin that doesn't have any database in use
- EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1));
- origins_info.clear();
- EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info));
- EXPECT_EQ(size_t(1), origins_info.size());
- EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin());
-
- origin1_info = tracker->GetCachedOriginInfo(kOrigin1);
- EXPECT_TRUE(origin1_info);
- EXPECT_EQ(origin1_quota, origin1_info->Quota());
- EXPECT_EQ(0, origin1_info->TotalSize());
- EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1));
+ DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false);
}
-TEST(DatabaseTrackerTest, NoInitIncognito) {
- const string16 kOrigin = ASCIIToUTF16("origin");
- const string16 kName = ASCIIToUTF16("name");
- const string16 kDescription = ASCIIToUTF16("description");
- const DatabaseConnections kEmptyCollection;
-
- std::vector<OriginInfo> infos;
- scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(FilePath()));
- EXPECT_TRUE(tracker->is_incognito_);
- EXPECT_FALSE(tracker->LazyInit());
- EXPECT_TRUE(tracker->DatabaseDirectory().empty());
- EXPECT_TRUE(tracker->GetFullDBFilePath(kOrigin, kName).empty());
- EXPECT_FALSE(tracker->GetAllOriginsInfo(&infos));
- EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOrigin, kName));
- EXPECT_EQ(net::ERR_FAILED,
- tracker->DeleteDatabase(kOrigin, kName, NULL));
- EXPECT_EQ(net::ERR_FAILED,
- tracker->DeleteDataModifiedSince(base::Time(), NULL));
- EXPECT_EQ(net::ERR_FAILED,
- tracker->DeleteDataForOrigin(kOrigin, NULL));
-
- // These should not assert or crash when called in this state.
- int64 size_out(0), space_available_out(0);
- tracker->DatabaseOpened(kOrigin, kName, kDescription, 1,
- &size_out, &space_available_out);
- tracker->DatabaseModified(kOrigin, kName);
- tracker->DatabaseClosed(kOrigin, kName);
- tracker->CloseDatabases(kEmptyCollection);
- tracker->CloseTrackerDatabaseAndClearCaches();
- tracker->SetOriginQuota(kOrigin, 5);
- tracker->SetOriginQuotaInMemory(kOrigin, 5);
- tracker->ResetOriginQuotaInMemory(kOrigin);
+TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) {
+ DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true);
}
} // namespace webkit_database