| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/scoped_temp_dir.h" | 8 #include "base/scoped_temp_dir.h" |
| 9 #include "base/time.h" | 9 #include "base/time.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 return false; | 35 return false; |
| 36 } | 36 } |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 class TestObserver : public webkit_database::DatabaseTracker::Observer { | 39 class TestObserver : public webkit_database::DatabaseTracker::Observer { |
| 40 public: | 40 public: |
| 41 TestObserver() : new_notification_received_(false) {} | 41 TestObserver() : new_notification_received_(false) {} |
| 42 virtual ~TestObserver() {} | 42 virtual ~TestObserver() {} |
| 43 virtual void OnDatabaseSizeChanged(const string16& origin_identifier, | 43 virtual void OnDatabaseSizeChanged(const string16& origin_identifier, |
| 44 const string16& database_name, | 44 const string16& database_name, |
| 45 int64 database_size, | 45 int64 database_size) { |
| 46 int64 space_available) { | |
| 47 new_notification_received_ = true; | 46 new_notification_received_ = true; |
| 48 origin_identifier_ = origin_identifier; | 47 origin_identifier_ = origin_identifier; |
| 49 database_name_ = database_name; | 48 database_name_ = database_name; |
| 50 database_size_ = database_size; | 49 database_size_ = database_size; |
| 51 space_available_ = space_available; | |
| 52 } | 50 } |
| 53 virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, | 51 virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, |
| 54 const string16& database_name) { | 52 const string16& database_name) { |
| 55 new_notification_received_ = true; | 53 new_notification_received_ = true; |
| 56 origin_identifier_ = origin_identifier; | 54 origin_identifier_ = origin_identifier; |
| 57 database_name_ = database_name; | 55 database_name_ = database_name; |
| 58 } | 56 } |
| 59 bool DidReceiveNewNotification() { | 57 bool DidReceiveNewNotification() { |
| 60 bool temp_new_notification_received = new_notification_received_; | 58 bool temp_new_notification_received = new_notification_received_; |
| 61 new_notification_received_ = false; | 59 new_notification_received_ = false; |
| 62 return temp_new_notification_received; | 60 return temp_new_notification_received; |
| 63 } | 61 } |
| 64 string16 GetNotificationOriginIdentifier() { return origin_identifier_; } | 62 string16 GetNotificationOriginIdentifier() { return origin_identifier_; } |
| 65 string16 GetNotificationDatabaseName() { return database_name_; } | 63 string16 GetNotificationDatabaseName() { return database_name_; } |
| 66 int64 GetNotificationDatabaseSize() { return database_size_; } | 64 int64 GetNotificationDatabaseSize() { return database_size_; } |
| 67 int64 GetNotificationSpaceAvailable() { return space_available_; } | |
| 68 | 65 |
| 69 private: | 66 private: |
| 70 bool new_notification_received_; | 67 bool new_notification_received_; |
| 71 string16 origin_identifier_; | 68 string16 origin_identifier_; |
| 72 string16 database_name_; | 69 string16 database_name_; |
| 73 int64 database_size_; | 70 int64 database_size_; |
| 74 int64 space_available_; | |
| 75 }; | 71 }; |
| 76 | 72 |
| 77 void CheckNotificationReceived(TestObserver* observer, | 73 void CheckNotificationReceived(TestObserver* observer, |
| 78 const string16& expected_origin_identifier, | 74 const string16& expected_origin_identifier, |
| 79 const string16& expected_database_name, | 75 const string16& expected_database_name, |
| 80 int64 expected_database_size, | 76 int64 expected_database_size) { |
| 81 int64 expected_space_available) { | |
| 82 EXPECT_TRUE(observer->DidReceiveNewNotification()); | 77 EXPECT_TRUE(observer->DidReceiveNewNotification()); |
| 83 EXPECT_EQ(expected_origin_identifier, | 78 EXPECT_EQ(expected_origin_identifier, |
| 84 observer->GetNotificationOriginIdentifier()); | 79 observer->GetNotificationOriginIdentifier()); |
| 85 EXPECT_EQ(expected_database_name, | 80 EXPECT_EQ(expected_database_name, |
| 86 observer->GetNotificationDatabaseName()); | 81 observer->GetNotificationDatabaseName()); |
| 87 EXPECT_EQ(expected_database_size, | 82 EXPECT_EQ(expected_database_size, |
| 88 observer->GetNotificationDatabaseSize()); | 83 observer->GetNotificationDatabaseSize()); |
| 89 EXPECT_EQ(expected_space_available, | |
| 90 observer->GetNotificationSpaceAvailable()); | |
| 91 } | 84 } |
| 92 | 85 |
| 93 class TestQuotaManagerProxy : public quota::QuotaManagerProxy { | 86 class TestQuotaManagerProxy : public quota::QuotaManagerProxy { |
| 94 public: | 87 public: |
| 95 TestQuotaManagerProxy() | 88 TestQuotaManagerProxy() |
| 96 : QuotaManagerProxy(NULL, NULL), | 89 : QuotaManagerProxy(NULL, NULL), |
| 97 registered_client_(NULL) { | 90 registered_client_(NULL) { |
| 98 } | 91 } |
| 99 | 92 |
| 100 virtual ~TestQuotaManagerProxy() { | 93 virtual ~TestQuotaManagerProxy() { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 // Initialize the tracker database. | 183 // Initialize the tracker database. |
| 191 ScopedTempDir temp_dir; | 184 ScopedTempDir temp_dir; |
| 192 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 185 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 193 scoped_refptr<DatabaseTracker> tracker( | 186 scoped_refptr<DatabaseTracker> tracker( |
| 194 new DatabaseTracker(temp_dir.path(), incognito_mode, | 187 new DatabaseTracker(temp_dir.path(), incognito_mode, |
| 195 new TestSpecialStoragePolicy, | 188 new TestSpecialStoragePolicy, |
| 196 NULL, NULL)); | 189 NULL, NULL)); |
| 197 | 190 |
| 198 // Create and open three databases. | 191 // Create and open three databases. |
| 199 int64 database_size = 0; | 192 int64 database_size = 0; |
| 200 int64 space_available = 0; | |
| 201 const string16 kOrigin1 = | 193 const string16 kOrigin1 = |
| 202 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); | 194 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); |
| 203 const string16 kOrigin2 = | 195 const string16 kOrigin2 = |
| 204 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); | 196 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); |
| 205 const string16 kDB1 = ASCIIToUTF16("db1"); | 197 const string16 kDB1 = ASCIIToUTF16("db1"); |
| 206 const string16 kDB2 = ASCIIToUTF16("db2"); | 198 const string16 kDB2 = ASCIIToUTF16("db2"); |
| 207 const string16 kDB3 = ASCIIToUTF16("db3"); | 199 const string16 kDB3 = ASCIIToUTF16("db3"); |
| 208 const string16 kDescription = ASCIIToUTF16("database_description"); | 200 const string16 kDescription = ASCIIToUTF16("database_description"); |
| 209 | 201 |
| 210 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 202 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 211 &database_size, &space_available); | 203 &database_size); |
| 212 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, | 204 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
| 213 &database_size, &space_available); | 205 &database_size); |
| 214 tracker->DatabaseOpened(kOrigin2, kDB3, kDescription, 0, | 206 tracker->DatabaseOpened(kOrigin2, kDB3, kDescription, 0, |
| 215 &database_size, &space_available); | 207 &database_size); |
| 216 | 208 |
| 217 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 209 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 218 FilePath::FromWStringHack(UTF16ToWide( | 210 FilePath::FromWStringHack(UTF16ToWide( |
| 219 tracker->GetOriginDirectory(kOrigin1)))))); | 211 tracker->GetOriginDirectory(kOrigin1)))))); |
| 220 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 212 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 221 FilePath::FromWStringHack(UTF16ToWide( | 213 FilePath::FromWStringHack(UTF16ToWide( |
| 222 tracker->GetOriginDirectory(kOrigin2)))))); | 214 tracker->GetOriginDirectory(kOrigin2)))))); |
| 223 EXPECT_EQ(1, file_util::WriteFile( | 215 EXPECT_EQ(1, file_util::WriteFile( |
| 224 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); | 216 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
| 225 EXPECT_EQ(2, file_util::WriteFile( | 217 EXPECT_EQ(2, file_util::WriteFile( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 241 EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier()); | 233 EXPECT_EQ(kOrigin1, observer.GetNotificationOriginIdentifier()); |
| 242 EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName()); | 234 EXPECT_EQ(kDB1, observer.GetNotificationDatabaseName()); |
| 243 tracker->DatabaseClosed(kOrigin1, kDB1); | 235 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 244 result = callback.GetResult(result); | 236 result = callback.GetResult(result); |
| 245 EXPECT_EQ(net::OK, result); | 237 EXPECT_EQ(net::OK, result); |
| 246 EXPECT_FALSE(file_util::PathExists(tracker->DatabaseDirectory().Append( | 238 EXPECT_FALSE(file_util::PathExists(tracker->DatabaseDirectory().Append( |
| 247 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); | 239 FilePath::FromWStringHack(UTF16ToWide(kOrigin1))))); |
| 248 | 240 |
| 249 // Recreate db1. | 241 // Recreate db1. |
| 250 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 242 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 251 &database_size, &space_available); | 243 &database_size); |
| 252 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 244 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 253 FilePath::FromWStringHack(UTF16ToWide( | 245 FilePath::FromWStringHack(UTF16ToWide( |
| 254 tracker->GetOriginDirectory(kOrigin1)))))); | 246 tracker->GetOriginDirectory(kOrigin1)))))); |
| 255 EXPECT_EQ(1, file_util::WriteFile( | 247 EXPECT_EQ(1, file_util::WriteFile( |
| 256 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); | 248 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
| 257 tracker->DatabaseModified(kOrigin1, kDB1); | 249 tracker->DatabaseModified(kOrigin1, kDB1); |
| 258 | 250 |
| 259 // Setup file modification times. db1 and db2 are modified now, db3 three | 251 // Setup file modification times. db1 and db2 are modified now, db3 three |
| 260 // days ago. | 252 // days ago. |
| 261 EXPECT_TRUE(file_util::SetLastModifiedTime( | 253 EXPECT_TRUE(file_util::SetLastModifiedTime( |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 NULL, NULL)); | 292 NULL, NULL)); |
| 301 | 293 |
| 302 // Add two observers. | 294 // Add two observers. |
| 303 TestObserver observer1; | 295 TestObserver observer1; |
| 304 TestObserver observer2; | 296 TestObserver observer2; |
| 305 tracker->AddObserver(&observer1); | 297 tracker->AddObserver(&observer1); |
| 306 tracker->AddObserver(&observer2); | 298 tracker->AddObserver(&observer2); |
| 307 | 299 |
| 308 // Open three new databases. | 300 // Open three new databases. |
| 309 int64 database_size = 0; | 301 int64 database_size = 0; |
| 310 int64 space_available = 0; | |
| 311 const string16 kOrigin1 = | 302 const string16 kOrigin1 = |
| 312 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); | 303 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); |
| 313 const string16 kOrigin2 = | 304 const string16 kOrigin2 = |
| 314 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); | 305 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); |
| 315 const string16 kDB1 = ASCIIToUTF16("db1"); | 306 const string16 kDB1 = ASCIIToUTF16("db1"); |
| 316 const string16 kDB2 = ASCIIToUTF16("db2"); | 307 const string16 kDB2 = ASCIIToUTF16("db2"); |
| 317 const string16 kDB3 = ASCIIToUTF16("db3"); | 308 const string16 kDB3 = ASCIIToUTF16("db3"); |
| 318 const string16 kDescription = ASCIIToUTF16("database_description"); | 309 const string16 kDescription = ASCIIToUTF16("database_description"); |
| 319 | 310 |
| 320 // Get the quota for kOrigin1 and kOrigin2 | 311 // Get the info for kOrigin1 and kOrigin2 |
| 321 DatabaseTracker::CachedOriginInfo* origin1_info = | 312 DatabaseTracker::CachedOriginInfo* origin1_info = |
| 322 tracker->GetCachedOriginInfo(kOrigin1); | 313 tracker->GetCachedOriginInfo(kOrigin1); |
| 323 DatabaseTracker::CachedOriginInfo* origin2_info = | 314 DatabaseTracker::CachedOriginInfo* origin2_info = |
| 324 tracker->GetCachedOriginInfo(kOrigin1); | 315 tracker->GetCachedOriginInfo(kOrigin1); |
| 325 EXPECT_TRUE(origin1_info); | 316 EXPECT_TRUE(origin1_info); |
| 326 EXPECT_TRUE(origin2_info); | 317 EXPECT_TRUE(origin2_info); |
| 327 int64 origin1_quota = origin1_info->Quota(); | |
| 328 int64 origin2_quota = origin2_info->Quota(); | |
| 329 EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1)); | |
| 330 EXPECT_EQ(origin2_quota, tracker->GetOriginSpaceAvailable(kOrigin2)); | |
| 331 | 318 |
| 332 // Set a new quota for kOrigin1 | |
| 333 origin1_quota *= 2; | |
| 334 tracker->SetOriginQuota(kOrigin1, origin1_quota); | |
| 335 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | |
| 336 EXPECT_TRUE(origin1_info); | |
| 337 EXPECT_EQ(origin1_quota, origin1_info->Quota()); | |
| 338 | 319 |
| 339 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 320 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 340 &database_size, &space_available); | 321 &database_size); |
| 341 EXPECT_EQ(0, database_size); | 322 EXPECT_EQ(0, database_size); |
| 342 EXPECT_EQ(origin1_quota, space_available); | |
| 343 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, | 323 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
| 344 &database_size, &space_available); | 324 &database_size); |
| 345 EXPECT_EQ(0, database_size); | 325 EXPECT_EQ(0, database_size); |
| 346 EXPECT_EQ(origin2_quota, space_available); | |
| 347 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, | 326 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
| 348 &database_size, &space_available); | 327 &database_size); |
| 349 EXPECT_EQ(0, database_size); | 328 EXPECT_EQ(0, database_size); |
| 350 EXPECT_EQ(origin1_quota, space_available); | |
| 351 | |
| 352 // Tell the tracker that a database has changed. | |
| 353 // Even though nothing has changed, the observers should be notified. | |
| 354 tracker->DatabaseModified(kOrigin1, kDB1); | |
| 355 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 0, origin1_quota); | |
| 356 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 0, origin1_quota); | |
| 357 | 329 |
| 358 // Write some data to each file and check that the listeners are | 330 // Write some data to each file and check that the listeners are |
| 359 // called with the appropriate values. | 331 // called with the appropriate values. |
| 360 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 332 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 361 FilePath::FromWStringHack(UTF16ToWide( | 333 FilePath::FromWStringHack(UTF16ToWide( |
| 362 tracker->GetOriginDirectory(kOrigin1)))))); | 334 tracker->GetOriginDirectory(kOrigin1)))))); |
| 363 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | 335 EXPECT_TRUE(file_util::CreateDirectory(tracker->DatabaseDirectory().Append( |
| 364 FilePath::FromWStringHack(UTF16ToWide( | 336 FilePath::FromWStringHack(UTF16ToWide( |
| 365 tracker->GetOriginDirectory(kOrigin2)))))); | 337 tracker->GetOriginDirectory(kOrigin2)))))); |
| 366 EXPECT_EQ(1, file_util::WriteFile( | 338 EXPECT_EQ(1, file_util::WriteFile( |
| 367 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); | 339 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); |
| 368 EXPECT_EQ(2, file_util::WriteFile( | 340 EXPECT_EQ(2, file_util::WriteFile( |
| 369 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); | 341 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); |
| 370 EXPECT_EQ(4, file_util::WriteFile( | 342 EXPECT_EQ(4, file_util::WriteFile( |
| 371 tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4)); | 343 tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4)); |
| 372 tracker->DatabaseModified(kOrigin1, kDB1); | 344 tracker->DatabaseModified(kOrigin1, kDB1); |
| 373 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 1); | 345 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1); |
| 374 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 1); | 346 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1); |
| 375 tracker->DatabaseModified(kOrigin2, kDB2); | 347 tracker->DatabaseModified(kOrigin2, kDB2); |
| 376 CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2, origin2_quota - 2); | 348 CheckNotificationReceived(&observer1, kOrigin2, kDB2, 2); |
| 377 CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2, origin2_quota - 2); | 349 CheckNotificationReceived(&observer2, kOrigin2, kDB2, 2); |
| 378 tracker->DatabaseModified(kOrigin1, kDB3); | 350 tracker->DatabaseModified(kOrigin1, kDB3); |
| 379 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4, origin1_quota - 5); | 351 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 4); |
| 380 CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4, origin1_quota - 5); | 352 CheckNotificationReceived(&observer2, kOrigin1, kDB3, 4); |
| 381 | |
| 382 // Make sure the available space for kOrigin1 and kOrigin2 changed too. | |
| 383 EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); | |
| 384 EXPECT_EQ(origin2_quota - 2, tracker->GetOriginSpaceAvailable(kOrigin2)); | |
| 385 | 353 |
| 386 // Close all databases | 354 // Close all databases |
| 387 tracker->DatabaseClosed(kOrigin1, kDB1); | 355 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 388 tracker->DatabaseClosed(kOrigin2, kDB2); | 356 tracker->DatabaseClosed(kOrigin2, kDB2); |
| 389 tracker->DatabaseClosed(kOrigin1, kDB3); | 357 tracker->DatabaseClosed(kOrigin1, kDB3); |
| 390 | 358 |
| 391 // Open an existing database and check the reported size | 359 // Open an existing database and check the reported size |
| 392 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 360 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 393 &database_size, &space_available); | 361 &database_size); |
| 394 EXPECT_EQ(1, database_size); | 362 EXPECT_EQ(1, database_size); |
| 395 EXPECT_EQ(origin1_quota - 5, space_available); | |
| 396 | |
| 397 // Make sure that the observers are notified even if | |
| 398 // the size of the database hasn't changed. | |
| 399 EXPECT_EQ(1, file_util::WriteFile( | |
| 400 tracker->GetFullDBFilePath(kOrigin1, kDB1), "b", 1)); | |
| 401 tracker->DatabaseModified(kOrigin1, kDB1); | |
| 402 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 1, origin1_quota - 5); | |
| 403 CheckNotificationReceived(&observer2, kOrigin1, kDB1, 1, origin1_quota - 5); | |
| 404 tracker->DatabaseClosed(kOrigin1, kDB1); | 363 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 405 | 364 |
| 406 // Remove an observer; this should clear all caches. | 365 // Remove an observer; this should clear all caches. |
| 407 tracker->RemoveObserver(&observer2); | 366 tracker->RemoveObserver(&observer2); |
| 408 | 367 |
| 409 // Change kDB1's and kDB3's size and call tracker->DatabaseModified() | |
| 410 // for kDB1 only. If the caches were indeed cleared, then calling | |
| 411 // tracker->DatabaseModified() should re-populate the cache for | |
| 412 // kOrigin1 == kOrigin1, and thus, should pick up kDB3's size change too. | |
| 413 EXPECT_EQ(5, file_util::WriteFile( | |
| 414 tracker->GetFullDBFilePath(kOrigin1, kDB1), "ccccc", 5)); | |
| 415 EXPECT_EQ(6, file_util::WriteFile( | |
| 416 tracker->GetFullDBFilePath(kOrigin1, kDB3), "dddddd", 6)); | |
| 417 tracker->DatabaseModified(kOrigin1, kDB1); | |
| 418 CheckNotificationReceived(&observer1, kOrigin1, kDB1, 5, | |
| 419 origin1_quota - 11); | |
| 420 EXPECT_FALSE(observer2.DidReceiveNewNotification()); | |
| 421 EXPECT_EQ(origin1_quota - 11, tracker->GetOriginSpaceAvailable(kOrigin1)); | |
| 422 | |
| 423 // Close the tracker database and clear all caches. | 368 // Close the tracker database and clear all caches. |
| 424 // Then make sure that DatabaseOpened() still returns the correct result. | 369 // Then make sure that DatabaseOpened() still returns the correct result. |
| 425 tracker->CloseTrackerDatabaseAndClearCaches(); | 370 tracker->CloseTrackerDatabaseAndClearCaches(); |
| 426 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 371 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 427 &database_size, &space_available); | 372 &database_size); |
| 428 EXPECT_EQ(5, database_size); | 373 EXPECT_EQ(1, database_size); |
| 429 EXPECT_EQ(origin1_quota - 11, space_available); | |
| 430 | |
| 431 // Close the tracker database and clear all caches. Then make sure that | |
| 432 // DatabaseModified() still calls the observers with correct values. | |
| 433 tracker->CloseTrackerDatabaseAndClearCaches(); | |
| 434 tracker->DatabaseModified(kOrigin1, kDB3); | |
| 435 CheckNotificationReceived(&observer1, kOrigin1, kDB3, 6, | |
| 436 origin1_quota - 11); | |
| 437 tracker->DatabaseClosed(kOrigin1, kDB1); | 374 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 438 | 375 |
| 439 // Remove all observers. | 376 // Remove all observers. |
| 440 tracker->RemoveObserver(&observer1); | 377 tracker->RemoveObserver(&observer1); |
| 441 | 378 |
| 442 // Trying to delete a database in use should fail | 379 // Trying to delete a database in use should fail |
| 443 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, | 380 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
| 444 &database_size, &space_available); | 381 &database_size); |
| 445 EXPECT_FALSE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); | 382 EXPECT_FALSE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); |
| 446 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 383 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 447 EXPECT_TRUE(origin1_info); | 384 EXPECT_TRUE(origin1_info); |
| 448 EXPECT_EQ(6, origin1_info->GetDatabaseSize(kDB3)); | 385 EXPECT_EQ(4, origin1_info->GetDatabaseSize(kDB3)); |
| 449 tracker->DatabaseClosed(kOrigin1, kDB3); | 386 tracker->DatabaseClosed(kOrigin1, kDB3); |
| 450 | 387 |
| 451 // Delete a database and make sure the space used by that origin is updated | 388 // Delete a database and make sure the space used by that origin is updated |
| 452 EXPECT_TRUE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); | 389 EXPECT_TRUE(tracker->DeleteClosedDatabase(kOrigin1, kDB3)); |
| 453 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 390 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 454 EXPECT_TRUE(origin1_info); | 391 EXPECT_TRUE(origin1_info); |
| 455 EXPECT_EQ(origin1_quota - 5, tracker->GetOriginSpaceAvailable(kOrigin1)); | 392 EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1)); |
| 456 EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1)); | |
| 457 EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3)); | 393 EXPECT_EQ(0, origin1_info->GetDatabaseSize(kDB3)); |
| 458 | 394 |
| 459 // Get all data for all origins | 395 // Get all data for all origins |
| 460 std::vector<OriginInfo> origins_info; | 396 std::vector<OriginInfo> origins_info; |
| 461 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); | 397 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
| 462 EXPECT_EQ(size_t(2), origins_info.size()); | 398 EXPECT_EQ(size_t(2), origins_info.size()); |
| 463 EXPECT_EQ(kOrigin1, origins_info[0].GetOrigin()); | 399 EXPECT_EQ(kOrigin1, origins_info[0].GetOrigin()); |
| 464 EXPECT_EQ(5, origins_info[0].TotalSize()); | 400 EXPECT_EQ(1, origins_info[0].TotalSize()); |
| 465 EXPECT_EQ(origin1_quota, origins_info[0].Quota()); | 401 EXPECT_EQ(1, origins_info[0].GetDatabaseSize(kDB1)); |
| 466 EXPECT_EQ(5, origins_info[0].GetDatabaseSize(kDB1)); | |
| 467 EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3)); | 402 EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3)); |
| 468 | 403 |
| 469 EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin()); | 404 EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin()); |
| 470 EXPECT_EQ(2, origins_info[1].TotalSize()); | 405 EXPECT_EQ(2, origins_info[1].TotalSize()); |
| 471 EXPECT_EQ(origin2_quota, origins_info[1].Quota()); | |
| 472 | 406 |
| 473 // Trying to delete an origin with databases in use should fail | 407 // Trying to delete an origin with databases in use should fail |
| 474 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 408 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 475 &database_size, &space_available); | 409 &database_size); |
| 476 EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1)); | 410 EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1)); |
| 477 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 411 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 478 EXPECT_TRUE(origin1_info); | 412 EXPECT_TRUE(origin1_info); |
| 479 EXPECT_EQ(5, origin1_info->GetDatabaseSize(kDB1)); | 413 EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1)); |
| 480 tracker->DatabaseClosed(kOrigin1, kDB1); | 414 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 481 | 415 |
| 482 // Delete an origin that doesn't have any database in use | 416 // Delete an origin that doesn't have any database in use |
| 483 EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1)); | 417 EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1)); |
| 484 origins_info.clear(); | 418 origins_info.clear(); |
| 485 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); | 419 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
| 486 EXPECT_EQ(size_t(1), origins_info.size()); | 420 EXPECT_EQ(size_t(1), origins_info.size()); |
| 487 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); | 421 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); |
| 488 | 422 |
| 489 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 423 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 490 EXPECT_TRUE(origin1_info); | 424 EXPECT_TRUE(origin1_info); |
| 491 EXPECT_EQ(origin1_quota, origin1_info->Quota()); | |
| 492 EXPECT_EQ(0, origin1_info->TotalSize()); | 425 EXPECT_EQ(0, origin1_info->TotalSize()); |
| 493 EXPECT_EQ(origin1_quota, tracker->GetOriginSpaceAvailable(kOrigin1)); | |
| 494 } | 426 } |
| 495 | 427 |
| 496 static void DatabaseTrackerQuotaIntegration() { | 428 static void DatabaseTrackerQuotaIntegration() { |
| 497 const GURL kOrigin(kOrigin1Url); | 429 const GURL kOrigin(kOrigin1Url); |
| 498 const string16 kOriginId = DatabaseUtil::GetOriginIdentifier(kOrigin); | 430 const string16 kOriginId = DatabaseUtil::GetOriginIdentifier(kOrigin); |
| 499 const string16 kName = ASCIIToUTF16("name"); | 431 const string16 kName = ASCIIToUTF16("name"); |
| 500 const string16 kDescription = ASCIIToUTF16("description"); | 432 const string16 kDescription = ASCIIToUTF16("description"); |
| 501 | 433 |
| 502 ScopedTempDir temp_dir; | 434 ScopedTempDir temp_dir; |
| 503 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 435 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 504 | 436 |
| 505 // Initialize the tracker with a QuotaManagerProxy | 437 // Initialize the tracker with a QuotaManagerProxy |
| 506 scoped_refptr<TestQuotaManagerProxy> test_quota_proxy( | 438 scoped_refptr<TestQuotaManagerProxy> test_quota_proxy( |
| 507 new TestQuotaManagerProxy); | 439 new TestQuotaManagerProxy); |
| 508 scoped_refptr<DatabaseTracker> tracker( | 440 scoped_refptr<DatabaseTracker> tracker( |
| 509 new DatabaseTracker(temp_dir.path(), false /* incognito */, | 441 new DatabaseTracker(temp_dir.path(), false /* incognito */, |
| 510 NULL, test_quota_proxy, NULL)); | 442 NULL, test_quota_proxy, NULL)); |
| 511 EXPECT_TRUE(test_quota_proxy->registered_client_); | 443 EXPECT_TRUE(test_quota_proxy->registered_client_); |
| 512 | 444 |
| 513 // Create a database and modify it a couple of times, close it, | 445 // Create a database and modify it a couple of times, close it, |
| 514 // then delete it. Observe the tracker notifies accordingly. | 446 // then delete it. Observe the tracker notifies accordingly. |
| 515 | 447 |
| 516 int64 database_size = 0; | 448 int64 database_size = 0; |
| 517 int64 space_available = 0; | |
| 518 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, | 449 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, |
| 519 &database_size, &space_available); | 450 &database_size); |
| 520 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); | 451 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); |
| 521 test_quota_proxy->reset(); | 452 test_quota_proxy->reset(); |
| 522 | 453 |
| 523 FilePath db_file(tracker->GetFullDBFilePath(kOriginId, kName)); | 454 FilePath db_file(tracker->GetFullDBFilePath(kOriginId, kName)); |
| 524 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); | 455 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); |
| 525 EXPECT_TRUE(EnsureFileOfSize(db_file, 10)); | 456 EXPECT_TRUE(EnsureFileOfSize(db_file, 10)); |
| 526 tracker->DatabaseModified(kOriginId, kName); | 457 tracker->DatabaseModified(kOriginId, kName); |
| 527 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 10)); | 458 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 10)); |
| 528 test_quota_proxy->reset(); | 459 test_quota_proxy->reset(); |
| 529 | 460 |
| 530 EXPECT_TRUE(EnsureFileOfSize(db_file, 100)); | 461 EXPECT_TRUE(EnsureFileOfSize(db_file, 100)); |
| 531 tracker->DatabaseModified(kOriginId, kName); | 462 tracker->DatabaseModified(kOriginId, kName); |
| 532 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 90)); | 463 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 90)); |
| 533 test_quota_proxy->reset(); | 464 test_quota_proxy->reset(); |
| 534 | 465 |
| 535 tracker->DatabaseClosed(kOriginId, kName); | 466 tracker->DatabaseClosed(kOriginId, kName); |
| 467 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); |
| 536 EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kName, NULL)); | 468 EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kName, NULL)); |
| 537 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); | 469 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); |
| 470 test_quota_proxy->reset(); |
| 538 | 471 |
| 539 // Create a database and modify it, try to delete it while open, | 472 // Create a database and modify it, try to delete it while open, |
| 540 // then close it (at which time deletion will actually occur). | 473 // then close it (at which time deletion will actually occur). |
| 541 // Observe the tracker notifies accordingly. | 474 // Observe the tracker notifies accordingly. |
| 542 | 475 |
| 543 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, | 476 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, |
| 544 &database_size, &space_available); | 477 &database_size); |
| 545 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); | 478 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); |
| 546 test_quota_proxy->reset(); | 479 test_quota_proxy->reset(); |
| 547 | 480 |
| 548 db_file = tracker->GetFullDBFilePath(kOriginId, kName); | 481 db_file = tracker->GetFullDBFilePath(kOriginId, kName); |
| 549 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); | 482 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); |
| 550 EXPECT_TRUE(EnsureFileOfSize(db_file, 100)); | 483 EXPECT_TRUE(EnsureFileOfSize(db_file, 100)); |
| 551 tracker->DatabaseModified(kOriginId, kName); | 484 tracker->DatabaseModified(kOriginId, kName); |
| 552 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); | 485 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); |
| 553 test_quota_proxy->reset(); | 486 test_quota_proxy->reset(); |
| 554 | 487 |
| 555 EXPECT_EQ(net::ERR_IO_PENDING, | 488 EXPECT_EQ(net::ERR_IO_PENDING, |
| 556 tracker->DeleteDatabase(kOriginId, kName, NULL)); | 489 tracker->DeleteDatabase(kOriginId, kName, NULL)); |
| 557 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); | 490 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); |
| 558 | 491 |
| 559 tracker->DatabaseClosed(kOriginId, kName); | 492 tracker->DatabaseClosed(kOriginId, kName); |
| 493 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); |
| 560 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); | 494 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100)); |
| 495 test_quota_proxy->reset(); |
| 561 | 496 |
| 562 // Create a database and up the file size without telling | 497 // Create a database and up the file size without telling |
| 563 // the tracker about the modification, than simulate a | 498 // the tracker about the modification, than simulate a |
| 564 // a renderer crash. | 499 // a renderer crash. |
| 565 // Observe the tracker notifies accordingly. | 500 // Observe the tracker notifies accordingly. |
| 566 | 501 |
| 567 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, | 502 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, |
| 568 &database_size, &space_available); | 503 &database_size); |
| 569 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); | 504 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); |
| 570 test_quota_proxy->reset(); | 505 test_quota_proxy->reset(); |
| 571 db_file = tracker->GetFullDBFilePath(kOriginId, kName); | 506 db_file = tracker->GetFullDBFilePath(kOriginId, kName); |
| 572 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); | 507 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); |
| 573 EXPECT_TRUE(EnsureFileOfSize(db_file, 100)); | 508 EXPECT_TRUE(EnsureFileOfSize(db_file, 100)); |
| 574 DatabaseConnections crashed_renderer_connections; | 509 DatabaseConnections crashed_renderer_connections; |
| 575 crashed_renderer_connections.AddConnection(kOriginId, kName); | 510 crashed_renderer_connections.AddConnection(kOriginId, kName); |
| 576 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); | 511 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); |
| 577 tracker->CloseDatabases(crashed_renderer_connections); | 512 tracker->CloseDatabases(crashed_renderer_connections); |
| 578 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); | 513 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 598 TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) { | 533 TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) { |
| 599 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true); | 534 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true); |
| 600 } | 535 } |
| 601 | 536 |
| 602 TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) { | 537 TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) { |
| 603 // There is no difference in behavior between incognito and not. | 538 // There is no difference in behavior between incognito and not. |
| 604 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration(); | 539 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration(); |
| 605 } | 540 } |
| 606 | 541 |
| 607 } // namespace webkit_database | 542 } // namespace webkit_database |
| OLD | NEW |