OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/file_path.h" | 5 #include "base/file_path.h" |
6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
7 #include "base/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
8 #include "base/scoped_temp_dir.h" | 8 #include "base/scoped_temp_dir.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/time.h" |
| 11 #include "net/base/test_completion_callback.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
11 #include "webkit/database/database_tracker.h" | 13 #include "webkit/database/database_tracker.h" |
12 | 14 |
13 namespace { | 15 namespace { |
14 | 16 |
15 class TestObserver : public webkit_database::DatabaseTracker::Observer { | 17 class TestObserver : public webkit_database::DatabaseTracker::Observer { |
16 public: | 18 public: |
17 TestObserver() : new_notification_received_(false) {} | 19 TestObserver() : new_notification_received_(false) {} |
18 virtual ~TestObserver() {} | 20 virtual ~TestObserver() {} |
19 virtual void OnDatabaseSizeChanged(const string16& origin_identifier, | 21 virtual void OnDatabaseSizeChanged(const string16& origin_identifier, |
20 const string16& database_name, | 22 const string16& database_name, |
21 int64 database_size, | 23 int64 database_size, |
22 int64 space_available) { | 24 int64 space_available) { |
23 new_notification_received_ = true; | 25 new_notification_received_ = true; |
24 origin_identifier_ = origin_identifier; | 26 origin_identifier_ = origin_identifier; |
25 database_name_ = database_name; | 27 database_name_ = database_name; |
26 database_size_ = database_size; | 28 database_size_ = database_size; |
27 space_available_ = space_available; | 29 space_available_ = space_available; |
28 } | 30 } |
29 virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, | 31 virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, |
30 const string16& database_name) { | 32 const string16& database_name) { |
| 33 new_notification_received_ = true; |
| 34 origin_identifier_ = origin_identifier; |
| 35 database_name_ = database_name; |
31 } | 36 } |
32 bool DidReceiveNewNotification() { | 37 bool DidReceiveNewNotification() { |
33 bool temp_new_notification_received = new_notification_received_; | 38 bool temp_new_notification_received = new_notification_received_; |
34 new_notification_received_ = false; | 39 new_notification_received_ = false; |
35 return temp_new_notification_received; | 40 return temp_new_notification_received; |
36 } | 41 } |
37 string16 GetNotificationOriginIdentifier() { return origin_identifier_; } | 42 string16 GetNotificationOriginIdentifier() { return origin_identifier_; } |
38 string16 GetNotificationDatabaseName() { return database_name_; } | 43 string16 GetNotificationDatabaseName() { return database_name_; } |
39 int64 GetNotificationDatabaseSize() { return database_size_; } | 44 int64 GetNotificationDatabaseSize() { return database_size_; } |
40 int64 GetNotificationSpaceAvailable() { return space_available_; } | 45 int64 GetNotificationSpaceAvailable() { return space_available_; } |
(...skipping 19 matching lines...) Expand all Loading... |
60 EXPECT_EQ(expected_database_size, | 65 EXPECT_EQ(expected_database_size, |
61 observer->GetNotificationDatabaseSize()); | 66 observer->GetNotificationDatabaseSize()); |
62 EXPECT_EQ(expected_space_available, | 67 EXPECT_EQ(expected_space_available, |
63 observer->GetNotificationSpaceAvailable()); | 68 observer->GetNotificationSpaceAvailable()); |
64 } | 69 } |
65 | 70 |
66 } // namespace | 71 } // namespace |
67 | 72 |
68 namespace webkit_database { | 73 namespace webkit_database { |
69 | 74 |
| 75 TEST(DatabaseTrackerTest, DeleteOpenDatabase) { |
| 76 // Initialize the tracker database. |
| 77 ScopedTempDir temp_dir; |
| 78 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 79 scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); |
| 80 |
| 81 // Create and open three databases. |
| 82 int64 database_size = 0; |
| 83 int64 space_available = 0; |
| 84 const string16 kOrigin1 = ASCIIToUTF16("origin1"); |
| 85 const string16 kOrigin2 = ASCIIToUTF16("origin2"); |
| 86 const string16 kDB1 = ASCIIToUTF16("db1"); |
| 87 const string16 kDB2 = ASCIIToUTF16("db2"); |
| 88 const string16 kDB3 = ASCIIToUTF16("db3"); |
| 89 const string16 kDescription = ASCIIToUTF16("database_description"); |
| 90 |
| 91 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 92 &database_size, &space_available); |
| 93 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
| 94 &database_size, &space_available); |
| 95 tracker->DatabaseOpened(kOrigin2, kDB3, kDescription, 0, |
| 96 &database_size, &space_available); |
| 97 |
| 98 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 99 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
| 100 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 101 FilePath::FromWStringHack(UTF16ToWide(kOrigin2))))); |
| 102 EXPECT_EQ(1, file_util::WriteFile( |
| 103 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
| 104 EXPECT_EQ(2, file_util::WriteFile( |
| 105 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); |
| 106 EXPECT_EQ(3, file_util::WriteFile( |
| 107 tracker->GetFullDBFilePath(kOrigin2, kDB3), "aaa", 3)); |
| 108 tracker->DatabaseModified(kOrigin1, kDB1); |
| 109 tracker->DatabaseModified(kOrigin2, kDB2); |
| 110 tracker->DatabaseModified(kOrigin2, kDB3); |
| 111 |
| 112 // Delete db1. Should also delete origin1. |
| 113 TestObserver observer; |
| 114 tracker->AddObserver(&observer); |
| 115 TestCompletionCallback callback; |
| 116 int result = tracker->DeleteDatabase(kOrigin1, kDB1, &callback); |
| 117 EXPECT_EQ(net::ERR_IO_PENDING, result); |
| 118 ASSERT_FALSE(callback.have_result()); |
| 119 EXPECT_TRUE(observer.DidReceiveNewNotification()); |
| 120 EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier()); |
| 121 EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName()); |
| 122 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 123 result = callback.GetResult(result); |
| 124 EXPECT_EQ(net::OK, result); |
| 125 EXPECT_FALSE(file_util::PathExists(tracker->DatabaseDirectory().Append( |
| 126 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
| 127 |
| 128 // Recreate db1. |
| 129 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 130 &database_size, &space_available); |
| 131 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 132 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
| 133 EXPECT_EQ(1, file_util::WriteFile( |
| 134 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
| 135 tracker->DatabaseModified(kOrigin1, kDB1); |
| 136 |
| 137 // Setup file modification times. db1 and db2 are modified now, db3 three |
| 138 // days ago. |
| 139 EXPECT_TRUE(file_util::SetLastModifiedTime( |
| 140 tracker->GetFullDBFilePath(kOrigin1, kDB1), base::Time::Now())); |
| 141 EXPECT_TRUE(file_util::SetLastModifiedTime( |
| 142 tracker->GetFullDBFilePath(kOrigin2, kDB2), base::Time::Now())); |
| 143 base::Time three_days_ago = base::Time::Now(); |
| 144 three_days_ago -= base::TimeDelta::FromDays(3); |
| 145 EXPECT_TRUE(file_util::SetLastModifiedTime( |
| 146 tracker->GetFullDBFilePath(kOrigin2, kDB3), three_days_ago)); |
| 147 |
| 148 // Delete databases modified since yesterday. |
| 149 base::Time yesterday = base::Time::Now(); |
| 150 yesterday -= base::TimeDelta::FromDays(1); |
| 151 result = tracker->DeleteDataModifiedSince(yesterday, &callback); |
| 152 EXPECT_EQ(net::ERR_IO_PENDING, result); |
| 153 ASSERT_FALSE(callback.have_result()); |
| 154 EXPECT_TRUE(observer.DidReceiveNewNotification()); |
| 155 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 156 tracker->DatabaseClosed(kOrigin2, kDB2); |
| 157 result = callback.GetResult(result); |
| 158 EXPECT_EQ(net::OK, result); |
| 159 EXPECT_FALSE(file_util::PathExists(tracker->DatabaseDirectory().Append( |
| 160 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
| 161 EXPECT_FALSE( |
| 162 file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2))); |
| 163 EXPECT_TRUE( |
| 164 file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB3))); |
| 165 |
| 166 tracker->DatabaseClosed(kOrigin2, kDB3); |
| 167 tracker->RemoveObserver(&observer); |
| 168 } |
| 169 |
70 TEST(DatabaseTrackerTest, TestIt) { | 170 TEST(DatabaseTrackerTest, TestIt) { |
71 // Initialize the tracker database. | 171 // Initialize the tracker database. |
72 ScopedTempDir temp_dir; | 172 ScopedTempDir temp_dir; |
73 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); | 173 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
74 scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); | 174 scoped_refptr<DatabaseTracker> tracker(new DatabaseTracker(temp_dir.path())); |
75 | 175 |
76 // Add two observers. | 176 // Add two observers. |
77 TestObserver observer1; | 177 TestObserver observer1; |
78 TestObserver observer2; | 178 TestObserver observer2; |
79 tracker->AddObserver(&observer1); | 179 tracker->AddObserver(&observer1); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 tracker->DatabaseModified(kOrigin1, kDB3); | 303 tracker->DatabaseModified(kOrigin1, kDB3); |
204 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6, origin1_quota - 11); | 304 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6, origin1_quota - 11); |
205 tracker->DatabaseClosed(kOrigin1, kDB1); | 305 tracker->DatabaseClosed(kOrigin1, kDB1); |
206 | 306 |
207 // Remove all observers. | 307 // Remove all observers. |
208 tracker->RemoveObserver(&observer1); | 308 tracker->RemoveObserver(&observer1); |
209 | 309 |
210 // Trying to delete a database in use should fail | 310 // Trying to delete a database in use should fail |
211 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, | 311 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
212 &database_size, &space_available); | 312 &database_size, &space_available); |
213 EXPECT_FALSE(tracker->DeleteDatabase(kOrigin1, kDB3)); | 313 EXPECT_FALSE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); |
214 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 314 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
215 EXPECT_TRUE(origin1_info); | 315 EXPECT_TRUE(origin1_info); |
216 EXPECT_EQ(6, origin1_info->GetDatabaseSize(kDB3)); | 316 EXPECT_EQ(6, origin1_info->GetDatabaseSize(kDB3)); |
217 tracker->DatabaseClosed(kOrigin1, kDB3); | 317 tracker->DatabaseClosed(kOrigin1, kDB3); |
218 | 318 |
219 // Delete a database and make sure the space used by that origin is updated | 319 // Delete a database and make sure the space used by that origin is updated |
220 EXPECT_TRUE(tracker->DeleteDatabase(kOrigin1, kDB3)); | 320 EXPECT_TRUE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); |
221 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 321 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
222 EXPECT_TRUE(origin1_info); | 322 EXPECT_TRUE(origin1_info); |
223 EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); | 323 EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); |
224 EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1)); | 324 EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1)); |
225 EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3)); | 325 EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3)); |
226 | 326 |
227 // Get all data for all origins | 327 // Get all data for all origins |
228 std::vector<OriginInfo> origins_info; | 328 std::vector<OriginInfo> origins_info; |
229 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); | 329 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
230 EXPECT_EQ(size_t(2), origins_info.size()); | 330 EXPECT_EQ(size_t(2), origins_info.size()); |
(...skipping 24 matching lines...) Expand all Loading... |
255 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); | 355 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); |
256 | 356 |
257 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 357 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
258 EXPECT_TRUE(origin1_info); | 358 EXPECT_TRUE(origin1_info); |
259 EXPECT_EQ(origin1_quota, origin1_info->Quota()); | 359 EXPECT_EQ(origin1_quota, origin1_info->Quota()); |
260 EXPECT_EQ(0, origin1_info->TotalSize()); | 360 EXPECT_EQ(0, origin1_info->TotalSize()); |
261 EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1)); | 361 EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1)); |
262 } | 362 } |
263 | 363 |
264 } // namespace webkit_database | 364 } // namespace webkit_database |
OLD | NEW |