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

Unified Diff: sync/syncable/directory_backing_store_unittest.cc

Issue 10821121: sync: Attempt to recover from directory corruption (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: sync/syncable/directory_backing_store_unittest.cc
diff --git a/sync/syncable/directory_backing_store_unittest.cc b/sync/syncable/directory_backing_store_unittest.cc
index 25aca638a8453b5da43fa7591f240581aa093ded..0a1cc3db7e79977725bcfdbd5f10f12cb4607728 100644
--- a/sync/syncable/directory_backing_store_unittest.cc
+++ b/sync/syncable/directory_backing_store_unittest.cc
@@ -2083,22 +2083,37 @@ TEST_F(DirectoryBackingStoreTest, ModelTypeIds) {
}
}
-// TODO(109668): This had to be disabled because the latest API will
-// intentionally crash when a database is this badly corrupted.
-TEST_F(DirectoryBackingStoreTest, DISABLED_Corruption) {
+// This is a whitebox test intended to exercise the code path where the on-disk
+// directory load code decides to delete the current directory and start fresh.
+//
+// Unfortunately, there's no way to tell that this code path is actually
+// exercised by the test. If the directory failed to detect the corruption, the
+// result would look exactly the same from this level of abstraction.
+//
+// This is considered "minor" corruption because the database recreation is
+// expected to succeed. The alternative, where recreation does not succeed (ie.
+// due to read-only file system), is not tested here.
+TEST_F(DirectoryBackingStoreTest, MinorCorruption) {
{
scoped_ptr<OnDiskDirectoryBackingStore> dbs(
new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath()));
- EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get()));
+ EXPECT_EQ(OPENED, LoadAndIgnoreReturnedData(dbs.get()));
+ }
+
+ // Corrupt the root node.
+ {
+ sql::Connection connection;
+ ASSERT_TRUE(connection.Open(GetDatabasePath()));
+ ASSERT_TRUE(connection.Execute(
+ "UPDATE metas SET parent_id='bogus' WHERE id = 'r';"));
}
- std::string bad_data("BAD DATA");
- EXPECT_TRUE(file_util::WriteFile(GetDatabasePath(), bad_data.data(),
- bad_data.size()));
+
{
scoped_ptr<OnDiskDirectoryBackingStore> dbs(
new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath()));
+ dbs->AllowFailureForTest();
- EXPECT_FALSE(LoadAndIgnoreReturnedData(dbs.get()));
+ EXPECT_EQ(OPENED, LoadAndIgnoreReturnedData(dbs.get()));
}
}

Powered by Google App Engine
This is Rietveld 408576698