OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "sync/engine/apply_updates_and_resolve_conflicts_command.h" | 10 #include "sync/engine/apply_updates_and_resolve_conflicts_command.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 | 64 |
65 protected: | 65 protected: |
66 DISALLOW_COPY_AND_ASSIGN(ApplyUpdatesAndResolveConflictsCommandTest); | 66 DISALLOW_COPY_AND_ASSIGN(ApplyUpdatesAndResolveConflictsCommandTest); |
67 | 67 |
68 ApplyUpdatesAndResolveConflictsCommand apply_updates_command_; | 68 ApplyUpdatesAndResolveConflictsCommand apply_updates_command_; |
69 scoped_ptr<TestEntryFactory> entry_factory_; | 69 scoped_ptr<TestEntryFactory> entry_factory_; |
70 }; | 70 }; |
71 | 71 |
72 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, Simple) { | 72 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, Simple) { |
73 string root_server_id = syncable::GetNullId().GetServerId(); | 73 string root_server_id = syncable::GetNullId().GetServerId(); |
74 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 74 entry_factory_->CreateUnappliedNewItemWithParent("parent", |
75 "parent", DefaultBookmarkSpecifics(), root_server_id); | 75 DefaultBookmarkSpecifics(), |
76 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 76 root_server_id); |
77 "child", DefaultBookmarkSpecifics(), "parent"); | 77 entry_factory_->CreateUnappliedNewItemWithParent("child", |
| 78 DefaultBookmarkSpecifics(), |
| 79 "parent"); |
78 | 80 |
79 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 81 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
80 apply_updates_command_.ExecuteImpl(session()); | 82 apply_updates_command_.ExecuteImpl(session()); |
81 | 83 |
82 const sessions::StatusController& status = session()->status_controller(); | 84 const sessions::StatusController& status = session()->status_controller(); |
83 EXPECT_EQ(0, status.num_encryption_conflicts()) | 85 EXPECT_EQ(0, status.num_encryption_conflicts()) |
84 << "Simple update shouldn't result in conflicts"; | 86 << "Simple update shouldn't result in conflicts"; |
85 EXPECT_EQ(0, status.num_hierarchy_conflicts()) | 87 EXPECT_EQ(0, status.num_hierarchy_conflicts()) |
86 << "Simple update shouldn't result in conflicts"; | 88 << "Simple update shouldn't result in conflicts"; |
87 EXPECT_EQ(2, status.num_updates_applied()) | 89 EXPECT_EQ(2, status.num_updates_applied()) |
88 << "All items should have been successfully applied"; | 90 << "All items should have been successfully applied"; |
89 } | 91 } |
90 | 92 |
91 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, | 93 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, |
92 UpdateWithChildrenBeforeParents) { | 94 UpdateWithChildrenBeforeParents) { |
93 // Set a bunch of updates which are difficult to apply in the order | 95 // Set a bunch of updates which are difficult to apply in the order |
94 // they're received due to dependencies on other unseen items. | 96 // they're received due to dependencies on other unseen items. |
95 string root_server_id = syncable::GetNullId().GetServerId(); | 97 string root_server_id = syncable::GetNullId().GetServerId(); |
96 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 98 entry_factory_->CreateUnappliedNewItemWithParent( |
97 "a_child_created_first", DefaultBookmarkSpecifics(), "parent"); | 99 "a_child_created_first", DefaultBookmarkSpecifics(), "parent"); |
98 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 100 entry_factory_->CreateUnappliedNewItemWithParent( |
99 "x_child_created_first", DefaultBookmarkSpecifics(), "parent"); | 101 "x_child_created_first", DefaultBookmarkSpecifics(), "parent"); |
100 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 102 entry_factory_->CreateUnappliedNewItemWithParent( |
101 "parent", DefaultBookmarkSpecifics(), root_server_id); | 103 "parent", DefaultBookmarkSpecifics(), root_server_id); |
102 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 104 entry_factory_->CreateUnappliedNewItemWithParent( |
103 "a_child_created_second", DefaultBookmarkSpecifics(), "parent"); | 105 "a_child_created_second", DefaultBookmarkSpecifics(), "parent"); |
104 entry_factory_->CreateUnappliedNewBookmarkItemWithParent( | 106 entry_factory_->CreateUnappliedNewItemWithParent( |
105 "x_child_created_second", DefaultBookmarkSpecifics(), "parent"); | 107 "x_child_created_second", DefaultBookmarkSpecifics(), "parent"); |
106 | 108 |
107 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 109 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
108 apply_updates_command_.ExecuteImpl(session()); | 110 apply_updates_command_.ExecuteImpl(session()); |
109 | 111 |
110 const sessions::StatusController& status = session()->status_controller(); | 112 const sessions::StatusController& status = session()->status_controller(); |
111 EXPECT_EQ(5, status.num_updates_applied()) | 113 EXPECT_EQ(5, status.num_updates_applied()) |
112 << "All updates should have been successfully applied"; | 114 << "All updates should have been successfully applied"; |
113 } | 115 } |
114 | 116 |
115 // Runs the ApplyUpdatesAndResolveConflictsCommand on an item that has both | 117 // Runs the ApplyUpdatesAndResolveConflictsCommand on an item that has both |
116 // local and remote modifications (IS_UNSYNCED and IS_UNAPPLIED_UPDATE). We | 118 // local and remote modifications (IS_UNSYNCED and IS_UNAPPLIED_UPDATE). We |
117 // expect the command to detect that this update can't be applied because it is | 119 // expect the command to detect that this update can't be applied because it is |
118 // in a CONFLICT state. | 120 // in a CONFLICT state. |
119 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, SimpleConflict) { | 121 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, SimpleConflict) { |
120 entry_factory_->CreateUnappliedAndUnsyncedBookmarkItem("item"); | 122 entry_factory_->CreateUnappliedAndUnsyncedItem("item", BOOKMARKS); |
121 | 123 |
122 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 124 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
123 apply_updates_command_.ExecuteImpl(session()); | 125 apply_updates_command_.ExecuteImpl(session()); |
124 | 126 |
125 const sessions::StatusController& status = session()->status_controller(); | 127 const sessions::StatusController& status = session()->status_controller(); |
126 EXPECT_EQ(1, status.num_server_overwrites()) | 128 EXPECT_EQ(1, status.num_server_overwrites()) |
127 << "Unsynced and unapplied item conflict should be resolved"; | 129 << "Unsynced and unapplied item conflict should be resolved"; |
128 EXPECT_EQ(0, status.num_updates_applied()) | 130 EXPECT_EQ(0, status.num_updates_applied()) |
129 << "Update should not be applied; we should override the server."; | 131 << "Update should not be applied; we should override the server."; |
130 } | 132 } |
131 | 133 |
132 // Runs the ApplyUpdatesAndResolveConflictsCommand on an item that has both | 134 // Runs the ApplyUpdatesAndResolveConflictsCommand on an item that has both |
133 // local and remote modifications *and* the remote modification cannot be | 135 // local and remote modifications *and* the remote modification cannot be |
134 // applied without violating the tree constraints. We expect the command to | 136 // applied without violating the tree constraints. We expect the command to |
135 // detect that this update can't be applied and that this situation can't be | 137 // detect that this update can't be applied and that this situation can't be |
136 // resolved with the simple conflict processing logic; it is in a | 138 // resolved with the simple conflict processing logic; it is in a |
137 // CONFLICT_HIERARCHY state. | 139 // CONFLICT_HIERARCHY state. |
138 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, HierarchyAndSimpleConflict) { | 140 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, HierarchyAndSimpleConflict) { |
139 // Create a simply-conflicting item. It will start with valid parent ids. | 141 // Create a simply-conflicting item. It will start with valid parent ids. |
140 int64 handle = entry_factory_->CreateUnappliedAndUnsyncedBookmarkItem( | 142 int64 handle = entry_factory_->CreateUnappliedAndUnsyncedItem( |
141 "orphaned_by_server"); | 143 "orphaned_by_server", BOOKMARKS); |
142 { | 144 { |
143 // Manually set the SERVER_PARENT_ID to bad value. | 145 // Manually set the SERVER_PARENT_ID to bad value. |
144 // A bad parent indicates a hierarchy conflict. | 146 // A bad parent indicates a hierarchy conflict. |
145 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); | 147 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); |
146 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); | 148 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); |
147 ASSERT_TRUE(entry.good()); | 149 ASSERT_TRUE(entry.good()); |
148 | 150 |
149 entry.Put(syncable::SERVER_PARENT_ID, | 151 entry.Put(syncable::SERVER_PARENT_ID, |
150 TestIdFactory::MakeServer("bogus_parent")); | 152 TestIdFactory::MakeServer("bogus_parent")); |
151 } | 153 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 235 |
234 // Runs the ApplyUpdatesAndResolveConflictsCommand on a directory where the | 236 // Runs the ApplyUpdatesAndResolveConflictsCommand on a directory where the |
235 // server is trying to delete a folder that has a recently added (and unsynced) | 237 // server is trying to delete a folder that has a recently added (and unsynced) |
236 // child. We expect the command to not apply the update because it is in a | 238 // child. We expect the command to not apply the update because it is in a |
237 // CONFLICT_HIERARCHY state. | 239 // CONFLICT_HIERARCHY state. |
238 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, | 240 TEST_F(ApplyUpdatesAndResolveConflictsCommandTest, |
239 HierarchyConflictDeleteNonEmptyDirectory) { | 241 HierarchyConflictDeleteNonEmptyDirectory) { |
240 // Create a server-deleted directory. | 242 // Create a server-deleted directory. |
241 { | 243 { |
242 // Create it as a child of root node. | 244 // Create it as a child of root node. |
243 int64 handle = entry_factory_->CreateSyncedItem("parent", BOOKMARKS, true); | 245 int64 handle = |
| 246 entry_factory_->CreateSyncedItem("parent", BOOKMARKS, true); |
244 | 247 |
245 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); | 248 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); |
246 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); | 249 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); |
247 ASSERT_TRUE(entry.good()); | 250 ASSERT_TRUE(entry.good()); |
248 | 251 |
249 // Delete it on the server. | 252 // Delete it on the server. |
250 entry.Put(syncable::SERVER_VERSION, entry_factory_->GetNextRevision()); | 253 entry.Put(syncable::SERVER_VERSION, entry_factory_->GetNextRevision()); |
251 entry.Put(syncable::IS_UNAPPLIED_UPDATE, true); | 254 entry.Put(syncable::IS_UNAPPLIED_UPDATE, true); |
252 entry.Put(syncable::SERVER_PARENT_ID, TestIdFactory::root()); | 255 entry.Put(syncable::SERVER_PARENT_ID, TestIdFactory::root()); |
253 entry.Put(syncable::SERVER_IS_DEL, true); | 256 entry.Put(syncable::SERVER_IS_DEL, true); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 | 410 |
408 const sessions::StatusController& status = session()->status_controller(); | 411 const sessions::StatusController& status = session()->status_controller(); |
409 EXPECT_EQ(1, status.num_encryption_conflicts()) | 412 EXPECT_EQ(1, status.num_encryption_conflicts()) |
410 << "The updates that can't be decrypted should be in encryption " | 413 << "The updates that can't be decrypted should be in encryption " |
411 << "conflict"; | 414 << "conflict"; |
412 EXPECT_EQ(1, status.num_updates_applied()) | 415 EXPECT_EQ(1, status.num_updates_applied()) |
413 << "The undecryptable password update shouldn't be applied"; | 416 << "The undecryptable password update shouldn't be applied"; |
414 } | 417 } |
415 | 418 |
416 } // namespace syncer | 419 } // namespace syncer |
OLD | NEW |