| Index: sync/syncable/directory_unittest.cc
|
| diff --git a/sync/syncable/directory_unittest.cc b/sync/syncable/directory_unittest.cc
|
| index 5f8cbed23c2225e3827f09a905586f6f8e4eaa5a..aa974d5ff1ba1dc69d8d7e6898663b07e21b7218 100644
|
| --- a/sync/syncable/directory_unittest.cc
|
| +++ b/sync/syncable/directory_unittest.cc
|
| @@ -552,6 +552,87 @@ TEST_F(SyncableDirectoryTest, ManageDeleteJournals) {
|
| }
|
| }
|
|
|
| +TEST_F(SyncableDirectoryTest, TestPurgeDeletedEntriesOnReload) {
|
| + sync_pb::EntitySpecifics specifics;
|
| + AddDefaultFieldValue(PREFERENCES, &specifics);
|
| +
|
| + const int kClientCount = 2;
|
| + const int kServerCount = 5;
|
| + const int kTestCount = kClientCount + kServerCount;
|
| + int64 handles[kTestCount];
|
| +
|
| + // 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 < kTestCount; 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 < kClientCount) {
|
| + item.PutId(TestIdFactory::FromNumber(i - kClientCount));
|
| + } else {
|
| + item.PutId(TestIdFactory::FromNumber(i));
|
| + }
|
| +
|
| + item.PutUniqueClientTag(name);
|
| + item.PutIsUnsynced(true);
|
| + item.PutSpecifics(specifics);
|
| + item.PutServerSpecifics(specifics);
|
| +
|
| + if (i >= kClientCount) {
|
| + 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 according to
|
| + // DirectoryBackingStore::SafeToPurgeOnLoading:
|
| + // - Item 0 is an item with IS_DEL flag and client ID.
|
| + // - Item 5 is an item with IS_DEL flag which has both
|
| + // IS_UNSYNCED and IS_UNAPPLIED_UPDATE unset.
|
| + 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 < kTestCount; 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));
|
|
|