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

Unified Diff: chrome/browser/sync/engine/apply_updates_command_unittest.cc

Issue 194065: Initial commit of sync engine code to browser/sync.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fixes to gtest include path, reverted syncapi. Created 11 years, 3 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: chrome/browser/sync/engine/apply_updates_command_unittest.cc
===================================================================
--- chrome/browser/sync/engine/apply_updates_command_unittest.cc (revision 0)
+++ chrome/browser/sync/engine/apply_updates_command_unittest.cc (revision 0)
@@ -0,0 +1,166 @@
+// Copyright (c) 2006-2009 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 "chrome/browser/sync/engine/apply_updates_command.h"
+#include "chrome/browser/sync/engine/sync_cycle_state.h"
+#include "chrome/browser/sync/engine/sync_process_state.h"
+#include "chrome/browser/sync/engine/syncer_session.h"
+#include "chrome/browser/sync/syncable/directory_manager.h"
+#include "chrome/browser/sync/syncable/syncable.h"
+#include "chrome/browser/sync/syncable/syncable_id.h"
+#include "chrome/browser/sync/util/character_set_converters.h"
+#include "chrome/test/sync/engine/test_directory_setter_upper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using std::string;
+using syncable::ScopedDirLookup;
+using syncable::WriteTransaction;
+using syncable::ReadTransaction;
+using syncable::MutableEntry;
+using syncable::Entry;
+using syncable::Id;
+using syncable::UNITTEST;
+
+namespace browser_sync {
+
+// A test fixture for tests exercising ApplyUpdatesCommand.
+class ApplyUpdatesCommandTest : public testing::Test {
+ protected:
+ ApplyUpdatesCommandTest() : next_revision_(1) {}
+ virtual ~ApplyUpdatesCommandTest() {}
+ virtual void SetUp() {
+ syncdb_.SetUp();
+ }
+ virtual void TearDown() {
+ syncdb_.TearDown();
+ }
+
+ protected:
+ // Create a new unapplied update.
+ void CreateUnappliedNewItemWithParent(const string& item_id,
+ const string& parent_id) {
+ ScopedDirLookup dir(syncdb_.manager(), syncdb_.name());
+ ASSERT_TRUE(dir.good());
+ WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__);
+ MutableEntry entry(&trans, syncable::CREATE_NEW_UPDATE_ITEM,
+ Id::CreateFromServerId(item_id));
+ ASSERT_TRUE(entry.good());
+ PathString name;
+ AppendUTF8ToPathString(item_id, &name);
+ entry.Put(syncable::SERVER_VERSION, next_revision_++);
+ entry.Put(syncable::IS_UNAPPLIED_UPDATE, true);
+ entry.Put(syncable::SERVER_NAME, name);
+ entry.Put(syncable::SERVER_NON_UNIQUE_NAME, name);
+ entry.Put(syncable::SERVER_PARENT_ID, Id::CreateFromServerId(parent_id));
+ entry.Put(syncable::SERVER_IS_DIR, true);
+ }
+
+ TestDirectorySetterUpper syncdb_;
+ ApplyUpdatesCommand apply_updates_command_;
+
+ private:
+ int64 next_revision_;
+ DISALLOW_COPY_AND_ASSIGN(ApplyUpdatesCommandTest);
+};
+
+TEST_F(ApplyUpdatesCommandTest, Simple) {
+ string root_server_id = syncable::kNullId.GetServerId();
+ CreateUnappliedNewItemWithParent("parent", root_server_id);
+ CreateUnappliedNewItemWithParent("child", "parent");
+
+ SyncCycleState cycle_state;
+ SyncProcessState process_state(syncdb_.manager(), syncdb_.name(),
+ NULL, NULL, NULL, NULL);
+ SyncerSession session(&cycle_state, &process_state);
+
+ apply_updates_command_.ModelChangingExecuteImpl(&session);
+
+ EXPECT_EQ(2, cycle_state.AppliedUpdatesSize())
+ << "All updates should have been attempted";
+ EXPECT_EQ(0, process_state.ConflictingItemsSize())
+ << "Simple update shouldn't result in conflicts";
+ EXPECT_EQ(0, process_state.BlockedItemsSize())
+ << "Blocked items shouldn't be possible under any circumstances";
+ EXPECT_EQ(2, cycle_state.SuccessfullyAppliedUpdateCount())
+ << "All items should have been successfully applied";
+}
+
+TEST_F(ApplyUpdatesCommandTest, UpdateWithChildrenBeforeParents) {
+ // Set a bunch of updates which are difficult to apply in the order
+ // they're received due to dependencies on other unseen items.
+ string root_server_id = syncable::kNullId.GetServerId();
+ CreateUnappliedNewItemWithParent("a_child_created_first", "parent");
+ CreateUnappliedNewItemWithParent("x_child_created_first", "parent");
+ CreateUnappliedNewItemWithParent("parent", root_server_id);
+ CreateUnappliedNewItemWithParent("a_child_created_second", "parent");
+ CreateUnappliedNewItemWithParent("x_child_created_second", "parent");
+
+ SyncCycleState cycle_state;
+ SyncProcessState process_state(syncdb_.manager(), syncdb_.name(),
+ NULL, NULL, NULL, NULL);
+ SyncerSession session(&cycle_state, &process_state);
+
+ apply_updates_command_.ModelChangingExecuteImpl(&session);
+
+ EXPECT_EQ(5, cycle_state.AppliedUpdatesSize())
+ << "All updates should have been attempted";
+ EXPECT_EQ(0, process_state.ConflictingItemsSize())
+ << "Simple update shouldn't result in conflicts, even if out-of-order";
+ EXPECT_EQ(0, process_state.BlockedItemsSize())
+ << "Blocked items shouldn't be possible under any circumstances";
+ EXPECT_EQ(5, cycle_state.SuccessfullyAppliedUpdateCount())
+ << "All updates should have been successfully applied";
+}
+
+TEST_F(ApplyUpdatesCommandTest, NestedItemsWithUnknownParent) {
+ // We shouldn't be able to do anything with either of these items.
+ CreateUnappliedNewItemWithParent("some_item", "unknown_parent");
+ CreateUnappliedNewItemWithParent("some_other_item", "some_item");
+
+ SyncCycleState cycle_state;
+ SyncProcessState process_state(syncdb_.manager(), syncdb_.name(),
+ NULL, NULL, NULL, NULL);
+ SyncerSession session(&cycle_state, &process_state);
+
+ apply_updates_command_.ModelChangingExecuteImpl(&session);
+
+ EXPECT_EQ(2, cycle_state.AppliedUpdatesSize())
+ << "All updates should have been attempted";
+ EXPECT_EQ(2, process_state.ConflictingItemsSize())
+ << "All updates with an unknown ancestors should be in conflict";
+ EXPECT_EQ(0, process_state.BlockedItemsSize())
+ << "Blocked items shouldn't be possible under any circumstances";
+ EXPECT_EQ(0, cycle_state.SuccessfullyAppliedUpdateCount())
+ << "No item with an unknown ancestor should be applied";
+}
+
+TEST_F(ApplyUpdatesCommandTest, ItemsBothKnownAndUnknown) {
+ // See what happens when there's a mixture of good and bad updates.
+ string root_server_id = syncable::kNullId.GetServerId();
+ CreateUnappliedNewItemWithParent("first_unknown_item", "unknown_parent");
+ CreateUnappliedNewItemWithParent("first_known_item", root_server_id);
+ CreateUnappliedNewItemWithParent("second_unknown_item", "unknown_parent");
+ CreateUnappliedNewItemWithParent("second_known_item", "first_known_item");
+ CreateUnappliedNewItemWithParent("third_known_item", "fourth_known_item");
+ CreateUnappliedNewItemWithParent("fourth_known_item", root_server_id);
+
+ SyncCycleState cycle_state;
+ SyncProcessState process_state(syncdb_.manager(), syncdb_.name(),
+ NULL, NULL, NULL, NULL);
+ SyncerSession session(&cycle_state, &process_state);
+
+ apply_updates_command_.ModelChangingExecuteImpl(&session);
+
+ EXPECT_EQ(6, cycle_state.AppliedUpdatesSize())
+ << "All updates should have been attempted";
+ EXPECT_EQ(2, process_state.ConflictingItemsSize())
+ << "The updates with unknown ancestors should be in conflict";
+ EXPECT_EQ(0, process_state.BlockedItemsSize())
+ << "Blocked items shouldn't be possible under any circumstances";
+ EXPECT_EQ(4, cycle_state.SuccessfullyAppliedUpdateCount())
+ << "The updates with known ancestors should be successfully applied";
+}
+
idana 2009/09/10 05:44:37 nit: please remove extra blank line.
+
+} // namespace browser_sync
Property changes on: chrome\browser\sync\engine\apply_updates_command_unittest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698