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

Side by Side Diff: chrome/browser/sync/syncable/directory_backing_store_unittest.cc

Issue 3026029: Fix EntryKernel leak if sync database load fails (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Fix legit leak in PurgeEntriesWithTypeIn Created 10 years, 4 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
OLDNEW
1 // Copyright (c) 2010 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 "testing/gtest/include/gtest/gtest.h" 5 #include "testing/gtest/include/gtest/gtest.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "app/sql/connection.h" 9 #include "app/sql/connection.h"
10 #include "app/sql/statement.h" 10 #include "app/sql/statement.h"
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 // Renamed a column in Version 70 872 // Renamed a column in Version 70
873 ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag")); 873 ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag"));
874 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); 874 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag"));
875 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); 875 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag"));
876 876
877 // Removed extended attributes in Version 72. 877 // Removed extended attributes in Version 72.
878 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); 878 ASSERT_FALSE(connection.DoesTableExist("extended_attributes"));
879 } 879 }
880 880
881 MetahandlesIndex index; 881 MetahandlesIndex index;
882 STLElementDeleter<MetahandlesIndex> index_deleter(&index);
882 dbs->LoadEntries(&index); 883 dbs->LoadEntries(&index);
883 dbs->EndLoad(); 884 dbs->EndLoad();
884 885
885 MetahandlesIndex::iterator it = index.begin(); 886 MetahandlesIndex::iterator it = index.begin();
886 ASSERT_TRUE(it != index.end()); 887 ASSERT_TRUE(it != index.end());
887 ASSERT_EQ(1, (*it)->ref(META_HANDLE)); 888 ASSERT_EQ(1, (*it)->ref(META_HANDLE));
888 EXPECT_TRUE((*it)->ref(ID).IsRoot()); 889 EXPECT_TRUE((*it)->ref(ID).IsRoot());
889 890
890 ASSERT_TRUE(++it != index.end()) << "Upgrade destroyed database contents."; 891 ASSERT_TRUE(++it != index.end()) << "Upgrade destroyed database contents.";
891 ASSERT_EQ(2, (*it)->ref(META_HANDLE)); 892 ASSERT_EQ(2, (*it)->ref(META_HANDLE));
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS). 998 EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS).
998 GetExtension(sync_pb::bookmark).has_favicon()); 999 GetExtension(sync_pb::bookmark).has_favicon());
999 1000
1000 ASSERT_TRUE(++it != index.end()); 1001 ASSERT_TRUE(++it != index.end());
1001 ASSERT_EQ(13, (*it)->ref(META_HANDLE)); 1002 ASSERT_EQ(13, (*it)->ref(META_HANDLE));
1002 1003
1003 ASSERT_TRUE(++it != index.end()); 1004 ASSERT_TRUE(++it != index.end());
1004 ASSERT_EQ(14, (*it)->ref(META_HANDLE)); 1005 ASSERT_EQ(14, (*it)->ref(META_HANDLE));
1005 1006
1006 ASSERT_TRUE(++it == index.end()); 1007 ASSERT_TRUE(++it == index.end());
1007
1008 STLDeleteElements(&index);
1009 } 1008 }
1010 1009
1011 INSTANTIATE_TEST_CASE_P(DirectoryBackingStore, MigrationTest, 1010 INSTANTIATE_TEST_CASE_P(DirectoryBackingStore, MigrationTest,
1012 testing::Range(67, kCurrentDBVersion)); 1011 testing::Range(67, kCurrentDBVersion));
1013 1012
1014 TEST_F(DirectoryBackingStoreTest, ModelTypeIds) { 1013 TEST_F(DirectoryBackingStoreTest, ModelTypeIds) {
1015 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { 1014 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
1016 std::string model_id = 1015 std::string model_id =
1017 DirectoryBackingStore::ModelTypeEnumToModelId(ModelTypeFromInt(i)); 1016 DirectoryBackingStore::ModelTypeEnumToModelId(ModelTypeFromInt(i));
1018 EXPECT_EQ(i, 1017 EXPECT_EQ(i,
(...skipping 22 matching lines...) Expand all
1041 EXPECT_DEATH(dbs->BeginLoad(), "sqlite error"); 1040 EXPECT_DEATH(dbs->BeginLoad(), "sqlite error");
1042 #endif 1041 #endif
1043 } 1042 }
1044 } 1043 }
1045 1044
1046 TEST_F(DirectoryBackingStoreTest, DeleteEntries) { 1045 TEST_F(DirectoryBackingStoreTest, DeleteEntries) {
1047 SetUpCurrentDatabaseAndCheckVersion(); 1046 SetUpCurrentDatabaseAndCheckVersion();
1048 scoped_ptr<DirectoryBackingStore> dbs( 1047 scoped_ptr<DirectoryBackingStore> dbs(
1049 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1048 new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1050 dbs->BeginLoad(); 1049 dbs->BeginLoad();
1051
1052 MetahandlesIndex index; 1050 MetahandlesIndex index;
1051 STLElementDeleter<MetahandlesIndex> index_deleter(&index);
1053 dbs->LoadEntries(&index); 1052 dbs->LoadEntries(&index);
1054 size_t initial_size = index.size(); 1053 size_t initial_size = index.size();
1055 ASSERT_LT(0U, initial_size) << "Test requires entries to delete."; 1054 ASSERT_LT(0U, initial_size) << "Test requires entries to delete.";
1056 int64 first_to_die = (*index.begin())->ref(META_HANDLE); 1055 int64 first_to_die = (*index.begin())->ref(META_HANDLE);
1057 MetahandleSet to_delete; 1056 MetahandleSet to_delete;
1058 to_delete.insert(first_to_die); 1057 to_delete.insert(first_to_die);
1059 EXPECT_TRUE(dbs->DeleteEntries(to_delete)); 1058 EXPECT_TRUE(dbs->DeleteEntries(to_delete));
1060 1059
1061 index.clear(); 1060 STLDeleteElements(&index);
1062 dbs->LoadEntries(&index); 1061 dbs->LoadEntries(&index);
1063 1062
1064 EXPECT_EQ(initial_size - 1, index.size()); 1063 EXPECT_EQ(initial_size - 1, index.size());
1065 bool delete_failed = false; 1064 bool delete_failed = false;
1066 for (MetahandlesIndex::iterator it = index.begin(); it != index.end(); 1065 for (MetahandlesIndex::iterator it = index.begin(); it != index.end();
1067 ++it) { 1066 ++it) {
1068 if ((*it)->ref(META_HANDLE) == first_to_die) { 1067 if ((*it)->ref(META_HANDLE) == first_to_die) {
1069 delete_failed = true; 1068 delete_failed = true;
1070 break; 1069 break;
1071 } 1070 }
1072 } 1071 }
1073 EXPECT_FALSE(delete_failed); 1072 EXPECT_FALSE(delete_failed);
1074 1073
1075 to_delete.clear(); 1074 to_delete.clear();
1076 for (MetahandlesIndex::iterator it = index.begin(); it != index.end(); 1075 for (MetahandlesIndex::iterator it = index.begin(); it != index.end();
1077 ++it) { 1076 ++it) {
1078 to_delete.insert((*it)->ref(META_HANDLE)); 1077 to_delete.insert((*it)->ref(META_HANDLE));
1079 } 1078 }
1080 1079
1081 EXPECT_TRUE(dbs->DeleteEntries(to_delete)); 1080 EXPECT_TRUE(dbs->DeleteEntries(to_delete));
1082 1081
1083 index.clear(); 1082 STLDeleteElements(&index);
1084 dbs->LoadEntries(&index); 1083 dbs->LoadEntries(&index);
1085 EXPECT_EQ(0U, index.size()); 1084 EXPECT_EQ(0U, index.size());
1086 1085
1087 dbs->EndLoad(); 1086 dbs->EndLoad();
1088 dbs->EndSave(); 1087 dbs->EndSave();
1089 } 1088 }
1090 1089
1091 } // namespace syncable 1090 } // namespace syncable
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698