Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
| 10 #include "chrome/browser/sync/engine/apply_updates_command.h" | 10 #include "chrome/browser/sync/engine/apply_updates_command.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 if (item_id.ServerKnows()) { | 136 if (item_id.ServerKnows()) { |
| 137 entry.Put(syncable::SERVER_SPECIFICS, default_specifics); | 137 entry.Put(syncable::SERVER_SPECIFICS, default_specifics); |
| 138 entry.Put(syncable::SERVER_IS_DIR, is_folder); | 138 entry.Put(syncable::SERVER_IS_DIR, is_folder); |
| 139 entry.Put(syncable::SERVER_PARENT_ID, parent_id); | 139 entry.Put(syncable::SERVER_PARENT_ID, parent_id); |
| 140 entry.Put(syncable::SERVER_IS_DEL, false); | 140 entry.Put(syncable::SERVER_IS_DEL, false); |
| 141 } | 141 } |
| 142 if (metahandle_out) | 142 if (metahandle_out) |
| 143 *metahandle_out = entry.Get(syncable::META_HANDLE); | 143 *metahandle_out = entry.Get(syncable::META_HANDLE); |
| 144 } | 144 } |
| 145 | 145 |
| 146 // Creates an item that is both unsynced an an unapplied update. Returns the | |
| 147 // metahandle of the created item. | |
| 148 int64 CreateUnappliedAndUnsyncedItem(const string& name, | |
| 149 syncable::ModelType model_type) { | |
| 150 int64 metahandle = 0; | |
| 151 CreateUnsyncedItem(id_factory_.MakeServer(name), id_factory_.root(), name, | |
| 152 false, model_type, &metahandle); | |
| 153 | |
| 154 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | |
| 155 EXPECT_TRUE(dir.good()); | |
|
akalin
2012/02/10 23:11:54
if dir is bad, probably want to return invalid met
rlarocque
2012/02/11 00:02:16
The dir is never bad. Will fix anyway, just to be
| |
| 156 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | |
| 157 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, metahandle); | |
| 158 EXPECT_TRUE(entry.good()); | |
|
akalin
2012/02/10 23:11:54
you can do
if(!entry.good()) {
ADD_FAILURE();
rlarocque
2012/02/11 00:02:16
Good idea, thanks!
| |
| 159 if (!entry.good()) | |
| 160 return -1; | |
|
akalin
2012/02/10 23:11:54
use kInvalidMetaHandle from syncable.h
rlarocque
2012/02/11 00:02:16
I was looking for something like that. Will do.
| |
| 161 | |
| 162 entry.Put(syncable::IS_UNAPPLIED_UPDATE, true); | |
| 163 entry.Put(syncable::SERVER_VERSION, GetNextRevision()); | |
| 164 | |
| 165 return metahandle; | |
| 166 } | |
| 167 | |
| 168 | |
| 169 // Creates an item that has neither IS_UNSYNED or IS_UNAPPLIED_UPDATE. The | |
| 170 // item is known to both the server and client. Returns the metahandle of | |
| 171 // the created item. | |
| 172 int64 CreateSyncedItem(const std::string& name, syncable::ModelType | |
| 173 model_type, bool is_folder) { | |
| 174 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | |
| 175 EXPECT_TRUE(dir.good()); | |
|
akalin
2012/02/10 23:11:54
as above
rlarocque
2012/02/11 00:02:16
Done.
| |
| 176 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | |
| 177 | |
| 178 syncable::Id parent_id(id_factory_.root()); | |
| 179 syncable::Id item_id(id_factory_.MakeServer(name)); | |
| 180 int64 version = GetNextRevision(); | |
| 181 | |
| 182 sync_pb::EntitySpecifics default_specifics; | |
| 183 syncable::AddDefaultExtensionValue(model_type, &default_specifics); | |
| 184 | |
| 185 MutableEntry entry(&trans, syncable::CREATE, parent_id, name); | |
| 186 EXPECT_TRUE(entry.good()); | |
| 187 if (!entry.good()) | |
| 188 return -1; | |
|
akalin
2012/02/10 23:11:54
as above
rlarocque
2012/02/11 00:02:16
Done.
| |
| 189 | |
| 190 entry.Put(syncable::ID, item_id); | |
| 191 entry.Put(syncable::BASE_VERSION, version); | |
| 192 entry.Put(syncable::IS_UNSYNCED, false); | |
| 193 entry.Put(syncable::NON_UNIQUE_NAME, name); | |
| 194 entry.Put(syncable::IS_DIR, is_folder); | |
| 195 entry.Put(syncable::IS_DEL, false); | |
| 196 entry.Put(syncable::PARENT_ID, parent_id); | |
| 197 | |
| 198 EXPECT_TRUE(entry.PutPredecessor(id_factory_.root())); | |
|
akalin
2012/02/10 23:11:54
return invalidmetahandle here?
rlarocque
2012/02/11 00:02:16
Done.
| |
| 199 entry.Put(syncable::SPECIFICS, default_specifics); | |
| 200 | |
| 201 entry.Put(syncable::SERVER_VERSION, GetNextRevision()); | |
| 202 entry.Put(syncable::IS_UNAPPLIED_UPDATE, true); | |
| 203 entry.Put(syncable::SERVER_NON_UNIQUE_NAME, "X"); | |
| 204 entry.Put(syncable::SERVER_PARENT_ID, id_factory_.MakeServer("Y")); | |
| 205 entry.Put(syncable::SERVER_IS_DIR, is_folder); | |
| 206 entry.Put(syncable::SERVER_IS_DEL, false); | |
| 207 entry.Put(syncable::SERVER_SPECIFICS, default_specifics); | |
| 208 entry.Put(syncable::SERVER_PARENT_ID, parent_id); | |
| 209 | |
| 210 return entry.Get(syncable::META_HANDLE); | |
| 211 } | |
| 212 | |
| 213 int64 GetNextRevision() { | |
| 214 return next_revision_++; | |
| 215 } | |
| 216 | |
| 146 ApplyUpdatesCommand apply_updates_command_; | 217 ApplyUpdatesCommand apply_updates_command_; |
| 147 TestIdFactory id_factory_; | 218 TestIdFactory id_factory_; |
| 148 private: | 219 private: |
| 149 int64 next_revision_; | 220 int64 next_revision_; |
| 150 DISALLOW_COPY_AND_ASSIGN(ApplyUpdatesCommandTest); | 221 DISALLOW_COPY_AND_ASSIGN(ApplyUpdatesCommandTest); |
| 151 }; | 222 }; |
| 152 | 223 |
| 153 TEST_F(ApplyUpdatesCommandTest, Simple) { | 224 TEST_F(ApplyUpdatesCommandTest, Simple) { |
| 154 string root_server_id = syncable::GetNullId().GetServerId(); | 225 string root_server_id = syncable::GetNullId().GetServerId(); |
| 155 CreateUnappliedNewItemWithParent("parent", | 226 CreateUnappliedNewItemWithParent("parent", |
| 156 DefaultBookmarkSpecifics(), | 227 DefaultBookmarkSpecifics(), |
| 157 root_server_id); | 228 root_server_id); |
| 158 CreateUnappliedNewItemWithParent("child", | 229 CreateUnappliedNewItemWithParent("child", |
| 159 DefaultBookmarkSpecifics(), | 230 DefaultBookmarkSpecifics(), |
| 160 "parent"); | 231 "parent"); |
| 161 | 232 |
| 162 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 233 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
| 163 apply_updates_command_.ExecuteImpl(session()); | 234 apply_updates_command_.ExecuteImpl(session()); |
| 164 | 235 |
| 165 sessions::StatusController* status = session()->mutable_status_controller(); | 236 sessions::StatusController* status = session()->mutable_status_controller(); |
| 166 | 237 |
| 167 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | 238 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); |
| 168 ASSERT_TRUE(status->update_progress()); | 239 ASSERT_TRUE(status->update_progress()); |
| 169 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) | 240 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) |
| 170 << "All updates should have been attempted"; | 241 << "All updates should have been attempted"; |
| 171 ASSERT_TRUE(status->conflict_progress()); | 242 ASSERT_TRUE(status->conflict_progress()); |
| 172 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 243 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 244 << "Simple update shouldn't result in conflicts"; | |
| 245 EXPECT_EQ(0, status->conflict_progress()->EncryptionConflictingItemsSize()) | |
| 246 << "Simple update shouldn't result in conflicts"; | |
| 247 EXPECT_EQ(0, status->conflict_progress()->HierarchyConflictingItemsSize()) | |
| 173 << "Simple update shouldn't result in conflicts"; | 248 << "Simple update shouldn't result in conflicts"; |
| 174 EXPECT_EQ(2, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 249 EXPECT_EQ(2, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 175 << "All items should have been successfully applied"; | 250 << "All items should have been successfully applied"; |
| 176 } | 251 } |
| 177 | 252 |
| 178 TEST_F(ApplyUpdatesCommandTest, UpdateWithChildrenBeforeParents) { | 253 TEST_F(ApplyUpdatesCommandTest, UpdateWithChildrenBeforeParents) { |
| 179 // Set a bunch of updates which are difficult to apply in the order | 254 // Set a bunch of updates which are difficult to apply in the order |
| 180 // they're received due to dependencies on other unseen items. | 255 // they're received due to dependencies on other unseen items. |
| 181 string root_server_id = syncable::GetNullId().GetServerId(); | 256 string root_server_id = syncable::GetNullId().GetServerId(); |
| 182 CreateUnappliedNewItemWithParent("a_child_created_first", | 257 CreateUnappliedNewItemWithParent("a_child_created_first", |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 197 | 272 |
| 198 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 273 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
| 199 apply_updates_command_.ExecuteImpl(session()); | 274 apply_updates_command_.ExecuteImpl(session()); |
| 200 | 275 |
| 201 sessions::StatusController* status = session()->mutable_status_controller(); | 276 sessions::StatusController* status = session()->mutable_status_controller(); |
| 202 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | 277 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); |
| 203 ASSERT_TRUE(status->update_progress()); | 278 ASSERT_TRUE(status->update_progress()); |
| 204 EXPECT_EQ(5, status->update_progress()->AppliedUpdatesSize()) | 279 EXPECT_EQ(5, status->update_progress()->AppliedUpdatesSize()) |
| 205 << "All updates should have been attempted"; | 280 << "All updates should have been attempted"; |
| 206 ASSERT_TRUE(status->conflict_progress()); | 281 ASSERT_TRUE(status->conflict_progress()); |
| 207 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 282 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 208 << "Simple update shouldn't result in conflicts, even if out-of-order"; | 283 << "Simple update shouldn't result in conflicts, even if out-of-order"; |
| 209 EXPECT_EQ(5, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 284 EXPECT_EQ(5, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 210 << "All updates should have been successfully applied"; | 285 << "All updates should have been successfully applied"; |
| 211 } | 286 } |
| 212 | 287 |
| 213 TEST_F(ApplyUpdatesCommandTest, NestedItemsWithUnknownParent) { | 288 // Runs the ApplyUpdatesCommand on an item that has both local and remote |
| 289 // modifications (IS_UNSYNCED and IS_UNAPPLIED_UPDATE). We expect the command | |
| 290 // to detect that this update can't be applied because it is in a CONFLICT | |
| 291 // state. | |
| 292 TEST_F(ApplyUpdatesCommandTest, SimpleConflict) { | |
| 293 CreateUnappliedAndUnsyncedItem("item", syncable::BOOKMARKS); | |
| 294 | |
| 295 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | |
| 296 apply_updates_command_.ExecuteImpl(session()); | |
| 297 | |
| 298 sessions::StatusController* status = session()->mutable_status_controller(); | |
| 299 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | |
| 300 ASSERT_TRUE(status->conflict_progress()); | |
| 301 EXPECT_EQ(1, status->conflict_progress()->SimpleConflictingItemsSize()) | |
| 302 << "Unsynced and unapplied item should be a simple conflict"; | |
| 303 } | |
| 304 | |
| 305 // Runs the ApplyUpdatesCommand on an item that has both local and remote | |
| 306 // modifications *and* the remote modification cannot be applied without | |
| 307 // violating the tree constraints. We expect the command to detect that this | |
| 308 // update can't be applied and that this situation can't be resolved with the | |
| 309 // simple conflict processing logic; it is in a CONFLICT_HIERARCHY state. | |
| 310 TEST_F(ApplyUpdatesCommandTest, HierarchyAndSimpleConflict) { | |
| 311 // Create a simply-conflicting item. It will start with valid parent ids. | |
| 312 int64 handle = CreateUnappliedAndUnsyncedItem("orphaned_by_server", | |
| 313 syncable::BOOKMARKS); | |
| 314 { | |
| 315 // Manually set the SERVER_PARENT_ID to bad value. | |
| 316 // A bad parent indicates a hierarchy conflict. | |
| 317 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | |
| 318 ASSERT_TRUE(dir.good()); | |
| 319 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | |
| 320 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); | |
| 321 ASSERT_TRUE(entry.good()); | |
| 322 | |
| 323 entry.Put(syncable::SERVER_PARENT_ID, | |
| 324 id_factory_.MakeServer("bogus_parent")); | |
| 325 } | |
| 326 | |
| 327 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | |
| 328 apply_updates_command_.ExecuteImpl(session()); | |
| 329 | |
| 330 sessions::StatusController* status = session()->mutable_status_controller(); | |
| 331 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | |
| 332 | |
| 333 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()); | |
| 334 | |
| 335 // An update that is both a simple conflict and a hierarchy conflict should be | |
| 336 // treated as a hierarchy conflict. | |
| 337 ASSERT_TRUE(status->conflict_progress()); | |
| 338 EXPECT_EQ(1, status->conflict_progress()->HierarchyConflictingItemsSize()); | |
| 339 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()); | |
| 340 } | |
| 341 | |
| 342 | |
| 343 // Runs the ApplyUpdatesCommand on an item with remote modifications that would | |
| 344 // create a directory loop if the update were applied. We expect the command to | |
| 345 // detect that this update can't be applied because it is in a | |
| 346 // CONFLICT_HIERARCHY state. | |
| 347 TEST_F(ApplyUpdatesCommandTest, HierarchyConflictDirectoryLoop) { | |
| 348 // Item 'X' locally has parent of 'root'. Server is updating it to have | |
| 349 // parent of 'Y'. | |
| 350 { | |
| 351 // Create it as a child of root node. | |
| 352 int64 handle = CreateSyncedItem("X", syncable::BOOKMARKS, true); | |
| 353 | |
| 354 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | |
| 355 ASSERT_TRUE(dir.good()); | |
| 356 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | |
| 357 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); | |
| 358 ASSERT_TRUE(entry.good()); | |
| 359 | |
| 360 // Re-parent from root to "Y" | |
| 361 entry.Put(syncable::SERVER_VERSION, GetNextRevision()); | |
| 362 entry.Put(syncable::IS_UNAPPLIED_UPDATE, true); | |
| 363 entry.Put(syncable::SERVER_PARENT_ID, id_factory_.MakeServer("Y")); | |
| 364 } | |
| 365 | |
| 366 // Item 'Y' is child of 'X'. | |
| 367 CreateUnsyncedItem(id_factory_.MakeServer("Y"), id_factory_.MakeServer("X"), | |
| 368 "Y", true, syncable::BOOKMARKS, NULL); | |
| 369 | |
| 370 // If the server's update were applied, we would have X be a child of Y, and Y | |
| 371 // as a child of X. That's a directory loop. The UpdateApplicator should | |
| 372 // prevent the update from being applied and note that this is a hierarchy | |
| 373 // conflict. | |
| 374 | |
| 375 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | |
| 376 apply_updates_command_.ExecuteImpl(session()); | |
| 377 | |
| 378 sessions::StatusController* status = session()->mutable_status_controller(); | |
| 379 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | |
| 380 | |
| 381 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()); | |
| 382 | |
| 383 // This should count as a hierarchy conflict. | |
| 384 ASSERT_TRUE(status->conflict_progress()); | |
| 385 EXPECT_EQ(1, status->conflict_progress()->HierarchyConflictingItemsSize()); | |
| 386 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()); | |
| 387 } | |
| 388 | |
| 389 // Runs the ApplyUpdatesCommand on a directory where the server sent us an | |
| 390 // update to add a child to a locally deleted (and unsynced) parent. We expect | |
| 391 // the command to not apply the update and to indicate the update is in a | |
| 392 // CONFLICT_HIERARCHY state. | |
| 393 TEST_F(ApplyUpdatesCommandTest, HierarchyConflictDeletedParent) { | |
| 394 // Create a locally deleted parent item. | |
| 395 int64 parent_handle; | |
| 396 CreateUnsyncedItem(Id::CreateFromServerId("parent"), id_factory_.root(), | |
| 397 "parent", true, syncable::BOOKMARKS, &parent_handle); | |
| 398 { | |
| 399 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | |
| 400 ASSERT_TRUE(dir.good()); | |
| 401 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | |
| 402 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, parent_handle); | |
| 403 entry.Put(syncable::IS_DEL, true); | |
| 404 } | |
| 405 | |
| 406 // Create an incoming child from the server. | |
| 407 CreateUnappliedNewItemWithParent("child", DefaultBookmarkSpecifics(), | |
| 408 "parent"); | |
| 409 | |
| 410 // The server's update may seem valid to some other client, but on this client | |
| 411 // that new item's parent no longer exists. The update should not be applied | |
| 412 // and the update applicator should indicate this is a hierarchy conflict. | |
| 413 | |
| 414 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | |
| 415 apply_updates_command_.ExecuteImpl(session()); | |
| 416 | |
| 417 sessions::StatusController* status = session()->mutable_status_controller(); | |
| 418 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | |
| 419 | |
| 420 // This should count as a hierarchy conflict. | |
| 421 ASSERT_TRUE(status->conflict_progress()); | |
| 422 EXPECT_EQ(1, status->conflict_progress()->HierarchyConflictingItemsSize()); | |
| 423 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()); | |
| 424 } | |
| 425 | |
| 426 // Runs the ApplyUpdatesCommand on a directory where the server is trying to | |
| 427 // delete a folder that has a recently added (and unsynced) child. We expect | |
| 428 // the command to not apply the update because it is in a CONFLICT_HIERARCHY | |
| 429 // state. | |
| 430 TEST_F(ApplyUpdatesCommandTest, HierarchyConflictDeleteNonEmptyDirectory) { | |
| 431 // Create a server-deleted directory. | |
| 432 { | |
| 433 // Create it as a child of root node. | |
| 434 int64 handle = CreateSyncedItem("parent", syncable::BOOKMARKS, true); | |
| 435 | |
| 436 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | |
| 437 ASSERT_TRUE(dir.good()); | |
| 438 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | |
| 439 MutableEntry entry(&trans, syncable::GET_BY_HANDLE, handle); | |
| 440 ASSERT_TRUE(entry.good()); | |
| 441 | |
| 442 // Delete it on the server. | |
| 443 entry.Put(syncable::SERVER_VERSION, GetNextRevision()); | |
| 444 entry.Put(syncable::IS_UNAPPLIED_UPDATE, true); | |
| 445 entry.Put(syncable::SERVER_PARENT_ID, id_factory_.root()); | |
| 446 entry.Put(syncable::SERVER_IS_DEL, true); | |
| 447 } | |
| 448 | |
| 449 // Create a local child of the server-deleted directory. | |
| 450 CreateUnsyncedItem(id_factory_.MakeServer("child"), | |
| 451 id_factory_.MakeServer("parent"), "child", false, | |
| 452 syncable::BOOKMARKS, NULL); | |
| 453 | |
| 454 // The server's request to delete the directory must be ignored, otherwise our | |
| 455 // unsynced new child would be orphaned. This is a hierarchy conflict. | |
| 456 | |
| 457 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | |
| 458 apply_updates_command_.ExecuteImpl(session()); | |
| 459 | |
| 460 sessions::StatusController* status = session()->mutable_status_controller(); | |
| 461 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | |
| 462 | |
| 463 // This should count as a hierarchy conflict. | |
| 464 ASSERT_TRUE(status->conflict_progress()); | |
| 465 EXPECT_EQ(1, status->conflict_progress()->HierarchyConflictingItemsSize()); | |
| 466 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()); | |
| 467 } | |
| 468 | |
| 469 // Runs the ApplyUpdatesCommand on a server-created item that has a locally | |
| 470 // unknown parent. We expect the command to not apply the update because the | |
| 471 // item is in a CONFLICT_HIERARCHY state. | |
| 472 TEST_F(ApplyUpdatesCommandTest, HierarchyConflictUnknownParent) { | |
| 214 // We shouldn't be able to do anything with either of these items. | 473 // We shouldn't be able to do anything with either of these items. |
| 215 CreateUnappliedNewItemWithParent("some_item", | 474 CreateUnappliedNewItemWithParent("some_item", |
| 216 DefaultBookmarkSpecifics(), | 475 DefaultBookmarkSpecifics(), |
| 217 "unknown_parent"); | 476 "unknown_parent"); |
| 218 CreateUnappliedNewItemWithParent("some_other_item", | 477 CreateUnappliedNewItemWithParent("some_other_item", |
| 219 DefaultBookmarkSpecifics(), | 478 DefaultBookmarkSpecifics(), |
| 220 "some_item"); | 479 "some_item"); |
| 221 | 480 |
| 222 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 481 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
| 223 apply_updates_command_.ExecuteImpl(session()); | 482 apply_updates_command_.ExecuteImpl(session()); |
| 224 | 483 |
| 225 sessions::StatusController* status = session()->mutable_status_controller(); | 484 sessions::StatusController* status = session()->mutable_status_controller(); |
| 226 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | 485 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); |
| 227 ASSERT_TRUE(status->update_progress()); | 486 ASSERT_TRUE(status->update_progress()); |
| 228 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) | 487 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) |
| 229 << "All updates should have been attempted"; | 488 << "All updates should have been attempted"; |
| 230 ASSERT_TRUE(status->conflict_progress()); | 489 ASSERT_TRUE(status->conflict_progress()); |
| 231 EXPECT_EQ(2, status->conflict_progress()->ConflictingItemsSize()) | 490 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 491 << "Updates with unknown parent should not be treated as 'simple'" | |
| 492 << " conflicts"; | |
| 493 EXPECT_EQ(2, status->conflict_progress()->HierarchyConflictingItemsSize()) | |
| 232 << "All updates with an unknown ancestors should be in conflict"; | 494 << "All updates with an unknown ancestors should be in conflict"; |
| 233 EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 495 EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 234 << "No item with an unknown ancestor should be applied"; | 496 << "No item with an unknown ancestor should be applied"; |
| 235 } | 497 } |
| 236 | 498 |
| 237 TEST_F(ApplyUpdatesCommandTest, ItemsBothKnownAndUnknown) { | 499 TEST_F(ApplyUpdatesCommandTest, ItemsBothKnownAndUnknown) { |
| 238 // See what happens when there's a mixture of good and bad updates. | 500 // See what happens when there's a mixture of good and bad updates. |
| 239 string root_server_id = syncable::GetNullId().GetServerId(); | 501 string root_server_id = syncable::GetNullId().GetServerId(); |
| 240 CreateUnappliedNewItemWithParent("first_unknown_item", | 502 CreateUnappliedNewItemWithParent("first_unknown_item", |
| 241 DefaultBookmarkSpecifics(), | 503 DefaultBookmarkSpecifics(), |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 258 | 520 |
| 259 ExpectGroupToChange(apply_updates_command_, GROUP_UI); | 521 ExpectGroupToChange(apply_updates_command_, GROUP_UI); |
| 260 apply_updates_command_.ExecuteImpl(session()); | 522 apply_updates_command_.ExecuteImpl(session()); |
| 261 | 523 |
| 262 sessions::StatusController* status = session()->mutable_status_controller(); | 524 sessions::StatusController* status = session()->mutable_status_controller(); |
| 263 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | 525 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); |
| 264 ASSERT_TRUE(status->update_progress()); | 526 ASSERT_TRUE(status->update_progress()); |
| 265 EXPECT_EQ(6, status->update_progress()->AppliedUpdatesSize()) | 527 EXPECT_EQ(6, status->update_progress()->AppliedUpdatesSize()) |
| 266 << "All updates should have been attempted"; | 528 << "All updates should have been attempted"; |
| 267 ASSERT_TRUE(status->conflict_progress()); | 529 ASSERT_TRUE(status->conflict_progress()); |
| 268 EXPECT_EQ(2, status->conflict_progress()->ConflictingItemsSize()) | 530 EXPECT_EQ(2, status->conflict_progress()->HierarchyConflictingItemsSize()) |
| 269 << "The updates with unknown ancestors should be in conflict"; | 531 << "The updates with unknown ancestors should be in conflict"; |
| 270 EXPECT_EQ(4, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 532 EXPECT_EQ(4, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 271 << "The updates with known ancestors should be successfully applied"; | 533 << "The updates with known ancestors should be successfully applied"; |
| 272 } | 534 } |
| 273 | 535 |
| 274 TEST_F(ApplyUpdatesCommandTest, DecryptablePassword) { | 536 TEST_F(ApplyUpdatesCommandTest, DecryptablePassword) { |
| 275 // Decryptable password updates should be applied. | 537 // Decryptable password updates should be applied. |
| 276 Cryptographer* cryptographer; | 538 Cryptographer* cryptographer; |
| 277 { | 539 { |
| 278 // Storing the cryptographer separately is bad, but for this test we | 540 // Storing the cryptographer separately is bad, but for this test we |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 297 | 559 |
| 298 ExpectGroupToChange(apply_updates_command_, GROUP_PASSWORD); | 560 ExpectGroupToChange(apply_updates_command_, GROUP_PASSWORD); |
| 299 apply_updates_command_.ExecuteImpl(session()); | 561 apply_updates_command_.ExecuteImpl(session()); |
| 300 | 562 |
| 301 sessions::StatusController* status = session()->mutable_status_controller(); | 563 sessions::StatusController* status = session()->mutable_status_controller(); |
| 302 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); | 564 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); |
| 303 ASSERT_TRUE(status->update_progress()); | 565 ASSERT_TRUE(status->update_progress()); |
| 304 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) | 566 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) |
| 305 << "All updates should have been attempted"; | 567 << "All updates should have been attempted"; |
| 306 ASSERT_TRUE(status->conflict_progress()); | 568 ASSERT_TRUE(status->conflict_progress()); |
| 307 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 569 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 308 << "No update should be in conflict because they're all decryptable"; | 570 << "No update should be in conflict because they're all decryptable"; |
| 309 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 571 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 310 << "The updates that can be decrypted should be applied"; | 572 << "The updates that can be decrypted should be applied"; |
| 311 } | 573 } |
| 312 | 574 |
| 313 TEST_F(ApplyUpdatesCommandTest, UndecryptableData) { | 575 TEST_F(ApplyUpdatesCommandTest, UndecryptableData) { |
| 314 // Undecryptable updates should not be applied. | 576 // Undecryptable updates should not be applied. |
| 315 sync_pb::EntitySpecifics encrypted_bookmark; | 577 sync_pb::EntitySpecifics encrypted_bookmark; |
| 316 encrypted_bookmark.mutable_encrypted(); | 578 encrypted_bookmark.mutable_encrypted(); |
| 317 AddDefaultExtensionValue(syncable::BOOKMARKS, &encrypted_bookmark); | 579 AddDefaultExtensionValue(syncable::BOOKMARKS, &encrypted_bookmark); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 330 sessions::StatusController* status = session()->mutable_status_controller(); | 592 sessions::StatusController* status = session()->mutable_status_controller(); |
| 331 EXPECT_TRUE(status->HasConflictingUpdates()) | 593 EXPECT_TRUE(status->HasConflictingUpdates()) |
| 332 << "Updates that can't be decrypted should trigger the syncer to have " | 594 << "Updates that can't be decrypted should trigger the syncer to have " |
| 333 << "conflicting updates."; | 595 << "conflicting updates."; |
| 334 { | 596 { |
| 335 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); | 597 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_UI); |
| 336 ASSERT_TRUE(status->update_progress()); | 598 ASSERT_TRUE(status->update_progress()); |
| 337 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) | 599 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) |
| 338 << "All updates should have been attempted"; | 600 << "All updates should have been attempted"; |
| 339 ASSERT_TRUE(status->conflict_progress()); | 601 ASSERT_TRUE(status->conflict_progress()); |
| 340 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 602 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 341 << "The updates that can't be decrypted should not be in regular " | 603 << "The updates that can't be decrypted should not be in regular " |
| 342 << "conflict"; | 604 << "conflict"; |
| 343 EXPECT_EQ(2, status->conflict_progress()->NonblockingConflictingItemsSize()) | 605 EXPECT_EQ(2, status->conflict_progress()->EncryptionConflictingItemsSize()) |
| 344 << "The updates that can't be decrypted should be in nonblocking " | 606 << "The updates that can't be decrypted should be in encryption " |
| 345 << "conflict"; | 607 << "conflict"; |
| 346 EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 608 EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 347 << "No update that can't be decrypted should be applied"; | 609 << "No update that can't be decrypted should be applied"; |
| 348 } | 610 } |
| 349 { | 611 { |
| 350 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); | 612 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); |
| 351 ASSERT_TRUE(status->update_progress()); | 613 ASSERT_TRUE(status->update_progress()); |
| 352 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) | 614 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) |
| 353 << "All updates should have been attempted"; | 615 << "All updates should have been attempted"; |
| 354 ASSERT_TRUE(status->conflict_progress()); | 616 ASSERT_TRUE(status->conflict_progress()); |
| 355 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 617 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 356 << "The updates that can't be decrypted should not be in regular " | 618 << "The updates that can't be decrypted should not be in regular " |
| 357 << "conflict"; | 619 << "conflict"; |
| 358 EXPECT_EQ(1, status->conflict_progress()->NonblockingConflictingItemsSize()) | 620 EXPECT_EQ(1, status->conflict_progress()->EncryptionConflictingItemsSize()) |
| 359 << "The updates that can't be decrypted should be in nonblocking " | 621 << "The updates that can't be decrypted should be in encryption " |
| 360 << "conflict"; | 622 << "conflict"; |
| 361 EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 623 EXPECT_EQ(0, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 362 << "No update that can't be decrypted should be applied"; | 624 << "No update that can't be decrypted should be applied"; |
| 363 } | 625 } |
| 364 } | 626 } |
| 365 | 627 |
| 366 TEST_F(ApplyUpdatesCommandTest, SomeUndecryptablePassword) { | 628 TEST_F(ApplyUpdatesCommandTest, SomeUndecryptablePassword) { |
| 367 // Only decryptable password updates should be applied. | 629 // Only decryptable password updates should be applied. |
| 368 { | 630 { |
| 369 sync_pb::EntitySpecifics specifics; | 631 sync_pb::EntitySpecifics specifics; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 405 sessions::StatusController* status = session()->mutable_status_controller(); | 667 sessions::StatusController* status = session()->mutable_status_controller(); |
| 406 EXPECT_TRUE(status->HasConflictingUpdates()) | 668 EXPECT_TRUE(status->HasConflictingUpdates()) |
| 407 << "Updates that can't be decrypted should trigger the syncer to have " | 669 << "Updates that can't be decrypted should trigger the syncer to have " |
| 408 << "conflicting updates."; | 670 << "conflicting updates."; |
| 409 { | 671 { |
| 410 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); | 672 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSWORD); |
| 411 ASSERT_TRUE(status->update_progress()); | 673 ASSERT_TRUE(status->update_progress()); |
| 412 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) | 674 EXPECT_EQ(2, status->update_progress()->AppliedUpdatesSize()) |
| 413 << "All updates should have been attempted"; | 675 << "All updates should have been attempted"; |
| 414 ASSERT_TRUE(status->conflict_progress()); | 676 ASSERT_TRUE(status->conflict_progress()); |
| 415 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 677 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 416 << "The updates that can't be decrypted should not be in regular " | 678 << "The updates that can't be decrypted should not be in regular " |
| 417 << "conflict"; | 679 << "conflict"; |
| 418 EXPECT_EQ(1, status->conflict_progress()->NonblockingConflictingItemsSize()) | 680 EXPECT_EQ(1, status->conflict_progress()->EncryptionConflictingItemsSize()) |
| 419 << "The updates that can't be decrypted should be in nonblocking " | 681 << "The updates that can't be decrypted should be in encryption " |
| 420 << "conflict"; | 682 << "conflict"; |
| 421 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 683 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 422 << "The undecryptable password update shouldn't be applied"; | 684 << "The undecryptable password update shouldn't be applied"; |
| 423 } | 685 } |
| 424 } | 686 } |
| 425 | 687 |
| 426 TEST_F(ApplyUpdatesCommandTest, NigoriUpdate) { | 688 TEST_F(ApplyUpdatesCommandTest, NigoriUpdate) { |
| 427 // Storing the cryptographer separately is bad, but for this test we | 689 // Storing the cryptographer separately is bad, but for this test we |
| 428 // know it's safe. | 690 // know it's safe. |
| 429 Cryptographer* cryptographer; | 691 Cryptographer* cryptographer; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 456 | 718 |
| 457 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); | 719 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); |
| 458 apply_updates_command_.ExecuteImpl(session()); | 720 apply_updates_command_.ExecuteImpl(session()); |
| 459 | 721 |
| 460 sessions::StatusController* status = session()->mutable_status_controller(); | 722 sessions::StatusController* status = session()->mutable_status_controller(); |
| 461 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); | 723 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); |
| 462 ASSERT_TRUE(status->update_progress()); | 724 ASSERT_TRUE(status->update_progress()); |
| 463 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) | 725 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) |
| 464 << "All updates should have been attempted"; | 726 << "All updates should have been attempted"; |
| 465 ASSERT_TRUE(status->conflict_progress()); | 727 ASSERT_TRUE(status->conflict_progress()); |
| 466 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 728 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 467 << "The nigori update shouldn't be in conflict"; | 729 << "The nigori update shouldn't be in conflict"; |
| 468 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 730 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 469 << "The nigori update should be applied"; | 731 << "The nigori update should be applied"; |
| 470 | 732 |
| 471 EXPECT_FALSE(cryptographer->is_ready()); | 733 EXPECT_FALSE(cryptographer->is_ready()); |
| 472 EXPECT_TRUE(cryptographer->has_pending_keys()); | 734 EXPECT_TRUE(cryptographer->has_pending_keys()); |
| 473 EXPECT_TRUE( | 735 EXPECT_TRUE( |
| 474 cryptographer->GetEncryptedTypes() | 736 cryptographer->GetEncryptedTypes() |
| 475 .Equals(syncable::ModelTypeSet::All())); | 737 .Equals(syncable::ModelTypeSet::All())); |
| 476 } | 738 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 510 | 772 |
| 511 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); | 773 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); |
| 512 apply_updates_command_.ExecuteImpl(session()); | 774 apply_updates_command_.ExecuteImpl(session()); |
| 513 | 775 |
| 514 sessions::StatusController* status = session()->mutable_status_controller(); | 776 sessions::StatusController* status = session()->mutable_status_controller(); |
| 515 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); | 777 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); |
| 516 ASSERT_TRUE(status->update_progress()); | 778 ASSERT_TRUE(status->update_progress()); |
| 517 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) | 779 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) |
| 518 << "All updates should have been attempted"; | 780 << "All updates should have been attempted"; |
| 519 ASSERT_TRUE(status->conflict_progress()); | 781 ASSERT_TRUE(status->conflict_progress()); |
| 520 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 782 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 521 << "The nigori update shouldn't be in conflict"; | 783 << "The nigori update shouldn't be in conflict"; |
| 522 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 784 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 523 << "The nigori update should be applied"; | 785 << "The nigori update should be applied"; |
| 524 | 786 |
| 525 EXPECT_FALSE(cryptographer->is_ready()); | 787 EXPECT_FALSE(cryptographer->is_ready()); |
| 526 EXPECT_TRUE(cryptographer->has_pending_keys()); | 788 EXPECT_TRUE(cryptographer->has_pending_keys()); |
| 527 EXPECT_TRUE( | 789 EXPECT_TRUE( |
| 528 cryptographer->GetEncryptedTypes() | 790 cryptographer->GetEncryptedTypes() |
| 529 .Equals(syncable::ModelTypeSet::All())); | 791 .Equals(syncable::ModelTypeSet::All())); |
| 530 } | 792 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 600 | 862 |
| 601 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); | 863 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); |
| 602 apply_updates_command_.ExecuteImpl(session()); | 864 apply_updates_command_.ExecuteImpl(session()); |
| 603 | 865 |
| 604 sessions::StatusController* status = session()->mutable_status_controller(); | 866 sessions::StatusController* status = session()->mutable_status_controller(); |
| 605 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); | 867 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); |
| 606 ASSERT_TRUE(status->update_progress()); | 868 ASSERT_TRUE(status->update_progress()); |
| 607 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) | 869 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) |
| 608 << "All updates should have been attempted"; | 870 << "All updates should have been attempted"; |
| 609 ASSERT_TRUE(status->conflict_progress()); | 871 ASSERT_TRUE(status->conflict_progress()); |
| 610 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 872 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 611 << "No updates should be in conflict"; | 873 << "No updates should be in conflict"; |
| 612 EXPECT_EQ(0, status->conflict_progress()->NonblockingConflictingItemsSize()) | 874 EXPECT_EQ(0, status->conflict_progress()->EncryptionConflictingItemsSize()) |
| 613 << "No updates should be in conflict"; | 875 << "No updates should be in conflict"; |
| 614 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 876 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 615 << "The nigori update should be applied"; | 877 << "The nigori update should be applied"; |
| 616 EXPECT_FALSE(cryptographer->has_pending_keys()); | 878 EXPECT_FALSE(cryptographer->has_pending_keys()); |
| 617 EXPECT_TRUE(cryptographer->is_ready()); | 879 EXPECT_TRUE(cryptographer->is_ready()); |
| 618 { | 880 { |
| 619 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | 881 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); |
| 620 ASSERT_TRUE(dir.good()); | 882 ASSERT_TRUE(dir.good()); |
| 621 ReadTransaction trans(FROM_HERE, dir); | 883 ReadTransaction trans(FROM_HERE, dir); |
| 622 | 884 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 703 | 965 |
| 704 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); | 966 ExpectGroupToChange(apply_updates_command_, GROUP_PASSIVE); |
| 705 apply_updates_command_.ExecuteImpl(session()); | 967 apply_updates_command_.ExecuteImpl(session()); |
| 706 | 968 |
| 707 sessions::StatusController* status = session()->mutable_status_controller(); | 969 sessions::StatusController* status = session()->mutable_status_controller(); |
| 708 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); | 970 sessions::ScopedModelSafeGroupRestriction r(status, GROUP_PASSIVE); |
| 709 ASSERT_TRUE(status->update_progress()); | 971 ASSERT_TRUE(status->update_progress()); |
| 710 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) | 972 EXPECT_EQ(1, status->update_progress()->AppliedUpdatesSize()) |
| 711 << "All updates should have been attempted"; | 973 << "All updates should have been attempted"; |
| 712 ASSERT_TRUE(status->conflict_progress()); | 974 ASSERT_TRUE(status->conflict_progress()); |
| 713 EXPECT_EQ(0, status->conflict_progress()->ConflictingItemsSize()) | 975 EXPECT_EQ(0, status->conflict_progress()->SimpleConflictingItemsSize()) |
| 714 << "The unsynced changes don't trigger a blocking conflict with the " | 976 << "The unsynced changes don't trigger a blocking conflict with the " |
| 715 << "nigori update."; | 977 << "nigori update."; |
| 716 EXPECT_EQ(0, status->conflict_progress()->NonblockingConflictingItemsSize()) | 978 EXPECT_EQ(0, status->conflict_progress()->EncryptionConflictingItemsSize()) |
| 717 << "The unsynced changes don't trigger a non-blocking conflict with the " | 979 << "The unsynced changes don't trigger an encryption conflict with the " |
| 718 << "nigori update."; | 980 << "nigori update."; |
| 719 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) | 981 EXPECT_EQ(1, status->update_progress()->SuccessfullyAppliedUpdateCount()) |
| 720 << "The nigori update should be applied"; | 982 << "The nigori update should be applied"; |
| 721 EXPECT_FALSE(cryptographer->is_ready()); | 983 EXPECT_FALSE(cryptographer->is_ready()); |
| 722 EXPECT_TRUE(cryptographer->has_pending_keys()); | 984 EXPECT_TRUE(cryptographer->has_pending_keys()); |
| 723 { | 985 { |
| 724 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); | 986 ScopedDirLookup dir(syncdb()->manager(), syncdb()->name()); |
| 725 ASSERT_TRUE(dir.good()); | 987 ASSERT_TRUE(dir.good()); |
| 726 ReadTransaction trans(FROM_HERE, dir); | 988 ReadTransaction trans(FROM_HERE, dir); |
| 727 | 989 |
| 728 // Since we have pending keys, we would have failed to encrypt, but the | 990 // Since we have pending keys, we would have failed to encrypt, but the |
| 729 // cryptographer should be updated. | 991 // cryptographer should be updated. |
| 730 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); | 992 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); |
| 731 EXPECT_TRUE(cryptographer->GetEncryptedTypes().Equals( | 993 EXPECT_TRUE(cryptographer->GetEncryptedTypes().Equals( |
| 732 syncable::ModelTypeSet().All())); | 994 syncable::ModelTypeSet().All())); |
| 733 EXPECT_FALSE(cryptographer->is_ready()); | 995 EXPECT_FALSE(cryptographer->is_ready()); |
| 734 EXPECT_TRUE(cryptographer->has_pending_keys()); | 996 EXPECT_TRUE(cryptographer->has_pending_keys()); |
| 735 | 997 |
| 736 Syncer::UnsyncedMetaHandles handles; | 998 Syncer::UnsyncedMetaHandles handles; |
| 737 SyncerUtil::GetUnsyncedEntries(&trans, &handles); | 999 SyncerUtil::GetUnsyncedEntries(&trans, &handles); |
| 738 EXPECT_EQ(2*batch_s+1, handles.size()); | 1000 EXPECT_EQ(2*batch_s+1, handles.size()); |
| 739 } | 1001 } |
| 740 } | 1002 } |
| 741 | 1003 |
| 742 } // namespace browser_sync | 1004 } // namespace browser_sync |
| OLD | NEW |