Index: components/sync/syncable/directory_backing_store_unittest.cc |
diff --git a/components/sync/syncable/directory_backing_store_unittest.cc b/components/sync/syncable/directory_backing_store_unittest.cc |
index 7f45eda8218c8b437c90d4e52fa3e6550ca77866..df72b316e16ffd23dbc8b54217065538696d44eb 100644 |
--- a/components/sync/syncable/directory_backing_store_unittest.cc |
+++ b/components/sync/syncable/directory_backing_store_unittest.cc |
@@ -78,6 +78,7 @@ class MigrationTest : public testing::TestWithParam<int> { |
&kernel_load_info) == OPENED; |
} |
+ void SetUpCorruptedRootDatabase(sql::Connection* connection); |
void SetUpVersion67Database(sql::Connection* connection); |
void SetUpVersion68Database(sql::Connection* connection); |
void SetUpVersion69Database(sql::Connection* connection); |
@@ -410,6 +411,51 @@ void ExpectTimes(const Directory::MetahandlesMap& handles_map, |
} // namespace |
+void MigrationTest::SetUpCorruptedRootDatabase(sql::Connection* connection) { |
+ ASSERT_TRUE(connection->is_open()); |
+ ASSERT_TRUE(connection->BeginTransaction()); |
+ ASSERT_TRUE(connection->Execute( |
+ "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " |
+ "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" |
+ "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," |
+ "base_version bigint default -1,server_version bigint default 0," |
+ "mtime bigint default 0,server_mtime bigint default 0," |
+ "ctime bigint default 0,server_ctime bigint default 0," |
+ "server_position_in_parent bigint default 0," |
+ "local_external_id bigint default 0,id varchar(255) default 'r'," |
+ "parent_id varchar(255) default 'r'," |
+ "server_parent_id varchar(255) default 'r'," |
+ "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," |
+ "is_unsynced bit default 0,is_unapplied_update bit default 0," |
+ "is_del bit default 0,is_dir bit default 0," |
+ "is_bookmark_object bit default 0,server_is_dir bit default 0," |
+ "server_is_del bit default 0,server_is_bookmark_object bit default 0," |
+ "name varchar(255), " /* COLLATE PATHNAME, */ |
+ "unsanitized_name varchar(255)," /* COLLATE PATHNAME, */ |
+ "non_unique_name varchar," |
+ "server_name varchar(255)," /* COLLATE PATHNAME */ |
+ "server_non_unique_name varchar," |
+ "bookmark_url varchar,server_bookmark_url varchar," |
+ "singleton_tag varchar,bookmark_favicon blob," |
+ "server_bookmark_favicon blob);" |
+ "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS( |
+ 1) ",0,0,'r2','r2','r','r','r',0,0,0,1,0,0,0,0,NULL," |
+ "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);" |
+ "CREATE TABLE share_info (id VARCHAR(128) primary key, " |
+ "last_sync_timestamp INT, name VARCHAR(128), " |
+ "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " |
+ "db_create_version VARCHAR(128), db_create_time int, " |
+ "next_id bigint default -2, cache_guid VARCHAR(32));" |
+ "INSERT INTO share_info VALUES('nick@chromium.org',694," |
+ "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," |
+ "'Unknown',1263522064,-65542," |
+ "'9010788312004066376x-6609234393368420856x');" |
+ "CREATE TABLE share_version (id VARCHAR(128) primary key, data " |
+ "INT);" |
+ "INSERT INTO share_version VALUES('nick@chromium.org',68);")); |
+ ASSERT_TRUE(connection->CommitTransaction()); |
+} |
+ |
void MigrationTest::SetUpVersion67Database(sql::Connection* connection) { |
// This is a version 67 database dump whose contents were backformed from |
// the contents of the version 68 database dump (the v68 migration was |
@@ -3570,6 +3616,23 @@ TEST_F(DirectoryBackingStoreTest, DetectInvalidPosition) { |
&kernel_load_info)); |
} |
+TEST_F(DirectoryBackingStoreTest, DetectCorruptedRoot) { |
+ sql::Connection connection; |
+ ASSERT_TRUE(connection.OpenInMemory()); |
+ SetUpCorruptedRootDatabase(&connection); |
+ |
+ std::unique_ptr<TestDirectoryBackingStore> dbs( |
+ new TestDirectoryBackingStore(GetUsername(), &connection)); |
+ |
+ Directory::MetahandlesMap handles_map; |
+ JournalIndex delete_journals; |
+ MetahandleSet metahandles_to_purge; |
+ Directory::KernelLoadInfo kernel_load_info; |
+ ASSERT_EQ(FAILED_DATABASE_CORRUPT, |
+ dbs->Load(&handles_map, &delete_journals, &metahandles_to_purge, |
+ &kernel_load_info)); |
+} |
+ |
TEST_P(MigrationTest, ToCurrentVersion) { |
sql::Connection connection; |
ASSERT_TRUE(connection.Open(GetDatabasePath())); |