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

Side by Side Diff: chrome/browser/sync/engine/syncer_unittest.cc

Issue 8770032: [Sync] Implement encryption-aware conflict resolution. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Split out nigori conflict code and rebase Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 // Syncer unit tests. Unfortunately a lot of these tests 5 // Syncer unit tests. Unfortunately a lot of these tests
6 // are outdated and need to be reworked and updated. 6 // are outdated and need to be reworked and updated.
7 7
8 #include <algorithm> 8 #include <algorithm>
9 #include <limits> 9 #include <limits>
10 #include <list> 10 #include <list>
(...skipping 16 matching lines...) Expand all
27 #include "chrome/browser/sync/engine/net/server_connection_manager.h" 27 #include "chrome/browser/sync/engine/net/server_connection_manager.h"
28 #include "chrome/browser/sync/engine/process_updates_command.h" 28 #include "chrome/browser/sync/engine/process_updates_command.h"
29 #include "chrome/browser/sync/engine/nigori_util.h" 29 #include "chrome/browser/sync/engine/nigori_util.h"
30 #include "chrome/browser/sync/engine/syncer.h" 30 #include "chrome/browser/sync/engine/syncer.h"
31 #include "chrome/browser/sync/engine/syncer_proto_util.h" 31 #include "chrome/browser/sync/engine/syncer_proto_util.h"
32 #include "chrome/browser/sync/engine/syncer_util.h" 32 #include "chrome/browser/sync/engine/syncer_util.h"
33 #include "chrome/browser/sync/engine/syncproto.h" 33 #include "chrome/browser/sync/engine/syncproto.h"
34 #include "chrome/browser/sync/protocol/sync.pb.h" 34 #include "chrome/browser/sync/protocol/sync.pb.h"
35 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" 35 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
36 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" 36 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
37 #include "chrome/browser/sync/protocol/preference_specifics.pb.h"
37 #include "chrome/browser/sync/sessions/sync_session_context.h" 38 #include "chrome/browser/sync/sessions/sync_session_context.h"
38 #include "chrome/browser/sync/syncable/directory_manager.h" 39 #include "chrome/browser/sync/syncable/directory_manager.h"
39 #include "chrome/browser/sync/syncable/model_type.h" 40 #include "chrome/browser/sync/syncable/model_type.h"
40 #include "chrome/browser/sync/syncable/syncable.h" 41 #include "chrome/browser/sync/syncable/syncable.h"
41 #include "chrome/browser/sync/test/engine/fake_model_worker.h" 42 #include "chrome/browser/sync/test/engine/fake_model_worker.h"
42 #include "chrome/browser/sync/test/engine/mock_connection_manager.h" 43 #include "chrome/browser/sync/test/engine/mock_connection_manager.h"
43 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" 44 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h"
44 #include "chrome/browser/sync/test/engine/test_id_factory.h" 45 #include "chrome/browser/sync/test/engine/test_id_factory.h"
45 #include "chrome/browser/sync/test/engine/test_syncable_utils.h" 46 #include "chrome/browser/sync/test/engine/test_syncable_utils.h"
46 #include "chrome/browser/sync/util/cryptographer.h" 47 #include "chrome/browser/sync/util/cryptographer.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 using syncable::IS_DEL; 82 using syncable::IS_DEL;
82 using syncable::IS_DIR; 83 using syncable::IS_DIR;
83 using syncable::IS_UNAPPLIED_UPDATE; 84 using syncable::IS_UNAPPLIED_UPDATE;
84 using syncable::IS_UNSYNCED; 85 using syncable::IS_UNSYNCED;
85 using syncable::META_HANDLE; 86 using syncable::META_HANDLE;
86 using syncable::MTIME; 87 using syncable::MTIME;
87 using syncable::NEXT_ID; 88 using syncable::NEXT_ID;
88 using syncable::NON_UNIQUE_NAME; 89 using syncable::NON_UNIQUE_NAME;
89 using syncable::PARENT_ID; 90 using syncable::PARENT_ID;
90 using syncable::PREV_ID; 91 using syncable::PREV_ID;
92 using syncable::PREV_SERVER_SPECIFICS;
91 using syncable::SERVER_IS_DEL; 93 using syncable::SERVER_IS_DEL;
92 using syncable::SERVER_NON_UNIQUE_NAME; 94 using syncable::SERVER_NON_UNIQUE_NAME;
93 using syncable::SERVER_PARENT_ID; 95 using syncable::SERVER_PARENT_ID;
94 using syncable::SERVER_POSITION_IN_PARENT; 96 using syncable::SERVER_POSITION_IN_PARENT;
95 using syncable::SERVER_SPECIFICS; 97 using syncable::SERVER_SPECIFICS;
96 using syncable::SERVER_VERSION; 98 using syncable::SERVER_VERSION;
97 using syncable::UNIQUE_CLIENT_TAG; 99 using syncable::UNIQUE_CLIENT_TAG;
98 using syncable::UNIQUE_SERVER_TAG; 100 using syncable::UNIQUE_SERVER_TAG;
99 using syncable::SPECIFICS; 101 using syncable::SPECIFICS;
100 using syncable::SYNCING; 102 using syncable::SYNCING;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 GetModelSafeRoutingInfo(&info); 174 GetModelSafeRoutingInfo(&info);
173 GetWorkers(&workers); 175 GetWorkers(&workers);
174 syncable::ModelTypePayloadMap types = 176 syncable::ModelTypePayloadMap types =
175 syncable::ModelTypePayloadMapFromRoutingInfo(info, std::string()); 177 syncable::ModelTypePayloadMapFromRoutingInfo(info, std::string());
176 return new SyncSession(context_.get(), this, 178 return new SyncSession(context_.get(), this,
177 sessions::SyncSourceInfo(sync_pb::GetUpdatesCallerInfo::UNKNOWN, types), 179 sessions::SyncSourceInfo(sync_pb::GetUpdatesCallerInfo::UNKNOWN, types),
178 info, workers); 180 info, workers);
179 } 181 }
180 182
181 bool SyncShareAsDelegate() { 183 bool SyncShareAsDelegate() {
182 scoped_ptr<SyncSession> session(MakeSession()); 184 session_.reset(MakeSession());
183 syncer_->SyncShare(session.get(), SYNCER_BEGIN, SYNCER_END); 185 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END);
184 return session->HasMoreToSync(); 186 return session_->HasMoreToSync();
185 } 187 }
186 188
187 void LoopSyncShare() { 189 void LoopSyncShare() {
188 bool should_loop = false; 190 bool should_loop = false;
189 int loop_iterations = 0; 191 int loop_iterations = 0;
190 do { 192 do {
191 ASSERT_LT(++loop_iterations, 100) << "infinite loop detected. please fix"; 193 ASSERT_LT(++loop_iterations, 100) << "infinite loop detected. please fix";
192 should_loop = SyncShareAsDelegate(); 194 should_loop = SyncShareAsDelegate();
193 } while (should_loop); 195 } while (should_loop);
194 } 196 }
195 197
196 virtual void SetUp() { 198 virtual void SetUp() {
197 syncdb_.SetUp(); 199 syncdb_.SetUp();
198 200
199 mock_server_.reset( 201 mock_server_.reset(
200 new MockConnectionManager(syncdb_.manager(), syncdb_.name())); 202 new MockConnectionManager(syncdb_.manager(), syncdb_.name()));
201 EnableDatatype(syncable::BOOKMARKS); 203 EnableDatatype(syncable::BOOKMARKS);
202 EnableDatatype(syncable::NIGORI); 204 EnableDatatype(syncable::NIGORI);
205 EnableDatatype(syncable::PREFERENCES);
206 EnableDatatype(syncable::NIGORI);
203 worker_ = new FakeModelWorker(GROUP_PASSIVE); 207 worker_ = new FakeModelWorker(GROUP_PASSIVE);
204 std::vector<SyncEngineEventListener*> listeners; 208 std::vector<SyncEngineEventListener*> listeners;
205 listeners.push_back(this); 209 listeners.push_back(this);
206 context_.reset(new SyncSessionContext(mock_server_.get(), 210 context_.reset(new SyncSessionContext(mock_server_.get(),
207 syncdb_.manager(), this, listeners, NULL)); 211 syncdb_.manager(), this, listeners, NULL));
208 context_->set_account_name(syncdb_.name()); 212 context_->set_account_name(syncdb_.name());
209 ASSERT_FALSE(context_->resolver()); 213 ASSERT_FALSE(context_->resolver());
210 syncer_ = new Syncer(); 214 syncer_ = new Syncer();
211 session_.reset(MakeSession()); 215 session_.reset(MakeSession());
212 216
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 expected_order.push_back(ids_.MakeLocal("b")); 559 expected_order.push_back(ids_.MakeLocal("b"));
556 expected_order.push_back(ids_.MakeLocal("c")); 560 expected_order.push_back(ids_.MakeLocal("c"));
557 expected_order.push_back(ids_.MakeLocal("e")); 561 expected_order.push_back(ids_.MakeLocal("e"));
558 DoTruncationTest(dir, unsynced_handle_view, expected_order); 562 DoTruncationTest(dir, unsynced_handle_view, expected_order);
559 } 563 }
560 564
561 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) { 565 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) {
562 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); 566 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name());
563 ASSERT_TRUE(dir.good()); 567 ASSERT_TRUE(dir.good());
564 const syncable::ModelTypeSet throttled_types(syncable::BOOKMARKS); 568 const syncable::ModelTypeSet throttled_types(syncable::BOOKMARKS);
565 KeyParams key_params = {"localhost", "dummy", "foobar"};
566 sync_pb::EntitySpecifics bookmark_data; 569 sync_pb::EntitySpecifics bookmark_data;
567 AddDefaultExtensionValue(syncable::BOOKMARKS, &bookmark_data); 570 AddDefaultExtensionValue(syncable::BOOKMARKS, &bookmark_data);
568 571
569 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 572 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
570 SyncShareAsDelegate(); 573 SyncShareAsDelegate();
571 574
572 { 575 {
573 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); 576 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir);
574 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 577 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
575 ASSERT_TRUE(A.good()); 578 ASSERT_TRUE(A.good());
(...skipping 23 matching lines...) Expand all
599 SyncShareAsDelegate(); 602 SyncShareAsDelegate();
600 { 603 {
601 // It should have been committed. 604 // It should have been committed.
602 ReadTransaction rtrans(FROM_HERE, dir); 605 ReadTransaction rtrans(FROM_HERE, dir);
603 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 606 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1));
604 ASSERT_TRUE(entryA.good()); 607 ASSERT_TRUE(entryA.good());
605 EXPECT_FALSE(entryA.Get(IS_UNSYNCED)); 608 EXPECT_FALSE(entryA.Get(IS_UNSYNCED));
606 } 609 }
607 } 610 }
608 611
612 // We use a macro so we can preserve the error location.
613 #define VERIFY_ENTRY(id, is_unapplied, is_unsynced, prev_initialized, \
614 parent_id, version, server_version, id_fac, rtrans) \
615 do { \
616 Entry entryA(rtrans, syncable::GET_BY_ID, id_fac.FromNumber(id)); \
617 ASSERT_TRUE(entryA.good()); \
618 EXPECT_EQ(is_unsynced, entryA.Get(IS_UNSYNCED)); \
619 EXPECT_EQ(is_unapplied, entryA.Get(IS_UNAPPLIED_UPDATE)); \
620 EXPECT_EQ(prev_initialized, \
621 syncable::IsRealDataType(syncable::GetModelTypeFromSpecifics( \
622 entryA.Get(PREV_SERVER_SPECIFICS)))); \
623 EXPECT_TRUE(parent_id == -1 || \
624 entryA.Get(PARENT_ID) == id_fac.FromNumber(parent_id)); \
625 EXPECT_EQ(version, entryA.Get(BASE_VERSION)); \
626 EXPECT_EQ(server_version, entryA.Get(SERVER_VERSION)); \
627 } while (0)
628
609 TEST_F(SyncerTest, GetCommitIdsFiltersUnreadyEntries) { 629 TEST_F(SyncerTest, GetCommitIdsFiltersUnreadyEntries) {
610 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); 630 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name());
611 ASSERT_TRUE(dir.good()); 631 ASSERT_TRUE(dir.good());
612 KeyParams key_params = {"localhost", "dummy", "foobar"}; 632 KeyParams key_params = {"localhost", "dummy", "foobar"};
613 sync_pb::EncryptedData encrypted; 633 KeyParams other_params = {"localhost", "dummy", "foobar2"};
614 sync_pb::EntitySpecifics encrypted_bookmark; 634 sync_pb::EntitySpecifics bookmark, encrypted_bookmark;
615 encrypted_bookmark.mutable_encrypted(); 635 bookmark.MutableExtension(sync_pb::bookmark)->set_url("url");
636 bookmark.MutableExtension(sync_pb::bookmark)->set_title("title");
616 AddDefaultExtensionValue(syncable::BOOKMARKS, &encrypted_bookmark); 637 AddDefaultExtensionValue(syncable::BOOKMARKS, &encrypted_bookmark);
617 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 638 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
618 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); 639 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10);
619 mock_server_->AddUpdateDirectory(3, 0, "C", 10, 10); 640 mock_server_->AddUpdateDirectory(3, 0, "C", 10, 10);
620 mock_server_->AddUpdateDirectory(4, 0, "D", 10, 10); 641 mock_server_->AddUpdateDirectory(4, 0, "D", 10, 10);
621 SyncShareAsDelegate(); 642 SyncShareAsDelegate();
622 // Server side change will put A in conflict. 643 // Server side change will put A in conflict.
623 mock_server_->AddUpdateDirectory(1, 0, "A", 20, 20); 644 mock_server_->AddUpdateDirectory(1, 0, "A", 20, 20);
624 { 645 {
625 // Mark bookmarks as encrypted and set the cryptographer to have pending 646 // Mark bookmarks as encrypted and set the cryptographer to have pending
626 // keys. 647 // keys.
627 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); 648 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir);
628 browser_sync::Cryptographer other_cryptographer; 649 browser_sync::Cryptographer other_cryptographer;
629 other_cryptographer.AddKey(key_params); 650 other_cryptographer.AddKey(other_params);
630 sync_pb::EntitySpecifics specifics; 651 sync_pb::EntitySpecifics specifics;
631 sync_pb::NigoriSpecifics* nigori = 652 sync_pb::NigoriSpecifics* nigori =
632 specifics.MutableExtension(sync_pb::nigori); 653 specifics.MutableExtension(sync_pb::nigori);
633 other_cryptographer.GetKeys(nigori->mutable_encrypted()); 654 other_cryptographer.GetKeys(nigori->mutable_encrypted());
634 nigori->set_encrypt_bookmarks(true); 655 nigori->set_encrypt_bookmarks(true);
656 // Set up with an old passphrase, but have pending keys
657 syncdb_.manager()->GetCryptographer(&wtrans)->AddKey(key_params);
658 syncdb_.manager()->GetCryptographer(&wtrans)->Encrypt(
659 bookmark,
660 encrypted_bookmark.mutable_encrypted());
635 syncdb_.manager()->GetCryptographer(&wtrans)->Update(*nigori); 661 syncdb_.manager()->GetCryptographer(&wtrans)->Update(*nigori);
636 662
637 // In conflict but properly encrypted. 663 // In conflict but properly encrypted.
638 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 664 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
639 ASSERT_TRUE(A.good()); 665 ASSERT_TRUE(A.good());
640 A.Put(IS_UNSYNCED, true); 666 A.Put(IS_UNSYNCED, true);
641 A.Put(SPECIFICS, encrypted_bookmark); 667 A.Put(SPECIFICS, encrypted_bookmark);
642 A.Put(NON_UNIQUE_NAME, kEncryptedString); 668 A.Put(NON_UNIQUE_NAME, kEncryptedString);
643 // Not in conflict and properly encrypted. 669 // Not in conflict and properly encrypted.
644 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 670 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
(...skipping 10 matching lines...) Expand all
655 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4)); 681 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4));
656 ASSERT_TRUE(D.good()); 682 ASSERT_TRUE(D.good());
657 D.Put(IS_UNSYNCED, true); 683 D.Put(IS_UNSYNCED, true);
658 D.Put(SPECIFICS, encrypted_bookmark); 684 D.Put(SPECIFICS, encrypted_bookmark);
659 D.Put(NON_UNIQUE_NAME, "not encrypted"); 685 D.Put(NON_UNIQUE_NAME, "not encrypted");
660 } 686 }
661 SyncShareAsDelegate(); 687 SyncShareAsDelegate();
662 { 688 {
663 // We remove any unready entries from the status controller's unsynced 689 // We remove any unready entries from the status controller's unsynced
664 // handles, so this should remain 0 even though the entries didn't commit. 690 // handles, so this should remain 0 even though the entries didn't commit.
665 ASSERT_EQ(0U, session_->status_controller().unsynced_handles().size()); 691 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
666 // Nothing should have commited due to bookmarks being encrypted and 692 // Nothing should have commited due to bookmarks being encrypted and
667 // the cryptographer having pending keys. A would have been resolved 693 // the cryptographer having pending keys. A would have been resolved
668 // as a simple conflict, but still be unsynced until the next sync cycle. 694 // as a simple conflict, but still be unsynced until the next sync cycle.
669 ReadTransaction rtrans(FROM_HERE, dir); 695 ReadTransaction rtrans(FROM_HERE, dir);
670 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 696 VERIFY_ENTRY(1, false, true, false, 0, 20, 20, ids_, &rtrans);
671 ASSERT_TRUE(entryA.good()); 697 VERIFY_ENTRY(2, false, true, false, 0, 10, 10, ids_, &rtrans);
672 EXPECT_TRUE(entryA.Get(IS_UNSYNCED)); 698 VERIFY_ENTRY(3, false, true, false, 0, 10, 10, ids_, &rtrans);
673 Entry entryB(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); 699 VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans);
674 ASSERT_TRUE(entryB.good());
675 EXPECT_TRUE(entryB.Get(IS_UNSYNCED));
676 Entry entryC(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(3));
677 ASSERT_TRUE(entryC.good());
678 EXPECT_TRUE(entryC.Get(IS_UNSYNCED));
679 Entry entryD(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(4));
680 ASSERT_TRUE(entryD.good());
681 EXPECT_TRUE(entryD.Get(IS_UNSYNCED));
682 700
683 // Resolve the pending keys. 701 // Resolve the pending keys.
684 syncdb_.manager()->GetCryptographer(&rtrans)->DecryptPendingKeys( 702 syncdb_.manager()->GetCryptographer(&rtrans)->DecryptPendingKeys(
685 key_params); 703 other_params);
686 } 704 }
687 SyncShareAsDelegate(); 705 SyncShareAsDelegate();
688 { 706 {
689 ASSERT_EQ(0U, session_->status_controller().unsynced_handles().size()); 707 // 2 unsynced handles to reflect the items that committed succesfully.
708 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size());
690 // All properly encrypted and non-conflicting items should commit. "A" was 709 // All properly encrypted and non-conflicting items should commit. "A" was
691 // conflicting, but last sync cycle resolved it as simple conflict, so on 710 // conflicting, but last sync cycle resolved it as simple conflict, so on
692 // this sync cycle it committed succesfullly. 711 // this sync cycle it committed succesfullly.
693 ReadTransaction rtrans(FROM_HERE, dir); 712 ReadTransaction rtrans(FROM_HERE, dir);
694 // Committed successfully. 713 // Committed successfully.
695 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 714 VERIFY_ENTRY(1, false, false, false, 0, 21, 21, ids_, &rtrans);
696 ASSERT_TRUE(entryA.good());
697 EXPECT_FALSE(entryA.Get(IS_UNSYNCED));
698 EXPECT_FALSE(entryA.Get(IS_UNAPPLIED_UPDATE));
699 // Committed successfully. 715 // Committed successfully.
700 Entry entryB(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); 716 VERIFY_ENTRY(2, false, false, false, 0, 11, 11, ids_, &rtrans);
701 ASSERT_TRUE(entryB.good());
702 EXPECT_FALSE(entryB.Get(IS_UNSYNCED));
703 EXPECT_FALSE(entryB.Get(IS_UNAPPLIED_UPDATE));
704 // Was not properly encrypted. 717 // Was not properly encrypted.
705 Entry entryC(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(3)); 718 VERIFY_ENTRY(3, false, true, false, 0, 10, 10, ids_, &rtrans);
706 ASSERT_TRUE(entryC.good());
707 EXPECT_TRUE(entryC.Get(IS_UNSYNCED));
708 EXPECT_FALSE(entryC.Get(IS_UNAPPLIED_UPDATE));
709 // Was not properly encrypted. 719 // Was not properly encrypted.
710 Entry entryD(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(4)); 720 VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans);
711 ASSERT_TRUE(entryD.good());
712 EXPECT_TRUE(entryD.Get(IS_UNSYNCED));
713 EXPECT_FALSE(entryD.Get(IS_UNAPPLIED_UPDATE));
714 } 721 }
715 { 722 {
716 // Fix the remaining items. 723 // Fix the remaining items.
717 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); 724 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir);
718 MutableEntry C(&wtrans, GET_BY_ID, ids_.FromNumber(3)); 725 MutableEntry C(&wtrans, GET_BY_ID, ids_.FromNumber(3));
719 ASSERT_TRUE(C.good()); 726 ASSERT_TRUE(C.good());
720 C.Put(SPECIFICS, encrypted_bookmark); 727 C.Put(SPECIFICS, encrypted_bookmark);
721 C.Put(NON_UNIQUE_NAME, kEncryptedString); 728 C.Put(NON_UNIQUE_NAME, kEncryptedString);
722 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4)); 729 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4));
723 ASSERT_TRUE(D.good()); 730 ASSERT_TRUE(D.good());
724 D.Put(SPECIFICS, encrypted_bookmark); 731 D.Put(SPECIFICS, encrypted_bookmark);
725 D.Put(NON_UNIQUE_NAME, kEncryptedString); 732 D.Put(NON_UNIQUE_NAME, kEncryptedString);
726 } 733 }
727 SyncShareAsDelegate(); 734 SyncShareAsDelegate();
728 { 735 {
729 ASSERT_EQ(0U, session_->status_controller().unsynced_handles().size()); 736 // We attempted to commit two items.
737 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size());
738 EXPECT_TRUE(session_->status_controller().did_commit_items());
730 // None should be unsynced anymore. 739 // None should be unsynced anymore.
731 ReadTransaction rtrans(FROM_HERE, dir); 740 ReadTransaction rtrans(FROM_HERE, dir);
732 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 741 VERIFY_ENTRY(1, false, false, false, 0, 21, 21, ids_, &rtrans);
733 ASSERT_TRUE(entryA.good()); 742 VERIFY_ENTRY(2, false, false, false, 0, 11, 11, ids_, &rtrans);
734 EXPECT_FALSE(entryA.Get(IS_UNSYNCED)); 743 VERIFY_ENTRY(3, false, false, false, 0, 11, 11, ids_, &rtrans);
735 EXPECT_FALSE(entryA.Get(IS_UNAPPLIED_UPDATE)); 744 VERIFY_ENTRY(4, false, false, false, 0, 11, 11, ids_, &rtrans);
736 Entry entryB(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2));
737 ASSERT_TRUE(entryB.good());
738 EXPECT_FALSE(entryB.Get(IS_UNSYNCED));
739 EXPECT_FALSE(entryB.Get(IS_UNAPPLIED_UPDATE));
740 Entry entryC(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(3));
741 ASSERT_TRUE(entryC.good());
742 EXPECT_FALSE(entryC.Get(IS_UNSYNCED));
743 EXPECT_FALSE(entryC.Get(IS_UNAPPLIED_UPDATE));
744 Entry entryD(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(4));
745 ASSERT_TRUE(entryD.good());
746 EXPECT_FALSE(entryD.Get(IS_UNSYNCED));
747 EXPECT_FALSE(entryD.Get(IS_UNAPPLIED_UPDATE));
748 } 745 }
749 } 746 }
750 747
748 TEST_F(SyncerTest, EncryptionAwareConflicts) {
tim (not reviewing) 2011/12/15 20:55:11 I like the coverage but.. it would be _REALLY_ nic
749 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name());
750 ASSERT_TRUE(dir.good());
751 KeyParams key_params = {"localhost", "dummy", "foobar"};
752 browser_sync::Cryptographer other_cryptographer;
753 other_cryptographer.AddKey(key_params);
754 sync_pb::EntitySpecifics bookmark, encrypted_bookmark, modified_bookmark;
755 bookmark.MutableExtension(sync_pb::bookmark)->set_title("title");
756 other_cryptographer.Encrypt(bookmark,
757 encrypted_bookmark.mutable_encrypted());
758 AddDefaultExtensionValue(syncable::BOOKMARKS, &encrypted_bookmark);
759 modified_bookmark.MutableExtension(sync_pb::bookmark)->set_title("title2");
760 other_cryptographer.Encrypt(modified_bookmark,
761 modified_bookmark.mutable_encrypted());
762 sync_pb::EntitySpecifics pref, encrypted_pref, modified_pref;
763 pref.MutableExtension(sync_pb::preference)->set_name("name");
764 AddDefaultExtensionValue(syncable::PREFERENCES, &encrypted_pref);
765 other_cryptographer.Encrypt(pref,
766 encrypted_pref.mutable_encrypted());
767 modified_pref.MutableExtension(sync_pb::preference)->set_name("name2");
768 other_cryptographer.Encrypt(modified_pref,
769 modified_pref.mutable_encrypted());
770 {
771 // Mark bookmarks and preferences as encrypted and set the cryptographer to
772 // have pending keys.
773 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir);
774 sync_pb::EntitySpecifics specifics;
775 sync_pb::NigoriSpecifics* nigori =
776 specifics.MutableExtension(sync_pb::nigori);
777 other_cryptographer.GetKeys(nigori->mutable_encrypted());
778 nigori->set_encrypt_bookmarks(true);
779 nigori->set_encrypt_preferences(true);
780 syncdb_.manager()->GetCryptographer(&wtrans)->Update(*nigori);
781 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)->
782 has_pending_keys());
783 }
784
785 mock_server_->AddUpdateSpecifics(1, 0, "A", 10, 10, true, 0, bookmark);
786 mock_server_->AddUpdateSpecifics(2, 1, "B", 10, 10, false, 2, bookmark);
787 mock_server_->AddUpdateSpecifics(3, 1, "C", 10, 10, false, 1, bookmark);
788 mock_server_->AddUpdateSpecifics(4, 0, "D", 10, 10, false, 0, pref);
789 SyncShareAsDelegate();
790 {
791 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
792 // Initial state. Everything is normal.
793 ReadTransaction rtrans(FROM_HERE, dir);
794 VERIFY_ENTRY(1, false, false, false, 0, 10, 10, ids_, &rtrans);
795 VERIFY_ENTRY(2, false, false, false, 1, 10, 10, ids_, &rtrans);
796 VERIFY_ENTRY(3, false, false, false, 1, 10, 10, ids_, &rtrans);
797 VERIFY_ENTRY(4, false, false, false, 0, 10, 10, ids_, &rtrans);
798 }
799 // Server side encryption will not be applied due to undecryptable data.
800 // At this point, PREV_SERVER_SPECIFICS should be filled for all four items.
801 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 20, 20, true, 0,
802 encrypted_bookmark);
803 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 20, 20, false, 2,
804 encrypted_bookmark);
805 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 20, 20, false, 1,
806 encrypted_bookmark);
807 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 20, 20, false, 0,
808 encrypted_pref);
809 SyncShareAsDelegate();
810 {
811 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
812 // All should be unapplied due to being undecryptable and have a valid
813 // PREV_SERVER_SPECIFICS.
814 ReadTransaction rtrans(FROM_HERE, dir);
815 VERIFY_ENTRY(1, true, false, true, 0, 10, 20, ids_, &rtrans);
816 VERIFY_ENTRY(2, true, false, true, 1, 10, 20, ids_, &rtrans);
817 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans);
818 VERIFY_ENTRY(4, true, false, true, 0, 10, 20, ids_, &rtrans);
819 }
820 // Server side change that don't modify anything should not affect
821 // PREV_SERVER_SPECIFICS (such as name changes and mtime changes).
822 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 30, 30, true, 0,
823 encrypted_bookmark);
824 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 30, 30, false, 2,
825 encrypted_bookmark);
826 // Item 3 doesn't change.
827 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 30, 30, false, 0,
828 encrypted_pref);
829 SyncShareAsDelegate();
830 {
831 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
832 // Items 1, 2, and 4 should have newer server versions, 3 remains the same.
833 // All should remain unapplied due to be undecryptable.
834 ReadTransaction rtrans(FROM_HERE, dir);
835 VERIFY_ENTRY(1, true, false, true, 0, 10, 30, ids_, &rtrans);
836 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans);
837 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans);
838 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans);
839 }
840 // Positional changes, parent changes, and specifics changes should reset
841 // PREV_SERVER_SPECIFICS.
842 // Became unencrypted.
843 mock_server_->AddUpdateSpecifics(1, 0, "A", 40, 40, true, 0, bookmark);
844 // Reordered to after item 2.
845 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 30, 30, false, 3,
846 encrypted_bookmark);
847 SyncShareAsDelegate();
848 {
849 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
850 // Items 2 and 4 should be the only ones with PREV_SERVER_SPECIFICS set.
851 // Items 1 is now unencrypted, so should have applied normally.
852 ReadTransaction rtrans(FROM_HERE, dir);
853 VERIFY_ENTRY(1, false, false, false, 0, 40, 40, ids_, &rtrans);
854 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans);
855 VERIFY_ENTRY(3, true, false, false, 1, 10, 30, ids_, &rtrans);
856 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans);
857 }
858 // Make local changes, which should remain unsynced for items 2, 3, 4.
859 {
860 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir);
861 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
862 ASSERT_TRUE(A.good());
863 A.Put(SPECIFICS, modified_bookmark);
864 A.Put(NON_UNIQUE_NAME, kEncryptedString);
865 A.Put(IS_UNSYNCED, true);
866 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
867 ASSERT_TRUE(B.good());
868 B.Put(SPECIFICS, modified_bookmark);
869 B.Put(NON_UNIQUE_NAME, kEncryptedString);
870 B.Put(IS_UNSYNCED, true);
871 MutableEntry C(&wtrans, GET_BY_ID, ids_.FromNumber(3));
872 ASSERT_TRUE(C.good());
873 C.Put(SPECIFICS, modified_bookmark);
874 C.Put(NON_UNIQUE_NAME, kEncryptedString);
875 C.Put(IS_UNSYNCED, true);
876 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4));
877 ASSERT_TRUE(D.good());
878 D.Put(SPECIFICS, modified_pref);
879 D.Put(NON_UNIQUE_NAME, kEncryptedString);
880 D.Put(IS_UNSYNCED, true);
881 }
882 SyncShareAsDelegate();
883 {
884 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
885 // Item 1 remains unsynced due to there being pending keys.
886 // Items 2, 3, 4 should remain unsynced since they were not up to date.
887 ReadTransaction rtrans(FROM_HERE, dir);
888 VERIFY_ENTRY(1, false, true, false, 0, 40, 40, ids_, &rtrans);
889 VERIFY_ENTRY(2, true, true, true, 1, 10, 30, ids_, &rtrans);
890 VERIFY_ENTRY(3, true, true, false, 1, 10, 30, ids_, &rtrans);
891 VERIFY_ENTRY(4, true, true, true, 0, 10, 30, ids_, &rtrans);
892 }
893 {
894 ReadTransaction rtrans(FROM_HERE, dir);
895 // Resolve the pending keys.
896 syncdb_.manager()->GetCryptographer(&rtrans)->DecryptPendingKeys(
897 key_params);
898 }
899 // First cycle resolves conflicts, second cycle commits changes.
900 SyncShareAsDelegate();
901 EXPECT_EQ(2, session_->status_controller().syncer_status().
902 num_server_overwrites);
903 EXPECT_EQ(1, session_->status_controller().syncer_status().
904 num_local_overwrites);
905 // We attempted to commit item 1.
906 EXPECT_EQ(1U, session_->status_controller().unsynced_handles().size());
907 EXPECT_TRUE(session_->status_controller().did_commit_items());
908 SyncShareAsDelegate();
909 {
910 // Everything should be resolved now. The local changes should have
911 // overwritten the server changes for 2 and 4, while the server changes
912 // overwrote the local for entry 3.
913 // We attempted to commit two handles.
914 EXPECT_EQ(0, session_->status_controller().syncer_status().
915 num_server_overwrites);
916 EXPECT_EQ(0, session_->status_controller().syncer_status().
917 num_local_overwrites);
918 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size());
919 EXPECT_TRUE(session_->status_controller().did_commit_items());
920 ReadTransaction rtrans(FROM_HERE, dir);
921 VERIFY_ENTRY(1, false, false, false, 0, 41, 41, ids_, &rtrans);
922 VERIFY_ENTRY(2, false, false, false, 1, 31, 31, ids_, &rtrans);
923 VERIFY_ENTRY(3, false, false, false, 1, 30, 30, ids_, &rtrans);
924 VERIFY_ENTRY(4, false, false, false, 0, 31, 31, ids_, &rtrans);
925 }
926 }
927
751 TEST_F(SyncerTest, NigoriConflicts) { 928 TEST_F(SyncerTest, NigoriConflicts) {
752 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); 929 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name());
753 ASSERT_TRUE(dir.good()); 930 ASSERT_TRUE(dir.good());
754 KeyParams local_key_params = {"localhost", "dummy", "blargle"}; 931 KeyParams local_key_params = {"localhost", "dummy", "blargle"};
755 KeyParams other_key_params = {"localhost", "dummy", "foobar"}; 932 KeyParams other_key_params = {"localhost", "dummy", "foobar"};
756 browser_sync::Cryptographer other_cryptographer; 933 browser_sync::Cryptographer other_cryptographer;
757 other_cryptographer.AddKey(other_key_params); 934 other_cryptographer.AddKey(other_key_params);
758 syncable::ModelTypeSet encrypted_types(syncable::PASSWORDS, syncable::NIGORI); 935 syncable::ModelTypeSet encrypted_types(syncable::PASSWORDS, syncable::NIGORI);
759 sync_pb::EntitySpecifics initial_nigori_specifics; 936 sync_pb::EntitySpecifics initial_nigori_specifics;
760 initial_nigori_specifics.MutableExtension(sync_pb::nigori); 937 initial_nigori_specifics.MutableExtension(sync_pb::nigori);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 our_encrypted_specifics.encrypted())); 1040 our_encrypted_specifics.encrypted()));
864 EXPECT_FALSE(syncdb_.manager()->GetCryptographer(&wtrans)-> 1041 EXPECT_FALSE(syncdb_.manager()->GetCryptographer(&wtrans)->
865 CanDecryptUsingDefaultKey(our_encrypted_specifics.encrypted())); 1042 CanDecryptUsingDefaultKey(our_encrypted_specifics.encrypted()));
866 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)->CanDecrypt( 1043 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)->CanDecrypt(
867 other_encrypted_specifics.encrypted())); 1044 other_encrypted_specifics.encrypted()));
868 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)-> 1045 EXPECT_TRUE(syncdb_.manager()->GetCryptographer(&wtrans)->
869 CanDecryptUsingDefaultKey(other_encrypted_specifics.encrypted())); 1046 CanDecryptUsingDefaultKey(other_encrypted_specifics.encrypted()));
870 } 1047 }
871 } 1048 }
872 1049
1050 #undef VERIFY_ENTRY
873 1051
874 // TODO(chron): More corner case unit tests around validation. 1052 // TODO(chron): More corner case unit tests around validation.
875 TEST_F(SyncerTest, TestCommitMetahandleIterator) { 1053 TEST_F(SyncerTest, TestCommitMetahandleIterator) {
876 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name()); 1054 ScopedDirLookup dir(syncdb_.manager(), syncdb_.name());
877 ASSERT_TRUE(dir.good()); 1055 ASSERT_TRUE(dir.good());
878 StatusController* status = session_->mutable_status_controller(); 1056 StatusController* status = session_->mutable_status_controller();
879 const vector<int64>& unsynced(status->unsynced_handles()); 1057 const vector<int64>& unsynced(status->unsynced_handles());
880 1058
881 { 1059 {
882 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir); 1060 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir);
(...skipping 4050 matching lines...) Expand 10 before | Expand all | Expand 10 after
4933 EXPECT_GE(0, Get(metahandle_, BASE_VERSION)); 5111 EXPECT_GE(0, Get(metahandle_, BASE_VERSION));
4934 EXPECT_GE(0, Get(metahandle_, SERVER_VERSION)); 5112 EXPECT_GE(0, Get(metahandle_, SERVER_VERSION));
4935 } 5113 }
4936 5114
4937 protected: 5115 protected:
4938 const std::string client_tag_; 5116 const std::string client_tag_;
4939 int64 metahandle_; 5117 int64 metahandle_;
4940 }; 5118 };
4941 5119
4942 TEST_F(SyncerUndeletionTest, UndeleteDuringCommit) { 5120 TEST_F(SyncerUndeletionTest, UndeleteDuringCommit) {
4943 const StatusController& status = session_->status_controller();
4944
4945 Create(); 5121 Create();
4946 ExpectUnsyncedCreation(); 5122 ExpectUnsyncedCreation();
4947 SyncShareAsDelegate(); 5123 SyncShareAsDelegate();
4948 5124
4949 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5125 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4950 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5126 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4951 ExpectSyncedAndCreated(); 5127 ExpectSyncedAndCreated();
4952 5128
4953 // Delete, begin committing the delete, then undelete while committing. 5129 // Delete, begin committing the delete, then undelete while committing.
4954 Delete(); 5130 Delete();
4955 ExpectUnsyncedDeletion(); 5131 ExpectUnsyncedDeletion();
4956 mock_server_->SetMidCommitCallback( 5132 mock_server_->SetMidCommitCallback(
4957 NewCallback<SyncerUndeletionTest>(this, 5133 NewCallback<SyncerUndeletionTest>(this,
4958 &SyncerUndeletionTest::Undelete)); 5134 &SyncerUndeletionTest::Undelete));
4959 SyncShareAsDelegate(); 5135 SyncShareAsDelegate();
4960 5136
4961 // The item ought to exist as an unsynced undeletion (meaning, 5137 // The item ought to exist as an unsynced undeletion (meaning,
4962 // we think that the next commit ought to be a recreation commit). 5138 // we think that the next commit ought to be a recreation commit).
4963 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5139 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4964 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5140 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4965 ExpectUnsyncedUndeletion(); 5141 ExpectUnsyncedUndeletion();
4966 5142
4967 // Now, encounter a GetUpdates corresponding to the deletion from 5143 // Now, encounter a GetUpdates corresponding to the deletion from
4968 // the server. The undeletion should prevail again and be committed. 5144 // the server. The undeletion should prevail again and be committed.
4969 // None of this should trigger any conflict detection -- it is perfectly 5145 // None of this should trigger any conflict detection -- it is perfectly
4970 // normal to recieve updates from our own commits. 5146 // normal to recieve updates from our own commits.
4971 mock_server_->SetMidCommitCallback(NULL); 5147 mock_server_->SetMidCommitCallback(NULL);
4972 mock_server_->AddUpdateTombstone(Get(metahandle_, ID)); 5148 mock_server_->AddUpdateTombstone(Get(metahandle_, ID));
4973 SyncShareAsDelegate(); 5149 SyncShareAsDelegate();
4974 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5150 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4975 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5151 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4976 ExpectSyncedAndCreated(); 5152 ExpectSyncedAndCreated();
4977 } 5153 }
4978 5154
4979 TEST_F(SyncerUndeletionTest, UndeleteBeforeCommit) { 5155 TEST_F(SyncerUndeletionTest, UndeleteBeforeCommit) {
4980 const StatusController& status = session_->status_controller();
4981
4982 Create(); 5156 Create();
4983 ExpectUnsyncedCreation(); 5157 ExpectUnsyncedCreation();
4984 SyncShareAsDelegate(); 5158 SyncShareAsDelegate();
4985 5159
4986 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5160 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4987 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5161 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4988 ExpectSyncedAndCreated(); 5162 ExpectSyncedAndCreated();
4989 5163
4990 // Delete and undelete, then sync to pick up the result. 5164 // Delete and undelete, then sync to pick up the result.
4991 Delete(); 5165 Delete();
4992 ExpectUnsyncedDeletion(); 5166 ExpectUnsyncedDeletion();
4993 Undelete(); 5167 Undelete();
4994 ExpectUnsyncedEdit(); // Edit, not undelete: server thinks it exists. 5168 ExpectUnsyncedEdit(); // Edit, not undelete: server thinks it exists.
4995 SyncShareAsDelegate(); 5169 SyncShareAsDelegate();
4996 5170
4997 // The item ought to have committed successfully. 5171 // The item ought to have committed successfully.
4998 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5172 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4999 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5173 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5000 ExpectSyncedAndCreated(); 5174 ExpectSyncedAndCreated();
5001 EXPECT_EQ(2, Get(metahandle_, BASE_VERSION)); 5175 EXPECT_EQ(2, Get(metahandle_, BASE_VERSION));
5002 5176
5003 // Now, encounter a GetUpdates corresponding to the just-committed 5177 // Now, encounter a GetUpdates corresponding to the just-committed
5004 // update. 5178 // update.
5005 mock_server_->AddUpdateFromLastCommit(); 5179 mock_server_->AddUpdateFromLastCommit();
5006 SyncShareAsDelegate(); 5180 SyncShareAsDelegate();
5007 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5181 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5008 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5182 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5009 ExpectSyncedAndCreated(); 5183 ExpectSyncedAndCreated();
5010 } 5184 }
5011 5185
5012 TEST_F(SyncerUndeletionTest, UndeleteAfterCommitButBeforeGetUpdates) { 5186 TEST_F(SyncerUndeletionTest, UndeleteAfterCommitButBeforeGetUpdates) {
5013 const StatusController& status = session_->status_controller();
5014
5015 Create(); 5187 Create();
5016 ExpectUnsyncedCreation(); 5188 ExpectUnsyncedCreation();
5017 SyncShareAsDelegate(); 5189 SyncShareAsDelegate();
5018 5190
5019 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5191 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5020 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5192 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5021 ExpectSyncedAndCreated(); 5193 ExpectSyncedAndCreated();
5022 5194
5023 // Delete and commit. 5195 // Delete and commit.
5024 Delete(); 5196 Delete();
5025 ExpectUnsyncedDeletion(); 5197 ExpectUnsyncedDeletion();
5026 SyncShareAsDelegate(); 5198 SyncShareAsDelegate();
5027 5199
5028 // The item ought to have committed successfully. 5200 // The item ought to have committed successfully.
5029 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5201 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5030 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5202 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5031 ExpectSyncedAndDeleted(); 5203 ExpectSyncedAndDeleted();
5032 5204
5033 // Before the GetUpdates, the item is locally undeleted. 5205 // Before the GetUpdates, the item is locally undeleted.
5034 Undelete(); 5206 Undelete();
5035 ExpectUnsyncedUndeletion(); 5207 ExpectUnsyncedUndeletion();
5036 5208
5037 // Now, encounter a GetUpdates corresponding to the just-committed 5209 // Now, encounter a GetUpdates corresponding to the just-committed
5038 // deletion update. The undeletion should prevail. 5210 // deletion update. The undeletion should prevail.
5039 mock_server_->AddUpdateFromLastCommit(); 5211 mock_server_->AddUpdateFromLastCommit();
5040 SyncShareAsDelegate(); 5212 SyncShareAsDelegate();
5041 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5213 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5042 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5214 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5043 ExpectSyncedAndCreated(); 5215 ExpectSyncedAndCreated();
5044 } 5216 }
5045 5217
5046 TEST_F(SyncerUndeletionTest, UndeleteAfterDeleteAndGetUpdates) { 5218 TEST_F(SyncerUndeletionTest, UndeleteAfterDeleteAndGetUpdates) {
5047 const StatusController& status = session_->status_controller();
5048
5049 Create(); 5219 Create();
5050 ExpectUnsyncedCreation(); 5220 ExpectUnsyncedCreation();
5051 SyncShareAsDelegate(); 5221 SyncShareAsDelegate();
5052 5222
5053 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5223 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5054 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5224 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5055 ExpectSyncedAndCreated(); 5225 ExpectSyncedAndCreated();
5056 5226
5057 mock_server_->AddUpdateFromLastCommit(); 5227 mock_server_->AddUpdateFromLastCommit();
5058 SyncShareAsDelegate(); 5228 SyncShareAsDelegate();
5059 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5229 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5060 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5230 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5061 ExpectSyncedAndCreated(); 5231 ExpectSyncedAndCreated();
5062 5232
5063 // Delete and commit. 5233 // Delete and commit.
5064 Delete(); 5234 Delete();
5065 ExpectUnsyncedDeletion(); 5235 ExpectUnsyncedDeletion();
5066 SyncShareAsDelegate(); 5236 SyncShareAsDelegate();
5067 5237
5068 // The item ought to have committed successfully. 5238 // The item ought to have committed successfully.
5069 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5239 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5070 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5240 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5071 ExpectSyncedAndDeleted(); 5241 ExpectSyncedAndDeleted();
5072 5242
5073 // Now, encounter a GetUpdates corresponding to the just-committed 5243 // Now, encounter a GetUpdates corresponding to the just-committed
5074 // deletion update. Should be consistent. 5244 // deletion update. Should be consistent.
5075 mock_server_->AddUpdateFromLastCommit(); 5245 mock_server_->AddUpdateFromLastCommit();
5076 SyncShareAsDelegate(); 5246 SyncShareAsDelegate();
5077 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5247 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5078 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5248 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5079 ExpectSyncedAndDeleted(); 5249 ExpectSyncedAndDeleted();
5080 5250
5081 // After the GetUpdates, the item is locally undeleted. 5251 // After the GetUpdates, the item is locally undeleted.
5082 Undelete(); 5252 Undelete();
5083 ExpectUnsyncedUndeletion(); 5253 ExpectUnsyncedUndeletion();
5084 5254
5085 // Now, encounter a GetUpdates corresponding to the just-committed 5255 // Now, encounter a GetUpdates corresponding to the just-committed
5086 // deletion update. The undeletion should prevail. 5256 // deletion update. The undeletion should prevail.
5087 SyncShareAsDelegate(); 5257 SyncShareAsDelegate();
5088 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5258 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5089 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5259 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5090 ExpectSyncedAndCreated(); 5260 ExpectSyncedAndCreated();
5091 } 5261 }
5092 5262
5093 // Test processing of undeletion GetUpdateses. 5263 // Test processing of undeletion GetUpdateses.
5094 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletes) { 5264 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletes) {
5095 const StatusController& status = session_->status_controller();
5096
5097 Create(); 5265 Create();
5098 ExpectUnsyncedCreation(); 5266 ExpectUnsyncedCreation();
5099 SyncShareAsDelegate(); 5267 SyncShareAsDelegate();
5100 5268
5101 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5269 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5102 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5270 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5103 ExpectSyncedAndCreated(); 5271 ExpectSyncedAndCreated();
5104 5272
5105 // Add a delete from the server. 5273 // Add a delete from the server.
5106 mock_server_->AddUpdateFromLastCommit(); 5274 mock_server_->AddUpdateFromLastCommit();
5107 SyncShareAsDelegate(); 5275 SyncShareAsDelegate();
5108 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5276 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5109 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5277 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5110 ExpectSyncedAndCreated(); 5278 ExpectSyncedAndCreated();
5111 5279
5112 // Some other client deletes the item. 5280 // Some other client deletes the item.
5113 mock_server_->AddUpdateTombstone(Get(metahandle_, ID)); 5281 mock_server_->AddUpdateTombstone(Get(metahandle_, ID));
5114 SyncShareAsDelegate(); 5282 SyncShareAsDelegate();
5115 5283
5116 // The update ought to have applied successfully. 5284 // The update ought to have applied successfully.
5117 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5285 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5118 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5286 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5119 ExpectSyncedAndDeleted(); 5287 ExpectSyncedAndDeleted();
5120 5288
5121 // Undelete it locally. 5289 // Undelete it locally.
5122 Undelete(); 5290 Undelete();
5123 ExpectUnsyncedUndeletion(); 5291 ExpectUnsyncedUndeletion();
5124 SyncShareAsDelegate(); 5292 SyncShareAsDelegate();
5125 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5293 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5126 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5294 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5127 ExpectSyncedAndCreated(); 5295 ExpectSyncedAndCreated();
5128 5296
5129 // Now, encounter a GetUpdates corresponding to the just-committed 5297 // Now, encounter a GetUpdates corresponding to the just-committed
5130 // deletion update. The undeletion should prevail. 5298 // deletion update. The undeletion should prevail.
5131 mock_server_->AddUpdateFromLastCommit(); 5299 mock_server_->AddUpdateFromLastCommit();
5132 SyncShareAsDelegate(); 5300 SyncShareAsDelegate();
5133 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5301 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5134 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5302 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5135 ExpectSyncedAndCreated(); 5303 ExpectSyncedAndCreated();
5136 } 5304 }
5137 5305
5138 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletesImmediately) { 5306 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletesImmediately) {
5139 const StatusController& status = session_->status_controller();
5140
5141 Create(); 5307 Create();
5142 ExpectUnsyncedCreation(); 5308 ExpectUnsyncedCreation();
5143 SyncShareAsDelegate(); 5309 SyncShareAsDelegate();
5144 5310
5145 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5311 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5146 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5312 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5147 ExpectSyncedAndCreated(); 5313 ExpectSyncedAndCreated();
5148 5314
5149 // Some other client deletes the item before we get a chance 5315 // Some other client deletes the item before we get a chance
5150 // to GetUpdates our original request. 5316 // to GetUpdates our original request.
5151 mock_server_->AddUpdateTombstone(Get(metahandle_, ID)); 5317 mock_server_->AddUpdateTombstone(Get(metahandle_, ID));
5152 SyncShareAsDelegate(); 5318 SyncShareAsDelegate();
5153 5319
5154 // The update ought to have applied successfully. 5320 // The update ought to have applied successfully.
5155 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5321 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5156 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5322 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5157 ExpectSyncedAndDeleted(); 5323 ExpectSyncedAndDeleted();
5158 5324
5159 // Undelete it locally. 5325 // Undelete it locally.
5160 Undelete(); 5326 Undelete();
5161 ExpectUnsyncedUndeletion(); 5327 ExpectUnsyncedUndeletion();
5162 SyncShareAsDelegate(); 5328 SyncShareAsDelegate();
5163 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5329 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5164 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5330 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5165 ExpectSyncedAndCreated(); 5331 ExpectSyncedAndCreated();
5166 5332
5167 // Now, encounter a GetUpdates corresponding to the just-committed 5333 // Now, encounter a GetUpdates corresponding to the just-committed
5168 // deletion update. The undeletion should prevail. 5334 // deletion update. The undeletion should prevail.
5169 mock_server_->AddUpdateFromLastCommit(); 5335 mock_server_->AddUpdateFromLastCommit();
5170 SyncShareAsDelegate(); 5336 SyncShareAsDelegate();
5171 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5337 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5172 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5338 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5173 ExpectSyncedAndCreated(); 5339 ExpectSyncedAndCreated();
5174 } 5340 }
5175 5341
5176 TEST_F(SyncerUndeletionTest, OtherClientUndeletes) { 5342 TEST_F(SyncerUndeletionTest, OtherClientUndeletes) {
5177 const StatusController& status = session_->status_controller();
5178
5179 Create(); 5343 Create();
5180 ExpectUnsyncedCreation(); 5344 ExpectUnsyncedCreation();
5181 SyncShareAsDelegate(); 5345 SyncShareAsDelegate();
5182 5346
5183 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5347 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5184 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5348 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5185 ExpectSyncedAndCreated(); 5349 ExpectSyncedAndCreated();
5186 5350
5187 // Get the updates of our just-committed entry. 5351 // Get the updates of our just-committed entry.
5188 mock_server_->AddUpdateFromLastCommit(); 5352 mock_server_->AddUpdateFromLastCommit();
5189 SyncShareAsDelegate(); 5353 SyncShareAsDelegate();
5190 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5354 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5191 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5355 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5192 ExpectSyncedAndCreated(); 5356 ExpectSyncedAndCreated();
5193 5357
5194 // We delete the item. 5358 // We delete the item.
5195 Delete(); 5359 Delete();
5196 ExpectUnsyncedDeletion(); 5360 ExpectUnsyncedDeletion();
5197 SyncShareAsDelegate(); 5361 SyncShareAsDelegate();
5198 5362
5199 // The update ought to have applied successfully. 5363 // The update ought to have applied successfully.
5200 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5364 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5201 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5365 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5202 ExpectSyncedAndDeleted(); 5366 ExpectSyncedAndDeleted();
5203 5367
5204 // Now, encounter a GetUpdates corresponding to the just-committed 5368 // Now, encounter a GetUpdates corresponding to the just-committed
5205 // deletion update. 5369 // deletion update.
5206 mock_server_->AddUpdateFromLastCommit(); 5370 mock_server_->AddUpdateFromLastCommit();
5207 SyncShareAsDelegate(); 5371 SyncShareAsDelegate();
5208 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5372 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5209 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5373 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5210 ExpectSyncedAndDeleted(); 5374 ExpectSyncedAndDeleted();
5211 5375
5212 // Some other client undeletes the item. 5376 // Some other client undeletes the item.
5213 mock_server_->AddUpdateBookmark(Get(metahandle_, ID), 5377 mock_server_->AddUpdateBookmark(Get(metahandle_, ID),
5214 Get(metahandle_, PARENT_ID), 5378 Get(metahandle_, PARENT_ID),
5215 "Thadeusz", 100, 1000); 5379 "Thadeusz", 100, 1000);
5216 mock_server_->SetLastUpdateClientTag(client_tag_); 5380 mock_server_->SetLastUpdateClientTag(client_tag_);
5217 SyncShareAsDelegate(); 5381 SyncShareAsDelegate();
5218 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5382 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5219 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5383 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5220 ExpectSyncedAndCreated(); 5384 ExpectSyncedAndCreated();
5221 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME)); 5385 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME));
5222 } 5386 }
5223 5387
5224 TEST_F(SyncerUndeletionTest, OtherClientUndeletesImmediately) { 5388 TEST_F(SyncerUndeletionTest, OtherClientUndeletesImmediately) {
5225 const StatusController& status = session_->status_controller();
5226
5227 Create(); 5389 Create();
5228 ExpectUnsyncedCreation(); 5390 ExpectUnsyncedCreation();
5229 SyncShareAsDelegate(); 5391 SyncShareAsDelegate();
5230 5392
5231 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5393 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5232 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5394 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5233 ExpectSyncedAndCreated(); 5395 ExpectSyncedAndCreated();
5234 5396
5235 // Get the updates of our just-committed entry. 5397 // Get the updates of our just-committed entry.
5236 mock_server_->AddUpdateFromLastCommit(); 5398 mock_server_->AddUpdateFromLastCommit();
5237 SyncShareAsDelegate(); 5399 SyncShareAsDelegate();
5238 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5400 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5239 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5401 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5240 ExpectSyncedAndCreated(); 5402 ExpectSyncedAndCreated();
5241 5403
5242 // We delete the item. 5404 // We delete the item.
5243 Delete(); 5405 Delete();
5244 ExpectUnsyncedDeletion(); 5406 ExpectUnsyncedDeletion();
5245 SyncShareAsDelegate(); 5407 SyncShareAsDelegate();
5246 5408
5247 // The update ought to have applied successfully. 5409 // The update ought to have applied successfully.
5248 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5410 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5249 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5411 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5250 ExpectSyncedAndDeleted(); 5412 ExpectSyncedAndDeleted();
5251 5413
5252 // Some other client undeletes before we see the update from our 5414 // Some other client undeletes before we see the update from our
5253 // commit. 5415 // commit.
5254 mock_server_->AddUpdateBookmark(Get(metahandle_, ID), 5416 mock_server_->AddUpdateBookmark(Get(metahandle_, ID),
5255 Get(metahandle_, PARENT_ID), 5417 Get(metahandle_, PARENT_ID),
5256 "Thadeusz", 100, 1000); 5418 "Thadeusz", 100, 1000);
5257 mock_server_->SetLastUpdateClientTag(client_tag_); 5419 mock_server_->SetLastUpdateClientTag(client_tag_);
5258 SyncShareAsDelegate(); 5420 SyncShareAsDelegate();
5259 EXPECT_EQ(0, status.TotalNumConflictingItems()); 5421 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
5260 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 5422 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
5261 ExpectSyncedAndCreated(); 5423 ExpectSyncedAndCreated();
5262 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME)); 5424 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME));
5263 } 5425 }
5264 5426
5265 // A group of tests exercising the syncer's handling of sibling ordering, as 5427 // A group of tests exercising the syncer's handling of sibling ordering, as
5266 // represented in the sync protocol. 5428 // represented in the sync protocol.
5267 class SyncerPositionUpdateTest : public SyncerTest { 5429 class SyncerPositionUpdateTest : public SyncerTest {
5268 public: 5430 public:
5269 SyncerPositionUpdateTest() : next_update_id_(1), next_revision_(1) {} 5431 SyncerPositionUpdateTest() : next_update_id_(1), next_revision_(1) {}
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
5477 Add(low_id_); 5639 Add(low_id_);
5478 Add(high_id_); 5640 Add(high_id_);
5479 SyncShareAsDelegate(); 5641 SyncShareAsDelegate();
5480 ExpectLocalOrderIsByServerId(); 5642 ExpectLocalOrderIsByServerId();
5481 } 5643 }
5482 5644
5483 const SyncerTest::CommitOrderingTest 5645 const SyncerTest::CommitOrderingTest
5484 SyncerTest::CommitOrderingTest::LAST_COMMIT_ITEM = {-1, TestIdFactory::root()}; 5646 SyncerTest::CommitOrderingTest::LAST_COMMIT_ITEM = {-1, TestIdFactory::root()};
5485 5647
5486 } // namespace browser_sync 5648 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698