| Index: sync/syncable/syncable_unittest.cc
|
| diff --git a/sync/syncable/syncable_unittest.cc b/sync/syncable/syncable_unittest.cc
|
| index 2a089ac3e3eb86cc875671c79c0fb303c6d08255..5378cc8fa8c0e412682305d0522e1248d3a5b726 100644
|
| --- a/sync/syncable/syncable_unittest.cc
|
| +++ b/sync/syncable/syncable_unittest.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop.h"
|
| +#include "base/stl_util.h"
|
| #include "base/stringprintf.h"
|
| #include "base/synchronization/condition_variable.h"
|
| #include "base/test/values_test_util.h"
|
| @@ -492,12 +493,14 @@ class SyncableDirectoryTest : public testing::Test {
|
| scoped_ptr<Directory> dir_;
|
| NullDirectoryChangeDelegate delegate_;
|
|
|
| - // Creates an empty entry and sets the ID field to a default one.
|
| + // Creates an empty entry and sets the ID field to a default one. Return meta
|
| + // handel of created entry.
|
| void CreateEntry(const std::string& entryname) {
|
| CreateEntry(entryname, TestIdFactory::FromNumber(-99));
|
| }
|
|
|
| - // Creates an empty entry and sets the ID field to id.
|
| + // Creates an empty entry and sets the ID field to id. Return meta handel of
|
| + // created entry.
|
| void CreateEntry(const std::string& entryname, const int id) {
|
| CreateEntry(entryname, TestIdFactory::FromNumber(id));
|
| }
|
| @@ -599,7 +602,7 @@ TEST_F(SyncableDirectoryTest, TakeSnapshotGetsAllDirtyHandlesTest) {
|
| ASSERT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size());
|
| for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
|
| i != snapshot.dirty_metas.end(); ++i) {
|
| - ASSERT_TRUE(i->is_dirty());
|
| + ASSERT_TRUE((*i)->is_dirty());
|
| }
|
| dir_->VacuumAfterSaveChanges(snapshot);
|
| }
|
| @@ -632,7 +635,7 @@ TEST_F(SyncableDirectoryTest, TakeSnapshotGetsAllDirtyHandlesTest) {
|
| EXPECT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size());
|
| for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
|
| i != snapshot.dirty_metas.end(); ++i) {
|
| - EXPECT_TRUE(i->is_dirty());
|
| + EXPECT_TRUE((*i)->is_dirty());
|
| }
|
| dir_->VacuumAfterSaveChanges(snapshot);
|
| }
|
| @@ -721,12 +724,130 @@ TEST_F(SyncableDirectoryTest, TakeSnapshotGetsOnlyDirtyHandlesTest) {
|
| EXPECT_EQ(number_changed, snapshot.dirty_metas.size());
|
| for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
|
| i != snapshot.dirty_metas.end(); ++i) {
|
| - EXPECT_TRUE(i->is_dirty());
|
| + EXPECT_TRUE((*i)->is_dirty());
|
| }
|
| dir_->VacuumAfterSaveChanges(snapshot);
|
| }
|
| }
|
|
|
| +// Test delete journals management.
|
| +TEST_F(SyncableDirectoryTest, ManageDeleteJournals) {
|
| + sync_pb::EntitySpecifics bookmark_specifics;
|
| + AddDefaultFieldValue(BOOKMARKS, &bookmark_specifics);
|
| + bookmark_specifics.mutable_bookmark()->set_url("url");
|
| +
|
| + Id id1 = TestIdFactory::FromNumber(-1);
|
| + Id id2 = TestIdFactory::FromNumber(-2);
|
| + int64 handle1 = 0;
|
| + int64 handle2 = 0;
|
| + {
|
| + // Create two bookmark entries and save in database.
|
| + CreateEntry("item1", id1);
|
| + CreateEntry("item2", id2);
|
| + {
|
| + WriteTransaction trans(FROM_HERE, UNITTEST, dir_.get());
|
| + MutableEntry item1(&trans, GET_BY_ID, id1);
|
| + ASSERT_TRUE(item1.good());
|
| + handle1 = item1.Get(META_HANDLE);
|
| + item1.Put(SPECIFICS, bookmark_specifics);
|
| + item1.Put(SERVER_SPECIFICS, bookmark_specifics);
|
| + MutableEntry item2(&trans, GET_BY_ID, id2);
|
| + ASSERT_TRUE(item2.good());
|
| + handle2 = item2.Get(META_HANDLE);
|
| + item2.Put(SPECIFICS, bookmark_specifics);
|
| + item2.Put(SERVER_SPECIFICS, bookmark_specifics);
|
| + }
|
| + ASSERT_EQ(OPENED, SimulateSaveAndReloadDir());
|
| + }
|
| +
|
| + { // Test adding and saving delete journals.
|
| + {
|
| + WriteTransaction trans(FROM_HERE, UNITTEST, dir_.get());
|
| + EntryKernelSet delete_journals;
|
| + dir_->GetDeleteJournals(&trans, BOOKMARKS, &delete_journals);
|
| + ASSERT_EQ(0u, delete_journals.size());
|
| +
|
| + // Set SERVER_IS_DEL of the entries to true and they should be added to
|
| + // delete journals.
|
| + MutableEntry item1(&trans, GET_BY_ID, id1);
|
| + ASSERT_TRUE(item1.good());
|
| + item1.Put(SERVER_IS_DEL, true);
|
| + MutableEntry item2(&trans, GET_BY_ID, id2);
|
| + ASSERT_TRUE(item2.good());
|
| + item2.Put(SERVER_IS_DEL, true);
|
| + EntryKernel tmp;
|
| + tmp.put(ID, id1);
|
| + EXPECT_TRUE(dir_->kernel_->delete_journals_->count(&tmp));
|
| + tmp.put(ID, id2);
|
| + EXPECT_TRUE(dir_->kernel_->delete_journals_->count(&tmp));
|
| + }
|
| +
|
| + // Save delete journals in database and verify memory clearing.
|
| + ASSERT_TRUE(dir_->SaveChanges());
|
| + EXPECT_EQ(0u, dir_->kernel_->delete_journals_->size());
|
| + ASSERT_EQ(OPENED, SimulateSaveAndReloadDir());
|
| + }
|
| +
|
| + {
|
| + {
|
| + // Test reading delete journals from database.
|
| + WriteTransaction trans(FROM_HERE, UNITTEST, dir_.get());
|
| + EntryKernelSet delete_journals;
|
| + dir_->GetDeleteJournals(&trans, BOOKMARKS, &delete_journals);
|
| + ASSERT_EQ(2u, delete_journals.size());
|
| + EntryKernel tmp;
|
| + tmp.put(META_HANDLE, handle1);
|
| + EXPECT_TRUE(delete_journals.count(&tmp));
|
| + tmp.put(META_HANDLE, handle2);
|
| + EXPECT_TRUE(delete_journals.count(&tmp));
|
| +
|
| + // Purge item2.
|
| + MetahandleSet to_purge;
|
| + to_purge.insert(handle2);
|
| + dir_->PurgeDeleteJournals(&trans, to_purge);
|
| +
|
| + // Verify that item2 is purged from journals in memory and will be
|
| + // purged from database.
|
| + tmp.put(ID, id2);
|
| + EXPECT_FALSE(dir_->kernel_->delete_journals_->count(&tmp));
|
| + EXPECT_EQ(1u, dir_->kernel_->delete_journals_to_purge_->size());
|
| + EXPECT_TRUE(dir_->kernel_->delete_journals_to_purge_->count(handle2));
|
| + }
|
| + ASSERT_EQ(OPENED, SimulateSaveAndReloadDir());
|
| + }
|
| +
|
| + {
|
| + {
|
| + // Verify purged entry is gone in database.
|
| + WriteTransaction trans(FROM_HERE, UNITTEST, dir_.get());
|
| + EntryKernelSet delete_journals;
|
| + dir_->GetDeleteJournals(&trans, BOOKMARKS, &delete_journals);
|
| + ASSERT_EQ(1u, delete_journals.size());
|
| + EntryKernel tmp;
|
| + tmp.put(ID, id1);
|
| + tmp.put(META_HANDLE, handle1);
|
| + EXPECT_TRUE(delete_journals.count(&tmp));
|
| +
|
| + // Undelete item1.
|
| + MutableEntry item1(&trans, GET_BY_ID, id1);
|
| + ASSERT_TRUE(item1.good());
|
| + item1.Put(SERVER_IS_DEL, false);
|
| + EXPECT_TRUE(dir_->kernel_->delete_journals_->empty());
|
| + EXPECT_EQ(1u, dir_->kernel_->delete_journals_to_purge_->size());
|
| + EXPECT_TRUE(dir_->kernel_->delete_journals_to_purge_->count(handle1));
|
| + }
|
| + ASSERT_EQ(OPENED, SimulateSaveAndReloadDir());
|
| + }
|
| +
|
| + {
|
| + // Verify undeleted entry is gone from database.
|
| + ReadTransaction trans(FROM_HERE, dir_.get());
|
| + EntryKernelSet delete_journals;
|
| + dir_->GetDeleteJournals(&trans, BOOKMARKS, &delete_journals);
|
| + ASSERT_EQ(0u, delete_journals.size());
|
| + }
|
| +}
|
| +
|
| const char SyncableDirectoryTest::kName[] = "Foo";
|
|
|
| namespace {
|
|
|