Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: webkit/database/database_tracker_unittest.cc

Issue 9371008: Nuke from orbit corrupt websql databases. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/database/database_tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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" 8 #include "base/message_loop_proxy.h"
9 #include "base/platform_file.h" 9 #include "base/platform_file.h"
10 #include "base/scoped_temp_dir.h" 10 #include "base/scoped_temp_dir.h"
11 #include "base/time.h" 11 #include "base/time.h"
12 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/base/test_completion_callback.h" 14 #include "net/base/test_completion_callback.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/sqlite/sqlite3.h"
16 #include "webkit/database/database_tracker.h" 17 #include "webkit/database/database_tracker.h"
17 #include "webkit/database/database_util.h" 18 #include "webkit/database/database_util.h"
18 #include "webkit/quota/mock_special_storage_policy.h" 19 #include "webkit/quota/mock_special_storage_policy.h"
19 #include "webkit/quota/quota_manager.h" 20 #include "webkit/quota/quota_manager.h"
20 21
21 namespace { 22 namespace {
22 23
23 const char kOrigin1Url[] = "http://origin1"; 24 const char kOrigin1Url[] = "http://origin1";
24 const char kOrigin2Url[] = "http://protected_origin2"; 25 const char kOrigin2Url[] = "http://protected_origin2";
25 26
26 class TestObserver : public webkit_database::DatabaseTracker::Observer { 27 class TestObserver : public webkit_database::DatabaseTracker::Observer {
27 public: 28 public:
28 TestObserver() : new_notification_received_(false) {} 29 TestObserver()
30 : new_notification_received_(false),
31 observe_size_changes_(true),
32 observe_scheduled_deletions_(true) {
33 }
34 TestObserver(bool observe_size_changes, bool observe_scheduled_deletions)
35 : new_notification_received_(false),
36 observe_size_changes_(observe_size_changes),
37 observe_scheduled_deletions_(observe_scheduled_deletions) {
38 }
39
29 virtual ~TestObserver() {} 40 virtual ~TestObserver() {}
30 virtual void OnDatabaseSizeChanged(const string16& origin_identifier, 41 virtual void OnDatabaseSizeChanged(const string16& origin_identifier,
31 const string16& database_name, 42 const string16& database_name,
32 int64 database_size) { 43 int64 database_size) {
44 if (!observe_size_changes_)
45 return;
33 new_notification_received_ = true; 46 new_notification_received_ = true;
34 origin_identifier_ = origin_identifier; 47 origin_identifier_ = origin_identifier;
35 database_name_ = database_name; 48 database_name_ = database_name;
36 database_size_ = database_size; 49 database_size_ = database_size;
37 } 50 }
38 virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, 51 virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier,
39 const string16& database_name) { 52 const string16& database_name) {
53 if (!observe_scheduled_deletions_)
54 return;
40 new_notification_received_ = true; 55 new_notification_received_ = true;
41 origin_identifier_ = origin_identifier; 56 origin_identifier_ = origin_identifier;
42 database_name_ = database_name; 57 database_name_ = database_name;
43 } 58 }
44 bool DidReceiveNewNotification() { 59 bool DidReceiveNewNotification() {
45 bool temp_new_notification_received = new_notification_received_; 60 bool temp_new_notification_received = new_notification_received_;
46 new_notification_received_ = false; 61 new_notification_received_ = false;
47 return temp_new_notification_received; 62 return temp_new_notification_received;
48 } 63 }
49 string16 GetNotificationOriginIdentifier() { return origin_identifier_; } 64 string16 GetNotificationOriginIdentifier() { return origin_identifier_; }
50 string16 GetNotificationDatabaseName() { return database_name_; } 65 string16 GetNotificationDatabaseName() { return database_name_; }
51 int64 GetNotificationDatabaseSize() { return database_size_; } 66 int64 GetNotificationDatabaseSize() { return database_size_; }
52 67
53 private: 68 private:
54 bool new_notification_received_; 69 bool new_notification_received_;
70 bool observe_size_changes_;
71 bool observe_scheduled_deletions_;
55 string16 origin_identifier_; 72 string16 origin_identifier_;
56 string16 database_name_; 73 string16 database_name_;
57 int64 database_size_; 74 int64 database_size_;
58 }; 75 };
59 76
60 void CheckNotificationReceived(TestObserver* observer, 77 void CheckNotificationReceived(TestObserver* observer,
61 const string16& expected_origin_identifier, 78 const string16& expected_origin_identifier,
62 const string16& expected_database_name, 79 const string16& expected_database_name,
63 int64 expected_database_size) { 80 int64 expected_database_size) {
64 EXPECT_TRUE(observer->DidReceiveNewNotification()); 81 EXPECT_TRUE(observer->DidReceiveNewNotification());
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 tracker->DatabaseClosed(kOriginId, kEmptyName); 822 tracker->DatabaseClosed(kOriginId, kEmptyName);
806 tracker->DatabaseClosed(kOriginId, kEmptyName); 823 tracker->DatabaseClosed(kOriginId, kEmptyName);
807 824
808 // Deleting it should return to the initial state. 825 // Deleting it should return to the initial state.
809 EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kEmptyName, 826 EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kEmptyName,
810 net::CompletionCallback())); 827 net::CompletionCallback()));
811 infos.clear(); 828 infos.clear();
812 EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos)); 829 EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
813 EXPECT_TRUE(infos.empty()); 830 EXPECT_TRUE(infos.empty());
814 } 831 }
832
833 static void HandleSqliteError() {
834 const GURL kOrigin(kOrigin1Url);
835 const string16 kOriginId = DatabaseUtil::GetOriginIdentifier(kOrigin);
836 const string16 kName(ASCIIToUTF16("name"));
837 const string16 kDescription(ASCIIToUTF16("description"));
838
839 // Initialize a tracker database, no need to put it on disk.
840 const bool kUseInMemoryTrackerDatabase = true;
841 ScopedTempDir temp_dir;
842 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
843 scoped_refptr<DatabaseTracker> tracker(
844 new DatabaseTracker(temp_dir.path(), kUseInMemoryTrackerDatabase,
845 false, NULL, NULL, NULL));
846
847 // Setup to observe OnScheduledForDelete notifications.
848 TestObserver observer(false, true);
849 tracker->AddObserver(&observer);
850
851 // Verify does no harm when there is no such database.
852 tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
853 EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
854 EXPECT_FALSE(observer.DidReceiveNewNotification());
855
856 // --------------------------------------------------------
857 // Create a record of a database in the tracker db and create
858 // a spoof_db_file on disk in the expected location.
859 int64 database_size = 0;
860 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
861 &database_size);
862 FilePath spoof_db_file = tracker->GetFullDBFilePath(kOriginId, kName);
863 EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
864 EXPECT_TRUE(file_util::CreateDirectory(spoof_db_file.DirName()));
865 EXPECT_TRUE(EnsureFileOfSize(spoof_db_file, 1));
866
867 // Verify does no harm with a non-error is reported.
868 tracker->HandleSqliteError(kOriginId, kName, SQLITE_OK);
869 EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
870 EXPECT_FALSE(observer.DidReceiveNewNotification());
871
872 // Verify that with a connection open, the db is scheduled for deletion,
873 // but that the file still exists.
874 tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
875 EXPECT_TRUE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
876 EXPECT_TRUE(observer.DidReceiveNewNotification());
877 EXPECT_TRUE(file_util::PathExists(spoof_db_file));
878
879 // Verify that once closed, the file is deleted and the record in the
880 // tracker db is removed.
881 tracker->DatabaseClosed(kOriginId, kName);
882 EXPECT_FALSE(file_util::PathExists(spoof_db_file));
883 EXPECT_TRUE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
884
885 // --------------------------------------------------------
886 // Create another record of a database in the tracker db and create
887 // a spoof_db_file on disk in the expected location.
888 tracker->DatabaseOpened(kOriginId, kName, kDescription, 0,
889 &database_size);
890 FilePath spoof_db_file2 = tracker->GetFullDBFilePath(kOriginId, kName);
891 EXPECT_FALSE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
892 EXPECT_NE(spoof_db_file, spoof_db_file2);
893 EXPECT_TRUE(file_util::CreateDirectory(spoof_db_file2.DirName()));
894 EXPECT_TRUE(EnsureFileOfSize(spoof_db_file2, 1));
895
896 // Verify that with no connection open, the db is deleted immediately.
897 tracker->DatabaseClosed(kOriginId, kName);
898 tracker->HandleSqliteError(kOriginId, kName, SQLITE_CORRUPT);
899 EXPECT_FALSE(tracker->IsDatabaseScheduledForDeletion(kOriginId, kName));
900 EXPECT_FALSE(observer.DidReceiveNewNotification());
901 EXPECT_TRUE(tracker->GetFullDBFilePath(kOriginId, kName).empty());
902 EXPECT_FALSE(file_util::PathExists(spoof_db_file2));
903
904 tracker->RemoveObserver(&observer);
905 }
815 }; 906 };
816 907
817 TEST(DatabaseTrackerTest, DeleteOpenDatabase) { 908 TEST(DatabaseTrackerTest, DeleteOpenDatabase) {
818 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false); 909 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(false);
819 } 910 }
820 911
821 TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) { 912 TEST(DatabaseTrackerTest, DeleteOpenDatabaseIncognitoMode) {
822 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true); 913 DatabaseTracker_TestHelper_Test::TestDeleteOpenDatabase(true);
823 } 914 }
824 915
(...skipping 23 matching lines...) Expand all
848 939
849 TEST(DatabaseTrackerTest, DatabaseTrackerSaveSessionState) { 940 TEST(DatabaseTrackerTest, DatabaseTrackerSaveSessionState) {
850 // Only works for regular mode. 941 // Only works for regular mode.
851 DatabaseTracker_TestHelper_Test::DatabaseTrackerSaveSessionState(); 942 DatabaseTracker_TestHelper_Test::DatabaseTrackerSaveSessionState();
852 } 943 }
853 944
854 TEST(DatabaseTrackerTest, EmptyDatabaseNameIsValid) { 945 TEST(DatabaseTrackerTest, EmptyDatabaseNameIsValid) {
855 DatabaseTracker_TestHelper_Test::EmptyDatabaseNameIsValid(); 946 DatabaseTracker_TestHelper_Test::EmptyDatabaseNameIsValid();
856 } 947 }
857 948
949 TEST(DatabaseTrackerTest, HandleSqliteError) {
950 DatabaseTracker_TestHelper_Test::HandleSqliteError();
951 }
952
858 } // namespace webkit_database 953 } // namespace webkit_database
OLDNEW
« no previous file with comments | « webkit/database/database_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698