| 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/message_loop_proxy.h" |
| 9 #include "base/platform_file.h" |
| 8 #include "base/scoped_temp_dir.h" | 10 #include "base/scoped_temp_dir.h" |
| 9 #include "base/time.h" | 11 #include "base/time.h" |
| 10 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
| 11 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
| 12 #include "net/base/test_completion_callback.h" | 14 #include "net/base/test_completion_callback.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 14 #include "webkit/database/database_tracker.h" | 16 #include "webkit/database/database_tracker.h" |
| 15 #include "webkit/database/database_util.h" | 17 #include "webkit/database/database_util.h" |
| 16 #include "webkit/quota/quota_manager.h" | 18 #include "webkit/quota/quota_manager.h" |
| 17 #include "webkit/quota/special_storage_policy.h" | 19 #include "webkit/quota/special_storage_policy.h" |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 // static methods of this class. Then we make our TEST() targets call these | 179 // static methods of this class. Then we make our TEST() targets call these |
| 178 // static functions. This allows us to run each test in normal mode and | 180 // static functions. This allows us to run each test in normal mode and |
| 179 // incognito mode without writing the same code twice. | 181 // incognito mode without writing the same code twice. |
| 180 class DatabaseTracker_TestHelper_Test { | 182 class DatabaseTracker_TestHelper_Test { |
| 181 public: | 183 public: |
| 182 static void TestDeleteOpenDatabase(bool incognito_mode) { | 184 static void TestDeleteOpenDatabase(bool incognito_mode) { |
| 183 // Initialize the tracker database. | 185 // Initialize the tracker database. |
| 184 ScopedTempDir temp_dir; | 186 ScopedTempDir temp_dir; |
| 185 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 187 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 186 scoped_refptr<DatabaseTracker> tracker( | 188 scoped_refptr<DatabaseTracker> tracker( |
| 187 new DatabaseTracker(temp_dir.path(), incognito_mode, | 189 new DatabaseTracker(temp_dir.path(), incognito_mode, false, |
| 188 new TestSpecialStoragePolicy, | 190 new TestSpecialStoragePolicy, |
| 189 NULL, NULL)); | 191 NULL, NULL)); |
| 190 | 192 |
| 191 // Create and open three databases. | 193 // Create and open three databases. |
| 192 int64 database_size = 0; | 194 int64 database_size = 0; |
| 193 const string16 kOrigin1 = | 195 const string16 kOrigin1 = |
| 194 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); | 196 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); |
| 195 const string16 kOrigin2 = | 197 const string16 kOrigin2 = |
| 196 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); | 198 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); |
| 197 const string16 kDB1 = ASCIIToUTF16("db1"); | 199 const string16 kDB1 = ASCIIToUTF16("db1"); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 | 282 |
| 281 tracker->DatabaseClosed(kOrigin2, kDB3); | 283 tracker->DatabaseClosed(kOrigin2, kDB3); |
| 282 tracker->RemoveObserver(&observer); | 284 tracker->RemoveObserver(&observer); |
| 283 } | 285 } |
| 284 | 286 |
| 285 static void TestDatabaseTracker(bool incognito_mode) { | 287 static void TestDatabaseTracker(bool incognito_mode) { |
| 286 // Initialize the tracker database. | 288 // Initialize the tracker database. |
| 287 ScopedTempDir temp_dir; | 289 ScopedTempDir temp_dir; |
| 288 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 290 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 289 scoped_refptr<DatabaseTracker> tracker( | 291 scoped_refptr<DatabaseTracker> tracker( |
| 290 new DatabaseTracker(temp_dir.path(), incognito_mode, | 292 new DatabaseTracker(temp_dir.path(), incognito_mode, false, |
| 291 new TestSpecialStoragePolicy, | 293 new TestSpecialStoragePolicy, |
| 292 NULL, NULL)); | 294 NULL, NULL)); |
| 293 | 295 |
| 294 // Add two observers. | 296 // Add two observers. |
| 295 TestObserver observer1; | 297 TestObserver observer1; |
| 296 TestObserver observer2; | 298 TestObserver observer2; |
| 297 tracker->AddObserver(&observer1); | 299 tracker->AddObserver(&observer1); |
| 298 tracker->AddObserver(&observer2); | 300 tracker->AddObserver(&observer2); |
| 299 | 301 |
| 300 // Open three new databases. | 302 // Open three new databases. |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 EXPECT_EQ(1, origins_info[0].TotalSize()); | 402 EXPECT_EQ(1, origins_info[0].TotalSize()); |
| 401 EXPECT_EQ(1, origins_info[0].GetDatabaseSize(kDB1)); | 403 EXPECT_EQ(1, origins_info[0].GetDatabaseSize(kDB1)); |
| 402 EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3)); | 404 EXPECT_EQ(0, origins_info[0].GetDatabaseSize(kDB3)); |
| 403 | 405 |
| 404 EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin()); | 406 EXPECT_EQ(kOrigin2, origins_info[1].GetOrigin()); |
| 405 EXPECT_EQ(2, origins_info[1].TotalSize()); | 407 EXPECT_EQ(2, origins_info[1].TotalSize()); |
| 406 | 408 |
| 407 // Trying to delete an origin with databases in use should fail | 409 // Trying to delete an origin with databases in use should fail |
| 408 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | 410 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 409 &database_size); | 411 &database_size); |
| 410 EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1)); | 412 EXPECT_FALSE(tracker->DeleteOrigin(kOrigin1, false)); |
| 411 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 413 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 412 EXPECT_TRUE(origin1_info); | 414 EXPECT_TRUE(origin1_info); |
| 413 EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1)); | 415 EXPECT_EQ(1, origin1_info->GetDatabaseSize(kDB1)); |
| 414 tracker->DatabaseClosed(kOrigin1, kDB1); | 416 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 415 | 417 |
| 416 // Delete an origin that doesn't have any database in use | 418 // Delete an origin that doesn't have any database in use |
| 417 EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1)); | 419 EXPECT_TRUE(tracker->DeleteOrigin(kOrigin1, false)); |
| 418 origins_info.clear(); | 420 origins_info.clear(); |
| 419 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); | 421 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
| 420 EXPECT_EQ(size_t(1), origins_info.size()); | 422 EXPECT_EQ(size_t(1), origins_info.size()); |
| 421 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); | 423 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); |
| 422 | 424 |
| 423 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); | 425 origin1_info = tracker->GetCachedOriginInfo(kOrigin1); |
| 424 EXPECT_TRUE(origin1_info); | 426 EXPECT_TRUE(origin1_info); |
| 425 EXPECT_EQ(0, origin1_info->TotalSize()); | 427 EXPECT_EQ(0, origin1_info->TotalSize()); |
| 426 } | 428 } |
| 427 | 429 |
| 428 static void DatabaseTrackerQuotaIntegration() { | 430 static void DatabaseTrackerQuotaIntegration() { |
| 429 const GURL kOrigin(kOrigin1Url); | 431 const GURL kOrigin(kOrigin1Url); |
| 430 const string16 kOriginId = DatabaseUtil::GetOriginIdentifier(kOrigin); | 432 const string16 kOriginId = DatabaseUtil::GetOriginIdentifier(kOrigin); |
| 431 const string16 kName = ASCIIToUTF16("name"); | 433 const string16 kName = ASCIIToUTF16("name"); |
| 432 const string16 kDescription = ASCIIToUTF16("description"); | 434 const string16 kDescription = ASCIIToUTF16("description"); |
| 433 | 435 |
| 434 ScopedTempDir temp_dir; | 436 ScopedTempDir temp_dir; |
| 435 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 437 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 436 | 438 |
| 437 // Initialize the tracker with a QuotaManagerProxy | 439 // Initialize the tracker with a QuotaManagerProxy |
| 438 scoped_refptr<TestQuotaManagerProxy> test_quota_proxy( | 440 scoped_refptr<TestQuotaManagerProxy> test_quota_proxy( |
| 439 new TestQuotaManagerProxy); | 441 new TestQuotaManagerProxy); |
| 440 scoped_refptr<DatabaseTracker> tracker( | 442 scoped_refptr<DatabaseTracker> tracker( |
| 441 new DatabaseTracker(temp_dir.path(), false /* incognito */, | 443 new DatabaseTracker(temp_dir.path(), false /* incognito */, false, |
| 442 NULL, test_quota_proxy, NULL)); | 444 NULL, test_quota_proxy, NULL)); |
| 443 EXPECT_TRUE(test_quota_proxy->registered_client_); | 445 EXPECT_TRUE(test_quota_proxy->registered_client_); |
| 444 | 446 |
| 445 // Create a database and modify it a couple of times, close it, | 447 // Create a database and modify it a couple of times, close it, |
| 446 // then delete it. Observe the tracker notifies accordingly. | 448 // then delete it. Observe the tracker notifies accordingly. |
| 447 | 449 |
| 448 int64 database_size = 0; | 450 int64 database_size = 0; |
| 449 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, | 451 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0, |
| 450 &database_size); | 452 &database_size); |
| 451 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); | 453 EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin)); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 DatabaseConnections crashed_renderer_connections; | 511 DatabaseConnections crashed_renderer_connections; |
| 510 crashed_renderer_connections.AddConnection(kOriginId, kName); | 512 crashed_renderer_connections.AddConnection(kOriginId, kName); |
| 511 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); | 513 EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); |
| 512 tracker->CloseDatabases(crashed_renderer_connections); | 514 tracker->CloseDatabases(crashed_renderer_connections); |
| 513 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); | 515 EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100)); |
| 514 | 516 |
| 515 // Cleanup. | 517 // Cleanup. |
| 516 crashed_renderer_connections.RemoveAllConnections(); | 518 crashed_renderer_connections.RemoveAllConnections(); |
| 517 test_quota_proxy->SimulateQuotaManagerDestroyed(); | 519 test_quota_proxy->SimulateQuotaManagerDestroyed(); |
| 518 } | 520 } |
| 521 |
| 522 static void DatabaseTrackerClearLocalStateOnExit() { |
| 523 int64 database_size = 0; |
| 524 const string16 kOrigin1 = |
| 525 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin1Url)); |
| 526 const string16 kOrigin2 = |
| 527 DatabaseUtil::GetOriginIdentifier(GURL(kOrigin2Url)); |
| 528 const string16 kDB1 = ASCIIToUTF16("db1"); |
| 529 const string16 kDB2 = ASCIIToUTF16("db2"); |
| 530 const string16 kDB3 = ASCIIToUTF16("db3"); |
| 531 const string16 kDescription = ASCIIToUTF16("database_description"); |
| 532 |
| 533 // Initialize the tracker database. |
| 534 ScopedTempDir temp_dir; |
| 535 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 536 FilePath origin1_db_dir; |
| 537 { |
| 538 scoped_refptr<DatabaseTracker> tracker( |
| 539 new DatabaseTracker( |
| 540 temp_dir.path(), false, true, |
| 541 new TestSpecialStoragePolicy, |
| 542 NULL, |
| 543 base::MessageLoopProxy::CreateForCurrentThread())); |
| 544 |
| 545 // Open three new databases. |
| 546 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, |
| 547 &database_size); |
| 548 EXPECT_EQ(0, database_size); |
| 549 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, |
| 550 &database_size); |
| 551 EXPECT_EQ(0, database_size); |
| 552 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, |
| 553 &database_size); |
| 554 EXPECT_EQ(0, database_size); |
| 555 |
| 556 // Write some data to each file. |
| 557 FilePath db_file; |
| 558 db_file = tracker->GetFullDBFilePath(kOrigin1, kDB1); |
| 559 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); |
| 560 EXPECT_TRUE(EnsureFileOfSize(db_file, 1)); |
| 561 |
| 562 db_file = tracker->GetFullDBFilePath(kOrigin2, kDB2); |
| 563 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); |
| 564 EXPECT_TRUE(EnsureFileOfSize(db_file, 2)); |
| 565 |
| 566 db_file = tracker->GetFullDBFilePath(kOrigin1, kDB3); |
| 567 EXPECT_TRUE(file_util::CreateDirectory(db_file.DirName())); |
| 568 EXPECT_TRUE(EnsureFileOfSize(db_file, 3)); |
| 569 |
| 570 // Store the origin database directory as long as it still exists. |
| 571 origin1_db_dir = tracker->GetFullDBFilePath(kOrigin1, kDB3).DirName(); |
| 572 |
| 573 tracker->DatabaseModified(kOrigin1, kDB1); |
| 574 tracker->DatabaseModified(kOrigin2, kDB2); |
| 575 tracker->DatabaseModified(kOrigin1, kDB3); |
| 576 |
| 577 // Close all databases but one database. |
| 578 tracker->DatabaseClosed(kOrigin1, kDB1); |
| 579 tracker->DatabaseClosed(kOrigin2, kDB2); |
| 580 |
| 581 // Keep an open file handle to the last database. |
| 582 base::PlatformFile file_handle = base::CreatePlatformFile( |
| 583 tracker->GetFullDBFilePath(kOrigin1, kDB3), |
| 584 base::PLATFORM_FILE_READ | |
| 585 base::PLATFORM_FILE_WRITE | |
| 586 base::PLATFORM_FILE_EXCLUSIVE_READ | |
| 587 base::PLATFORM_FILE_EXCLUSIVE_WRITE | |
| 588 base::PLATFORM_FILE_OPEN_ALWAYS | |
| 589 base::PLATFORM_FILE_SHARE_DELETE, |
| 590 NULL, NULL); |
| 591 |
| 592 tracker->Shutdown(); |
| 593 |
| 594 base::ClosePlatformFile(file_handle); |
| 595 tracker->DatabaseClosed(kOrigin1, kDB3); |
| 596 } |
| 597 |
| 598 // At this point, the database tracker should be gone. Create a new one. |
| 599 scoped_refptr<DatabaseTracker> tracker( |
| 600 new DatabaseTracker(temp_dir.path(), false, false, |
| 601 new TestSpecialStoragePolicy, |
| 602 NULL, NULL)); |
| 603 |
| 604 // Get all data for all origins. |
| 605 std::vector<OriginInfo> origins_info; |
| 606 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); |
| 607 EXPECT_EQ(size_t(1), origins_info.size()); |
| 608 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); |
| 609 EXPECT_EQ(FilePath(), tracker->GetFullDBFilePath(kOrigin1, kDB1)); |
| 610 EXPECT_TRUE( |
| 611 file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2))); |
| 612 EXPECT_EQ(FilePath(), tracker->GetFullDBFilePath(kOrigin1, kDB3)); |
| 613 |
| 614 // The origin directory should be gone as well. |
| 615 EXPECT_FALSE(file_util::PathExists(origin1_db_dir)); |
| 616 } |
| 519 }; | 617 }; |
| 520 | 618 |
| 521 TEST(DatabaseTrackerTest, DeleteOpenDatabase) { | 619 TEST(DatabaseTrackerTest, DeleteOpenDatabase) { |
| 522 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false); | 620 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false); |
| 523 } | 621 } |
| 524 | 622 |
| 525 TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) { | 623 TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) { |
| 526 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true); | 624 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true); |
| 527 } | 625 } |
| 528 | 626 |
| 529 TEST(DatabaseTrackerTest, DatabaseTracker) { | 627 TEST(DatabaseTrackerTest, DatabaseTracker) { |
| 530 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false); | 628 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false); |
| 531 } | 629 } |
| 532 | 630 |
| 533 TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) { | 631 TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) { |
| 534 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true); | 632 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true); |
| 535 } | 633 } |
| 536 | 634 |
| 537 TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) { | 635 TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) { |
| 538 // There is no difference in behavior between incognito and not. | 636 // There is no difference in behavior between incognito and not. |
| 539 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration(); | 637 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration(); |
| 540 } | 638 } |
| 541 | 639 |
| 640 TEST(DatabaseTrackerTest, DatabaseTrackerClearLocalStateOnExit) { |
| 641 // Only works for regular mode. |
| 642 DatabaseTracker_TestHelper_Test::DatabaseTrackerClearLocalStateOnExit(); |
| 643 } |
| 644 |
| 542 } // namespace webkit_database | 645 } // namespace webkit_database |
| OLD | NEW |