Index: sync/syncable/directory_unittest.cc |
diff --git a/sync/syncable/directory_unittest.cc b/sync/syncable/directory_unittest.cc |
index 5f8cbed23c2225e3827f09a905586f6f8e4eaa5a..333cf6094cab47acbecbe9208eb70ac05842f0b1 100644 |
--- a/sync/syncable/directory_unittest.cc |
+++ b/sync/syncable/directory_unittest.cc |
@@ -552,6 +552,83 @@ TEST_F(SyncableDirectoryTest, ManageDeleteJournals) { |
} |
} |
+TEST_F(SyncableDirectoryTest, TestPurgeDeletedEntriesOnReload) { |
+ sync_pb::EntitySpecifics specifics; |
+ AddDefaultFieldValue(PREFERENCES, &specifics); |
+ |
+ const int CLIENT_COUNT = 2; |
Nicolas Zea
2015/03/17 01:05:17
nit: const variables should be of the form kCamelC
|
+ const int SERVER_COUNT = 5; |
+ const int TEST_COUNT = CLIENT_COUNT + SERVER_COUNT; |
+ int64 handles[TEST_COUNT]; |
+ |
+ // The idea is to recreate various combinations of IDs, IS_DEL, |
+ // IS_UNSYNCED, and IS_UNAPPLIED_UPDATE flags to test all combinations |
+ // for DirectoryBackingStore::SafeToPurgeOnLoading. |
+ // 0: client ID, IS_DEL, IS_UNSYNCED |
+ // 1: client ID, IS_UNSYNCED |
+ // 2: server ID, IS_DEL, IS_UNSYNCED, IS_UNAPPLIED_UPDATE |
+ // 3: server ID, IS_DEL, IS_UNSYNCED |
+ // 4: server ID, IS_DEL, IS_UNAPPLIED_UPDATE |
+ // 5: server ID, IS_DEL |
+ // 6: server ID |
+ { |
+ WriteTransaction trans(FROM_HERE, UNITTEST, dir().get()); |
+ |
+ for (int i = 0; i < TEST_COUNT; i++) { |
+ std::string name = base::StringPrintf("item%d", i); |
+ MutableEntry item(&trans, CREATE, PREFERENCES, trans.root_id(), name); |
+ ASSERT_TRUE(item.good()); |
+ |
+ handles[i] = item.GetMetahandle(); |
+ |
+ if (i < CLIENT_COUNT) { |
+ item.PutId(TestIdFactory::FromNumber(i - CLIENT_COUNT)); |
+ } else { |
+ item.PutId(TestIdFactory::FromNumber(i)); |
+ } |
+ |
+ item.PutUniqueClientTag(name); |
+ item.PutIsUnsynced(true); |
+ item.PutSpecifics(specifics); |
+ item.PutServerSpecifics(specifics); |
+ |
+ if (i >= CLIENT_COUNT) { |
+ item.PutBaseVersion(10); |
+ item.PutServerVersion(10); |
+ } |
+ |
+ // Set flags |
+ if (i != 1 && i != 6) |
+ item.PutIsDel(true); |
+ |
+ if (i >= 4) |
+ item.PutIsUnsynced(false); |
+ |
+ if (i == 2 || i == 4) |
+ item.PutIsUnappliedUpdate(true); |
+ } |
+ } |
+ ASSERT_EQ(OPENED, SimulateSaveAndReloadDir()); |
+ |
+ // Expect items 0 and 5 to be purged |
Nicolas Zea
2015/03/17 01:05:17
nit: explain why?
|
+ std::vector<int64> expected_purged; |
+ expected_purged.push_back(0); |
+ expected_purged.push_back(5); |
+ |
+ std::vector<int64> actually_purged; |
+ { |
+ ReadTransaction trans(FROM_HERE, dir().get()); |
+ for (int i = 0; i < TEST_COUNT; i++) { |
+ Entry item(&trans, GET_BY_HANDLE, handles[i]); |
+ if (!item.good()) { |
+ actually_purged.push_back(i); |
+ } |
+ } |
+ } |
+ |
+ EXPECT_EQ(expected_purged, actually_purged); |
+} |
+ |
TEST_F(SyncableDirectoryTest, TestBasicLookupNonExistantID) { |
ReadTransaction rtrans(FROM_HERE, dir().get()); |
Entry e(&rtrans, GET_BY_ID, TestIdFactory::FromNumber(-99)); |