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/test/thread_test_helper.h" | |
10 #include "base/threading/thread.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" |
18 | 20 |
(...skipping 158 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() { | |
michaeln
2011/07/01 03:02:34
Can you alter the test such that a file is held op
jochen (gone - plz use gerrit)
2011/07/06 09:24:53
Done.
| |
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 base::Thread thread("Database tracker thread"); | |
537 ASSERT_TRUE(thread.Start()); | |
538 { | |
539 scoped_refptr<DatabaseTracker> tracker( | |
540 new DatabaseTracker(temp_dir.path(), false, true, | |
541 new TestSpecialStoragePolicy, | |
542 NULL, thread.message_loop_proxy())); | |
543 | |
544 // Open three new databases. | |
545 tracker->DatabaseOpened(kOrigin1, kDB1, kDescription, 0, | |
michaeln
2011/07/01 03:02:34
Having these methods be called on something other
jochen (gone - plz use gerrit)
2011/07/06 09:24:53
Done.
| |
546 &database_size); | |
547 EXPECT_EQ(0, database_size); | |
548 tracker->DatabaseOpened(kOrigin2, kDB2, kDescription, 0, | |
549 &database_size); | |
550 EXPECT_EQ(0, database_size); | |
551 tracker->DatabaseOpened(kOrigin1, kDB3, kDescription, 0, | |
552 &database_size); | |
553 EXPECT_EQ(0, database_size); | |
554 | |
555 // Write some data to each file. | |
556 EXPECT_TRUE( | |
557 file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | |
558 FilePath::FromWStringHack(UTF16ToWide( | |
michaeln
2011/07/01 03:02:34
Let's avoid adding more usages of FromWStringHack.
jochen (gone - plz use gerrit)
2011/07/06 09:24:53
Done.
| |
559 tracker->GetOriginDirectory(kOrigin1)))))); | |
560 EXPECT_TRUE( | |
561 file_util::CreateDirectory(tracker->DatabaseDirectory().Append( | |
562 FilePath::FromWStringHack(UTF16ToWide( | |
563 tracker->GetOriginDirectory(kOrigin2)))))); | |
564 EXPECT_EQ(1, file_util::WriteFile( | |
565 tracker->GetFullDBFilePath(kOrigin1, kDB1), "a", 1)); | |
566 EXPECT_EQ(2, file_util::WriteFile( | |
567 tracker->GetFullDBFilePath(kOrigin2, kDB2), "aa", 2)); | |
568 EXPECT_EQ(4, file_util::WriteFile( | |
569 tracker->GetFullDBFilePath(kOrigin1, kDB3), "aaaa", 4)); | |
570 tracker->DatabaseModified(kOrigin1, kDB1); | |
571 tracker->DatabaseModified(kOrigin2, kDB2); | |
572 tracker->DatabaseModified(kOrigin1, kDB3); | |
573 | |
574 // Close all databases. | |
575 tracker->DatabaseClosed(kOrigin1, kDB1); | |
576 tracker->DatabaseClosed(kOrigin2, kDB2); | |
577 tracker->DatabaseClosed(kOrigin1, kDB3); | |
578 | |
579 tracker->Shutdown(); | |
580 | |
581 // Synchronize with the database tracker thread to ensure that the | |
582 // shutdown tasks have completed. | |
583 scoped_refptr<base::ThreadTestHelper> sync = | |
584 new base::ThreadTestHelper(thread.message_loop_proxy()); | |
585 ASSERT_TRUE(sync->Run()); | |
586 } | |
587 | |
588 // At this point, the database tracker should be gone. Create a new one. | |
589 scoped_refptr<DatabaseTracker> tracker( | |
590 new DatabaseTracker(temp_dir.path(), false, false, | |
591 new TestSpecialStoragePolicy, | |
592 NULL, NULL)); | |
593 | |
594 // Get all data for all origins. | |
595 std::vector<OriginInfo> origins_info; | |
596 EXPECT_TRUE(tracker->GetAllOriginsInfo(&origins_info)); | |
597 EXPECT_EQ(size_t(1), origins_info.size()); | |
598 EXPECT_EQ(kOrigin2, origins_info[0].GetOrigin()); | |
599 EXPECT_FALSE( | |
600 file_util::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB1))); | |
601 EXPECT_TRUE( | |
602 file_util::PathExists(tracker->GetFullDBFilePath(kOrigin2, kDB2))); | |
603 EXPECT_FALSE( | |
604 file_util::PathExists(tracker->GetFullDBFilePath(kOrigin1, kDB3))); | |
605 } | |
519 }; | 606 }; |
520 | 607 |
521 TEST(DatabaseTrackerTest, DeleteOpenDatabase) { | 608 TEST(DatabaseTrackerTest, DeleteOpenDatabase) { |
522 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false); | 609 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false); |
523 } | 610 } |
524 | 611 |
525 TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) { | 612 TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) { |
526 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true); | 613 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true); |
527 } | 614 } |
528 | 615 |
529 TEST(DatabaseTrackerTest, DatabaseTracker) { | 616 TEST(DatabaseTrackerTest, DatabaseTracker) { |
530 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false); | 617 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(false); |
531 } | 618 } |
532 | 619 |
533 TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) { | 620 TEST(DatabaseTrackerTest, DatabaseTrackerIncognitoMode) { |
534 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true); | 621 DatabaseTracker_TestHelper_Test::TestDatabaseTracker(true); |
535 } | 622 } |
536 | 623 |
537 TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) { | 624 TEST(DatabaseTrackerTest, DatabaseTrackerQuotaIntegration) { |
538 // There is no difference in behavior between incognito and not. | 625 // There is no difference in behavior between incognito and not. |
539 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration(); | 626 DatabaseTracker_TestHelper_Test::DatabaseTrackerQuotaIntegration(); |
540 } | 627 } |
541 | 628 |
629 TEST(DatabaseTrackerTest, DatabaseTrackerClearLocalStateOnExit) { | |
630 // Only works for regular mode. | |
631 DatabaseTracker_TestHelper_Test::DatabaseTrackerClearLocalStateOnExit(); | |
632 } | |
633 | |
542 } // namespace webkit_database | 634 } // namespace webkit_database |
OLD | NEW |