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

Unified Diff: sync/syncable/parent_child_index_unittest.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 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
« no previous file with comments | « sync/syncable/parent_child_index.cc ('k') | sync/syncable/scoped_kernel_lock.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/syncable/parent_child_index_unittest.cc
diff --git a/sync/syncable/parent_child_index_unittest.cc b/sync/syncable/parent_child_index_unittest.cc
deleted file mode 100644
index 1ef983255c6aebb96ed7196cfb7f76bacf33edfc..0000000000000000000000000000000000000000
--- a/sync/syncable/parent_child_index_unittest.cc
+++ /dev/null
@@ -1,526 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "sync/syncable/parent_child_index.h"
-
-#include <list>
-#include <string>
-
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "sync/syncable/entry_kernel.h"
-#include "sync/syncable/syncable_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace syncer {
-namespace syncable {
-
-namespace {
-
-static const std::string kCacheGuid = "8HhNIHlEOCGQbIAALr9QEg==";
-
-} // namespace
-
-class ParentChildIndexTest : public testing::Test {
- public:
- void TearDown() override {
- // To make memory management easier, we take ownership of all EntryKernels
- // returned by our factory methods and delete them here.
- STLDeleteElements(&owned_entry_kernels_);
- }
-
- // Unfortunately, we can't use the regular Entry factory methods, because the
- // ParentChildIndex deals in EntryKernels.
-
- static syncable::Id GetBookmarkRootId() {
- return syncable::Id::CreateFromServerId("bookmark_folder");
- }
-
- static syncable::Id GetBookmarkId(int n) {
- return syncable::Id::CreateFromServerId("b" + base::IntToString(n));
- }
-
- static syncable::Id GetClientUniqueId(int n) {
- return syncable::Id::CreateFromServerId("c" + base::IntToString(n));
- }
-
- EntryKernel* MakeRoot() {
- // Mimics the root node.
- EntryKernel* root = new EntryKernel();
- root->put(META_HANDLE, 1);
- root->put(BASE_VERSION, -1);
- root->put(SERVER_VERSION, 0);
- root->put(IS_DIR, true);
- root->put(ID, syncable::Id::GetRoot());
- root->put(PARENT_ID, syncable::Id::GetRoot());
-
- owned_entry_kernels_.push_back(root);
- return root;
- }
-
- EntryKernel* MakeTypeRoot(ModelType model_type, const syncable::Id& id) {
- // Mimics a server-created bookmark folder.
- EntryKernel* folder = new EntryKernel;
- folder->put(META_HANDLE, 1);
- folder->put(BASE_VERSION, 9);
- folder->put(SERVER_VERSION, 9);
- folder->put(IS_DIR, true);
- folder->put(ID, id);
- folder->put(PARENT_ID, syncable::Id::GetRoot());
- folder->put(UNIQUE_SERVER_TAG, ModelTypeToRootTag(model_type));
-
- // Ensure that GetModelType() returns a correct value.
- sync_pb::EntitySpecifics specifics;
- AddDefaultFieldValue(model_type, &specifics);
- folder->put(SPECIFICS, specifics);
-
- owned_entry_kernels_.push_back(folder);
- return folder;
- }
-
- EntryKernel* MakeBookmarkRoot() {
- return MakeTypeRoot(BOOKMARKS, GetBookmarkRootId());
- }
-
- EntryKernel* MakeBookmark(int n, int pos, bool is_dir) {
- // Mimics a regular bookmark or folder.
- EntryKernel* bm = new EntryKernel();
- bm->put(META_HANDLE, n);
- bm->put(BASE_VERSION, 10);
- bm->put(SERVER_VERSION, 10);
- bm->put(IS_DIR, is_dir);
- bm->put(ID, GetBookmarkId(n));
- bm->put(PARENT_ID, GetBookmarkRootId());
-
- bm->put(UNIQUE_BOOKMARK_TAG,
- syncable::GenerateSyncableBookmarkHash(kCacheGuid,
- bm->ref(ID).GetServerId()));
-
- UniquePosition unique_pos =
- UniquePosition::FromInt64(pos, bm->ref(UNIQUE_BOOKMARK_TAG));
- bm->put(UNIQUE_POSITION, unique_pos);
- bm->put(SERVER_UNIQUE_POSITION, unique_pos);
-
- owned_entry_kernels_.push_back(bm);
- return bm;
- }
-
- EntryKernel* MakeUniqueClientItem(ModelType model_type,
- int n,
- const syncable::Id& parent_id) {
- EntryKernel* item = new EntryKernel();
- item->put(META_HANDLE, n);
- item->put(BASE_VERSION, 10);
- item->put(SERVER_VERSION, 10);
- item->put(IS_DIR, false);
- item->put(ID, GetClientUniqueId(n));
- item->put(UNIQUE_CLIENT_TAG, base::IntToString(n));
-
- if (!parent_id.IsNull()) {
- item->put(PARENT_ID, parent_id);
- }
-
- if (model_type != UNSPECIFIED) {
- // Ensure that GetModelType() returns a correct value.
- sync_pb::EntitySpecifics specifics;
- AddDefaultFieldValue(model_type, &specifics);
- item->put(SPECIFICS, specifics);
- }
-
- owned_entry_kernels_.push_back(item);
- return item;
- }
-
- EntryKernel* MakeUniqueClientItem(int n, const syncable::Id& parent_id) {
- return MakeUniqueClientItem(UNSPECIFIED, n, parent_id);
- }
-
- EntryKernel* MakeUniqueClientItem(ModelType model_type, int n) {
- return MakeUniqueClientItem(model_type, n, Id());
- }
-
- const syncable::Id& IndexKnownModelTypeRootId(ModelType model_type) const {
- return index_.GetModelTypeRootId(model_type);
- }
-
- ParentChildIndex index_;
-
- private:
- std::list<EntryKernel*> owned_entry_kernels_;
-};
-
-TEST_F(ParentChildIndexTest, TestRootNode) {
- EntryKernel* root = MakeRoot();
- EXPECT_FALSE(ParentChildIndex::ShouldInclude(root));
-}
-
-TEST_F(ParentChildIndexTest, TestBookmarkRootFolder) {
- EntryKernel* bm_folder = MakeBookmarkRoot();
- EXPECT_TRUE(ParentChildIndex::ShouldInclude(bm_folder));
-
- index_.Insert(bm_folder);
- // Since BOOKMARKS is a hierarchical type, its type root folder shouldn't be
- // tracked by ParentChildIndex.
- EXPECT_EQ(Id(), IndexKnownModelTypeRootId(BOOKMARKS));
-}
-
-// Tests iteration over a set of siblings.
-TEST_F(ParentChildIndexTest, ChildInsertionAndIteration) {
- EntryKernel* bm_folder = MakeBookmarkRoot();
- index_.Insert(bm_folder);
-
- // Make some folder and non-folder entries.
- EntryKernel* b1 = MakeBookmark(1, 1, false);
- EntryKernel* b2 = MakeBookmark(2, 2, false);
- EntryKernel* b3 = MakeBookmark(3, 3, true);
- EntryKernel* b4 = MakeBookmark(4, 4, false);
-
- // Insert them out-of-order to test different cases.
- index_.Insert(b3); // Only child.
- index_.Insert(b4); // Right-most child.
- index_.Insert(b1); // Left-most child.
- index_.Insert(b2); // Between existing items.
-
- // Double-check they've been added.
- EXPECT_TRUE(index_.Contains(b1));
- EXPECT_TRUE(index_.Contains(b2));
- EXPECT_TRUE(index_.Contains(b3));
- EXPECT_TRUE(index_.Contains(b4));
-
- // Check the ordering.
- const OrderedChildSet* children = index_.GetChildren(GetBookmarkRootId());
- ASSERT_TRUE(children);
- ASSERT_EQ(children->size(), 4UL);
- OrderedChildSet::const_iterator it = children->begin();
- EXPECT_EQ(*it, b1);
- it++;
- EXPECT_EQ(*it, b2);
- it++;
- EXPECT_EQ(*it, b3);
- it++;
- EXPECT_EQ(*it, b4);
- it++;
- EXPECT_TRUE(it == children->end());
-}
-
-// Tests iteration when hierarchy is involved.
-TEST_F(ParentChildIndexTest, ChildInsertionAndIterationWithHierarchy) {
- EntryKernel* bm_folder = MakeBookmarkRoot();
- index_.Insert(bm_folder);
-
- // Just below the root, we have folders f1 and f2.
- EntryKernel* f1 = MakeBookmark(1, 1, false);
- EntryKernel* f2 = MakeBookmark(2, 2, false);
- EntryKernel* f3 = MakeBookmark(3, 3, false);
-
- // Under folder f1, we have two bookmarks.
- EntryKernel* f1_b1 = MakeBookmark(101, 1, false);
- f1_b1->put(PARENT_ID, GetBookmarkId(1));
- EntryKernel* f1_b2 = MakeBookmark(102, 2, false);
- f1_b2->put(PARENT_ID, GetBookmarkId(1));
-
- // Under folder f2, there is one bookmark.
- EntryKernel* f2_b1 = MakeBookmark(201, 1, false);
- f2_b1->put(PARENT_ID, GetBookmarkId(2));
-
- // Under folder f3, there is nothing.
-
- // Insert in a strange order, because we can.
- index_.Insert(f1_b2);
- index_.Insert(f2);
- index_.Insert(f2_b1);
- index_.Insert(f1);
- index_.Insert(f1_b1);
- index_.Insert(f3);
-
- OrderedChildSet::const_iterator it;
-
- // Iterate over children of the bookmark root.
- const OrderedChildSet* top_children = index_.GetChildren(GetBookmarkRootId());
- ASSERT_TRUE(top_children);
- ASSERT_EQ(top_children->size(), 3UL);
- it = top_children->begin();
- EXPECT_EQ(*it, f1);
- it++;
- EXPECT_EQ(*it, f2);
- it++;
- EXPECT_EQ(*it, f3);
- it++;
- EXPECT_TRUE(it == top_children->end());
-
- // Iterate over children of the first folder.
- const OrderedChildSet* f1_children = index_.GetChildren(GetBookmarkId(1));
- ASSERT_TRUE(f1_children);
- ASSERT_EQ(f1_children->size(), 2UL);
- it = f1_children->begin();
- EXPECT_EQ(*it, f1_b1);
- it++;
- EXPECT_EQ(*it, f1_b2);
- it++;
- EXPECT_TRUE(it == f1_children->end());
-
- // Iterate over children of the second folder.
- const OrderedChildSet* f2_children = index_.GetChildren(GetBookmarkId(2));
- ASSERT_TRUE(f2_children);
- ASSERT_EQ(f2_children->size(), 1UL);
- it = f2_children->begin();
- EXPECT_EQ(*it, f2_b1);
- it++;
- EXPECT_TRUE(it == f2_children->end());
-
- // Check for children of the third folder.
- const OrderedChildSet* f3_children = index_.GetChildren(GetBookmarkId(3));
- EXPECT_FALSE(f3_children);
-}
-
-// Tests removing items.
-TEST_F(ParentChildIndexTest, RemoveWithHierarchy) {
- EntryKernel* bm_folder = MakeBookmarkRoot();
- index_.Insert(bm_folder);
-
- // Just below the root, we have folders f1 and f2.
- EntryKernel* f1 = MakeBookmark(1, 1, false);
- EntryKernel* f2 = MakeBookmark(2, 2, false);
- EntryKernel* f3 = MakeBookmark(3, 3, false);
-
- // Under folder f1, we have two bookmarks.
- EntryKernel* f1_b1 = MakeBookmark(101, 1, false);
- f1_b1->put(PARENT_ID, GetBookmarkId(1));
- EntryKernel* f1_b2 = MakeBookmark(102, 2, false);
- f1_b2->put(PARENT_ID, GetBookmarkId(1));
-
- // Under folder f2, there is one bookmark.
- EntryKernel* f2_b1 = MakeBookmark(201, 1, false);
- f2_b1->put(PARENT_ID, GetBookmarkId(2));
-
- // Under folder f3, there is nothing.
-
- // Insert in any order.
- index_.Insert(f2_b1);
- index_.Insert(f3);
- index_.Insert(f1_b2);
- index_.Insert(f1);
- index_.Insert(f2);
- index_.Insert(f1_b1);
-
- // Check that all are in the index.
- EXPECT_TRUE(index_.Contains(f1));
- EXPECT_TRUE(index_.Contains(f2));
- EXPECT_TRUE(index_.Contains(f3));
- EXPECT_TRUE(index_.Contains(f1_b1));
- EXPECT_TRUE(index_.Contains(f1_b2));
- EXPECT_TRUE(index_.Contains(f2_b1));
-
- // Remove them all in any order.
- index_.Remove(f3);
- EXPECT_FALSE(index_.Contains(f3));
- index_.Remove(f1_b2);
- EXPECT_FALSE(index_.Contains(f1_b2));
- index_.Remove(f2_b1);
- EXPECT_FALSE(index_.Contains(f2_b1));
- index_.Remove(f1);
- EXPECT_FALSE(index_.Contains(f1));
- index_.Remove(f2);
- EXPECT_FALSE(index_.Contains(f2));
- index_.Remove(f1_b1);
- EXPECT_FALSE(index_.Contains(f1_b1));
-}
-
-// Test that involves two non-ordered items.
-TEST_F(ParentChildIndexTest, UnorderedChildren) {
- // Make two unique client tag items under the root node.
- EntryKernel* u1 = MakeUniqueClientItem(1, syncable::Id::GetRoot());
- EntryKernel* u2 = MakeUniqueClientItem(2, syncable::Id::GetRoot());
-
- EXPECT_FALSE(u1->ShouldMaintainPosition());
- EXPECT_FALSE(u2->ShouldMaintainPosition());
-
- index_.Insert(u1);
- index_.Insert(u2);
-
- const OrderedChildSet* children = index_.GetChildren(syncable::Id::GetRoot());
- EXPECT_EQ(children->count(u1), 1UL);
- EXPECT_EQ(children->count(u2), 1UL);
- EXPECT_EQ(children->size(), 2UL);
-}
-
-// Test ordered and non-ordered entries under the same parent.
-// TODO(rlarocque): We should not need to support this.
-TEST_F(ParentChildIndexTest, OrderedAndUnorderedChildren) {
- EntryKernel* bm_folder = MakeBookmarkRoot();
- index_.Insert(bm_folder);
-
- EntryKernel* b1 = MakeBookmark(1, 1, false);
- EntryKernel* b2 = MakeBookmark(2, 2, false);
- EntryKernel* u1 = MakeUniqueClientItem(1, GetBookmarkRootId());
-
- index_.Insert(b1);
- index_.Insert(u1);
- index_.Insert(b2);
-
- const OrderedChildSet* children = index_.GetChildren(GetBookmarkRootId());
- ASSERT_TRUE(children);
- EXPECT_EQ(3UL, children->size());
-
- // Ensure that the non-positionable item is moved to the far right.
- OrderedChildSet::const_iterator it = children->begin();
- EXPECT_EQ(*it, b1);
- it++;
- EXPECT_EQ(*it, b2);
- it++;
- EXPECT_EQ(*it, u1);
- it++;
- EXPECT_TRUE(it == children->end());
-}
-
-TEST_F(ParentChildIndexTest, NodesWithImplicitParentId) {
- syncable::Id type_root_id = syncable::Id::CreateFromServerId("type_root");
- EntryKernel* type_root = MakeTypeRoot(PREFERENCES, type_root_id);
- index_.Insert(type_root);
- EXPECT_EQ(type_root_id, IndexKnownModelTypeRootId(PREFERENCES));
-
- // Create entries without parent ID
- EntryKernel* p1 = MakeUniqueClientItem(PREFERENCES, 1);
- EntryKernel* p2 = MakeUniqueClientItem(PREFERENCES, 2);
-
- index_.Insert(p1);
- index_.Insert(p2);
-
- EXPECT_TRUE(index_.Contains(p1));
- EXPECT_TRUE(index_.Contains(p2));
-
- // Items should appear under the type root
- const OrderedChildSet* children = index_.GetChildren(type_root);
- ASSERT_TRUE(children);
- EXPECT_EQ(2UL, children->size());
-
- EXPECT_EQ(2UL, index_.GetSiblings(p1)->size());
- EXPECT_EQ(2UL, index_.GetSiblings(p2)->size());
-
- index_.Remove(p1);
-
- EXPECT_FALSE(index_.Contains(p1));
- EXPECT_TRUE(index_.Contains(p2));
- children = index_.GetChildren(type_root_id);
- ASSERT_TRUE(children);
- EXPECT_EQ(1UL, children->size());
-
- index_.Remove(p2);
-
- EXPECT_FALSE(index_.Contains(p2));
- children = index_.GetChildren(type_root);
- ASSERT_EQ(nullptr, children);
-}
-
-// Test that the removal isn't sensitive to the order (PurgeEntriesWithTypeIn
-// removes items in arbitrary order).
-TEST_F(ParentChildIndexTest, RemoveOutOfOrder) {
- // Insert a type root and two items (with implicit parent ID).
- syncable::Id type_root_id = syncable::Id::CreateFromServerId("type_root");
- EntryKernel* type_root = MakeTypeRoot(PREFERENCES, type_root_id);
- index_.Insert(type_root);
- EntryKernel* p1 = MakeUniqueClientItem(PREFERENCES, 1);
- EntryKernel* p2 = MakeUniqueClientItem(PREFERENCES, 2);
- index_.Insert(p1);
- index_.Insert(p2);
-
- // Two items expected under the type root.
- const OrderedChildSet* children = index_.GetChildren(type_root);
- ASSERT_TRUE(children);
- EXPECT_EQ(2UL, children->size());
-
- // Remove all 3 items in arbitrary order.
- index_.Remove(p2);
- index_.Remove(type_root);
- index_.Remove(p1);
-
- EXPECT_EQ(nullptr, index_.GetChildren(type_root));
-
- // Add a new root and another two items again.
- type_root = MakeTypeRoot(PREFERENCES, type_root_id);
- index_.Insert(type_root);
-
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 3));
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 4));
-
- children = index_.GetChildren(type_root);
- ASSERT_TRUE(children);
- // Should have 2 items. If the out of order removal cleared the implicit
- // parent folder ID prematurely, the collection would have 3 items including
- // p1.
- EXPECT_EQ(2UL, children->size());
-}
-
-// Test that the insert isn't sensitive to the order (Loading entries from
-// Sync DB is done in arbitrary order).
-TEST_F(ParentChildIndexTest, InsertOutOfOrder) {
- // Insert two Preferences entries with implicit parent first
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 1));
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 2));
-
- // Then insert the Preferences type root
- syncable::Id type_root_id = syncable::Id::CreateFromServerId("type_root");
- index_.Insert(MakeTypeRoot(PREFERENCES, type_root_id));
-
- // The index should still be able to associate Preferences entries
- // with the root.
- const OrderedChildSet* children = index_.GetChildren(type_root_id);
- ASSERT_TRUE(children);
- EXPECT_EQ(2UL, children->size());
-}
-
-// Test that if for some reason we wind up with multiple type roots, we
-// gracefully handle it and don't allow any new entities to become invisible.
-TEST_F(ParentChildIndexTest, MultipleTypeRoots) {
- // Create the good Preferences type root.
- syncable::Id type_root_id = syncable::Id::CreateFromClientString("type_root");
- index_.Insert(MakeTypeRoot(PREFERENCES, type_root_id));
-
- // Then insert the bad Preferences type root
- syncable::Id bad_type_root_id = syncable::Id::CreateFromServerId("bad");
- index_.Insert(MakeTypeRoot(PREFERENCES, bad_type_root_id));
-
- // Insert two Preferences entries with implicit parent.
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 1));
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 2));
-
- // The index should still be able to associate Preferences entries
- // with the good and bad roots.
- const OrderedChildSet* children = index_.GetChildren(type_root_id);
- ASSERT_TRUE(children);
- EXPECT_EQ(2UL, children->size());
- const OrderedChildSet* children_bad = index_.GetChildren(bad_type_root_id);
- ASSERT_TRUE(children_bad);
- EXPECT_EQ(2UL, children_bad->size());
-}
-
-// Test that if for some reason we wind up with multiple type roots, we
-// gracefully handle it and don't allow any new entities to become invisible.
-// Same as above but with the roots created in inverse order.
-TEST_F(ParentChildIndexTest, MultipleTypeRootsInverse) {
- // Create the bad Preferences type root
- syncable::Id bad_type_root_id = syncable::Id::CreateFromServerId("bad");
- index_.Insert(MakeTypeRoot(PREFERENCES, bad_type_root_id));
-
- // Then insert the good Preferences type root.
- syncable::Id type_root_id = syncable::Id::CreateFromClientString("type_root");
- index_.Insert(MakeTypeRoot(PREFERENCES, type_root_id));
-
- // Insert two Preferences entries with implicit parent.
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 1));
- index_.Insert(MakeUniqueClientItem(PREFERENCES, 2));
-
- // The index should still be able to associate Preferences entries
- // with the good root and bad roots.
- const OrderedChildSet* children = index_.GetChildren(type_root_id);
- ASSERT_TRUE(children);
- EXPECT_EQ(2UL, children->size());
- const OrderedChildSet* children_bad = index_.GetChildren(bad_type_root_id);
- ASSERT_TRUE(children_bad);
- EXPECT_EQ(2UL, children_bad->size());
-}
-
-} // namespace syncable
-} // namespace syncer
-
« no previous file with comments | « sync/syncable/parent_child_index.cc ('k') | sync/syncable/scoped_kernel_lock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698