Index: webkit/database/database_tracker_unittest.cc |
=================================================================== |
--- webkit/database/database_tracker_unittest.cc (revision 0) |
+++ webkit/database/database_tracker_unittest.cc (revision 0) |
@@ -0,0 +1,175 @@ |
+// Copyright (c) 2009 The Chromium Authos. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/file_path.h" |
+#include "base/file_util.h" |
+#include "base/scoped_ptr.h" |
+#include "base/scoped_temp_dir.h" |
+#include "base/string_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "webkit/database/database_tracker.h" |
+ |
+namespace { |
+ |
+class TestObserver : public webkit_database::DatabaseTracker::Observer { |
+ public: |
+ TestObserver() : new_notification_received_(false) {} |
+ virtual ~TestObserver() {} |
+ virtual void OnDatabaseSizeChanged(const string16& origin_identifier, |
+ const string16& database_name, |
+ int64 database_size, |
+ int64 space_available) { |
+ new_notification_received_ = true; |
+ origin_identifier_ = origin_identifier; |
+ database_name_ = database_name; |
+ database_size_ = database_size; |
+ space_available_ = space_available; |
+ } |
+ bool DidReceiveNewNotification() { |
+ bool temp_new_notification_received = new_notification_received_; |
+ new_notification_received_ = false; |
+ return temp_new_notification_received; |
+ } |
+ string16 GetNotificationOriginIdentifier() { return origin_identifier_; } |
+ string16 GetNotificationDatabaseName() { return database_name_; } |
+ int64 GetNotificationDatabaseSize() { return database_size_; } |
+ int64 GetNotificationSpaceAvailable() { return space_available_; } |
+ |
+ private: |
+ bool new_notification_received_; |
+ string16 origin_identifier_; |
+ string16 database_name_; |
+ int64 database_size_; |
+ int64 space_available_; |
+}; |
+ |
+void CheckNotificationReceived(TestObserver* observer, |
+ const string16& expected_origin_identifier, |
+ const string16& expected_database_name, |
+ int64 expected_database_size, |
+ int64 expected_space_available) { |
+ EXPECT_TRUE(observer->DidReceiveNewNotification()); |
+ EXPECT_EQ(expected_origin_identifier, |
+ observer->GetNotificationOriginIdentifier()); |
+ EXPECT_EQ(expected_database_name, |
+ observer->GetNotificationDatabaseName()); |
+ EXPECT_EQ(expected_database_size, |
+ observer->GetNotificationDatabaseSize()); |
+ EXPECT_EQ(expected_space_available, |
+ observer->GetNotificationSpaceAvailable()); |
+} |
+ |
+} // namespace |
+ |
+namespace webkit_database { |
+ |
+TEST(DatabaseTrackerTest, TestIt) { |
+ // Initialize the tracker database. |
+ ScopedTempDir temp_dir; |
+ EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
+ scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); |
+ |
+ // Get the default quota for all origins. |
+ const int64 kDefaultQuota = tracker->GetOriginQuota(EmptyString16()); |
+ |
+ // 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("kOrigin1"); |
+ const string16 kOrigin2 = ASCIIToUTF16("kOrigin2"); |
+ const string16 kDB1 = ASCIIToUTF16("kDB1"); |
+ const string16 kDB2 = ASCIIToUTF16("kDB2"); |
+ const string16 kDB3 = ASCIIToUTF16("kDB3"); |
+ const string16 kDescription = ASCIIToUTF16("database_kDescription"); |
+ tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
+ &database_size, &space_available); |
+ EXPECT_EQ(0, database_size); |
+ EXPECT_EQ(kDefaultQuota, space_available); |
+ tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
+ &database_size, &space_available); |
+ EXPECT_EQ(0, database_size); |
+ EXPECT_EQ(kDefaultQuota, space_available); |
+ tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
+ &database_size, &space_available); |
+ EXPECT_EQ(0, database_size); |
+ EXPECT_EQ(kDefaultQuota, 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, kDefaultQuota); |
+ CheckNotificationReceived(&observer2, kOrigin1, kDB1, 0, kDefaultQuota); |
+ |
+ // Write some data to each file and check that the listeners are |
+ // called with the appropriate values. |
+ 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, kDefaultQuota - 1); |
+ CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, kDefaultQuota - 1); |
+ tracker->DatabaseModified(kOrigin2, kDB2); |
+ CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2, kDefaultQuota - 2); |
+ CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2, kDefaultQuota - 2); |
+ tracker->DatabaseModified(kOrigin1, kDB3); |
+ CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4, kDefaultQuota - 5); |
+ CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4, kDefaultQuota - 5); |
+ |
+ // 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(kDefaultQuota - 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, kDefaultQuota - 5); |
+ CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, kDefaultQuota - 5); |
+ |
+ // 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, kDefaultQuota - 11); |
+ EXPECT_FALSE(observer2.DidReceiveNewNotification()); |
+ |
+ // 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(kDefaultQuota - 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, kDefaultQuota - 11); |
+ |
+ // Clean up. |
+ tracker->RemoveObserver(&observer1); |
+} |
+ |
+} // namespace webkit_database |
Property changes on: webkit\database\database_tracker_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |