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

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

Issue 10006046: Abort sync cycles when download step fails (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rearrange SetSyncerStepsForPurpose Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // 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 14 matching lines...) Expand all
25 #include "build/build_config.h" 25 #include "build/build_config.h"
26 #include "sync/engine/get_commit_ids_command.h" 26 #include "sync/engine/get_commit_ids_command.h"
27 #include "sync/engine/model_safe_worker.h" 27 #include "sync/engine/model_safe_worker.h"
28 #include "sync/engine/net/server_connection_manager.h" 28 #include "sync/engine/net/server_connection_manager.h"
29 #include "sync/engine/nigori_util.h" 29 #include "sync/engine/nigori_util.h"
30 #include "sync/engine/process_updates_command.h" 30 #include "sync/engine/process_updates_command.h"
31 #include "sync/engine/syncer.h" 31 #include "sync/engine/syncer.h"
32 #include "sync/engine/syncer_proto_util.h" 32 #include "sync/engine/syncer_proto_util.h"
33 #include "sync/engine/syncer_util.h" 33 #include "sync/engine/syncer_util.h"
34 #include "sync/engine/syncproto.h" 34 #include "sync/engine/syncproto.h"
35 #include "sync/engine/sync_scheduler.h"
35 #include "sync/protocol/bookmark_specifics.pb.h" 36 #include "sync/protocol/bookmark_specifics.pb.h"
36 #include "sync/protocol/nigori_specifics.pb.h" 37 #include "sync/protocol/nigori_specifics.pb.h"
37 #include "sync/protocol/preference_specifics.pb.h" 38 #include "sync/protocol/preference_specifics.pb.h"
38 #include "sync/protocol/sync.pb.h" 39 #include "sync/protocol/sync.pb.h"
39 #include "sync/sessions/sync_session_context.h" 40 #include "sync/sessions/sync_session_context.h"
40 #include "sync/syncable/model_type.h" 41 #include "sync/syncable/model_type.h"
41 #include "sync/syncable/syncable.h" 42 #include "sync/syncable/syncable.h"
42 #include "sync/test/engine/fake_model_worker.h" 43 #include "sync/test/engine/fake_model_worker.h"
43 #include "sync/test/engine/mock_connection_manager.h" 44 #include "sync/test/engine/mock_connection_manager.h"
44 #include "sync/test/engine/test_directory_setter_upper.h" 45 #include "sync/test/engine/test_directory_setter_upper.h"
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 std::vector<ModelSafeWorker*> workers; 175 std::vector<ModelSafeWorker*> workers;
175 GetModelSafeRoutingInfo(&info); 176 GetModelSafeRoutingInfo(&info);
176 GetWorkers(&workers); 177 GetWorkers(&workers);
177 syncable::ModelTypePayloadMap types = 178 syncable::ModelTypePayloadMap types =
178 syncable::ModelTypePayloadMapFromRoutingInfo(info, std::string()); 179 syncable::ModelTypePayloadMapFromRoutingInfo(info, std::string());
179 return new SyncSession(context_.get(), this, 180 return new SyncSession(context_.get(), this,
180 sessions::SyncSourceInfo(sync_pb::GetUpdatesCallerInfo::UNKNOWN, types), 181 sessions::SyncSourceInfo(sync_pb::GetUpdatesCallerInfo::UNKNOWN, types),
181 info, workers); 182 info, workers);
182 } 183 }
183 184
184 bool SyncShareAsDelegate() { 185 bool SyncShareAsDelegate(
186 SyncScheduler::SyncSessionJob::SyncSessionJobPurpose purpose) {
187 SyncerStep start;
188 SyncerStep end;
189 SyncScheduler::SetSyncerStepsForPurpose(purpose, &start, &end);
190
185 session_.reset(MakeSession()); 191 session_.reset(MakeSession());
186 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); 192 syncer_->SyncShare(session_.get(), start, end);
187 return session_->HasMoreToSync(); 193 return session_->HasMoreToSync();
188 } 194 }
189 195
196 bool SyncShareNudge() {
197 session_.reset(MakeSession());
198 return SyncShareAsDelegate(SyncScheduler::SyncSessionJob::NUDGE);
199 }
200
201 bool SyncShareConfigure() {
202 session_.reset(MakeSession());
203 return SyncShareAsDelegate(SyncScheduler::SyncSessionJob::CONFIGURATION);
204 }
205
190 void LoopSyncShare() { 206 void LoopSyncShare() {
191 bool should_loop = false; 207 bool should_loop = false;
192 int loop_iterations = 0; 208 int loop_iterations = 0;
193 do { 209 do {
194 ASSERT_LT(++loop_iterations, 100) << "infinite loop detected. please fix"; 210 ASSERT_LT(++loop_iterations, 100) << "infinite loop detected. please fix";
195 should_loop = SyncShareAsDelegate(); 211 should_loop = SyncShareNudge();
196 } while (should_loop); 212 } while (should_loop);
197 } 213 }
198 214
199 virtual void SetUp() { 215 virtual void SetUp() {
200 dir_maker_.SetUp(); 216 dir_maker_.SetUp();
201 mock_server_.reset(new MockConnectionManager(directory())); 217 mock_server_.reset(new MockConnectionManager(directory()));
202 EnableDatatype(syncable::BOOKMARKS); 218 EnableDatatype(syncable::BOOKMARKS);
203 EnableDatatype(syncable::NIGORI); 219 EnableDatatype(syncable::NIGORI);
204 EnableDatatype(syncable::PREFERENCES); 220 EnableDatatype(syncable::PREFERENCES);
205 EnableDatatype(syncable::NIGORI); 221 EnableDatatype(syncable::NIGORI);
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 // TODO(sync): When we can dynamically connect and disconnect the mock 544 // TODO(sync): When we can dynamically connect and disconnect the mock
529 // ServerConnectionManager test disconnected GetUnsyncedEntries here. It's a 545 // ServerConnectionManager test disconnected GetUnsyncedEntries here. It's a
530 // regression for a very old bug. 546 // regression for a very old bug.
531 } 547 }
532 548
533 TEST_F(SyncerTest, GetCommitIdsCommandTruncates) { 549 TEST_F(SyncerTest, GetCommitIdsCommandTruncates) {
534 syncable::Id root = ids_.root(); 550 syncable::Id root = ids_.root();
535 // Create two server entries. 551 // Create two server entries.
536 mock_server_->AddUpdateDirectory(ids_.MakeServer("x"), root, "X", 10, 10); 552 mock_server_->AddUpdateDirectory(ids_.MakeServer("x"), root, "X", 10, 10);
537 mock_server_->AddUpdateDirectory(ids_.MakeServer("w"), root, "W", 10, 10); 553 mock_server_->AddUpdateDirectory(ids_.MakeServer("w"), root, "W", 10, 10);
538 SyncShareAsDelegate(); 554 SyncShareNudge();
539 555
540 // Create some new client entries. 556 // Create some new client entries.
541 CreateUnsyncedDirectory("C", ids_.MakeLocal("c")); 557 CreateUnsyncedDirectory("C", ids_.MakeLocal("c"));
542 CreateUnsyncedDirectory("B", ids_.MakeLocal("b")); 558 CreateUnsyncedDirectory("B", ids_.MakeLocal("b"));
543 CreateUnsyncedDirectory("D", ids_.MakeLocal("d")); 559 CreateUnsyncedDirectory("D", ids_.MakeLocal("d"));
544 CreateUnsyncedDirectory("E", ids_.MakeLocal("e")); 560 CreateUnsyncedDirectory("E", ids_.MakeLocal("e"));
545 CreateUnsyncedDirectory("J", ids_.MakeLocal("j")); 561 CreateUnsyncedDirectory("J", ids_.MakeLocal("j"));
546 562
547 { 563 {
548 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 564 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 expected_order.push_back(ids_.MakeLocal("e")); 598 expected_order.push_back(ids_.MakeLocal("e"));
583 DoTruncationTest(unsynced_handle_view, expected_order); 599 DoTruncationTest(unsynced_handle_view, expected_order);
584 } 600 }
585 601
586 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) { 602 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) {
587 const syncable::ModelTypeSet throttled_types(syncable::BOOKMARKS); 603 const syncable::ModelTypeSet throttled_types(syncable::BOOKMARKS);
588 sync_pb::EntitySpecifics bookmark_data; 604 sync_pb::EntitySpecifics bookmark_data;
589 AddDefaultFieldValue(syncable::BOOKMARKS, &bookmark_data); 605 AddDefaultFieldValue(syncable::BOOKMARKS, &bookmark_data);
590 606
591 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 607 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
592 SyncShareAsDelegate(); 608 SyncShareNudge();
593 609
594 { 610 {
595 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 611 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
596 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 612 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
597 ASSERT_TRUE(A.good()); 613 ASSERT_TRUE(A.good());
598 A.Put(IS_UNSYNCED, true); 614 A.Put(IS_UNSYNCED, true);
599 A.Put(SPECIFICS, bookmark_data); 615 A.Put(SPECIFICS, bookmark_data);
600 A.Put(NON_UNIQUE_NAME, "bookmark"); 616 A.Put(NON_UNIQUE_NAME, "bookmark");
601 } 617 }
602 618
603 // Now set the throttled types. 619 // Now set the throttled types.
604 context_->SetUnthrottleTime( 620 context_->SetUnthrottleTime(
605 throttled_types, 621 throttled_types,
606 base::TimeTicks::Now() + base::TimeDelta::FromSeconds(1200)); 622 base::TimeTicks::Now() + base::TimeDelta::FromSeconds(1200));
607 SyncShareAsDelegate(); 623 SyncShareNudge();
608 624
609 { 625 {
610 // Nothing should have been committed as bookmarks is throttled. 626 // Nothing should have been committed as bookmarks is throttled.
611 ReadTransaction rtrans(FROM_HERE, directory()); 627 ReadTransaction rtrans(FROM_HERE, directory());
612 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 628 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1));
613 ASSERT_TRUE(entryA.good()); 629 ASSERT_TRUE(entryA.good());
614 EXPECT_TRUE(entryA.Get(IS_UNSYNCED)); 630 EXPECT_TRUE(entryA.Get(IS_UNSYNCED));
615 } 631 }
616 632
617 // Now unthrottle. 633 // Now unthrottle.
618 context_->SetUnthrottleTime( 634 context_->SetUnthrottleTime(
619 throttled_types, 635 throttled_types,
620 base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1200)); 636 base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1200));
621 SyncShareAsDelegate(); 637 SyncShareNudge();
622 { 638 {
623 // It should have been committed. 639 // It should have been committed.
624 ReadTransaction rtrans(FROM_HERE, directory()); 640 ReadTransaction rtrans(FROM_HERE, directory());
625 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 641 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1));
626 ASSERT_TRUE(entryA.good()); 642 ASSERT_TRUE(entryA.good());
627 EXPECT_FALSE(entryA.Get(IS_UNSYNCED)); 643 EXPECT_FALSE(entryA.Get(IS_UNSYNCED));
628 } 644 }
629 } 645 }
630 646
631 // We use a macro so we can preserve the error location. 647 // We use a macro so we can preserve the error location.
(...skipping 19 matching lines...) Expand all
651 KeyParams key_params = {"localhost", "dummy", "foobar"}; 667 KeyParams key_params = {"localhost", "dummy", "foobar"};
652 KeyParams other_params = {"localhost", "dummy", "foobar2"}; 668 KeyParams other_params = {"localhost", "dummy", "foobar2"};
653 sync_pb::EntitySpecifics bookmark, encrypted_bookmark; 669 sync_pb::EntitySpecifics bookmark, encrypted_bookmark;
654 bookmark.mutable_bookmark()->set_url("url"); 670 bookmark.mutable_bookmark()->set_url("url");
655 bookmark.mutable_bookmark()->set_title("title"); 671 bookmark.mutable_bookmark()->set_title("title");
656 AddDefaultFieldValue(syncable::BOOKMARKS, &encrypted_bookmark); 672 AddDefaultFieldValue(syncable::BOOKMARKS, &encrypted_bookmark);
657 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 673 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
658 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); 674 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10);
659 mock_server_->AddUpdateDirectory(3, 0, "C", 10, 10); 675 mock_server_->AddUpdateDirectory(3, 0, "C", 10, 10);
660 mock_server_->AddUpdateDirectory(4, 0, "D", 10, 10); 676 mock_server_->AddUpdateDirectory(4, 0, "D", 10, 10);
661 SyncShareAsDelegate(); 677 SyncShareNudge();
662 // Server side change will put A in conflict. 678 // Server side change will put A in conflict.
663 mock_server_->AddUpdateDirectory(1, 0, "A", 20, 20); 679 mock_server_->AddUpdateDirectory(1, 0, "A", 20, 20);
664 { 680 {
665 // Mark bookmarks as encrypted and set the cryptographer to have pending 681 // Mark bookmarks as encrypted and set the cryptographer to have pending
666 // keys. 682 // keys.
667 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 683 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
668 browser_sync::Cryptographer other_cryptographer(&encryptor_); 684 browser_sync::Cryptographer other_cryptographer(&encryptor_);
669 other_cryptographer.AddKey(other_params); 685 other_cryptographer.AddKey(other_params);
670 sync_pb::EntitySpecifics specifics; 686 sync_pb::EntitySpecifics specifics;
671 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 687 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
(...skipping 22 matching lines...) Expand all
694 ASSERT_TRUE(C.good()); 710 ASSERT_TRUE(C.good());
695 C.Put(IS_UNSYNCED, true); 711 C.Put(IS_UNSYNCED, true);
696 C.Put(NON_UNIQUE_NAME, kEncryptedString); 712 C.Put(NON_UNIQUE_NAME, kEncryptedString);
697 // Unencrypted non_unique_name. 713 // Unencrypted non_unique_name.
698 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4)); 714 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4));
699 ASSERT_TRUE(D.good()); 715 ASSERT_TRUE(D.good());
700 D.Put(IS_UNSYNCED, true); 716 D.Put(IS_UNSYNCED, true);
701 D.Put(SPECIFICS, encrypted_bookmark); 717 D.Put(SPECIFICS, encrypted_bookmark);
702 D.Put(NON_UNIQUE_NAME, "not encrypted"); 718 D.Put(NON_UNIQUE_NAME, "not encrypted");
703 } 719 }
704 SyncShareAsDelegate(); 720 SyncShareNudge();
705 { 721 {
706 // We remove any unready entries from the status controller's unsynced 722 // We remove any unready entries from the status controller's unsynced
707 // handles, so this should remain 0 even though the entries didn't commit. 723 // handles, so this should remain 0 even though the entries didn't commit.
708 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size()); 724 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
709 // Nothing should have commited due to bookmarks being encrypted and 725 // Nothing should have commited due to bookmarks being encrypted and
710 // the cryptographer having pending keys. A would have been resolved 726 // the cryptographer having pending keys. A would have been resolved
711 // as a simple conflict, but still be unsynced until the next sync cycle. 727 // as a simple conflict, but still be unsynced until the next sync cycle.
712 ReadTransaction rtrans(FROM_HERE, directory()); 728 ReadTransaction rtrans(FROM_HERE, directory());
713 VERIFY_ENTRY(1, false, true, false, 0, 20, 20, ids_, &rtrans); 729 VERIFY_ENTRY(1, false, true, false, 0, 20, 20, ids_, &rtrans);
714 VERIFY_ENTRY(2, false, true, false, 0, 10, 10, ids_, &rtrans); 730 VERIFY_ENTRY(2, false, true, false, 0, 10, 10, ids_, &rtrans);
715 VERIFY_ENTRY(3, false, true, false, 0, 10, 10, ids_, &rtrans); 731 VERIFY_ENTRY(3, false, true, false, 0, 10, 10, ids_, &rtrans);
716 VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans); 732 VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans);
717 733
718 // Resolve the pending keys. 734 // Resolve the pending keys.
719 cryptographer(&rtrans)->DecryptPendingKeys(other_params); 735 cryptographer(&rtrans)->DecryptPendingKeys(other_params);
720 } 736 }
721 SyncShareAsDelegate(); 737 SyncShareNudge();
722 { 738 {
723 // 2 unsynced handles to reflect the items that committed succesfully. 739 // 2 unsynced handles to reflect the items that committed succesfully.
724 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size()); 740 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size());
725 // All properly encrypted and non-conflicting items should commit. "A" was 741 // All properly encrypted and non-conflicting items should commit. "A" was
726 // conflicting, but last sync cycle resolved it as simple conflict, so on 742 // conflicting, but last sync cycle resolved it as simple conflict, so on
727 // this sync cycle it committed succesfullly. 743 // this sync cycle it committed succesfullly.
728 ReadTransaction rtrans(FROM_HERE, directory()); 744 ReadTransaction rtrans(FROM_HERE, directory());
729 // Committed successfully. 745 // Committed successfully.
730 VERIFY_ENTRY(1, false, false, false, 0, 21, 21, ids_, &rtrans); 746 VERIFY_ENTRY(1, false, false, false, 0, 21, 21, ids_, &rtrans);
731 // Committed successfully. 747 // Committed successfully.
732 VERIFY_ENTRY(2, false, false, false, 0, 11, 11, ids_, &rtrans); 748 VERIFY_ENTRY(2, false, false, false, 0, 11, 11, ids_, &rtrans);
733 // Was not properly encrypted. 749 // Was not properly encrypted.
734 VERIFY_ENTRY(3, false, true, false, 0, 10, 10, ids_, &rtrans); 750 VERIFY_ENTRY(3, false, true, false, 0, 10, 10, ids_, &rtrans);
735 // Was not properly encrypted. 751 // Was not properly encrypted.
736 VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans); 752 VERIFY_ENTRY(4, false, true, false, 0, 10, 10, ids_, &rtrans);
737 } 753 }
738 { 754 {
739 // Fix the remaining items. 755 // Fix the remaining items.
740 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 756 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
741 MutableEntry C(&wtrans, GET_BY_ID, ids_.FromNumber(3)); 757 MutableEntry C(&wtrans, GET_BY_ID, ids_.FromNumber(3));
742 ASSERT_TRUE(C.good()); 758 ASSERT_TRUE(C.good());
743 C.Put(SPECIFICS, encrypted_bookmark); 759 C.Put(SPECIFICS, encrypted_bookmark);
744 C.Put(NON_UNIQUE_NAME, kEncryptedString); 760 C.Put(NON_UNIQUE_NAME, kEncryptedString);
745 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4)); 761 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4));
746 ASSERT_TRUE(D.good()); 762 ASSERT_TRUE(D.good());
747 D.Put(SPECIFICS, encrypted_bookmark); 763 D.Put(SPECIFICS, encrypted_bookmark);
748 D.Put(NON_UNIQUE_NAME, kEncryptedString); 764 D.Put(NON_UNIQUE_NAME, kEncryptedString);
749 } 765 }
750 SyncShareAsDelegate(); 766 SyncShareNudge();
751 { 767 {
752 // We attempted to commit two items. 768 // We attempted to commit two items.
753 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size()); 769 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size());
754 EXPECT_TRUE(session_->status_controller().did_commit_items()); 770 EXPECT_TRUE(session_->status_controller().did_commit_items());
755 // None should be unsynced anymore. 771 // None should be unsynced anymore.
756 ReadTransaction rtrans(FROM_HERE, directory()); 772 ReadTransaction rtrans(FROM_HERE, directory());
757 VERIFY_ENTRY(1, false, false, false, 0, 21, 21, ids_, &rtrans); 773 VERIFY_ENTRY(1, false, false, false, 0, 21, 21, ids_, &rtrans);
758 VERIFY_ENTRY(2, false, false, false, 0, 11, 11, ids_, &rtrans); 774 VERIFY_ENTRY(2, false, false, false, 0, 11, 11, ids_, &rtrans);
759 VERIFY_ENTRY(3, false, false, false, 0, 11, 11, ids_, &rtrans); 775 VERIFY_ENTRY(3, false, false, false, 0, 11, 11, ids_, &rtrans);
760 VERIFY_ENTRY(4, false, false, false, 0, 11, 11, ids_, &rtrans); 776 VERIFY_ENTRY(4, false, false, false, 0, 11, 11, ids_, &rtrans);
(...skipping 30 matching lines...) Expand all
791 nigori->set_encrypt_bookmarks(true); 807 nigori->set_encrypt_bookmarks(true);
792 nigori->set_encrypt_preferences(true); 808 nigori->set_encrypt_preferences(true);
793 cryptographer(&wtrans)->Update(*nigori); 809 cryptographer(&wtrans)->Update(*nigori);
794 EXPECT_TRUE(cryptographer(&wtrans)->has_pending_keys()); 810 EXPECT_TRUE(cryptographer(&wtrans)->has_pending_keys());
795 } 811 }
796 812
797 mock_server_->AddUpdateSpecifics(1, 0, "A", 10, 10, true, 0, bookmark); 813 mock_server_->AddUpdateSpecifics(1, 0, "A", 10, 10, true, 0, bookmark);
798 mock_server_->AddUpdateSpecifics(2, 1, "B", 10, 10, false, 2, bookmark); 814 mock_server_->AddUpdateSpecifics(2, 1, "B", 10, 10, false, 2, bookmark);
799 mock_server_->AddUpdateSpecifics(3, 1, "C", 10, 10, false, 1, bookmark); 815 mock_server_->AddUpdateSpecifics(3, 1, "C", 10, 10, false, 1, bookmark);
800 mock_server_->AddUpdateSpecifics(4, 0, "D", 10, 10, false, 0, pref); 816 mock_server_->AddUpdateSpecifics(4, 0, "D", 10, 10, false, 0, pref);
801 SyncShareAsDelegate(); 817 SyncShareNudge();
802 { 818 {
803 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size()); 819 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
804 // Initial state. Everything is normal. 820 // Initial state. Everything is normal.
805 ReadTransaction rtrans(FROM_HERE, directory()); 821 ReadTransaction rtrans(FROM_HERE, directory());
806 VERIFY_ENTRY(1, false, false, false, 0, 10, 10, ids_, &rtrans); 822 VERIFY_ENTRY(1, false, false, false, 0, 10, 10, ids_, &rtrans);
807 VERIFY_ENTRY(2, false, false, false, 1, 10, 10, ids_, &rtrans); 823 VERIFY_ENTRY(2, false, false, false, 1, 10, 10, ids_, &rtrans);
808 VERIFY_ENTRY(3, false, false, false, 1, 10, 10, ids_, &rtrans); 824 VERIFY_ENTRY(3, false, false, false, 1, 10, 10, ids_, &rtrans);
809 VERIFY_ENTRY(4, false, false, false, 0, 10, 10, ids_, &rtrans); 825 VERIFY_ENTRY(4, false, false, false, 0, 10, 10, ids_, &rtrans);
810 } 826 }
811 827
812 // Server side encryption will not be applied due to undecryptable data. 828 // Server side encryption will not be applied due to undecryptable data.
813 // At this point, BASE_SERVER_SPECIFICS should be filled for all four items. 829 // At this point, BASE_SERVER_SPECIFICS should be filled for all four items.
814 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 20, 20, true, 0, 830 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 20, 20, true, 0,
815 encrypted_bookmark); 831 encrypted_bookmark);
816 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 20, 20, false, 2, 832 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 20, 20, false, 2,
817 encrypted_bookmark); 833 encrypted_bookmark);
818 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 20, 20, false, 1, 834 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 20, 20, false, 1,
819 encrypted_bookmark); 835 encrypted_bookmark);
820 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 20, 20, false, 0, 836 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 20, 20, false, 0,
821 encrypted_pref); 837 encrypted_pref);
822 SyncShareAsDelegate(); 838 SyncShareNudge();
823 { 839 {
824 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size()); 840 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
825 // All should be unapplied due to being undecryptable and have a valid 841 // All should be unapplied due to being undecryptable and have a valid
826 // BASE_SERVER_SPECIFICS. 842 // BASE_SERVER_SPECIFICS.
827 ReadTransaction rtrans(FROM_HERE, directory()); 843 ReadTransaction rtrans(FROM_HERE, directory());
828 VERIFY_ENTRY(1, true, false, true, 0, 10, 20, ids_, &rtrans); 844 VERIFY_ENTRY(1, true, false, true, 0, 10, 20, ids_, &rtrans);
829 VERIFY_ENTRY(2, true, false, true, 1, 10, 20, ids_, &rtrans); 845 VERIFY_ENTRY(2, true, false, true, 1, 10, 20, ids_, &rtrans);
830 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans); 846 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans);
831 VERIFY_ENTRY(4, true, false, true, 0, 10, 20, ids_, &rtrans); 847 VERIFY_ENTRY(4, true, false, true, 0, 10, 20, ids_, &rtrans);
832 } 848 }
833 849
834 // Server side change that don't modify anything should not affect 850 // Server side change that don't modify anything should not affect
835 // BASE_SERVER_SPECIFICS (such as name changes and mtime changes). 851 // BASE_SERVER_SPECIFICS (such as name changes and mtime changes).
836 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 30, 30, true, 0, 852 mock_server_->AddUpdateSpecifics(1, 0, kEncryptedString, 30, 30, true, 0,
837 encrypted_bookmark); 853 encrypted_bookmark);
838 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 30, 30, false, 2, 854 mock_server_->AddUpdateSpecifics(2, 1, kEncryptedString, 30, 30, false, 2,
839 encrypted_bookmark); 855 encrypted_bookmark);
840 // Item 3 doesn't change. 856 // Item 3 doesn't change.
841 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 30, 30, false, 0, 857 mock_server_->AddUpdateSpecifics(4, 0, kEncryptedString, 30, 30, false, 0,
842 encrypted_pref); 858 encrypted_pref);
843 SyncShareAsDelegate(); 859 SyncShareNudge();
844 { 860 {
845 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size()); 861 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
846 // Items 1, 2, and 4 should have newer server versions, 3 remains the same. 862 // Items 1, 2, and 4 should have newer server versions, 3 remains the same.
847 // All should remain unapplied due to be undecryptable. 863 // All should remain unapplied due to be undecryptable.
848 ReadTransaction rtrans(FROM_HERE, directory()); 864 ReadTransaction rtrans(FROM_HERE, directory());
849 VERIFY_ENTRY(1, true, false, true, 0, 10, 30, ids_, &rtrans); 865 VERIFY_ENTRY(1, true, false, true, 0, 10, 30, ids_, &rtrans);
850 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans); 866 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans);
851 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans); 867 VERIFY_ENTRY(3, true, false, true, 1, 10, 20, ids_, &rtrans);
852 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans); 868 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans);
853 } 869 }
854 870
855 // Positional changes, parent changes, and specifics changes should reset 871 // Positional changes, parent changes, and specifics changes should reset
856 // BASE_SERVER_SPECIFICS. 872 // BASE_SERVER_SPECIFICS.
857 // Became unencrypted. 873 // Became unencrypted.
858 mock_server_->AddUpdateSpecifics(1, 0, "A", 40, 40, true, 0, bookmark); 874 mock_server_->AddUpdateSpecifics(1, 0, "A", 40, 40, true, 0, bookmark);
859 // Reordered to after item 2. 875 // Reordered to after item 2.
860 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 30, 30, false, 3, 876 mock_server_->AddUpdateSpecifics(3, 1, kEncryptedString, 30, 30, false, 3,
861 encrypted_bookmark); 877 encrypted_bookmark);
862 SyncShareAsDelegate(); 878 SyncShareNudge();
863 { 879 {
864 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size()); 880 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
865 // Items 2 and 4 should be the only ones with BASE_SERVER_SPECIFICS set. 881 // Items 2 and 4 should be the only ones with BASE_SERVER_SPECIFICS set.
866 // Items 1 is now unencrypted, so should have applied normally. 882 // Items 1 is now unencrypted, so should have applied normally.
867 ReadTransaction rtrans(FROM_HERE, directory()); 883 ReadTransaction rtrans(FROM_HERE, directory());
868 VERIFY_ENTRY(1, false, false, false, 0, 40, 40, ids_, &rtrans); 884 VERIFY_ENTRY(1, false, false, false, 0, 40, 40, ids_, &rtrans);
869 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans); 885 VERIFY_ENTRY(2, true, false, true, 1, 10, 30, ids_, &rtrans);
870 VERIFY_ENTRY(3, true, false, false, 1, 10, 30, ids_, &rtrans); 886 VERIFY_ENTRY(3, true, false, false, 1, 10, 30, ids_, &rtrans);
871 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans); 887 VERIFY_ENTRY(4, true, false, true, 0, 10, 30, ids_, &rtrans);
872 } 888 }
(...skipping 15 matching lines...) Expand all
888 ASSERT_TRUE(C.good()); 904 ASSERT_TRUE(C.good());
889 C.Put(SPECIFICS, modified_bookmark); 905 C.Put(SPECIFICS, modified_bookmark);
890 C.Put(NON_UNIQUE_NAME, kEncryptedString); 906 C.Put(NON_UNIQUE_NAME, kEncryptedString);
891 C.Put(IS_UNSYNCED, true); 907 C.Put(IS_UNSYNCED, true);
892 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4)); 908 MutableEntry D(&wtrans, GET_BY_ID, ids_.FromNumber(4));
893 ASSERT_TRUE(D.good()); 909 ASSERT_TRUE(D.good());
894 D.Put(SPECIFICS, modified_pref); 910 D.Put(SPECIFICS, modified_pref);
895 D.Put(NON_UNIQUE_NAME, kEncryptedString); 911 D.Put(NON_UNIQUE_NAME, kEncryptedString);
896 D.Put(IS_UNSYNCED, true); 912 D.Put(IS_UNSYNCED, true);
897 } 913 }
898 SyncShareAsDelegate(); 914 SyncShareNudge();
899 { 915 {
900 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size()); 916 EXPECT_EQ(0U, session_->status_controller().unsynced_handles().size());
901 // Item 1 remains unsynced due to there being pending keys. 917 // Item 1 remains unsynced due to there being pending keys.
902 // Items 2, 3, 4 should remain unsynced since they were not up to date. 918 // Items 2, 3, 4 should remain unsynced since they were not up to date.
903 ReadTransaction rtrans(FROM_HERE, directory()); 919 ReadTransaction rtrans(FROM_HERE, directory());
904 VERIFY_ENTRY(1, false, true, false, 0, 40, 40, ids_, &rtrans); 920 VERIFY_ENTRY(1, false, true, false, 0, 40, 40, ids_, &rtrans);
905 VERIFY_ENTRY(2, true, true, true, 1, 10, 30, ids_, &rtrans); 921 VERIFY_ENTRY(2, true, true, true, 1, 10, 30, ids_, &rtrans);
906 VERIFY_ENTRY(3, true, true, false, 1, 10, 30, ids_, &rtrans); 922 VERIFY_ENTRY(3, true, true, false, 1, 10, 30, ids_, &rtrans);
907 VERIFY_ENTRY(4, true, true, true, 0, 10, 30, ids_, &rtrans); 923 VERIFY_ENTRY(4, true, true, true, 0, 10, 30, ids_, &rtrans);
908 } 924 }
909 925
910 { 926 {
911 ReadTransaction rtrans(FROM_HERE, directory()); 927 ReadTransaction rtrans(FROM_HERE, directory());
912 // Resolve the pending keys. 928 // Resolve the pending keys.
913 cryptographer(&rtrans)->DecryptPendingKeys(key_params); 929 cryptographer(&rtrans)->DecryptPendingKeys(key_params);
914 } 930 }
915 // First cycle resolves conflicts, second cycle commits changes. 931 // First cycle resolves conflicts, second cycle commits changes.
916 SyncShareAsDelegate(); 932 SyncShareNudge();
917 EXPECT_EQ(2, session_->status_controller().syncer_status(). 933 EXPECT_EQ(2, session_->status_controller().syncer_status().
918 num_server_overwrites); 934 num_server_overwrites);
919 EXPECT_EQ(1, session_->status_controller().syncer_status(). 935 EXPECT_EQ(1, session_->status_controller().syncer_status().
920 num_local_overwrites); 936 num_local_overwrites);
921 // We attempted to commit item 1. 937 // We attempted to commit item 1.
922 EXPECT_EQ(1U, session_->status_controller().unsynced_handles().size()); 938 EXPECT_EQ(1U, session_->status_controller().unsynced_handles().size());
923 EXPECT_TRUE(session_->status_controller().did_commit_items()); 939 EXPECT_TRUE(session_->status_controller().did_commit_items());
924 SyncShareAsDelegate(); 940 SyncShareNudge();
925 { 941 {
926 // Everything should be resolved now. The local changes should have 942 // Everything should be resolved now. The local changes should have
927 // overwritten the server changes for 2 and 4, while the server changes 943 // overwritten the server changes for 2 and 4, while the server changes
928 // overwrote the local for entry 3. 944 // overwrote the local for entry 3.
929 // We attempted to commit two handles. 945 // We attempted to commit two handles.
930 EXPECT_EQ(0, session_->status_controller().syncer_status(). 946 EXPECT_EQ(0, session_->status_controller().syncer_status().
931 num_server_overwrites); 947 num_server_overwrites);
932 EXPECT_EQ(0, session_->status_controller().syncer_status(). 948 EXPECT_EQ(0, session_->status_controller().syncer_status().
933 num_local_overwrites); 949 num_local_overwrites);
934 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size()); 950 EXPECT_EQ(2U, session_->status_controller().unsynced_handles().size());
(...skipping 24 matching lines...) Expand all
959 other_encrypted_specifics.mutable_encrypted()); 975 other_encrypted_specifics.mutable_encrypted());
960 sync_pb::EntitySpecifics our_encrypted_specifics; 976 sync_pb::EntitySpecifics our_encrypted_specifics;
961 our_encrypted_specifics.mutable_bookmark()->set_title("title2"); 977 our_encrypted_specifics.mutable_bookmark()->set_title("title2");
962 syncable::ModelTypeSet encrypted_types = syncable::ModelTypeSet::All(); 978 syncable::ModelTypeSet encrypted_types = syncable::ModelTypeSet::All();
963 979
964 980
965 // Receive the initial nigori node. 981 // Receive the initial nigori node.
966 sync_pb::EntitySpecifics initial_nigori_specifics; 982 sync_pb::EntitySpecifics initial_nigori_specifics;
967 initial_nigori_specifics.mutable_nigori(); 983 initial_nigori_specifics.mutable_nigori();
968 mock_server_->SetNigori(1, 10, 10, initial_nigori_specifics); 984 mock_server_->SetNigori(1, 10, 10, initial_nigori_specifics);
969 SyncShareAsDelegate(); 985 SyncShareNudge();
970 986
971 { 987 {
972 // Set up the current nigori node (containing both keys and encrypt 988 // Set up the current nigori node (containing both keys and encrypt
973 // everything). 989 // everything).
974 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 990 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
975 sync_pb::EntitySpecifics specifics; 991 sync_pb::EntitySpecifics specifics;
976 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 992 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
977 cryptographer(&wtrans)->AddKey(old_key); 993 cryptographer(&wtrans)->AddKey(old_key);
978 cryptographer(&wtrans)->AddKey(current_key); 994 cryptographer(&wtrans)->AddKey(current_key);
979 cryptographer(&wtrans)->Encrypt( 995 cryptographer(&wtrans)->Encrypt(
980 our_encrypted_specifics, 996 our_encrypted_specifics,
981 our_encrypted_specifics.mutable_encrypted()); 997 our_encrypted_specifics.mutable_encrypted());
982 cryptographer(&wtrans)->GetKeys( 998 cryptographer(&wtrans)->GetKeys(
983 nigori->mutable_encrypted()); 999 nigori->mutable_encrypted());
984 cryptographer(&wtrans)->set_encrypt_everything(); 1000 cryptographer(&wtrans)->set_encrypt_everything();
985 cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori); 1001 cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori);
986 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG, 1002 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG,
987 syncable::ModelTypeToRootTag(syncable::NIGORI)); 1003 syncable::ModelTypeToRootTag(syncable::NIGORI));
988 ASSERT_TRUE(nigori_entry.good()); 1004 ASSERT_TRUE(nigori_entry.good());
989 nigori_entry.Put(SPECIFICS, specifics); 1005 nigori_entry.Put(SPECIFICS, specifics);
990 nigori_entry.Put(IS_UNSYNCED, true); 1006 nigori_entry.Put(IS_UNSYNCED, true);
991 EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys()); 1007 EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys());
992 EXPECT_TRUE(encrypted_types.Equals( 1008 EXPECT_TRUE(encrypted_types.Equals(
993 cryptographer(&wtrans)->GetEncryptedTypes())); 1009 cryptographer(&wtrans)->GetEncryptedTypes()));
994 } 1010 }
995 1011
996 SyncShareAsDelegate(); // Commit it. 1012 SyncShareNudge(); // Commit it.
997 1013
998 // Now set up the old nigori node and add it as a server update. 1014 // Now set up the old nigori node and add it as a server update.
999 sync_pb::EntitySpecifics old_nigori_specifics; 1015 sync_pb::EntitySpecifics old_nigori_specifics;
1000 sync_pb::NigoriSpecifics *old_nigori = old_nigori_specifics.mutable_nigori(); 1016 sync_pb::NigoriSpecifics *old_nigori = old_nigori_specifics.mutable_nigori();
1001 other_cryptographer.GetKeys(old_nigori->mutable_encrypted()); 1017 other_cryptographer.GetKeys(old_nigori->mutable_encrypted());
1002 other_cryptographer.UpdateNigoriFromEncryptedTypes(old_nigori); 1018 other_cryptographer.UpdateNigoriFromEncryptedTypes(old_nigori);
1003 mock_server_->SetNigori(1, 30, 30, old_nigori_specifics); 1019 mock_server_->SetNigori(1, 30, 30, old_nigori_specifics);
1004 1020
1005 SyncShareAsDelegate(); // Download the old nigori and apply it. 1021 SyncShareNudge(); // Download the old nigori and apply it.
1006 1022
1007 { 1023 {
1008 // Ensure everything is committed and stable now. The cryptographer 1024 // Ensure everything is committed and stable now. The cryptographer
1009 // should be able to decrypt both sets of keys and still be encrypting with 1025 // should be able to decrypt both sets of keys and still be encrypting with
1010 // the newest, and the encrypted types should be the most recent 1026 // the newest, and the encrypted types should be the most recent
1011 ReadTransaction trans(FROM_HERE, directory()); 1027 ReadTransaction trans(FROM_HERE, directory());
1012 Entry nigori_entry(&trans, GET_BY_SERVER_TAG, 1028 Entry nigori_entry(&trans, GET_BY_SERVER_TAG,
1013 syncable::ModelTypeToRootTag(syncable::NIGORI)); 1029 syncable::ModelTypeToRootTag(syncable::NIGORI));
1014 ASSERT_TRUE(nigori_entry.good()); 1030 ASSERT_TRUE(nigori_entry.good());
1015 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE)); 1031 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE));
(...skipping 28 matching lines...) Expand all
1044 // Data for testing encryption/decryption. 1060 // Data for testing encryption/decryption.
1045 sync_pb::EntitySpecifics other_encrypted_specifics; 1061 sync_pb::EntitySpecifics other_encrypted_specifics;
1046 other_encrypted_specifics.mutable_bookmark()->set_title("title"); 1062 other_encrypted_specifics.mutable_bookmark()->set_title("title");
1047 other_cryptographer.Encrypt( 1063 other_cryptographer.Encrypt(
1048 other_encrypted_specifics, 1064 other_encrypted_specifics,
1049 other_encrypted_specifics.mutable_encrypted()); 1065 other_encrypted_specifics.mutable_encrypted());
1050 sync_pb::EntitySpecifics our_encrypted_specifics; 1066 sync_pb::EntitySpecifics our_encrypted_specifics;
1051 our_encrypted_specifics.mutable_bookmark()->set_title("title2"); 1067 our_encrypted_specifics.mutable_bookmark()->set_title("title2");
1052 1068
1053 // Receive the initial nigori node. 1069 // Receive the initial nigori node.
1054 SyncShareAsDelegate(); 1070 SyncShareNudge();
1055 encrypted_types = syncable::ModelTypeSet::All(); 1071 encrypted_types = syncable::ModelTypeSet::All();
1056 { 1072 {
1057 // Local changes with different passphrase, different types, and sync_tabs. 1073 // Local changes with different passphrase, different types, and sync_tabs.
1058 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1074 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1059 sync_pb::EntitySpecifics specifics; 1075 sync_pb::EntitySpecifics specifics;
1060 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 1076 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
1061 cryptographer(&wtrans)->AddKey(local_key_params); 1077 cryptographer(&wtrans)->AddKey(local_key_params);
1062 cryptographer(&wtrans)->Encrypt( 1078 cryptographer(&wtrans)->Encrypt(
1063 our_encrypted_specifics, 1079 our_encrypted_specifics,
1064 our_encrypted_specifics.mutable_encrypted()); 1080 our_encrypted_specifics.mutable_encrypted());
(...skipping 20 matching lines...) Expand all
1085 nigori->set_encrypt_everything(false); 1101 nigori->set_encrypt_everything(false);
1086 nigori->set_using_explicit_passphrase(true); 1102 nigori->set_using_explicit_passphrase(true);
1087 mock_server_->SetNigori(1, 20, 20, specifics); 1103 mock_server_->SetNigori(1, 20, 20, specifics);
1088 } 1104 }
1089 1105
1090 // Will result in downloading the server nigori, which puts the local nigori 1106 // Will result in downloading the server nigori, which puts the local nigori
1091 // in a state of conflict. This is resolved by merging the local and server 1107 // in a state of conflict. This is resolved by merging the local and server
1092 // data (with priority given to the server's encryption keys if they are 1108 // data (with priority given to the server's encryption keys if they are
1093 // undecryptable), which we then commit. The cryptographer should have pending 1109 // undecryptable), which we then commit. The cryptographer should have pending
1094 // keys and merge the set of encrypted types. 1110 // keys and merge the set of encrypted types.
1095 SyncShareAsDelegate(); // Resolve conflict in this cycle. 1111 SyncShareNudge(); // Resolve conflict in this cycle.
1096 SyncShareAsDelegate(); // Commit local change in this cycle. 1112 SyncShareNudge(); // Commit local change in this cycle.
1097 { 1113 {
1098 // Ensure the nigori data merged (encrypted types, sync_tabs). 1114 // Ensure the nigori data merged (encrypted types, sync_tabs).
1099 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1115 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1100 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG, 1116 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG,
1101 syncable::ModelTypeToRootTag(syncable::NIGORI)); 1117 syncable::ModelTypeToRootTag(syncable::NIGORI));
1102 ASSERT_TRUE(nigori_entry.good()); 1118 ASSERT_TRUE(nigori_entry.good());
1103 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE)); 1119 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE));
1104 EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED)); 1120 EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED));
1105 sync_pb::EntitySpecifics specifics = nigori_entry.Get(SPECIFICS); 1121 sync_pb::EntitySpecifics specifics = nigori_entry.Get(SPECIFICS);
1106 EXPECT_TRUE(cryptographer(&wtrans)->has_pending_keys()); 1122 EXPECT_TRUE(cryptographer(&wtrans)->has_pending_keys());
1107 EXPECT_TRUE(encrypted_types.Equals( 1123 EXPECT_TRUE(encrypted_types.Equals(
1108 cryptographer(&wtrans)->GetEncryptedTypes())); 1124 cryptographer(&wtrans)->GetEncryptedTypes()));
1109 EXPECT_TRUE(cryptographer(&wtrans)->encrypt_everything()); 1125 EXPECT_TRUE(cryptographer(&wtrans)->encrypt_everything());
1110 EXPECT_TRUE(specifics.nigori().sync_tabs()); 1126 EXPECT_TRUE(specifics.nigori().sync_tabs());
1111 EXPECT_TRUE(specifics.nigori().using_explicit_passphrase()); 1127 EXPECT_TRUE(specifics.nigori().using_explicit_passphrase());
1112 // Supply the pending keys. Afterwards, we should be able to decrypt both 1128 // Supply the pending keys. Afterwards, we should be able to decrypt both
1113 // our own encrypted data and data encrypted by the other cryptographer, 1129 // our own encrypted data and data encrypted by the other cryptographer,
1114 // but the key provided by the other cryptographer should be the default. 1130 // but the key provided by the other cryptographer should be the default.
1115 EXPECT_TRUE(cryptographer(&wtrans)->DecryptPendingKeys(other_key_params)); 1131 EXPECT_TRUE(cryptographer(&wtrans)->DecryptPendingKeys(other_key_params));
1116 EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys()); 1132 EXPECT_FALSE(cryptographer(&wtrans)->has_pending_keys());
1117 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 1133 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
1118 cryptographer(&wtrans)->GetKeys(nigori->mutable_encrypted()); 1134 cryptographer(&wtrans)->GetKeys(nigori->mutable_encrypted());
1119 cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori); 1135 cryptographer(&wtrans)->UpdateNigoriFromEncryptedTypes(nigori);
1120 // Normally this would be written as part of SetPassphrase, but we do it 1136 // Normally this would be written as part of SetPassphrase, but we do it
1121 // manually for the test. 1137 // manually for the test.
1122 nigori_entry.Put(SPECIFICS, specifics); 1138 nigori_entry.Put(SPECIFICS, specifics);
1123 nigori_entry.Put(IS_UNSYNCED, true); 1139 nigori_entry.Put(IS_UNSYNCED, true);
1124 } 1140 }
1125 1141
1126 SyncShareAsDelegate(); 1142 SyncShareNudge();
1127 { 1143 {
1128 // Ensure everything is committed and stable now. The cryptographer 1144 // Ensure everything is committed and stable now. The cryptographer
1129 // should be able to decrypt both sets of keys, sync_tabs should be true, 1145 // should be able to decrypt both sets of keys, sync_tabs should be true,
1130 // and the encrypted types should have been unioned. 1146 // and the encrypted types should have been unioned.
1131 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 1147 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
1132 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG, 1148 MutableEntry nigori_entry(&wtrans, GET_BY_SERVER_TAG,
1133 syncable::ModelTypeToRootTag(syncable::NIGORI)); 1149 syncable::ModelTypeToRootTag(syncable::NIGORI));
1134 ASSERT_TRUE(nigori_entry.good()); 1150 ASSERT_TRUE(nigori_entry.good());
1135 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE)); 1151 EXPECT_FALSE(nigori_entry.Get(IS_UNAPPLIED_UPDATE));
1136 EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED)); 1152 EXPECT_FALSE(nigori_entry.Get(IS_UNSYNCED));
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 EXPECT_TRUE(entry_b.Get(syncable::ID).ServerKnows()); 1721 EXPECT_TRUE(entry_b.Get(syncable::ID).ServerKnows());
1706 EXPECT_TRUE(parent2.Get(syncable::ID) == entry_b.Get(syncable::PARENT_ID)); 1722 EXPECT_TRUE(parent2.Get(syncable::ID) == entry_b.Get(syncable::PARENT_ID));
1707 } 1723 }
1708 } 1724 }
1709 1725
1710 TEST_F(SyncerTest, UpdateWithZeroLengthName) { 1726 TEST_F(SyncerTest, UpdateWithZeroLengthName) {
1711 // One illegal update 1727 // One illegal update
1712 mock_server_->AddUpdateDirectory(1, 0, "", 1, 10); 1728 mock_server_->AddUpdateDirectory(1, 0, "", 1, 10);
1713 // And one legal one that we're going to delete. 1729 // And one legal one that we're going to delete.
1714 mock_server_->AddUpdateDirectory(2, 0, "FOO", 1, 10); 1730 mock_server_->AddUpdateDirectory(2, 0, "FOO", 1, 10);
1715 SyncShareAsDelegate(); 1731 SyncShareNudge();
1716 // Delete the legal one. The new update has a null name. 1732 // Delete the legal one. The new update has a null name.
1717 mock_server_->AddUpdateDirectory(2, 0, "", 2, 20); 1733 mock_server_->AddUpdateDirectory(2, 0, "", 2, 20);
1718 mock_server_->SetLastUpdateDeleted(); 1734 mock_server_->SetLastUpdateDeleted();
1719 SyncShareAsDelegate(); 1735 SyncShareNudge();
1720 } 1736 }
1721 1737
1722 TEST_F(SyncerTest, TestBasicUpdate) { 1738 TEST_F(SyncerTest, TestBasicUpdate) {
1723 string id = "some_id"; 1739 string id = "some_id";
1724 string parent_id = "0"; 1740 string parent_id = "0";
1725 string name = "in_root"; 1741 string name = "in_root";
1726 int64 version = 10; 1742 int64 version = 10;
1727 int64 timestamp = 10; 1743 int64 timestamp = 10;
1728 mock_server_->AddUpdateDirectory(id, parent_id, name, version, timestamp); 1744 mock_server_->AddUpdateDirectory(id, parent_id, name, version, timestamp);
1729 1745
1730 SyncShareAsDelegate(); 1746 SyncShareNudge();
1731 { 1747 {
1732 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 1748 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
1733 Entry entry(&trans, GET_BY_ID, 1749 Entry entry(&trans, GET_BY_ID,
1734 syncable::Id::CreateFromServerId("some_id")); 1750 syncable::Id::CreateFromServerId("some_id"));
1735 ASSERT_TRUE(entry.good()); 1751 ASSERT_TRUE(entry.good());
1736 EXPECT_TRUE(entry.Get(IS_DIR)); 1752 EXPECT_TRUE(entry.Get(IS_DIR));
1737 EXPECT_TRUE(entry.Get(SERVER_VERSION) == version); 1753 EXPECT_TRUE(entry.Get(SERVER_VERSION) == version);
1738 EXPECT_TRUE(entry.Get(BASE_VERSION) == version); 1754 EXPECT_TRUE(entry.Get(BASE_VERSION) == version);
1739 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 1755 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
1740 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 1756 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1898 1914
1899 MutableEntry entry(&trans, CREATE, parent.Get(ID), "new_entry"); 1915 MutableEntry entry(&trans, CREATE, parent.Get(ID), "new_entry");
1900 ASSERT_TRUE(entry.good()); 1916 ASSERT_TRUE(entry.good());
1901 metahandle_new_entry = entry.Get(META_HANDLE); 1917 metahandle_new_entry = entry.Get(META_HANDLE);
1902 WriteTestDataToEntry(&trans, &entry); 1918 WriteTestDataToEntry(&trans, &entry);
1903 } 1919 }
1904 1920
1905 // Mix in a directory creation too for later. 1921 // Mix in a directory creation too for later.
1906 mock_server_->AddUpdateDirectory(2, 0, "dir_in_root", 10, 10); 1922 mock_server_->AddUpdateDirectory(2, 0, "dir_in_root", 10, 10);
1907 mock_server_->SetCommitTimeRename("renamed_"); 1923 mock_server_->SetCommitTimeRename("renamed_");
1908 SyncShareAsDelegate(); 1924 SyncShareNudge();
1909 1925
1910 // Verify it was correctly renamed. 1926 // Verify it was correctly renamed.
1911 { 1927 {
1912 ReadTransaction trans(FROM_HERE, directory()); 1928 ReadTransaction trans(FROM_HERE, directory());
1913 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle_folder); 1929 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle_folder);
1914 ASSERT_TRUE(entry_folder.good()); 1930 ASSERT_TRUE(entry_folder.good());
1915 EXPECT_EQ("renamed_Folder", entry_folder.Get(NON_UNIQUE_NAME)); 1931 EXPECT_EQ("renamed_Folder", entry_folder.Get(NON_UNIQUE_NAME));
1916 1932
1917 Entry entry_new(&trans, GET_BY_HANDLE, metahandle_new_entry); 1933 Entry entry_new(&trans, GET_BY_HANDLE, metahandle_new_entry);
1918 ASSERT_TRUE(entry_new.good()); 1934 ASSERT_TRUE(entry_new.good());
(...skipping 20 matching lines...) Expand all
1939 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 1955 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
1940 MutableEntry parent(&trans, CREATE, root_id_, "Folder"); 1956 MutableEntry parent(&trans, CREATE, root_id_, "Folder");
1941 ASSERT_TRUE(parent.good()); 1957 ASSERT_TRUE(parent.good());
1942 parent.Put(IS_DIR, true); 1958 parent.Put(IS_DIR, true);
1943 parent.Put(SPECIFICS, DefaultBookmarkSpecifics()); 1959 parent.Put(SPECIFICS, DefaultBookmarkSpecifics());
1944 parent.Put(IS_UNSYNCED, true); 1960 parent.Put(IS_UNSYNCED, true);
1945 metahandle = parent.Get(META_HANDLE); 1961 metahandle = parent.Get(META_HANDLE);
1946 } 1962 }
1947 1963
1948 mock_server_->SetCommitTimeRename(i18nString); 1964 mock_server_->SetCommitTimeRename(i18nString);
1949 SyncShareAsDelegate(); 1965 SyncShareNudge();
1950 1966
1951 // Verify it was correctly renamed. 1967 // Verify it was correctly renamed.
1952 { 1968 {
1953 ReadTransaction trans(FROM_HERE, directory()); 1969 ReadTransaction trans(FROM_HERE, directory());
1954 string expected_folder_name(i18nString); 1970 string expected_folder_name(i18nString);
1955 expected_folder_name.append("Folder"); 1971 expected_folder_name.append("Folder");
1956 1972
1957 1973
1958 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle); 1974 Entry entry_folder(&trans, GET_BY_HANDLE, metahandle);
1959 ASSERT_TRUE(entry_folder.good()); 1975 ASSERT_TRUE(entry_folder.good());
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2019 // well as reassociate the id. 2035 // well as reassociate the id.
2020 mock_server_->AddUpdateDirectory(new_folder_id, root_id_, 2036 mock_server_->AddUpdateDirectory(new_folder_id, root_id_,
2021 "new_folder", new_version, timestamp); 2037 "new_folder", new_version, timestamp);
2022 mock_server_->SetLastUpdateOriginatorFields( 2038 mock_server_->SetLastUpdateOriginatorFields(
2023 directory()->cache_guid(), folder_id.GetServerId()); 2039 directory()->cache_guid(), folder_id.GetServerId());
2024 2040
2025 // We don't want it accidentally committed, just the update applied. 2041 // We don't want it accidentally committed, just the update applied.
2026 mock_server_->set_conflict_all_commits(true); 2042 mock_server_->set_conflict_all_commits(true);
2027 2043
2028 // Alright! Apply that update! 2044 // Alright! Apply that update!
2029 SyncShareAsDelegate(); 2045 SyncShareNudge();
2030 { 2046 {
2031 // The folder's ID should have been updated. 2047 // The folder's ID should have been updated.
2032 ReadTransaction trans(FROM_HERE, directory()); 2048 ReadTransaction trans(FROM_HERE, directory());
2033 Entry folder(&trans, GET_BY_HANDLE, metahandle_folder); 2049 Entry folder(&trans, GET_BY_HANDLE, metahandle_folder);
2034 ASSERT_TRUE(folder.good()); 2050 ASSERT_TRUE(folder.good());
2035 EXPECT_EQ("new_folder", folder.Get(NON_UNIQUE_NAME)); 2051 EXPECT_EQ("new_folder", folder.Get(NON_UNIQUE_NAME));
2036 EXPECT_TRUE(new_version == folder.Get(BASE_VERSION)); 2052 EXPECT_TRUE(new_version == folder.Get(BASE_VERSION));
2037 EXPECT_TRUE(new_folder_id == folder.Get(ID)); 2053 EXPECT_TRUE(new_folder_id == folder.Get(ID));
2038 EXPECT_TRUE(folder.Get(ID).ServerKnows()); 2054 EXPECT_TRUE(folder.Get(ID).ServerKnows());
2039 EXPECT_EQ(trans.root_id(), folder.Get(PARENT_ID)); 2055 EXPECT_EQ(trans.root_id(), folder.Get(PARENT_ID));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2085 // Generate an update from the server with a relevant ID reassignment. 2101 // Generate an update from the server with a relevant ID reassignment.
2086 mock_server_->AddUpdateBookmark(new_entry_id, root_id_, 2102 mock_server_->AddUpdateBookmark(new_entry_id, root_id_,
2087 "new_entry", new_version, timestamp); 2103 "new_entry", new_version, timestamp);
2088 mock_server_->SetLastUpdateOriginatorFields( 2104 mock_server_->SetLastUpdateOriginatorFields(
2089 directory()->cache_guid(), entry_id.GetServerId()); 2105 directory()->cache_guid(), entry_id.GetServerId());
2090 2106
2091 // We don't want it accidentally committed, just the update applied. 2107 // We don't want it accidentally committed, just the update applied.
2092 mock_server_->set_conflict_all_commits(true); 2108 mock_server_->set_conflict_all_commits(true);
2093 2109
2094 // Alright! Apply that update! 2110 // Alright! Apply that update!
2095 SyncShareAsDelegate(); 2111 SyncShareNudge();
2096 { 2112 {
2097 ReadTransaction trans(FROM_HERE, directory()); 2113 ReadTransaction trans(FROM_HERE, directory());
2098 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle); 2114 Entry entry(&trans, GET_BY_HANDLE, entry_metahandle);
2099 ASSERT_TRUE(entry.good()); 2115 ASSERT_TRUE(entry.good());
2100 EXPECT_TRUE(new_version == entry.Get(BASE_VERSION)); 2116 EXPECT_TRUE(new_version == entry.Get(BASE_VERSION));
2101 EXPECT_TRUE(new_entry_id == entry.Get(ID)); 2117 EXPECT_TRUE(new_entry_id == entry.Get(ID));
2102 EXPECT_EQ("new_entry", entry.Get(NON_UNIQUE_NAME)); 2118 EXPECT_EQ("new_entry", entry.Get(NON_UNIQUE_NAME));
2103 } 2119 }
2104 } 2120 }
2105 2121
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 { 2164 {
2149 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2165 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2150 Id new_entry_id = GetOnlyEntryWithName( 2166 Id new_entry_id = GetOnlyEntryWithName(
2151 &trans, trans.root_id(), "new_entry"); 2167 &trans, trans.root_id(), "new_entry");
2152 MutableEntry entry(&trans, GET_BY_ID, new_entry_id); 2168 MutableEntry entry(&trans, GET_BY_ID, new_entry_id);
2153 ASSERT_TRUE(entry.good()); 2169 ASSERT_TRUE(entry.good());
2154 entry.Put(syncable::IS_DEL, true); 2170 entry.Put(syncable::IS_DEL, true);
2155 } 2171 }
2156 2172
2157 // Just don't CHECK fail in sync, have the update split. 2173 // Just don't CHECK fail in sync, have the update split.
2158 SyncShareAsDelegate(); 2174 SyncShareNudge();
2159 { 2175 {
2160 ReadTransaction trans(FROM_HERE, directory()); 2176 ReadTransaction trans(FROM_HERE, directory());
2161 Id new_entry_id = GetOnlyEntryWithName( 2177 Id new_entry_id = GetOnlyEntryWithName(
2162 &trans, trans.root_id(), "new_entry"); 2178 &trans, trans.root_id(), "new_entry");
2163 Entry entry(&trans, GET_BY_ID, new_entry_id); 2179 Entry entry(&trans, GET_BY_ID, new_entry_id);
2164 ASSERT_TRUE(entry.good()); 2180 ASSERT_TRUE(entry.good());
2165 EXPECT_FALSE(entry.Get(IS_DEL)); 2181 EXPECT_FALSE(entry.Get(IS_DEL));
2166 2182
2167 Entry old_entry(&trans, GET_BY_ID, entry_id); 2183 Entry old_entry(&trans, GET_BY_ID, entry_id);
2168 ASSERT_TRUE(old_entry.good()); 2184 ASSERT_TRUE(old_entry.good());
2169 EXPECT_TRUE(old_entry.Get(IS_DEL)); 2185 EXPECT_TRUE(old_entry.Get(IS_DEL));
2170 } 2186 }
2171 } 2187 }
2172 2188
2173 // TODO(chron): Add more unsanitized name tests. 2189 // TODO(chron): Add more unsanitized name tests.
2174 TEST_F(SyncerTest, ConflictMatchingEntryHandlesUnsanitizedNames) { 2190 TEST_F(SyncerTest, ConflictMatchingEntryHandlesUnsanitizedNames) {
2175 mock_server_->AddUpdateDirectory(1, 0, "A/A", 10, 10); 2191 mock_server_->AddUpdateDirectory(1, 0, "A/A", 10, 10);
2176 mock_server_->AddUpdateDirectory(2, 0, "B/B", 10, 10); 2192 mock_server_->AddUpdateDirectory(2, 0, "B/B", 10, 10);
2177 mock_server_->set_conflict_all_commits(true); 2193 mock_server_->set_conflict_all_commits(true);
2178 SyncShareAsDelegate(); 2194 SyncShareNudge();
2179 { 2195 {
2180 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2196 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2181 2197
2182 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2198 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2183 ASSERT_TRUE(A.good()); 2199 ASSERT_TRUE(A.good());
2184 A.Put(IS_UNSYNCED, true); 2200 A.Put(IS_UNSYNCED, true);
2185 A.Put(IS_UNAPPLIED_UPDATE, true); 2201 A.Put(IS_UNAPPLIED_UPDATE, true);
2186 A.Put(SERVER_VERSION, 20); 2202 A.Put(SERVER_VERSION, 20);
2187 2203
2188 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 2204 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
(...skipping 19 matching lines...) Expand all
2208 EXPECT_TRUE(B.Get(IS_UNSYNCED) == false); 2224 EXPECT_TRUE(B.Get(IS_UNSYNCED) == false);
2209 EXPECT_TRUE(B.Get(IS_UNAPPLIED_UPDATE) == false); 2225 EXPECT_TRUE(B.Get(IS_UNAPPLIED_UPDATE) == false);
2210 EXPECT_TRUE(B.Get(SERVER_VERSION) == 20); 2226 EXPECT_TRUE(B.Get(SERVER_VERSION) == 20);
2211 } 2227 }
2212 } 2228 }
2213 2229
2214 TEST_F(SyncerTest, ConflictMatchingEntryHandlesNormalNames) { 2230 TEST_F(SyncerTest, ConflictMatchingEntryHandlesNormalNames) {
2215 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 2231 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
2216 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); 2232 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10);
2217 mock_server_->set_conflict_all_commits(true); 2233 mock_server_->set_conflict_all_commits(true);
2218 SyncShareAsDelegate(); 2234 SyncShareNudge();
2219 { 2235 {
2220 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2236 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2221 2237
2222 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2238 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2223 ASSERT_TRUE(A.good()); 2239 ASSERT_TRUE(A.good());
2224 A.Put(IS_UNSYNCED, true); 2240 A.Put(IS_UNSYNCED, true);
2225 A.Put(IS_UNAPPLIED_UPDATE, true); 2241 A.Put(IS_UNAPPLIED_UPDATE, true);
2226 A.Put(SERVER_VERSION, 20); 2242 A.Put(SERVER_VERSION, 20);
2227 2243
2228 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 2244 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2312 Id child_id = 2328 Id child_id =
2313 GetOnlyEntryWithName(&trans, parent_entry.Get(ID), "bob"); 2329 GetOnlyEntryWithName(&trans, parent_entry.Get(ID), "bob");
2314 Entry child(&trans, syncable::GET_BY_ID, child_id); 2330 Entry child(&trans, syncable::GET_BY_ID, child_id);
2315 ASSERT_TRUE(child.good()); 2331 ASSERT_TRUE(child.good());
2316 EXPECT_EQ(parent_entry.Get(ID), child.Get(PARENT_ID)); 2332 EXPECT_EQ(parent_entry.Get(ID), child.Get(PARENT_ID));
2317 } 2333 }
2318 } 2334 }
2319 2335
2320 TEST_F(SyncerTest, NegativeIDInUpdate) { 2336 TEST_F(SyncerTest, NegativeIDInUpdate) {
2321 mock_server_->AddUpdateBookmark(-10, 0, "bad", 40, 40); 2337 mock_server_->AddUpdateBookmark(-10, 0, "bad", 40, 40);
2322 SyncShareAsDelegate(); 2338 SyncShareNudge();
2323 // The negative id would make us CHECK! 2339 // The negative id would make us CHECK!
2324 } 2340 }
2325 2341
2326 TEST_F(SyncerTest, UnappliedUpdateOnCreatedItemItemDoesNotCrash) { 2342 TEST_F(SyncerTest, UnappliedUpdateOnCreatedItemItemDoesNotCrash) {
2327 int64 metahandle_fred; 2343 int64 metahandle_fred;
2328 { 2344 {
2329 // Create an item. 2345 // Create an item.
2330 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2346 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2331 MutableEntry fred_match(&trans, CREATE, trans.root_id(), 2347 MutableEntry fred_match(&trans, CREATE, trans.root_id(),
2332 "fred_match"); 2348 "fred_match");
2333 ASSERT_TRUE(fred_match.good()); 2349 ASSERT_TRUE(fred_match.good());
2334 metahandle_fred = fred_match.Get(META_HANDLE); 2350 metahandle_fred = fred_match.Get(META_HANDLE);
2335 WriteTestDataToEntry(&trans, &fred_match); 2351 WriteTestDataToEntry(&trans, &fred_match);
2336 } 2352 }
2337 // Commit it. 2353 // Commit it.
2338 SyncShareAsDelegate(); 2354 SyncShareNudge();
2339 EXPECT_EQ(1u, mock_server_->committed_ids().size()); 2355 EXPECT_EQ(1u, mock_server_->committed_ids().size());
2340 mock_server_->set_conflict_all_commits(true); 2356 mock_server_->set_conflict_all_commits(true);
2341 syncable::Id fred_match_id; 2357 syncable::Id fred_match_id;
2342 { 2358 {
2343 // Now receive a change from outside. 2359 // Now receive a change from outside.
2344 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2360 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2345 MutableEntry fred_match(&trans, GET_BY_HANDLE, metahandle_fred); 2361 MutableEntry fred_match(&trans, GET_BY_HANDLE, metahandle_fred);
2346 ASSERT_TRUE(fred_match.good()); 2362 ASSERT_TRUE(fred_match.good());
2347 EXPECT_TRUE(fred_match.Get(ID).ServerKnows()); 2363 EXPECT_TRUE(fred_match.Get(ID).ServerKnows());
2348 fred_match_id = fred_match.Get(ID); 2364 fred_match_id = fred_match.Get(ID);
2349 mock_server_->AddUpdateBookmark(fred_match_id, trans.root_id(), 2365 mock_server_->AddUpdateBookmark(fred_match_id, trans.root_id(),
2350 "fred_match", 40, 40); 2366 "fred_match", 40, 40);
2351 } 2367 }
2352 // Run the syncer. 2368 // Run the syncer.
2353 for (int i = 0 ; i < 30 ; ++i) { 2369 for (int i = 0 ; i < 30 ; ++i) {
2354 SyncShareAsDelegate(); 2370 SyncShareNudge();
2355 } 2371 }
2356 } 2372 }
2357 2373
2358 /** 2374 /**
2359 * In the event that we have a double changed entry, that is changed on both 2375 * In the event that we have a double changed entry, that is changed on both
2360 * the client and the server, the conflict resolver should just drop one of 2376 * the client and the server, the conflict resolver should just drop one of
2361 * them and accept the other. 2377 * them and accept the other.
2362 */ 2378 */
2363 2379
2364 TEST_F(SyncerTest, DoublyChangedWithResolver) { 2380 TEST_F(SyncerTest, DoublyChangedWithResolver) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2407 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2423 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2408 MutableEntry entry(&wtrans, syncable::CREATE, root_id_, "Pete"); 2424 MutableEntry entry(&wtrans, syncable::CREATE, root_id_, "Pete");
2409 ASSERT_TRUE(entry.good()); 2425 ASSERT_TRUE(entry.good());
2410 EXPECT_FALSE(entry.Get(ID).ServerKnows()); 2426 EXPECT_FALSE(entry.Get(ID).ServerKnows());
2411 entry.Put(syncable::IS_DIR, true); 2427 entry.Put(syncable::IS_DIR, true);
2412 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); 2428 entry.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics());
2413 entry.Put(syncable::IS_UNSYNCED, true); 2429 entry.Put(syncable::IS_UNSYNCED, true);
2414 entry.Put(syncable::MTIME, test_time); 2430 entry.Put(syncable::MTIME, test_time);
2415 entry_metahandle = entry.Get(META_HANDLE); 2431 entry_metahandle = entry.Get(META_HANDLE);
2416 } 2432 }
2417 SyncShareAsDelegate(); 2433 SyncShareNudge();
2418 syncable::Id id; 2434 syncable::Id id;
2419 int64 version; 2435 int64 version;
2420 int64 server_position_in_parent; 2436 int64 server_position_in_parent;
2421 { 2437 {
2422 ReadTransaction trans(FROM_HERE, directory()); 2438 ReadTransaction trans(FROM_HERE, directory());
2423 Entry entry(&trans, syncable::GET_BY_HANDLE, entry_metahandle); 2439 Entry entry(&trans, syncable::GET_BY_HANDLE, entry_metahandle);
2424 ASSERT_TRUE(entry.good()); 2440 ASSERT_TRUE(entry.good());
2425 id = entry.Get(ID); 2441 id = entry.Get(ID);
2426 EXPECT_TRUE(id.ServerKnows()); 2442 EXPECT_TRUE(id.ServerKnows());
2427 version = entry.Get(BASE_VERSION); 2443 version = entry.Get(BASE_VERSION);
2428 server_position_in_parent = entry.Get(SERVER_POSITION_IN_PARENT); 2444 server_position_in_parent = entry.Get(SERVER_POSITION_IN_PARENT);
2429 } 2445 }
2430 sync_pb::SyncEntity* update = mock_server_->AddUpdateFromLastCommit(); 2446 sync_pb::SyncEntity* update = mock_server_->AddUpdateFromLastCommit();
2431 EXPECT_EQ("Pete", update->name()); 2447 EXPECT_EQ("Pete", update->name());
2432 EXPECT_EQ(id.GetServerId(), update->id_string()); 2448 EXPECT_EQ(id.GetServerId(), update->id_string());
2433 EXPECT_EQ(root_id_.GetServerId(), update->parent_id_string()); 2449 EXPECT_EQ(root_id_.GetServerId(), update->parent_id_string());
2434 EXPECT_EQ(version, update->version()); 2450 EXPECT_EQ(version, update->version());
2435 EXPECT_EQ(server_position_in_parent, update->position_in_parent()); 2451 EXPECT_EQ(server_position_in_parent, update->position_in_parent());
2436 SyncShareAsDelegate(); 2452 SyncShareNudge();
2437 { 2453 {
2438 ReadTransaction trans(FROM_HERE, directory()); 2454 ReadTransaction trans(FROM_HERE, directory());
2439 Entry entry(&trans, syncable::GET_BY_ID, id); 2455 Entry entry(&trans, syncable::GET_BY_ID, id);
2440 ASSERT_TRUE(entry.good()); 2456 ASSERT_TRUE(entry.good());
2441 EXPECT_TRUE(entry.Get(MTIME) == test_time); 2457 EXPECT_TRUE(entry.Get(MTIME) == test_time);
2442 } 2458 }
2443 } 2459 }
2444 2460
2445 TEST_F(SyncerTest, ParentAndChildBothMatch) { 2461 TEST_F(SyncerTest, ParentAndChildBothMatch) {
2446 const syncable::FullModelTypeSet all_types = 2462 const syncable::FullModelTypeSet all_types =
(...skipping 14 matching lines...) Expand all
2461 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "test.htm"); 2477 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "test.htm");
2462 ASSERT_TRUE(child.good()); 2478 ASSERT_TRUE(child.good());
2463 child.Put(ID, child_id); 2479 child.Put(ID, child_id);
2464 child.Put(BASE_VERSION, 1); 2480 child.Put(BASE_VERSION, 1);
2465 child.Put(SPECIFICS, DefaultBookmarkSpecifics()); 2481 child.Put(SPECIFICS, DefaultBookmarkSpecifics());
2466 WriteTestDataToEntry(&wtrans, &child); 2482 WriteTestDataToEntry(&wtrans, &child);
2467 } 2483 }
2468 mock_server_->AddUpdateDirectory(parent_id, root_id_, "Folder", 10, 10); 2484 mock_server_->AddUpdateDirectory(parent_id, root_id_, "Folder", 10, 10);
2469 mock_server_->AddUpdateBookmark(child_id, parent_id, "test.htm", 10, 10); 2485 mock_server_->AddUpdateBookmark(child_id, parent_id, "test.htm", 10, 10);
2470 mock_server_->set_conflict_all_commits(true); 2486 mock_server_->set_conflict_all_commits(true);
2471 SyncShareAsDelegate(); 2487 SyncShareNudge();
2472 SyncShareAsDelegate(); 2488 SyncShareNudge();
2473 SyncShareAsDelegate(); 2489 SyncShareNudge();
2474 { 2490 {
2475 ReadTransaction trans(FROM_HERE, directory()); 2491 ReadTransaction trans(FROM_HERE, directory());
2476 Directory::ChildHandles children; 2492 Directory::ChildHandles children;
2477 directory()->GetChildHandlesById(&trans, root_id_, &children); 2493 directory()->GetChildHandlesById(&trans, root_id_, &children);
2478 EXPECT_EQ(1u, children.size()); 2494 EXPECT_EQ(1u, children.size());
2479 directory()->GetChildHandlesById(&trans, parent_id, &children); 2495 directory()->GetChildHandlesById(&trans, parent_id, &children);
2480 EXPECT_EQ(1u, children.size()); 2496 EXPECT_EQ(1u, children.size());
2481 Directory::UnappliedUpdateMetaHandles unapplied; 2497 Directory::UnappliedUpdateMetaHandles unapplied;
2482 directory()->GetUnappliedUpdateMetaHandles(&trans, all_types, &unapplied); 2498 directory()->GetUnappliedUpdateMetaHandles(&trans, all_types, &unapplied);
2483 EXPECT_EQ(0u, unapplied.size()); 2499 EXPECT_EQ(0u, unapplied.size());
2484 syncable::Directory::UnsyncedMetaHandles unsynced; 2500 syncable::Directory::UnsyncedMetaHandles unsynced;
2485 directory()->GetUnsyncedMetaHandles(&trans, &unsynced); 2501 directory()->GetUnsyncedMetaHandles(&trans, &unsynced);
2486 EXPECT_EQ(0u, unsynced.size()); 2502 EXPECT_EQ(0u, unsynced.size());
2487 saw_syncer_event_ = false; 2503 saw_syncer_event_ = false;
2488 } 2504 }
2489 } 2505 }
2490 2506
2491 TEST_F(SyncerTest, CommittingNewDeleted) { 2507 TEST_F(SyncerTest, CommittingNewDeleted) {
2492 { 2508 {
2493 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2509 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2494 MutableEntry entry(&trans, CREATE, trans.root_id(), "bob"); 2510 MutableEntry entry(&trans, CREATE, trans.root_id(), "bob");
2495 entry.Put(IS_UNSYNCED, true); 2511 entry.Put(IS_UNSYNCED, true);
2496 entry.Put(IS_DEL, true); 2512 entry.Put(IS_DEL, true);
2497 } 2513 }
2498 SyncShareAsDelegate(); 2514 SyncShareNudge();
2499 EXPECT_EQ(0u, mock_server_->committed_ids().size()); 2515 EXPECT_EQ(0u, mock_server_->committed_ids().size());
2500 } 2516 }
2501 2517
2502 // Original problem synopsis: 2518 // Original problem synopsis:
2503 // Check failed: entry->Get(BASE_VERSION) <= entry->Get(SERVER_VERSION) 2519 // Check failed: entry->Get(BASE_VERSION) <= entry->Get(SERVER_VERSION)
2504 // Client creates entry, client finishes committing entry. Between 2520 // Client creates entry, client finishes committing entry. Between
2505 // commit and getting update back, we delete the entry. 2521 // commit and getting update back, we delete the entry.
2506 // We get the update for the entry, but the local one was modified 2522 // We get the update for the entry, but the local one was modified
2507 // so we store the entry but don't apply it. IS_UNAPPLIED_UPDATE is set. 2523 // so we store the entry but don't apply it. IS_UNAPPLIED_UPDATE is set.
2508 // We commit deletion and get a new version number. 2524 // We commit deletion and get a new version number.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2571 } 2587 }
2572 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); 2588 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END);
2573 const StatusController& status(session_->status_controller()); 2589 const StatusController& status(session_->status_controller());
2574 EXPECT_EQ(0, status.TotalNumServerConflictingItems()); 2590 EXPECT_EQ(0, status.TotalNumServerConflictingItems());
2575 } 2591 }
2576 2592
2577 TEST_F(SyncerTest, DeletingEntryWithLocalEdits) { 2593 TEST_F(SyncerTest, DeletingEntryWithLocalEdits) {
2578 int64 newfolder_metahandle; 2594 int64 newfolder_metahandle;
2579 2595
2580 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); 2596 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10);
2581 SyncShareAsDelegate(); 2597 SyncShareNudge();
2582 { 2598 {
2583 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2599 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2584 MutableEntry newfolder(&trans, CREATE, ids_.FromNumber(1), "local"); 2600 MutableEntry newfolder(&trans, CREATE, ids_.FromNumber(1), "local");
2585 ASSERT_TRUE(newfolder.good()); 2601 ASSERT_TRUE(newfolder.good());
2586 newfolder.Put(IS_UNSYNCED, true); 2602 newfolder.Put(IS_UNSYNCED, true);
2587 newfolder.Put(IS_DIR, true); 2603 newfolder.Put(IS_DIR, true);
2588 newfolder.Put(SPECIFICS, DefaultBookmarkSpecifics()); 2604 newfolder.Put(SPECIFICS, DefaultBookmarkSpecifics());
2589 newfolder_metahandle = newfolder.Get(META_HANDLE); 2605 newfolder_metahandle = newfolder.Get(META_HANDLE);
2590 } 2606 }
2591 mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20); 2607 mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20);
2592 mock_server_->SetLastUpdateDeleted(); 2608 mock_server_->SetLastUpdateDeleted();
2593 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, APPLY_UPDATES); 2609 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, APPLY_UPDATES);
2594 { 2610 {
2595 ReadTransaction trans(FROM_HERE, directory()); 2611 ReadTransaction trans(FROM_HERE, directory());
2596 Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle); 2612 Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle);
2597 ASSERT_TRUE(entry.good()); 2613 ASSERT_TRUE(entry.good());
2598 } 2614 }
2599 } 2615 }
2600 2616
2601 TEST_F(SyncerTest, FolderSwapUpdate) { 2617 TEST_F(SyncerTest, FolderSwapUpdate) {
2602 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10); 2618 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10);
2603 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10); 2619 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10);
2604 SyncShareAsDelegate(); 2620 SyncShareNudge();
2605 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20); 2621 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20);
2606 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20); 2622 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20);
2607 SyncShareAsDelegate(); 2623 SyncShareNudge();
2608 { 2624 {
2609 ReadTransaction trans(FROM_HERE, directory()); 2625 ReadTransaction trans(FROM_HERE, directory());
2610 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); 2626 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801));
2611 ASSERT_TRUE(id1.good()); 2627 ASSERT_TRUE(id1.good());
2612 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME)); 2628 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME));
2613 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); 2629 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID));
2614 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); 2630 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024));
2615 ASSERT_TRUE(id2.good()); 2631 ASSERT_TRUE(id2.good());
2616 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME)); 2632 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME));
2617 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); 2633 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID));
2618 } 2634 }
2619 saw_syncer_event_ = false; 2635 saw_syncer_event_ = false;
2620 } 2636 }
2621 2637
2622 TEST_F(SyncerTest, NameCollidingFolderSwapWorksFine) { 2638 TEST_F(SyncerTest, NameCollidingFolderSwapWorksFine) {
2623 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10); 2639 mock_server_->AddUpdateDirectory(7801, 0, "bob", 1, 10);
2624 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10); 2640 mock_server_->AddUpdateDirectory(1024, 0, "fred", 1, 10);
2625 mock_server_->AddUpdateDirectory(4096, 0, "alice", 1, 10); 2641 mock_server_->AddUpdateDirectory(4096, 0, "alice", 1, 10);
2626 SyncShareAsDelegate(); 2642 SyncShareNudge();
2627 { 2643 {
2628 ReadTransaction trans(FROM_HERE, directory()); 2644 ReadTransaction trans(FROM_HERE, directory());
2629 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); 2645 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801));
2630 ASSERT_TRUE(id1.good()); 2646 ASSERT_TRUE(id1.good());
2631 EXPECT_TRUE("bob" == id1.Get(NON_UNIQUE_NAME)); 2647 EXPECT_TRUE("bob" == id1.Get(NON_UNIQUE_NAME));
2632 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); 2648 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID));
2633 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); 2649 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024));
2634 ASSERT_TRUE(id2.good()); 2650 ASSERT_TRUE(id2.good());
2635 EXPECT_TRUE("fred" == id2.Get(NON_UNIQUE_NAME)); 2651 EXPECT_TRUE("fred" == id2.Get(NON_UNIQUE_NAME));
2636 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); 2652 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID));
2637 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096)); 2653 Entry id3(&trans, GET_BY_ID, ids_.FromNumber(4096));
2638 ASSERT_TRUE(id3.good()); 2654 ASSERT_TRUE(id3.good());
2639 EXPECT_TRUE("alice" == id3.Get(NON_UNIQUE_NAME)); 2655 EXPECT_TRUE("alice" == id3.Get(NON_UNIQUE_NAME));
2640 EXPECT_TRUE(root_id_ == id3.Get(PARENT_ID)); 2656 EXPECT_TRUE(root_id_ == id3.Get(PARENT_ID));
2641 } 2657 }
2642 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20); 2658 mock_server_->AddUpdateDirectory(1024, 0, "bob", 2, 20);
2643 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20); 2659 mock_server_->AddUpdateDirectory(7801, 0, "fred", 2, 20);
2644 mock_server_->AddUpdateDirectory(4096, 0, "bob", 2, 20); 2660 mock_server_->AddUpdateDirectory(4096, 0, "bob", 2, 20);
2645 SyncShareAsDelegate(); 2661 SyncShareNudge();
2646 { 2662 {
2647 ReadTransaction trans(FROM_HERE, directory()); 2663 ReadTransaction trans(FROM_HERE, directory());
2648 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801)); 2664 Entry id1(&trans, GET_BY_ID, ids_.FromNumber(7801));
2649 ASSERT_TRUE(id1.good()); 2665 ASSERT_TRUE(id1.good());
2650 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME)); 2666 EXPECT_TRUE("fred" == id1.Get(NON_UNIQUE_NAME));
2651 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID)); 2667 EXPECT_TRUE(root_id_ == id1.Get(PARENT_ID));
2652 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024)); 2668 Entry id2(&trans, GET_BY_ID, ids_.FromNumber(1024));
2653 ASSERT_TRUE(id2.good()); 2669 ASSERT_TRUE(id2.good());
2654 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME)); 2670 EXPECT_TRUE("bob" == id2.Get(NON_UNIQUE_NAME));
2655 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID)); 2671 EXPECT_TRUE(root_id_ == id2.Get(PARENT_ID));
(...skipping 13 matching lines...) Expand all
2669 for (uint32 i = 0; i < items_to_commit; i++) { 2685 for (uint32 i = 0; i < items_to_commit; i++) {
2670 string nameutf8 = base::StringPrintf("%d", i); 2686 string nameutf8 = base::StringPrintf("%d", i);
2671 string name(nameutf8.begin(), nameutf8.end()); 2687 string name(nameutf8.begin(), nameutf8.end());
2672 MutableEntry e(&trans, CREATE, trans.root_id(), name); 2688 MutableEntry e(&trans, CREATE, trans.root_id(), name);
2673 e.Put(IS_UNSYNCED, true); 2689 e.Put(IS_UNSYNCED, true);
2674 e.Put(IS_DIR, true); 2690 e.Put(IS_DIR, true);
2675 e.Put(SPECIFICS, DefaultBookmarkSpecifics()); 2691 e.Put(SPECIFICS, DefaultBookmarkSpecifics());
2676 } 2692 }
2677 } 2693 }
2678 uint32 num_loops = 0; 2694 uint32 num_loops = 0;
2679 while (SyncShareAsDelegate()) { 2695 while (SyncShareNudge()) {
2680 num_loops++; 2696 num_loops++;
2681 ASSERT_LT(num_loops, max_batches * 2); 2697 ASSERT_LT(num_loops, max_batches * 2);
2682 } 2698 }
2683 EXPECT_GE(mock_server_->commit_messages().size(), max_batches); 2699 EXPECT_GE(mock_server_->commit_messages().size(), max_batches);
2684 } 2700 }
2685 2701
2686 TEST_F(SyncerTest, HugeConflict) { 2702 TEST_F(SyncerTest, HugeConflict) {
2687 int item_count = 300; // We should be able to do 300 or 3000 w/o issue. 2703 int item_count = 300; // We should be able to do 300 or 3000 w/o issue.
2688 2704
2689 syncable::Id parent_id = ids_.NewServerId(); 2705 syncable::Id parent_id = ids_.NewServerId();
2690 syncable::Id last_id = parent_id; 2706 syncable::Id last_id = parent_id;
2691 vector<syncable::Id> tree_ids; 2707 vector<syncable::Id> tree_ids;
2692 2708
2693 // Create a lot of updates for which the parent does not exist yet. 2709 // Create a lot of updates for which the parent does not exist yet.
2694 // Generate a huge deep tree which should all fail to apply at first. 2710 // Generate a huge deep tree which should all fail to apply at first.
2695 { 2711 {
2696 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2712 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2697 for (int i = 0; i < item_count ; i++) { 2713 for (int i = 0; i < item_count ; i++) {
2698 syncable::Id next_id = ids_.NewServerId(); 2714 syncable::Id next_id = ids_.NewServerId();
2699 tree_ids.push_back(next_id); 2715 tree_ids.push_back(next_id);
2700 mock_server_->AddUpdateDirectory(next_id, last_id, "BOB", 2, 20); 2716 mock_server_->AddUpdateDirectory(next_id, last_id, "BOB", 2, 20);
2701 last_id = next_id; 2717 last_id = next_id;
2702 } 2718 }
2703 } 2719 }
2704 SyncShareAsDelegate(); 2720 SyncShareNudge();
2705 2721
2706 // Check they're in the expected conflict state. 2722 // Check they're in the expected conflict state.
2707 { 2723 {
2708 ReadTransaction trans(FROM_HERE, directory()); 2724 ReadTransaction trans(FROM_HERE, directory());
2709 for (int i = 0; i < item_count; i++) { 2725 for (int i = 0; i < item_count; i++) {
2710 Entry e(&trans, GET_BY_ID, tree_ids[i]); 2726 Entry e(&trans, GET_BY_ID, tree_ids[i]);
2711 // They should all exist but none should be applied. 2727 // They should all exist but none should be applied.
2712 ASSERT_TRUE(e.good()); 2728 ASSERT_TRUE(e.good());
2713 EXPECT_TRUE(e.Get(IS_DEL)); 2729 EXPECT_TRUE(e.Get(IS_DEL));
2714 EXPECT_TRUE(e.Get(IS_UNAPPLIED_UPDATE)); 2730 EXPECT_TRUE(e.Get(IS_UNAPPLIED_UPDATE));
2715 } 2731 }
2716 } 2732 }
2717 2733
2718 // Add the missing parent directory. 2734 // Add the missing parent directory.
2719 mock_server_->AddUpdateDirectory(parent_id, TestIdFactory::root(), 2735 mock_server_->AddUpdateDirectory(parent_id, TestIdFactory::root(),
2720 "BOB", 2, 20); 2736 "BOB", 2, 20);
2721 SyncShareAsDelegate(); 2737 SyncShareNudge();
2722 2738
2723 // Now they should all be OK. 2739 // Now they should all be OK.
2724 { 2740 {
2725 ReadTransaction trans(FROM_HERE, directory()); 2741 ReadTransaction trans(FROM_HERE, directory());
2726 for (int i = 0; i < item_count; i++) { 2742 for (int i = 0; i < item_count; i++) {
2727 Entry e(&trans, GET_BY_ID, tree_ids[i]); 2743 Entry e(&trans, GET_BY_ID, tree_ids[i]);
2728 ASSERT_TRUE(e.good()); 2744 ASSERT_TRUE(e.good());
2729 EXPECT_FALSE(e.Get(IS_DEL)); 2745 EXPECT_FALSE(e.Get(IS_DEL));
2730 EXPECT_FALSE(e.Get(IS_UNAPPLIED_UPDATE)); 2746 EXPECT_FALSE(e.Get(IS_UNAPPLIED_UPDATE));
2731 } 2747 }
2732 } 2748 }
2733 } 2749 }
2734 2750
2735 TEST_F(SyncerTest, DontCrashOnCaseChange) { 2751 TEST_F(SyncerTest, DontCrashOnCaseChange) {
2736 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); 2752 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10);
2737 SyncShareAsDelegate(); 2753 SyncShareNudge();
2738 { 2754 {
2739 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2755 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2740 MutableEntry e(&trans, GET_BY_ID, ids_.FromNumber(1)); 2756 MutableEntry e(&trans, GET_BY_ID, ids_.FromNumber(1));
2741 ASSERT_TRUE(e.good()); 2757 ASSERT_TRUE(e.good());
2742 e.Put(IS_UNSYNCED, true); 2758 e.Put(IS_UNSYNCED, true);
2743 } 2759 }
2744 mock_server_->set_conflict_all_commits(true); 2760 mock_server_->set_conflict_all_commits(true);
2745 mock_server_->AddUpdateDirectory(1, 0, "BOB", 2, 20); 2761 mock_server_->AddUpdateDirectory(1, 0, "BOB", 2, 20);
2746 SyncShareAsDelegate(); // USED TO CAUSE AN ASSERT 2762 SyncShareNudge(); // USED TO CAUSE AN ASSERT
2747 saw_syncer_event_ = false; 2763 saw_syncer_event_ = false;
2748 } 2764 }
2749 2765
2750 TEST_F(SyncerTest, UnsyncedItemAndUpdate) { 2766 TEST_F(SyncerTest, UnsyncedItemAndUpdate) {
2751 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); 2767 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10);
2752 SyncShareAsDelegate(); 2768 SyncShareNudge();
2753 mock_server_->set_conflict_all_commits(true); 2769 mock_server_->set_conflict_all_commits(true);
2754 mock_server_->AddUpdateDirectory(2, 0, "bob", 2, 20); 2770 mock_server_->AddUpdateDirectory(2, 0, "bob", 2, 20);
2755 SyncShareAsDelegate(); // USED TO CAUSE AN ASSERT 2771 SyncShareNudge(); // USED TO CAUSE AN ASSERT
2756 saw_syncer_event_ = false; 2772 saw_syncer_event_ = false;
2757 } 2773 }
2758 2774
2759 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath) { 2775 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath) {
2760 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10); 2776 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10);
2761 SyncShareAsDelegate(); 2777 SyncShareNudge();
2762 int64 local_folder_handle; 2778 int64 local_folder_handle;
2763 syncable::Id local_folder_id; 2779 syncable::Id local_folder_id;
2764 { 2780 {
2765 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2781 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2766 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm"); 2782 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm");
2767 ASSERT_TRUE(new_entry.good()); 2783 ASSERT_TRUE(new_entry.good());
2768 local_folder_id = new_entry.Get(ID); 2784 local_folder_id = new_entry.Get(ID);
2769 local_folder_handle = new_entry.Get(META_HANDLE); 2785 local_folder_handle = new_entry.Get(META_HANDLE);
2770 new_entry.Put(IS_UNSYNCED, true); 2786 new_entry.Put(IS_UNSYNCED, true);
2771 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); 2787 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics());
2772 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2788 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2773 ASSERT_TRUE(old.good()); 2789 ASSERT_TRUE(old.good());
2774 WriteTestDataToEntry(&wtrans, &old); 2790 WriteTestDataToEntry(&wtrans, &old);
2775 } 2791 }
2776 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20); 2792 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20);
2777 mock_server_->set_conflict_all_commits(true); 2793 mock_server_->set_conflict_all_commits(true);
2778 SyncShareAsDelegate(); 2794 SyncShareNudge();
2779 saw_syncer_event_ = false; 2795 saw_syncer_event_ = false;
2780 { 2796 {
2781 // Update #20 should have been dropped in favor of the local version. 2797 // Update #20 should have been dropped in favor of the local version.
2782 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2798 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2783 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2799 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2784 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 2800 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
2785 ASSERT_TRUE(server.good()); 2801 ASSERT_TRUE(server.good());
2786 ASSERT_TRUE(local.good()); 2802 ASSERT_TRUE(local.good());
2787 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); 2803 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE));
2788 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); 2804 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE));
2789 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); 2805 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE));
2790 EXPECT_TRUE(server.Get(IS_UNSYNCED)); 2806 EXPECT_TRUE(server.Get(IS_UNSYNCED));
2791 EXPECT_TRUE(local.Get(IS_UNSYNCED)); 2807 EXPECT_TRUE(local.Get(IS_UNSYNCED));
2792 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME)); 2808 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME));
2793 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); 2809 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME));
2794 } 2810 }
2795 // Allow local changes to commit. 2811 // Allow local changes to commit.
2796 mock_server_->set_conflict_all_commits(false); 2812 mock_server_->set_conflict_all_commits(false);
2797 SyncShareAsDelegate(); 2813 SyncShareNudge();
2798 saw_syncer_event_ = false; 2814 saw_syncer_event_ = false;
2799 2815
2800 // Now add a server change to make the two names equal. There should 2816 // Now add a server change to make the two names equal. There should
2801 // be no conflict with that, since names are not unique. 2817 // be no conflict with that, since names are not unique.
2802 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30); 2818 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30);
2803 SyncShareAsDelegate(); 2819 SyncShareNudge();
2804 saw_syncer_event_ = false; 2820 saw_syncer_event_ = false;
2805 { 2821 {
2806 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2822 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2807 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2823 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2808 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 2824 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
2809 ASSERT_TRUE(server.good()); 2825 ASSERT_TRUE(server.good());
2810 ASSERT_TRUE(local.good()); 2826 ASSERT_TRUE(local.good());
2811 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); 2827 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE));
2812 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); 2828 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE));
2813 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); 2829 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE));
2814 EXPECT_FALSE(server.Get(IS_UNSYNCED)); 2830 EXPECT_FALSE(server.Get(IS_UNSYNCED));
2815 EXPECT_FALSE(local.Get(IS_UNSYNCED)); 2831 EXPECT_FALSE(local.Get(IS_UNSYNCED));
2816 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME)); 2832 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME));
2817 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); 2833 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME));
2818 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. 2834 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark.
2819 server.Get(SPECIFICS).bookmark().url()); 2835 server.Get(SPECIFICS).bookmark().url());
2820 } 2836 }
2821 } 2837 }
2822 2838
2823 // Same as NewEntryAnddServerEntrySharePath, but using the old-style protocol. 2839 // Same as NewEntryAnddServerEntrySharePath, but using the old-style protocol.
2824 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath_OldBookmarksProto) { 2840 TEST_F(SyncerTest, NewEntryAndAlteredServerEntrySharePath_OldBookmarksProto) {
2825 mock_server_->set_use_legacy_bookmarks_protocol(true); 2841 mock_server_->set_use_legacy_bookmarks_protocol(true);
2826 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10); 2842 mock_server_->AddUpdateBookmark(1, 0, "Foo.htm", 10, 10);
2827 SyncShareAsDelegate(); 2843 SyncShareNudge();
2828 int64 local_folder_handle; 2844 int64 local_folder_handle;
2829 syncable::Id local_folder_id; 2845 syncable::Id local_folder_id;
2830 { 2846 {
2831 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2847 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2832 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm"); 2848 MutableEntry new_entry(&wtrans, CREATE, wtrans.root_id(), "Bar.htm");
2833 ASSERT_TRUE(new_entry.good()); 2849 ASSERT_TRUE(new_entry.good());
2834 local_folder_id = new_entry.Get(ID); 2850 local_folder_id = new_entry.Get(ID);
2835 local_folder_handle = new_entry.Get(META_HANDLE); 2851 local_folder_handle = new_entry.Get(META_HANDLE);
2836 new_entry.Put(IS_UNSYNCED, true); 2852 new_entry.Put(IS_UNSYNCED, true);
2837 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics()); 2853 new_entry.Put(SPECIFICS, DefaultBookmarkSpecifics());
2838 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2854 MutableEntry old(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2839 ASSERT_TRUE(old.good()); 2855 ASSERT_TRUE(old.good());
2840 WriteTestDataToEntry(&wtrans, &old); 2856 WriteTestDataToEntry(&wtrans, &old);
2841 } 2857 }
2842 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20); 2858 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 20, 20);
2843 mock_server_->set_conflict_all_commits(true); 2859 mock_server_->set_conflict_all_commits(true);
2844 SyncShareAsDelegate(); 2860 SyncShareNudge();
2845 saw_syncer_event_ = false; 2861 saw_syncer_event_ = false;
2846 { 2862 {
2847 // Update #20 should have been dropped in favor of the local version. 2863 // Update #20 should have been dropped in favor of the local version.
2848 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2864 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2849 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2865 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2850 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 2866 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
2851 ASSERT_TRUE(server.good()); 2867 ASSERT_TRUE(server.good());
2852 ASSERT_TRUE(local.good()); 2868 ASSERT_TRUE(local.good());
2853 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); 2869 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE));
2854 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); 2870 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE));
2855 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); 2871 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE));
2856 EXPECT_TRUE(server.Get(IS_UNSYNCED)); 2872 EXPECT_TRUE(server.Get(IS_UNSYNCED));
2857 EXPECT_TRUE(local.Get(IS_UNSYNCED)); 2873 EXPECT_TRUE(local.Get(IS_UNSYNCED));
2858 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME)); 2874 EXPECT_EQ("Foo.htm", server.Get(NON_UNIQUE_NAME));
2859 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); 2875 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME));
2860 } 2876 }
2861 // Allow local changes to commit. 2877 // Allow local changes to commit.
2862 mock_server_->set_conflict_all_commits(false); 2878 mock_server_->set_conflict_all_commits(false);
2863 SyncShareAsDelegate(); 2879 SyncShareNudge();
2864 saw_syncer_event_ = false; 2880 saw_syncer_event_ = false;
2865 2881
2866 // Now add a server change to make the two names equal. There should 2882 // Now add a server change to make the two names equal. There should
2867 // be no conflict with that, since names are not unique. 2883 // be no conflict with that, since names are not unique.
2868 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30); 2884 mock_server_->AddUpdateBookmark(1, 0, "Bar.htm", 30, 30);
2869 SyncShareAsDelegate(); 2885 SyncShareNudge();
2870 saw_syncer_event_ = false; 2886 saw_syncer_event_ = false;
2871 { 2887 {
2872 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2888 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2873 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2889 MutableEntry server(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2874 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle); 2890 MutableEntry local(&wtrans, GET_BY_HANDLE, local_folder_handle);
2875 ASSERT_TRUE(server.good()); 2891 ASSERT_TRUE(server.good());
2876 ASSERT_TRUE(local.good()); 2892 ASSERT_TRUE(local.good());
2877 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE)); 2893 EXPECT_TRUE(local.Get(META_HANDLE) != server.Get(META_HANDLE));
2878 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE)); 2894 EXPECT_FALSE(server.Get(IS_UNAPPLIED_UPDATE));
2879 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE)); 2895 EXPECT_FALSE(local.Get(IS_UNAPPLIED_UPDATE));
2880 EXPECT_FALSE(server.Get(IS_UNSYNCED)); 2896 EXPECT_FALSE(server.Get(IS_UNSYNCED));
2881 EXPECT_FALSE(local.Get(IS_UNSYNCED)); 2897 EXPECT_FALSE(local.Get(IS_UNSYNCED));
2882 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME)); 2898 EXPECT_EQ("Bar.htm", server.Get(NON_UNIQUE_NAME));
2883 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME)); 2899 EXPECT_EQ("Bar.htm", local.Get(NON_UNIQUE_NAME));
2884 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark. 2900 EXPECT_EQ("http://google.com", // Default from AddUpdateBookmark.
2885 server.Get(SPECIFICS).bookmark().url()); 2901 server.Get(SPECIFICS).bookmark().url());
2886 } 2902 }
2887 } 2903 }
2888 2904
2889 // Circular links should be resolved by the server. 2905 // Circular links should be resolved by the server.
2890 TEST_F(SyncerTest, SiblingDirectoriesBecomeCircular) { 2906 TEST_F(SyncerTest, SiblingDirectoriesBecomeCircular) {
2891 // we don't currently resolve this. This test ensures we don't. 2907 // we don't currently resolve this. This test ensures we don't.
2892 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 2908 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
2893 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); 2909 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10);
2894 SyncShareAsDelegate(); 2910 SyncShareNudge();
2895 { 2911 {
2896 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2912 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2897 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2913 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2898 ASSERT_TRUE(A.good()); 2914 ASSERT_TRUE(A.good());
2899 A.Put(IS_UNSYNCED, true); 2915 A.Put(IS_UNSYNCED, true);
2900 ASSERT_TRUE(A.Put(PARENT_ID, ids_.FromNumber(2))); 2916 ASSERT_TRUE(A.Put(PARENT_ID, ids_.FromNumber(2)));
2901 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B")); 2917 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B"));
2902 } 2918 }
2903 mock_server_->AddUpdateDirectory(2, 1, "A", 20, 20); 2919 mock_server_->AddUpdateDirectory(2, 1, "A", 20, 20);
2904 mock_server_->set_conflict_all_commits(true); 2920 mock_server_->set_conflict_all_commits(true);
2905 SyncShareAsDelegate(); 2921 SyncShareNudge();
2906 saw_syncer_event_ = false; 2922 saw_syncer_event_ = false;
2907 { 2923 {
2908 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2924 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2909 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2925 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2910 ASSERT_TRUE(A.good()); 2926 ASSERT_TRUE(A.good());
2911 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 2927 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
2912 ASSERT_TRUE(B.good()); 2928 ASSERT_TRUE(B.good());
2913 EXPECT_TRUE(A.Get(NON_UNIQUE_NAME) == "B"); 2929 EXPECT_TRUE(A.Get(NON_UNIQUE_NAME) == "B");
2914 EXPECT_TRUE(B.Get(NON_UNIQUE_NAME) == "B"); 2930 EXPECT_TRUE(B.Get(NON_UNIQUE_NAME) == "B");
2915 } 2931 }
2916 } 2932 }
2917 2933
2918 TEST_F(SyncerTest, SwapEntryNames) { 2934 TEST_F(SyncerTest, SwapEntryNames) {
2919 // Simple transaction test. 2935 // Simple transaction test.
2920 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 2936 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
2921 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10); 2937 mock_server_->AddUpdateDirectory(2, 0, "B", 10, 10);
2922 mock_server_->set_conflict_all_commits(true); 2938 mock_server_->set_conflict_all_commits(true);
2923 SyncShareAsDelegate(); 2939 SyncShareNudge();
2924 { 2940 {
2925 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 2941 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
2926 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); 2942 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1));
2927 ASSERT_TRUE(A.good()); 2943 ASSERT_TRUE(A.good());
2928 A.Put(IS_UNSYNCED, true); 2944 A.Put(IS_UNSYNCED, true);
2929 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2)); 2945 MutableEntry B(&wtrans, GET_BY_ID, ids_.FromNumber(2));
2930 ASSERT_TRUE(B.good()); 2946 ASSERT_TRUE(B.good());
2931 B.Put(IS_UNSYNCED, true); 2947 B.Put(IS_UNSYNCED, true);
2932 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "C")); 2948 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "C"));
2933 ASSERT_TRUE(B.Put(NON_UNIQUE_NAME, "A")); 2949 ASSERT_TRUE(B.Put(NON_UNIQUE_NAME, "A"));
2934 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B")); 2950 ASSERT_TRUE(A.Put(NON_UNIQUE_NAME, "B"));
2935 } 2951 }
2936 SyncShareAsDelegate(); 2952 SyncShareNudge();
2937 saw_syncer_event_ = false; 2953 saw_syncer_event_ = false;
2938 } 2954 }
2939 2955
2940 TEST_F(SyncerTest, DualDeletionWithNewItemNameClash) { 2956 TEST_F(SyncerTest, DualDeletionWithNewItemNameClash) {
2941 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10); 2957 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10);
2942 mock_server_->AddUpdateBookmark(2, 0, "B", 10, 10); 2958 mock_server_->AddUpdateBookmark(2, 0, "B", 10, 10);
2943 mock_server_->set_conflict_all_commits(true); 2959 mock_server_->set_conflict_all_commits(true);
2944 SyncShareAsDelegate(); 2960 SyncShareNudge();
2945 { 2961 {
2946 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2962 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2947 MutableEntry B(&trans, GET_BY_ID, ids_.FromNumber(2)); 2963 MutableEntry B(&trans, GET_BY_ID, ids_.FromNumber(2));
2948 ASSERT_TRUE(B.good()); 2964 ASSERT_TRUE(B.good());
2949 WriteTestDataToEntry(&trans, &B); 2965 WriteTestDataToEntry(&trans, &B);
2950 B.Put(IS_DEL, true); 2966 B.Put(IS_DEL, true);
2951 } 2967 }
2952 mock_server_->AddUpdateBookmark(2, 0, "A", 11, 11); 2968 mock_server_->AddUpdateBookmark(2, 0, "A", 11, 11);
2953 mock_server_->SetLastUpdateDeleted(); 2969 mock_server_->SetLastUpdateDeleted();
2954 SyncShareAsDelegate(); 2970 SyncShareNudge();
2955 { 2971 {
2956 ReadTransaction trans(FROM_HERE, directory()); 2972 ReadTransaction trans(FROM_HERE, directory());
2957 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2)); 2973 Entry B(&trans, GET_BY_ID, ids_.FromNumber(2));
2958 ASSERT_TRUE(B.good()); 2974 ASSERT_TRUE(B.good());
2959 EXPECT_FALSE(B.Get(IS_UNSYNCED)); 2975 EXPECT_FALSE(B.Get(IS_UNSYNCED));
2960 EXPECT_FALSE(B.Get(IS_UNAPPLIED_UPDATE)); 2976 EXPECT_FALSE(B.Get(IS_UNAPPLIED_UPDATE));
2961 } 2977 }
2962 saw_syncer_event_ = false; 2978 saw_syncer_event_ = false;
2963 } 2979 }
2964 2980
2965 TEST_F(SyncerTest, ResolveWeWroteTheyDeleted) { 2981 TEST_F(SyncerTest, ResolveWeWroteTheyDeleted) {
2966 int64 bob_metahandle; 2982 int64 bob_metahandle;
2967 2983
2968 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10); 2984 mock_server_->AddUpdateBookmark(1, 0, "bob", 1, 10);
2969 SyncShareAsDelegate(); 2985 SyncShareNudge();
2970 { 2986 {
2971 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 2987 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
2972 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); 2988 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1));
2973 ASSERT_TRUE(bob.good()); 2989 ASSERT_TRUE(bob.good());
2974 bob_metahandle = bob.Get(META_HANDLE); 2990 bob_metahandle = bob.Get(META_HANDLE);
2975 WriteTestDataToEntry(&trans, &bob); 2991 WriteTestDataToEntry(&trans, &bob);
2976 } 2992 }
2977 mock_server_->AddUpdateBookmark(1, 0, "bob", 2, 10); 2993 mock_server_->AddUpdateBookmark(1, 0, "bob", 2, 10);
2978 mock_server_->SetLastUpdateDeleted(); 2994 mock_server_->SetLastUpdateDeleted();
2979 mock_server_->set_conflict_all_commits(true); 2995 mock_server_->set_conflict_all_commits(true);
2980 SyncShareAsDelegate(); 2996 SyncShareNudge();
2981 SyncShareAsDelegate(); 2997 SyncShareNudge();
2982 { 2998 {
2983 ReadTransaction trans(FROM_HERE, directory()); 2999 ReadTransaction trans(FROM_HERE, directory());
2984 Entry bob(&trans, GET_BY_HANDLE, bob_metahandle); 3000 Entry bob(&trans, GET_BY_HANDLE, bob_metahandle);
2985 ASSERT_TRUE(bob.good()); 3001 ASSERT_TRUE(bob.good());
2986 EXPECT_TRUE(bob.Get(IS_UNSYNCED)); 3002 EXPECT_TRUE(bob.Get(IS_UNSYNCED));
2987 EXPECT_FALSE(bob.Get(ID).ServerKnows()); 3003 EXPECT_FALSE(bob.Get(ID).ServerKnows());
2988 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE)); 3004 EXPECT_FALSE(bob.Get(IS_UNAPPLIED_UPDATE));
2989 EXPECT_FALSE(bob.Get(IS_DEL)); 3005 EXPECT_FALSE(bob.Get(IS_DEL));
2990 } 3006 }
2991 saw_syncer_event_ = false; 3007 saw_syncer_event_ = false;
(...skipping 13 matching lines...) Expand all
3005 ASSERT_TRUE(folder2.good()); 3021 ASSERT_TRUE(folder2.good());
3006 folder2.Put(IS_UNSYNCED, false); 3022 folder2.Put(IS_UNSYNCED, false);
3007 folder2.Put(IS_DIR, true); 3023 folder2.Put(IS_DIR, true);
3008 folder2.Put(SPECIFICS, DefaultBookmarkSpecifics()); 3024 folder2.Put(SPECIFICS, DefaultBookmarkSpecifics());
3009 folder2.Put(BASE_VERSION, 3); 3025 folder2.Put(BASE_VERSION, 3);
3010 folder2.Put(ID, syncable::Id::CreateFromServerId("mock_server:10000")); 3026 folder2.Put(ID, syncable::Id::CreateFromServerId("mock_server:10000"));
3011 } 3027 }
3012 mock_server_->set_next_new_id(10000); 3028 mock_server_->set_next_new_id(10000);
3013 EXPECT_EQ(1u, directory()->unsynced_entity_count()); 3029 EXPECT_EQ(1u, directory()->unsynced_entity_count());
3014 // we get back a bad id in here (should never happen). 3030 // we get back a bad id in here (should never happen).
3015 SyncShareAsDelegate(); 3031 SyncShareNudge();
3016 EXPECT_EQ(1u, directory()->unsynced_entity_count()); 3032 EXPECT_EQ(1u, directory()->unsynced_entity_count());
3017 SyncShareAsDelegate(); // another bad id in here. 3033 SyncShareNudge(); // another bad id in here.
3018 EXPECT_EQ(0u, directory()->unsynced_entity_count()); 3034 EXPECT_EQ(0u, directory()->unsynced_entity_count());
3019 saw_syncer_event_ = false; 3035 saw_syncer_event_ = false;
3020 } 3036 }
3021 3037
3022 TEST_F(SyncerTest, DeletedEntryWithBadParentInLoopCalculation) { 3038 TEST_F(SyncerTest, DeletedEntryWithBadParentInLoopCalculation) {
3023 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10); 3039 mock_server_->AddUpdateDirectory(1, 0, "bob", 1, 10);
3024 SyncShareAsDelegate(); 3040 SyncShareNudge();
3025 { 3041 {
3026 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3042 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3027 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1)); 3043 MutableEntry bob(&trans, GET_BY_ID, ids_.FromNumber(1));
3028 ASSERT_TRUE(bob.good()); 3044 ASSERT_TRUE(bob.good());
3029 // This is valid, because the parent could have gone away a long time ago. 3045 // This is valid, because the parent could have gone away a long time ago.
3030 bob.Put(PARENT_ID, ids_.FromNumber(54)); 3046 bob.Put(PARENT_ID, ids_.FromNumber(54));
3031 bob.Put(IS_DEL, true); 3047 bob.Put(IS_DEL, true);
3032 bob.Put(IS_UNSYNCED, true); 3048 bob.Put(IS_UNSYNCED, true);
3033 } 3049 }
3034 mock_server_->AddUpdateDirectory(2, 1, "fred", 1, 10); 3050 mock_server_->AddUpdateDirectory(2, 1, "fred", 1, 10);
3035 SyncShareAsDelegate(); 3051 SyncShareNudge();
3036 SyncShareAsDelegate(); 3052 SyncShareNudge();
3037 } 3053 }
3038 3054
3039 TEST_F(SyncerTest, ConflictResolverMergesLocalDeleteAndServerUpdate) { 3055 TEST_F(SyncerTest, ConflictResolverMergesLocalDeleteAndServerUpdate) {
3040 { 3056 {
3041 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3057 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3042 3058
3043 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name"); 3059 MutableEntry local_deleted(&trans, CREATE, trans.root_id(), "name");
3044 local_deleted.Put(ID, ids_.FromNumber(1)); 3060 local_deleted.Put(ID, ids_.FromNumber(1));
3045 local_deleted.Put(BASE_VERSION, 1); 3061 local_deleted.Put(BASE_VERSION, 1);
3046 local_deleted.Put(IS_DEL, true); 3062 local_deleted.Put(IS_DEL, true);
3047 local_deleted.Put(IS_DIR, false); 3063 local_deleted.Put(IS_DIR, false);
3048 local_deleted.Put(IS_UNSYNCED, true); 3064 local_deleted.Put(IS_UNSYNCED, true);
3049 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics()); 3065 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics());
3050 } 3066 }
3051 3067
3052 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10); 3068 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10);
3053 3069
3054 // We don't care about actually committing, just the resolution. 3070 // We don't care about actually committing, just the resolution.
3055 mock_server_->set_conflict_all_commits(true); 3071 mock_server_->set_conflict_all_commits(true);
3056 SyncShareAsDelegate(); 3072 SyncShareNudge();
3057 3073
3058 { 3074 {
3059 ReadTransaction trans(FROM_HERE, directory()); 3075 ReadTransaction trans(FROM_HERE, directory());
3060 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); 3076 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1));
3061 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 10); 3077 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 10);
3062 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false); 3078 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false);
3063 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true); 3079 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true);
3064 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true); 3080 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true);
3065 EXPECT_TRUE(local_deleted.Get(IS_DIR) == false); 3081 EXPECT_TRUE(local_deleted.Get(IS_DIR) == false);
3066 } 3082 }
(...skipping 15 matching lines...) Expand all
3082 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics()); 3098 local_deleted.Put(SPECIFICS, DefaultBookmarkSpecifics());
3083 } 3099 }
3084 3100
3085 // Server update: entry-type object (not a container), revision 10. 3101 // Server update: entry-type object (not a container), revision 10.
3086 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10); 3102 mock_server_->AddUpdateBookmark(ids_.FromNumber(1), root_id_, "name", 10, 10);
3087 3103
3088 // Don't attempt to commit. 3104 // Don't attempt to commit.
3089 mock_server_->set_conflict_all_commits(true); 3105 mock_server_->set_conflict_all_commits(true);
3090 3106
3091 // The syncer should not attempt to apply the invalid update. 3107 // The syncer should not attempt to apply the invalid update.
3092 SyncShareAsDelegate(); 3108 SyncShareNudge();
3093 3109
3094 { 3110 {
3095 ReadTransaction trans(FROM_HERE, directory()); 3111 ReadTransaction trans(FROM_HERE, directory());
3096 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1)); 3112 Entry local_deleted(&trans, GET_BY_ID, ids_.FromNumber(1));
3097 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 1); 3113 EXPECT_TRUE(local_deleted.Get(BASE_VERSION) == 1);
3098 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false); 3114 EXPECT_TRUE(local_deleted.Get(IS_UNAPPLIED_UPDATE) == false);
3099 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true); 3115 EXPECT_TRUE(local_deleted.Get(IS_UNSYNCED) == true);
3100 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true); 3116 EXPECT_TRUE(local_deleted.Get(IS_DEL) == true);
3101 EXPECT_TRUE(local_deleted.Get(IS_DIR) == true); 3117 EXPECT_TRUE(local_deleted.Get(IS_DIR) == true);
3102 } 3118 }
3103 } 3119 }
3104 3120
3105 // Bug Synopsis: 3121 // Bug Synopsis:
3106 // Merge conflict resolution will merge a new local entry with another entry 3122 // Merge conflict resolution will merge a new local entry with another entry
3107 // that needs updates, resulting in CHECK. 3123 // that needs updates, resulting in CHECK.
3108 TEST_F(SyncerTest, MergingExistingItems) { 3124 TEST_F(SyncerTest, MergingExistingItems) {
3109 mock_server_->set_conflict_all_commits(true); 3125 mock_server_->set_conflict_all_commits(true);
3110 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10); 3126 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10);
3111 SyncShareAsDelegate(); 3127 SyncShareNudge();
3112 { 3128 {
3113 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3129 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3114 MutableEntry entry(&trans, CREATE, trans.root_id(), "Copy of base"); 3130 MutableEntry entry(&trans, CREATE, trans.root_id(), "Copy of base");
3115 WriteTestDataToEntry(&trans, &entry); 3131 WriteTestDataToEntry(&trans, &entry);
3116 } 3132 }
3117 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50); 3133 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50);
3118 SyncRepeatedlyToTriggerConflictResolution(session_.get()); 3134 SyncRepeatedlyToTriggerConflictResolution(session_.get());
3119 } 3135 }
3120 3136
3121 // In this test a long changelog contains a child at the start of the changelog 3137 // In this test a long changelog contains a child at the start of the changelog
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 EXPECT_EQ(entry.Get(ID), child.Get(PARENT_ID)); 3185 EXPECT_EQ(entry.Get(ID), child.Get(PARENT_ID));
3170 EXPECT_EQ("stuck", child.Get(NON_UNIQUE_NAME)); 3186 EXPECT_EQ("stuck", child.Get(NON_UNIQUE_NAME));
3171 EXPECT_TRUE(child.good()); 3187 EXPECT_TRUE(child.good());
3172 } 3188 }
3173 } 3189 }
3174 3190
3175 TEST_F(SyncerTest, DontMergeTwoExistingItems) { 3191 TEST_F(SyncerTest, DontMergeTwoExistingItems) {
3176 mock_server_->set_conflict_all_commits(true); 3192 mock_server_->set_conflict_all_commits(true);
3177 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10); 3193 mock_server_->AddUpdateBookmark(1, 0, "base", 10, 10);
3178 mock_server_->AddUpdateBookmark(2, 0, "base2", 10, 10); 3194 mock_server_->AddUpdateBookmark(2, 0, "base2", 10, 10);
3179 SyncShareAsDelegate(); 3195 SyncShareNudge();
3180 { 3196 {
3181 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3197 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3182 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3198 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
3183 ASSERT_TRUE(entry.good()); 3199 ASSERT_TRUE(entry.good());
3184 EXPECT_TRUE(entry.Put(NON_UNIQUE_NAME, "Copy of base")); 3200 EXPECT_TRUE(entry.Put(NON_UNIQUE_NAME, "Copy of base"));
3185 entry.Put(IS_UNSYNCED, true); 3201 entry.Put(IS_UNSYNCED, true);
3186 } 3202 }
3187 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50); 3203 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50);
3188 SyncRepeatedlyToTriggerConflictResolution(session_.get()); 3204 SyncRepeatedlyToTriggerConflictResolution(session_.get());
3189 { 3205 {
3190 ReadTransaction trans(FROM_HERE, directory()); 3206 ReadTransaction trans(FROM_HERE, directory());
3191 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1)); 3207 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1));
3192 EXPECT_FALSE(entry1.Get(IS_UNAPPLIED_UPDATE)); 3208 EXPECT_FALSE(entry1.Get(IS_UNAPPLIED_UPDATE));
3193 EXPECT_FALSE(entry1.Get(IS_UNSYNCED)); 3209 EXPECT_FALSE(entry1.Get(IS_UNSYNCED));
3194 EXPECT_FALSE(entry1.Get(IS_DEL)); 3210 EXPECT_FALSE(entry1.Get(IS_DEL));
3195 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2)); 3211 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2));
3196 EXPECT_FALSE(entry2.Get(IS_UNAPPLIED_UPDATE)); 3212 EXPECT_FALSE(entry2.Get(IS_UNAPPLIED_UPDATE));
3197 EXPECT_TRUE(entry2.Get(IS_UNSYNCED)); 3213 EXPECT_TRUE(entry2.Get(IS_UNSYNCED));
3198 EXPECT_FALSE(entry2.Get(IS_DEL)); 3214 EXPECT_FALSE(entry2.Get(IS_DEL));
3199 EXPECT_EQ(entry1.Get(NON_UNIQUE_NAME), entry2.Get(NON_UNIQUE_NAME)); 3215 EXPECT_EQ(entry1.Get(NON_UNIQUE_NAME), entry2.Get(NON_UNIQUE_NAME));
3200 } 3216 }
3201 } 3217 }
3202 3218
3203 TEST_F(SyncerTest, TestUndeleteUpdate) { 3219 TEST_F(SyncerTest, TestUndeleteUpdate) {
3204 mock_server_->set_conflict_all_commits(true); 3220 mock_server_->set_conflict_all_commits(true);
3205 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1); 3221 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1);
3206 mock_server_->AddUpdateDirectory(2, 1, "bar", 1, 2); 3222 mock_server_->AddUpdateDirectory(2, 1, "bar", 1, 2);
3207 SyncShareAsDelegate(); 3223 SyncShareNudge();
3208 mock_server_->AddUpdateDirectory(2, 1, "bar", 2, 3); 3224 mock_server_->AddUpdateDirectory(2, 1, "bar", 2, 3);
3209 mock_server_->SetLastUpdateDeleted(); 3225 mock_server_->SetLastUpdateDeleted();
3210 SyncShareAsDelegate(); 3226 SyncShareNudge();
3211 3227
3212 int64 metahandle; 3228 int64 metahandle;
3213 { 3229 {
3214 ReadTransaction trans(FROM_HERE, directory()); 3230 ReadTransaction trans(FROM_HERE, directory());
3215 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3231 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
3216 ASSERT_TRUE(entry.good()); 3232 ASSERT_TRUE(entry.good());
3217 EXPECT_TRUE(entry.Get(IS_DEL)); 3233 EXPECT_TRUE(entry.Get(IS_DEL));
3218 metahandle = entry.Get(META_HANDLE); 3234 metahandle = entry.Get(META_HANDLE);
3219 } 3235 }
3220 mock_server_->AddUpdateDirectory(1, 0, "foo", 2, 4); 3236 mock_server_->AddUpdateDirectory(1, 0, "foo", 2, 4);
3221 mock_server_->SetLastUpdateDeleted(); 3237 mock_server_->SetLastUpdateDeleted();
3222 SyncShareAsDelegate(); 3238 SyncShareNudge();
3223 // This used to be rejected as it's an undeletion. Now, it results in moving 3239 // This used to be rejected as it's an undeletion. Now, it results in moving
3224 // the delete path aside. 3240 // the delete path aside.
3225 mock_server_->AddUpdateDirectory(2, 1, "bar", 3, 5); 3241 mock_server_->AddUpdateDirectory(2, 1, "bar", 3, 5);
3226 SyncShareAsDelegate(); 3242 SyncShareNudge();
3227 { 3243 {
3228 ReadTransaction trans(FROM_HERE, directory()); 3244 ReadTransaction trans(FROM_HERE, directory());
3229 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3245 Entry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
3230 ASSERT_TRUE(entry.good()); 3246 ASSERT_TRUE(entry.good());
3231 EXPECT_TRUE(entry.Get(IS_DEL)); 3247 EXPECT_TRUE(entry.Get(IS_DEL));
3232 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); 3248 EXPECT_FALSE(entry.Get(SERVER_IS_DEL));
3233 EXPECT_TRUE(entry.Get(IS_UNAPPLIED_UPDATE)); 3249 EXPECT_TRUE(entry.Get(IS_UNAPPLIED_UPDATE));
3234 EXPECT_NE(entry.Get(META_HANDLE), metahandle); 3250 EXPECT_NE(entry.Get(META_HANDLE), metahandle);
3235 } 3251 }
3236 } 3252 }
3237 3253
3238 TEST_F(SyncerTest, TestMoveSanitizedNamedFolder) { 3254 TEST_F(SyncerTest, TestMoveSanitizedNamedFolder) {
3239 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1); 3255 mock_server_->AddUpdateDirectory(1, 0, "foo", 1, 1);
3240 mock_server_->AddUpdateDirectory(2, 0, ":::", 1, 2); 3256 mock_server_->AddUpdateDirectory(2, 0, ":::", 1, 2);
3241 SyncShareAsDelegate(); 3257 SyncShareNudge();
3242 { 3258 {
3243 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3259 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3244 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); 3260 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2));
3245 ASSERT_TRUE(entry.good()); 3261 ASSERT_TRUE(entry.good());
3246 EXPECT_TRUE(entry.Put(PARENT_ID, ids_.FromNumber(1))); 3262 EXPECT_TRUE(entry.Put(PARENT_ID, ids_.FromNumber(1)));
3247 EXPECT_TRUE(entry.Put(IS_UNSYNCED, true)); 3263 EXPECT_TRUE(entry.Put(IS_UNSYNCED, true));
3248 } 3264 }
3249 SyncShareAsDelegate(); 3265 SyncShareNudge();
3250 // We use the same sync ts as before so our times match up. 3266 // We use the same sync ts as before so our times match up.
3251 mock_server_->AddUpdateDirectory(2, 1, ":::", 2, 2); 3267 mock_server_->AddUpdateDirectory(2, 1, ":::", 2, 2);
3252 SyncShareAsDelegate(); 3268 SyncShareNudge();
3253 } 3269 }
3254 3270
3255 // Don't crash when this occurs. 3271 // Don't crash when this occurs.
3256 TEST_F(SyncerTest, UpdateWhereParentIsNotAFolder) { 3272 TEST_F(SyncerTest, UpdateWhereParentIsNotAFolder) {
3257 mock_server_->AddUpdateBookmark(1, 0, "B", 10, 10); 3273 mock_server_->AddUpdateBookmark(1, 0, "B", 10, 10);
3258 mock_server_->AddUpdateDirectory(2, 1, "BookmarkParent", 10, 10); 3274 mock_server_->AddUpdateDirectory(2, 1, "BookmarkParent", 10, 10);
3259 // Used to cause a CHECK 3275 // Used to cause a CHECK
3260 SyncShareAsDelegate(); 3276 SyncShareNudge();
3261 { 3277 {
3262 ReadTransaction rtrans(FROM_HERE, directory()); 3278 ReadTransaction rtrans(FROM_HERE, directory());
3263 Entry good_entry(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); 3279 Entry good_entry(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1));
3264 ASSERT_TRUE(good_entry.good()); 3280 ASSERT_TRUE(good_entry.good());
3265 EXPECT_FALSE(good_entry.Get(IS_UNAPPLIED_UPDATE)); 3281 EXPECT_FALSE(good_entry.Get(IS_UNAPPLIED_UPDATE));
3266 Entry bad_parent(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2)); 3282 Entry bad_parent(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(2));
3267 ASSERT_TRUE(bad_parent.good()); 3283 ASSERT_TRUE(bad_parent.good());
3268 EXPECT_TRUE(bad_parent.Get(IS_UNAPPLIED_UPDATE)); 3284 EXPECT_TRUE(bad_parent.Get(IS_UNAPPLIED_UPDATE));
3269 } 3285 }
3270 } 3286 }
3271 3287
3272 const char kRootId[] = "0"; 3288 const char kRootId[] = "0";
3273 3289
3274 TEST_F(SyncerTest, DirectoryUpdateTest) { 3290 TEST_F(SyncerTest, DirectoryUpdateTest) {
3275 Id in_root_id = ids_.NewServerId(); 3291 Id in_root_id = ids_.NewServerId();
3276 Id in_in_root_id = ids_.NewServerId(); 3292 Id in_in_root_id = ids_.NewServerId();
3277 3293
3278 mock_server_->AddUpdateDirectory(in_root_id, TestIdFactory::root(), 3294 mock_server_->AddUpdateDirectory(in_root_id, TestIdFactory::root(),
3279 "in_root_name", 2, 2); 3295 "in_root_name", 2, 2);
3280 mock_server_->AddUpdateDirectory(in_in_root_id, in_root_id, 3296 mock_server_->AddUpdateDirectory(in_in_root_id, in_root_id,
3281 "in_in_root_name", 3, 3); 3297 "in_in_root_name", 3, 3);
3282 SyncShareAsDelegate(); 3298 SyncShareNudge();
3283 { 3299 {
3284 ReadTransaction trans(FROM_HERE, directory()); 3300 ReadTransaction trans(FROM_HERE, directory());
3285 Entry in_root(&trans, GET_BY_ID, in_root_id); 3301 Entry in_root(&trans, GET_BY_ID, in_root_id);
3286 ASSERT_TRUE(in_root.good()); 3302 ASSERT_TRUE(in_root.good());
3287 EXPECT_EQ("in_root_name", in_root.Get(NON_UNIQUE_NAME)); 3303 EXPECT_EQ("in_root_name", in_root.Get(NON_UNIQUE_NAME));
3288 EXPECT_EQ(TestIdFactory::root(), in_root.Get(PARENT_ID)); 3304 EXPECT_EQ(TestIdFactory::root(), in_root.Get(PARENT_ID));
3289 3305
3290 Entry in_in_root(&trans, GET_BY_ID, in_in_root_id); 3306 Entry in_in_root(&trans, GET_BY_ID, in_in_root_id);
3291 ASSERT_TRUE(in_in_root.good()); 3307 ASSERT_TRUE(in_in_root.good());
3292 EXPECT_EQ("in_in_root_name", in_in_root.Get(NON_UNIQUE_NAME)); 3308 EXPECT_EQ("in_in_root_name", in_in_root.Get(NON_UNIQUE_NAME));
(...skipping 17 matching lines...) Expand all
3310 foo_metahandle = parent.Get(META_HANDLE); 3326 foo_metahandle = parent.Get(META_HANDLE);
3311 3327
3312 MutableEntry child(&wtrans, syncable::CREATE, parent.Get(ID), "bar"); 3328 MutableEntry child(&wtrans, syncable::CREATE, parent.Get(ID), "bar");
3313 ASSERT_TRUE(child.good()); 3329 ASSERT_TRUE(child.good());
3314 child.Put(syncable::IS_UNSYNCED, true); 3330 child.Put(syncable::IS_UNSYNCED, true);
3315 child.Put(syncable::IS_DIR, true); 3331 child.Put(syncable::IS_DIR, true);
3316 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics()); 3332 child.Put(syncable::SPECIFICS, DefaultBookmarkSpecifics());
3317 bar_metahandle = child.Get(META_HANDLE); 3333 bar_metahandle = child.Get(META_HANDLE);
3318 in_dir_id = parent.Get(syncable::ID); 3334 in_dir_id = parent.Get(syncable::ID);
3319 } 3335 }
3320 SyncShareAsDelegate(); 3336 SyncShareNudge();
3321 { 3337 {
3322 ReadTransaction trans(FROM_HERE, directory()); 3338 ReadTransaction trans(FROM_HERE, directory());
3323 Entry fail_by_old_id_entry(&trans, GET_BY_ID, in_root_id); 3339 Entry fail_by_old_id_entry(&trans, GET_BY_ID, in_root_id);
3324 ASSERT_FALSE(fail_by_old_id_entry.good()); 3340 ASSERT_FALSE(fail_by_old_id_entry.good());
3325 3341
3326 Entry foo_entry(&trans, GET_BY_HANDLE, foo_metahandle); 3342 Entry foo_entry(&trans, GET_BY_HANDLE, foo_metahandle);
3327 ASSERT_TRUE(foo_entry.good()); 3343 ASSERT_TRUE(foo_entry.good());
3328 EXPECT_EQ("foo", foo_entry.Get(NON_UNIQUE_NAME)); 3344 EXPECT_EQ("foo", foo_entry.Get(NON_UNIQUE_NAME));
3329 EXPECT_NE(foo_entry.Get(syncable::ID), in_root_id); 3345 EXPECT_NE(foo_entry.Get(syncable::ID), in_root_id);
3330 3346
3331 Entry bar_entry(&trans, GET_BY_HANDLE, bar_metahandle); 3347 Entry bar_entry(&trans, GET_BY_HANDLE, bar_metahandle);
3332 ASSERT_TRUE(bar_entry.good()); 3348 ASSERT_TRUE(bar_entry.good());
3333 EXPECT_EQ("bar", bar_entry.Get(NON_UNIQUE_NAME)); 3349 EXPECT_EQ("bar", bar_entry.Get(NON_UNIQUE_NAME));
3334 EXPECT_NE(bar_entry.Get(syncable::ID), in_dir_id); 3350 EXPECT_NE(bar_entry.Get(syncable::ID), in_dir_id);
3335 EXPECT_EQ(foo_entry.Get(syncable::ID), bar_entry.Get(PARENT_ID)); 3351 EXPECT_EQ(foo_entry.Get(syncable::ID), bar_entry.Get(PARENT_ID));
3336 } 3352 }
3337 } 3353 }
3338 3354
3339 TEST_F(SyncerTest, TestClientCommand) { 3355 TEST_F(SyncerTest, TestClientCommand) {
3340 using sync_pb::ClientCommand; 3356 using sync_pb::ClientCommand;
3341 3357
3342 ClientCommand* command = mock_server_->GetNextClientCommand(); 3358 ClientCommand* command = mock_server_->GetNextClientCommand();
3343 command->set_set_sync_poll_interval(8); 3359 command->set_set_sync_poll_interval(8);
3344 command->set_set_sync_long_poll_interval(800); 3360 command->set_set_sync_long_poll_interval(800);
3345 command->set_sessions_commit_delay_seconds(3141); 3361 command->set_sessions_commit_delay_seconds(3141);
3346 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1); 3362 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1);
3347 SyncShareAsDelegate(); 3363 SyncShareNudge();
3348 3364
3349 EXPECT_TRUE(TimeDelta::FromSeconds(8) == 3365 EXPECT_TRUE(TimeDelta::FromSeconds(8) ==
3350 last_short_poll_interval_received_); 3366 last_short_poll_interval_received_);
3351 EXPECT_TRUE(TimeDelta::FromSeconds(800) == 3367 EXPECT_TRUE(TimeDelta::FromSeconds(800) ==
3352 last_long_poll_interval_received_); 3368 last_long_poll_interval_received_);
3353 EXPECT_TRUE(TimeDelta::FromSeconds(3141) == 3369 EXPECT_TRUE(TimeDelta::FromSeconds(3141) ==
3354 last_sessions_commit_delay_seconds_); 3370 last_sessions_commit_delay_seconds_);
3355 3371
3356 command = mock_server_->GetNextClientCommand(); 3372 command = mock_server_->GetNextClientCommand();
3357 command->set_set_sync_poll_interval(180); 3373 command->set_set_sync_poll_interval(180);
3358 command->set_set_sync_long_poll_interval(190); 3374 command->set_set_sync_long_poll_interval(190);
3359 command->set_sessions_commit_delay_seconds(2718); 3375 command->set_sessions_commit_delay_seconds(2718);
3360 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1); 3376 mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1);
3361 SyncShareAsDelegate(); 3377 SyncShareNudge();
3362 3378
3363 EXPECT_TRUE(TimeDelta::FromSeconds(180) == 3379 EXPECT_TRUE(TimeDelta::FromSeconds(180) ==
3364 last_short_poll_interval_received_); 3380 last_short_poll_interval_received_);
3365 EXPECT_TRUE(TimeDelta::FromSeconds(190) == 3381 EXPECT_TRUE(TimeDelta::FromSeconds(190) ==
3366 last_long_poll_interval_received_); 3382 last_long_poll_interval_received_);
3367 EXPECT_TRUE(TimeDelta::FromSeconds(2718) == 3383 EXPECT_TRUE(TimeDelta::FromSeconds(2718) ==
3368 last_sessions_commit_delay_seconds_); 3384 last_sessions_commit_delay_seconds_);
3369 } 3385 }
3370 3386
3371 TEST_F(SyncerTest, EnsureWeSendUpOldParent) { 3387 TEST_F(SyncerTest, EnsureWeSendUpOldParent) {
3372 syncable::Id folder_one_id = ids_.FromNumber(1); 3388 syncable::Id folder_one_id = ids_.FromNumber(1);
3373 syncable::Id folder_two_id = ids_.FromNumber(2); 3389 syncable::Id folder_two_id = ids_.FromNumber(2);
3374 3390
3375 mock_server_->AddUpdateDirectory(folder_one_id, TestIdFactory::root(), 3391 mock_server_->AddUpdateDirectory(folder_one_id, TestIdFactory::root(),
3376 "folder_one", 1, 1); 3392 "folder_one", 1, 1);
3377 mock_server_->AddUpdateDirectory(folder_two_id, TestIdFactory::root(), 3393 mock_server_->AddUpdateDirectory(folder_two_id, TestIdFactory::root(),
3378 "folder_two", 1, 1); 3394 "folder_two", 1, 1);
3379 SyncShareAsDelegate(); 3395 SyncShareNudge();
3380 { 3396 {
3381 // A moved entry should send an "old parent." 3397 // A moved entry should send an "old parent."
3382 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 3398 WriteTransaction trans(FROM_HERE, UNITTEST, directory());
3383 MutableEntry entry(&trans, GET_BY_ID, folder_one_id); 3399 MutableEntry entry(&trans, GET_BY_ID, folder_one_id);
3384 ASSERT_TRUE(entry.good()); 3400 ASSERT_TRUE(entry.good());
3385 entry.Put(PARENT_ID, folder_two_id); 3401 entry.Put(PARENT_ID, folder_two_id);
3386 entry.Put(IS_UNSYNCED, true); 3402 entry.Put(IS_UNSYNCED, true);
3387 // A new entry should send no "old parent." 3403 // A new entry should send no "old parent."
3388 MutableEntry create(&trans, CREATE, trans.root_id(), "new_folder"); 3404 MutableEntry create(&trans, CREATE, trans.root_id(), "new_folder");
3389 create.Put(IS_UNSYNCED, true); 3405 create.Put(IS_UNSYNCED, true);
3390 create.Put(SPECIFICS, DefaultBookmarkSpecifics()); 3406 create.Put(SPECIFICS, DefaultBookmarkSpecifics());
3391 } 3407 }
3392 SyncShareAsDelegate(); 3408 SyncShareNudge();
3393 const sync_pb::CommitMessage& commit = mock_server_->last_sent_commit(); 3409 const sync_pb::CommitMessage& commit = mock_server_->last_sent_commit();
3394 ASSERT_EQ(2, commit.entries_size()); 3410 ASSERT_EQ(2, commit.entries_size());
3395 EXPECT_TRUE(commit.entries(0).parent_id_string() == "2"); 3411 EXPECT_TRUE(commit.entries(0).parent_id_string() == "2");
3396 EXPECT_TRUE(commit.entries(0).old_parent_id() == "0"); 3412 EXPECT_TRUE(commit.entries(0).old_parent_id() == "0");
3397 EXPECT_FALSE(commit.entries(1).has_old_parent_id()); 3413 EXPECT_FALSE(commit.entries(1).has_old_parent_id());
3398 } 3414 }
3399 3415
3400 TEST_F(SyncerTest, Test64BitVersionSupport) { 3416 TEST_F(SyncerTest, Test64BitVersionSupport) {
3401 int64 really_big_int = std::numeric_limits<int64>::max() - 12; 3417 int64 really_big_int = std::numeric_limits<int64>::max() - 12;
3402 const string name("ringo's dang orang ran rings around my o-ring"); 3418 const string name("ringo's dang orang ran rings around my o-ring");
(...skipping 14 matching lines...) Expand all
3417 Entry entry(&rtrans, syncable::GET_BY_HANDLE, item_metahandle); 3433 Entry entry(&rtrans, syncable::GET_BY_HANDLE, item_metahandle);
3418 ASSERT_TRUE(entry.good()); 3434 ASSERT_TRUE(entry.good());
3419 EXPECT_TRUE(really_big_int == entry.Get(syncable::BASE_VERSION)); 3435 EXPECT_TRUE(really_big_int == entry.Get(syncable::BASE_VERSION));
3420 } 3436 }
3421 3437
3422 TEST_F(SyncerTest, TestSimpleUndelete) { 3438 TEST_F(SyncerTest, TestSimpleUndelete) {
3423 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); 3439 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root();
3424 mock_server_->set_conflict_all_commits(true); 3440 mock_server_->set_conflict_all_commits(true);
3425 // Let there be an entry from the server. 3441 // Let there be an entry from the server.
3426 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10); 3442 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10);
3427 SyncShareAsDelegate(); 3443 SyncShareNudge();
3428 // Check it out and delete it. 3444 // Check it out and delete it.
3429 { 3445 {
3430 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3446 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3431 MutableEntry entry(&wtrans, GET_BY_ID, id); 3447 MutableEntry entry(&wtrans, GET_BY_ID, id);
3432 ASSERT_TRUE(entry.good()); 3448 ASSERT_TRUE(entry.good());
3433 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3449 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3434 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3450 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3435 EXPECT_FALSE(entry.Get(IS_DEL)); 3451 EXPECT_FALSE(entry.Get(IS_DEL));
3436 // Delete it locally. 3452 // Delete it locally.
3437 entry.Put(IS_DEL, true); 3453 entry.Put(IS_DEL, true);
3438 } 3454 }
3439 SyncShareAsDelegate(); 3455 SyncShareNudge();
3440 // Confirm we see IS_DEL and not SERVER_IS_DEL. 3456 // Confirm we see IS_DEL and not SERVER_IS_DEL.
3441 { 3457 {
3442 ReadTransaction trans(FROM_HERE, directory()); 3458 ReadTransaction trans(FROM_HERE, directory());
3443 Entry entry(&trans, GET_BY_ID, id); 3459 Entry entry(&trans, GET_BY_ID, id);
3444 ASSERT_TRUE(entry.good()); 3460 ASSERT_TRUE(entry.good());
3445 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3461 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3446 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3462 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3447 EXPECT_TRUE(entry.Get(IS_DEL)); 3463 EXPECT_TRUE(entry.Get(IS_DEL));
3448 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); 3464 EXPECT_FALSE(entry.Get(SERVER_IS_DEL));
3449 } 3465 }
3450 SyncShareAsDelegate(); 3466 SyncShareNudge();
3451 // Update from server confirming deletion. 3467 // Update from server confirming deletion.
3452 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 11); 3468 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 11);
3453 mock_server_->SetLastUpdateDeleted(); 3469 mock_server_->SetLastUpdateDeleted();
3454 SyncShareAsDelegate(); 3470 SyncShareNudge();
3455 // IS_DEL AND SERVER_IS_DEL now both true. 3471 // IS_DEL AND SERVER_IS_DEL now both true.
3456 { 3472 {
3457 ReadTransaction trans(FROM_HERE, directory()); 3473 ReadTransaction trans(FROM_HERE, directory());
3458 Entry entry(&trans, GET_BY_ID, id); 3474 Entry entry(&trans, GET_BY_ID, id);
3459 ASSERT_TRUE(entry.good()); 3475 ASSERT_TRUE(entry.good());
3460 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3476 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3461 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3477 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3462 EXPECT_TRUE(entry.Get(IS_DEL)); 3478 EXPECT_TRUE(entry.Get(IS_DEL));
3463 EXPECT_TRUE(entry.Get(SERVER_IS_DEL)); 3479 EXPECT_TRUE(entry.Get(SERVER_IS_DEL));
3464 } 3480 }
3465 // Undelete from server. 3481 // Undelete from server.
3466 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12); 3482 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12);
3467 SyncShareAsDelegate(); 3483 SyncShareNudge();
3468 // IS_DEL and SERVER_IS_DEL now both false. 3484 // IS_DEL and SERVER_IS_DEL now both false.
3469 { 3485 {
3470 ReadTransaction trans(FROM_HERE, directory()); 3486 ReadTransaction trans(FROM_HERE, directory());
3471 Entry entry(&trans, GET_BY_ID, id); 3487 Entry entry(&trans, GET_BY_ID, id);
3472 ASSERT_TRUE(entry.good()); 3488 ASSERT_TRUE(entry.good());
3473 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3489 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3474 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3490 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3475 EXPECT_FALSE(entry.Get(IS_DEL)); 3491 EXPECT_FALSE(entry.Get(IS_DEL));
3476 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); 3492 EXPECT_FALSE(entry.Get(SERVER_IS_DEL));
3477 } 3493 }
3478 } 3494 }
3479 3495
3480 TEST_F(SyncerTest, TestUndeleteWithMissingDeleteUpdate) { 3496 TEST_F(SyncerTest, TestUndeleteWithMissingDeleteUpdate) {
3481 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root(); 3497 Id id = ids_.MakeServer("undeletion item"), root = TestIdFactory::root();
3482 // Let there be a entry, from the server. 3498 // Let there be a entry, from the server.
3483 mock_server_->set_conflict_all_commits(true); 3499 mock_server_->set_conflict_all_commits(true);
3484 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10); 3500 mock_server_->AddUpdateBookmark(id, root, "foo", 1, 10);
3485 SyncShareAsDelegate(); 3501 SyncShareNudge();
3486 // Check it out and delete it. 3502 // Check it out and delete it.
3487 { 3503 {
3488 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); 3504 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory());
3489 MutableEntry entry(&wtrans, GET_BY_ID, id); 3505 MutableEntry entry(&wtrans, GET_BY_ID, id);
3490 ASSERT_TRUE(entry.good()); 3506 ASSERT_TRUE(entry.good());
3491 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3507 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3492 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3508 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3493 EXPECT_FALSE(entry.Get(IS_DEL)); 3509 EXPECT_FALSE(entry.Get(IS_DEL));
3494 // Delete it locally. 3510 // Delete it locally.
3495 entry.Put(IS_DEL, true); 3511 entry.Put(IS_DEL, true);
3496 } 3512 }
3497 SyncShareAsDelegate(); 3513 SyncShareNudge();
3498 // Confirm we see IS_DEL and not SERVER_IS_DEL. 3514 // Confirm we see IS_DEL and not SERVER_IS_DEL.
3499 { 3515 {
3500 ReadTransaction trans(FROM_HERE, directory()); 3516 ReadTransaction trans(FROM_HERE, directory());
3501 Entry entry(&trans, GET_BY_ID, id); 3517 Entry entry(&trans, GET_BY_ID, id);
3502 ASSERT_TRUE(entry.good()); 3518 ASSERT_TRUE(entry.good());
3503 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3519 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3504 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3520 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3505 EXPECT_TRUE(entry.Get(IS_DEL)); 3521 EXPECT_TRUE(entry.Get(IS_DEL));
3506 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); 3522 EXPECT_FALSE(entry.Get(SERVER_IS_DEL));
3507 } 3523 }
3508 SyncShareAsDelegate(); 3524 SyncShareNudge();
3509 // Say we do not get an update from server confirming deletion. Undelete 3525 // Say we do not get an update from server confirming deletion. Undelete
3510 // from server 3526 // from server
3511 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12); 3527 mock_server_->AddUpdateBookmark(id, root, "foo", 2, 12);
3512 SyncShareAsDelegate(); 3528 SyncShareNudge();
3513 // IS_DEL and SERVER_IS_DEL now both false. 3529 // IS_DEL and SERVER_IS_DEL now both false.
3514 { 3530 {
3515 ReadTransaction trans(FROM_HERE, directory()); 3531 ReadTransaction trans(FROM_HERE, directory());
3516 Entry entry(&trans, GET_BY_ID, id); 3532 Entry entry(&trans, GET_BY_ID, id);
3517 ASSERT_TRUE(entry.good()); 3533 ASSERT_TRUE(entry.good());
3518 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE)); 3534 EXPECT_FALSE(entry.Get(IS_UNAPPLIED_UPDATE));
3519 EXPECT_FALSE(entry.Get(IS_UNSYNCED)); 3535 EXPECT_FALSE(entry.Get(IS_UNSYNCED));
3520 EXPECT_FALSE(entry.Get(IS_DEL)); 3536 EXPECT_FALSE(entry.Get(IS_DEL));
3521 EXPECT_FALSE(entry.Get(SERVER_IS_DEL)); 3537 EXPECT_FALSE(entry.Get(SERVER_IS_DEL));
3522 } 3538 }
3523 } 3539 }
3524 3540
3525 TEST_F(SyncerTest, TestUndeleteIgnoreCorrectlyUnappliedUpdate) { 3541 TEST_F(SyncerTest, TestUndeleteIgnoreCorrectlyUnappliedUpdate) {
3526 Id id1 = ids_.MakeServer("first"), id2 = ids_.MakeServer("second"); 3542 Id id1 = ids_.MakeServer("first"), id2 = ids_.MakeServer("second");
3527 Id root = TestIdFactory::root(); 3543 Id root = TestIdFactory::root();
3528 // Duplicate! expect path clashing! 3544 // Duplicate! expect path clashing!
3529 mock_server_->set_conflict_all_commits(true); 3545 mock_server_->set_conflict_all_commits(true);
3530 mock_server_->AddUpdateBookmark(id1, root, "foo", 1, 10); 3546 mock_server_->AddUpdateBookmark(id1, root, "foo", 1, 10);
3531 mock_server_->AddUpdateBookmark(id2, root, "foo", 1, 10); 3547 mock_server_->AddUpdateBookmark(id2, root, "foo", 1, 10);
3532 SyncShareAsDelegate(); 3548 SyncShareNudge();
3533 mock_server_->AddUpdateBookmark(id2, root, "foo2", 2, 20); 3549 mock_server_->AddUpdateBookmark(id2, root, "foo2", 2, 20);
3534 SyncShareAsDelegate(); // Now just don't explode. 3550 SyncShareNudge(); // Now just don't explode.
3535 } 3551 }
3536 3552
3537 TEST_F(SyncerTest, ClientTagServerCreatedUpdatesWork) { 3553 TEST_F(SyncerTest, ClientTagServerCreatedUpdatesWork) {
3538 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10); 3554 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10);
3539 mock_server_->SetLastUpdateClientTag("permfolder"); 3555 mock_server_->SetLastUpdateClientTag("permfolder");
3540 3556
3541 SyncShareAsDelegate(); 3557 SyncShareNudge();
3542 3558
3543 { 3559 {
3544 ReadTransaction trans(FROM_HERE, directory()); 3560 ReadTransaction trans(FROM_HERE, directory());
3545 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); 3561 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder");
3546 ASSERT_TRUE(perm_folder.good()); 3562 ASSERT_TRUE(perm_folder.good());
3547 EXPECT_FALSE(perm_folder.Get(IS_DEL)); 3563 EXPECT_FALSE(perm_folder.Get(IS_DEL));
3548 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); 3564 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE));
3549 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); 3565 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED));
3550 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); 3566 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder");
3551 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem1"); 3567 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem1");
3552 } 3568 }
3553 3569
3554 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); 3570 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100);
3555 mock_server_->SetLastUpdateClientTag("permfolder"); 3571 mock_server_->SetLastUpdateClientTag("permfolder");
3556 SyncShareAsDelegate(); 3572 SyncShareNudge();
3557 3573
3558 { 3574 {
3559 ReadTransaction trans(FROM_HERE, directory()); 3575 ReadTransaction trans(FROM_HERE, directory());
3560 3576
3561 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); 3577 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder");
3562 ASSERT_TRUE(perm_folder.good()); 3578 ASSERT_TRUE(perm_folder.good());
3563 EXPECT_FALSE(perm_folder.Get(IS_DEL)); 3579 EXPECT_FALSE(perm_folder.Get(IS_DEL));
3564 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); 3580 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE));
3565 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); 3581 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED));
3566 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); 3582 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder");
3567 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem_renamed"); 3583 EXPECT_EQ(perm_folder.Get(NON_UNIQUE_NAME), "permitem_renamed");
3568 } 3584 }
3569 } 3585 }
3570 3586
3571 TEST_F(SyncerTest, ClientTagIllegalUpdateIgnored) { 3587 TEST_F(SyncerTest, ClientTagIllegalUpdateIgnored) {
3572 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10); 3588 mock_server_->AddUpdateDirectory(1, 0, "permitem1", 1, 10);
3573 mock_server_->SetLastUpdateClientTag("permfolder"); 3589 mock_server_->SetLastUpdateClientTag("permfolder");
3574 3590
3575 SyncShareAsDelegate(); 3591 SyncShareNudge();
3576 3592
3577 { 3593 {
3578 ReadTransaction trans(FROM_HERE, directory()); 3594 ReadTransaction trans(FROM_HERE, directory());
3579 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder"); 3595 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "permfolder");
3580 ASSERT_TRUE(perm_folder.good()); 3596 ASSERT_TRUE(perm_folder.good());
3581 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); 3597 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE));
3582 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); 3598 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED));
3583 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder"); 3599 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "permfolder");
3584 EXPECT_TRUE(perm_folder.Get(NON_UNIQUE_NAME) == "permitem1"); 3600 EXPECT_TRUE(perm_folder.Get(NON_UNIQUE_NAME) == "permitem1");
3585 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); 3601 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows());
3586 } 3602 }
3587 3603
3588 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); 3604 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100);
3589 mock_server_->SetLastUpdateClientTag("wrongtag"); 3605 mock_server_->SetLastUpdateClientTag("wrongtag");
3590 SyncShareAsDelegate(); 3606 SyncShareNudge();
3591 3607
3592 { 3608 {
3593 ReadTransaction trans(FROM_HERE, directory()); 3609 ReadTransaction trans(FROM_HERE, directory());
3594 3610
3595 // This update is rejected because it has the same ID, but a 3611 // This update is rejected because it has the same ID, but a
3596 // different tag than one that is already on the client. 3612 // different tag than one that is already on the client.
3597 // The client has a ServerKnows ID, which cannot be overwritten. 3613 // The client has a ServerKnows ID, which cannot be overwritten.
3598 Entry rejected_update(&trans, GET_BY_CLIENT_TAG, "wrongtag"); 3614 Entry rejected_update(&trans, GET_BY_CLIENT_TAG, "wrongtag");
3599 EXPECT_FALSE(rejected_update.good()); 3615 EXPECT_FALSE(rejected_update.good());
3600 3616
(...skipping 24 matching lines...) Expand all
3625 EXPECT_FALSE(perm_folder.Get(ID).ServerKnows()); 3641 EXPECT_FALSE(perm_folder.Get(ID).ServerKnows());
3626 original_metahandle = perm_folder.Get(META_HANDLE); 3642 original_metahandle = perm_folder.Get(META_HANDLE);
3627 } 3643 }
3628 3644
3629 mock_server_->AddUpdateBookmark(1, 0, "permitem_renamed", 10, 100); 3645 mock_server_->AddUpdateBookmark(1, 0, "permitem_renamed", 10, 100);
3630 mock_server_->SetLastUpdateClientTag("clientperm"); 3646 mock_server_->SetLastUpdateClientTag("clientperm");
3631 mock_server_->GetMutableLastUpdate()->mutable_specifics()-> 3647 mock_server_->GetMutableLastUpdate()->mutable_specifics()->
3632 CopyFrom(server_bookmark); 3648 CopyFrom(server_bookmark);
3633 mock_server_->set_conflict_all_commits(true); 3649 mock_server_->set_conflict_all_commits(true);
3634 3650
3635 SyncShareAsDelegate(); 3651 SyncShareNudge();
3636 // This should cause client tag reunion, preserving the metahandle. 3652 // This should cause client tag reunion, preserving the metahandle.
3637 { 3653 {
3638 ReadTransaction trans(FROM_HERE, directory()); 3654 ReadTransaction trans(FROM_HERE, directory());
3639 3655
3640 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); 3656 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm");
3641 ASSERT_TRUE(perm_folder.good()); 3657 ASSERT_TRUE(perm_folder.good());
3642 EXPECT_FALSE(perm_folder.Get(IS_DEL)); 3658 EXPECT_FALSE(perm_folder.Get(IS_DEL));
3643 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); 3659 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE));
3644 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED)); 3660 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED));
3645 EXPECT_EQ(10, perm_folder.Get(BASE_VERSION)); 3661 EXPECT_EQ(10, perm_folder.Get(BASE_VERSION));
3646 // Entry should have been given the new ID while preserving the 3662 // Entry should have been given the new ID while preserving the
3647 // metahandle; client should have won the conflict resolution. 3663 // metahandle; client should have won the conflict resolution.
3648 EXPECT_EQ(original_metahandle, perm_folder.Get(META_HANDLE)); 3664 EXPECT_EQ(original_metahandle, perm_folder.Get(META_HANDLE));
3649 EXPECT_EQ("clientperm", perm_folder.Get(UNIQUE_CLIENT_TAG)); 3665 EXPECT_EQ("clientperm", perm_folder.Get(UNIQUE_CLIENT_TAG));
3650 EXPECT_EQ("clientname", perm_folder.Get(NON_UNIQUE_NAME)); 3666 EXPECT_EQ("clientname", perm_folder.Get(NON_UNIQUE_NAME));
3651 EXPECT_EQ(local_bookmark.SerializeAsString(), 3667 EXPECT_EQ(local_bookmark.SerializeAsString(),
3652 perm_folder.Get(SPECIFICS).SerializeAsString()); 3668 perm_folder.Get(SPECIFICS).SerializeAsString());
3653 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows()); 3669 EXPECT_TRUE(perm_folder.Get(ID).ServerKnows());
3654 } 3670 }
3655 3671
3656 mock_server_->set_conflict_all_commits(false); 3672 mock_server_->set_conflict_all_commits(false);
3657 SyncShareAsDelegate(); 3673 SyncShareNudge();
3658 3674
3659 // The resolved entry ought to commit cleanly. 3675 // The resolved entry ought to commit cleanly.
3660 { 3676 {
3661 ReadTransaction trans(FROM_HERE, directory()); 3677 ReadTransaction trans(FROM_HERE, directory());
3662 3678
3663 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); 3679 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm");
3664 ASSERT_TRUE(perm_folder.good()); 3680 ASSERT_TRUE(perm_folder.good());
3665 EXPECT_FALSE(perm_folder.Get(IS_DEL)); 3681 EXPECT_FALSE(perm_folder.Get(IS_DEL));
3666 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); 3682 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE));
3667 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED)); 3683 EXPECT_FALSE(perm_folder.Get(IS_UNSYNCED));
(...skipping 18 matching lines...) Expand all
3686 perm_folder.Put(UNIQUE_CLIENT_TAG, "clientperm"); 3702 perm_folder.Put(UNIQUE_CLIENT_TAG, "clientperm");
3687 perm_folder.Put(SPECIFICS, DefaultBookmarkSpecifics()); 3703 perm_folder.Put(SPECIFICS, DefaultBookmarkSpecifics());
3688 perm_folder.Put(IS_UNSYNCED, true); 3704 perm_folder.Put(IS_UNSYNCED, true);
3689 perm_folder.Put(IS_DEL, true); 3705 perm_folder.Put(IS_DEL, true);
3690 } 3706 }
3691 3707
3692 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100); 3708 mock_server_->AddUpdateDirectory(1, 0, "permitem_renamed", 10, 100);
3693 mock_server_->SetLastUpdateClientTag("clientperm"); 3709 mock_server_->SetLastUpdateClientTag("clientperm");
3694 mock_server_->set_conflict_all_commits(true); 3710 mock_server_->set_conflict_all_commits(true);
3695 3711
3696 SyncShareAsDelegate(); 3712 SyncShareNudge();
3697 // This should cause client tag overwrite. 3713 // This should cause client tag overwrite.
3698 { 3714 {
3699 ReadTransaction trans(FROM_HERE, directory()); 3715 ReadTransaction trans(FROM_HERE, directory());
3700 3716
3701 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm"); 3717 Entry perm_folder(&trans, GET_BY_CLIENT_TAG, "clientperm");
3702 ASSERT_TRUE(perm_folder.good()); 3718 ASSERT_TRUE(perm_folder.good());
3703 ASSERT_TRUE(perm_folder.Get(ID).ServerKnows()); 3719 ASSERT_TRUE(perm_folder.Get(ID).ServerKnows());
3704 EXPECT_TRUE(perm_folder.Get(IS_DEL)); 3720 EXPECT_TRUE(perm_folder.Get(IS_DEL));
3705 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE)); 3721 EXPECT_FALSE(perm_folder.Get(IS_UNAPPLIED_UPDATE));
3706 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED)); 3722 EXPECT_TRUE(perm_folder.Get(IS_UNSYNCED));
3707 EXPECT_EQ(perm_folder.Get(BASE_VERSION), 10); 3723 EXPECT_EQ(perm_folder.Get(BASE_VERSION), 10);
3708 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "clientperm"); 3724 EXPECT_EQ(perm_folder.Get(UNIQUE_CLIENT_TAG), "clientperm");
3709 } 3725 }
3710 } 3726 }
3711 3727
3712 TEST_F(SyncerTest, ClientTagUpdateClashesWithLocalEntry) { 3728 TEST_F(SyncerTest, ClientTagUpdateClashesWithLocalEntry) {
3713 // This test is written assuming that ID comparison 3729 // This test is written assuming that ID comparison
3714 // will work out in a particular way. 3730 // will work out in a particular way.
3715 EXPECT_TRUE(ids_.FromNumber(1) < ids_.FromNumber(2)); 3731 EXPECT_TRUE(ids_.FromNumber(1) < ids_.FromNumber(2));
3716 EXPECT_TRUE(ids_.FromNumber(3) < ids_.FromNumber(4)); 3732 EXPECT_TRUE(ids_.FromNumber(3) < ids_.FromNumber(4));
3717 3733
3718 mock_server_->AddUpdateBookmark(1, 0, "One", 10, 100); 3734 mock_server_->AddUpdateBookmark(1, 0, "One", 10, 100);
3719 mock_server_->SetLastUpdateClientTag("tag1"); 3735 mock_server_->SetLastUpdateClientTag("tag1");
3720 mock_server_->AddUpdateBookmark(4, 0, "Four", 11, 110); 3736 mock_server_->AddUpdateBookmark(4, 0, "Four", 11, 110);
3721 mock_server_->SetLastUpdateClientTag("tag2"); 3737 mock_server_->SetLastUpdateClientTag("tag2");
3722 3738
3723 mock_server_->set_conflict_all_commits(true); 3739 mock_server_->set_conflict_all_commits(true);
3724 3740
3725 SyncShareAsDelegate(); 3741 SyncShareNudge();
3726 int64 tag1_metahandle = syncable::kInvalidMetaHandle; 3742 int64 tag1_metahandle = syncable::kInvalidMetaHandle;
3727 int64 tag2_metahandle = syncable::kInvalidMetaHandle; 3743 int64 tag2_metahandle = syncable::kInvalidMetaHandle;
3728 // This should cause client tag overwrite. 3744 // This should cause client tag overwrite.
3729 { 3745 {
3730 ReadTransaction trans(FROM_HERE, directory()); 3746 ReadTransaction trans(FROM_HERE, directory());
3731 3747
3732 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1"); 3748 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1");
3733 ASSERT_TRUE(tag1.good()); 3749 ASSERT_TRUE(tag1.good());
3734 ASSERT_TRUE(tag1.Get(ID).ServerKnows()); 3750 ASSERT_TRUE(tag1.Get(ID).ServerKnows());
3735 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID)); 3751 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID));
(...skipping 19 matching lines...) Expand all
3755 3771
3756 syncable::Directory::ChildHandles children; 3772 syncable::Directory::ChildHandles children;
3757 directory()->GetChildHandlesById(&trans, trans.root_id(), &children); 3773 directory()->GetChildHandlesById(&trans, trans.root_id(), &children);
3758 ASSERT_EQ(2U, children.size()); 3774 ASSERT_EQ(2U, children.size());
3759 } 3775 }
3760 3776
3761 mock_server_->AddUpdateBookmark(2, 0, "Two", 12, 120); 3777 mock_server_->AddUpdateBookmark(2, 0, "Two", 12, 120);
3762 mock_server_->SetLastUpdateClientTag("tag1"); 3778 mock_server_->SetLastUpdateClientTag("tag1");
3763 mock_server_->AddUpdateBookmark(3, 0, "Three", 13, 130); 3779 mock_server_->AddUpdateBookmark(3, 0, "Three", 13, 130);
3764 mock_server_->SetLastUpdateClientTag("tag2"); 3780 mock_server_->SetLastUpdateClientTag("tag2");
3765 SyncShareAsDelegate(); 3781 SyncShareNudge();
3766 3782
3767 { 3783 {
3768 ReadTransaction trans(FROM_HERE, directory()); 3784 ReadTransaction trans(FROM_HERE, directory());
3769 3785
3770 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1"); 3786 Entry tag1(&trans, GET_BY_CLIENT_TAG, "tag1");
3771 ASSERT_TRUE(tag1.good()); 3787 ASSERT_TRUE(tag1.good());
3772 ASSERT_TRUE(tag1.Get(ID).ServerKnows()); 3788 ASSERT_TRUE(tag1.Get(ID).ServerKnows());
3773 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID)) 3789 ASSERT_TRUE(ids_.FromNumber(1) == tag1.Get(ID))
3774 << "ID 1 should be kept, since it was less than ID 2."; 3790 << "ID 1 should be kept, since it was less than ID 2.";
3775 EXPECT_FALSE(tag1.Get(IS_DEL)); 3791 EXPECT_FALSE(tag1.Get(IS_DEL));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3827 mock_server_->SetLastUpdateClientTag("tag c"); 3843 mock_server_->SetLastUpdateClientTag("tag c");
3828 mock_server_->AddUpdateBookmark(202, 0, "Two C", 19, 190); 3844 mock_server_->AddUpdateBookmark(202, 0, "Two C", 19, 190);
3829 mock_server_->SetLastUpdateClientTag("tag c"); 3845 mock_server_->SetLastUpdateClientTag("tag c");
3830 mock_server_->AddUpdateBookmark(204, 0, "Three C", 20, 200); 3846 mock_server_->AddUpdateBookmark(204, 0, "Three C", 20, 200);
3831 mock_server_->SetLastUpdateClientTag("tag c"); 3847 mock_server_->SetLastUpdateClientTag("tag c");
3832 mock_server_->AddUpdateBookmark(201, 0, "Four C", 21, 210); 3848 mock_server_->AddUpdateBookmark(201, 0, "Four C", 21, 210);
3833 mock_server_->SetLastUpdateClientTag("tag c"); // Least ID: winner. 3849 mock_server_->SetLastUpdateClientTag("tag c"); // Least ID: winner.
3834 3850
3835 mock_server_->set_conflict_all_commits(true); 3851 mock_server_->set_conflict_all_commits(true);
3836 3852
3837 SyncShareAsDelegate(); 3853 SyncShareNudge();
3838 // This should cause client tag overwrite. 3854 // This should cause client tag overwrite.
3839 { 3855 {
3840 ReadTransaction trans(FROM_HERE, directory()); 3856 ReadTransaction trans(FROM_HERE, directory());
3841 3857
3842 Entry tag_a(&trans, GET_BY_CLIENT_TAG, "tag a"); 3858 Entry tag_a(&trans, GET_BY_CLIENT_TAG, "tag a");
3843 ASSERT_TRUE(tag_a.good()); 3859 ASSERT_TRUE(tag_a.good());
3844 EXPECT_TRUE(tag_a.Get(ID).ServerKnows()); 3860 EXPECT_TRUE(tag_a.Get(ID).ServerKnows());
3845 EXPECT_EQ(ids_.FromNumber(1), tag_a.Get(ID)); 3861 EXPECT_EQ(ids_.FromNumber(1), tag_a.Get(ID));
3846 EXPECT_FALSE(tag_a.Get(IS_DEL)); 3862 EXPECT_FALSE(tag_a.Get(IS_DEL));
3847 EXPECT_FALSE(tag_a.Get(IS_UNAPPLIED_UPDATE)); 3863 EXPECT_FALSE(tag_a.Get(IS_UNAPPLIED_UPDATE));
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3895 EXPECT_FALSE(tag_alpha.good()); 3911 EXPECT_FALSE(tag_alpha.good());
3896 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob"); 3912 Entry tag_bob(&trans, GET_BY_SERVER_TAG, "bob");
3897 EXPECT_FALSE(tag_bob.good()); 3913 EXPECT_FALSE(tag_bob.good());
3898 } 3914 }
3899 3915
3900 // Now download some tagged items as updates. 3916 // Now download some tagged items as updates.
3901 mock_server_->AddUpdateDirectory(1, 0, "update1", 1, 10); 3917 mock_server_->AddUpdateDirectory(1, 0, "update1", 1, 10);
3902 mock_server_->SetLastUpdateServerTag("alpha"); 3918 mock_server_->SetLastUpdateServerTag("alpha");
3903 mock_server_->AddUpdateDirectory(2, 0, "update2", 2, 20); 3919 mock_server_->AddUpdateDirectory(2, 0, "update2", 2, 20);
3904 mock_server_->SetLastUpdateServerTag("bob"); 3920 mock_server_->SetLastUpdateServerTag("bob");
3905 SyncShareAsDelegate(); 3921 SyncShareNudge();
3906 3922
3907 { 3923 {
3908 ReadTransaction trans(FROM_HERE, directory()); 3924 ReadTransaction trans(FROM_HERE, directory());
3909 3925
3910 // The new items should be applied as new entries, and we should be able 3926 // The new items should be applied as new entries, and we should be able
3911 // to look them up by their tag values. 3927 // to look them up by their tag values.
3912 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha"); 3928 Entry tag_alpha(&trans, GET_BY_SERVER_TAG, "alpha");
3913 ASSERT_TRUE(tag_alpha.good()); 3929 ASSERT_TRUE(tag_alpha.good());
3914 ASSERT_TRUE(!tag_alpha.Get(IS_DEL)); 3930 ASSERT_TRUE(!tag_alpha.Get(IS_DEL));
3915 ASSERT_TRUE(tag_alpha.Get(UNIQUE_SERVER_TAG) == "alpha"); 3931 ASSERT_TRUE(tag_alpha.Get(UNIQUE_SERVER_TAG) == "alpha");
(...skipping 10 matching lines...) Expand all
3926 ASSERT_TRUE(hurdle.Get(UNIQUE_SERVER_TAG).empty()); 3942 ASSERT_TRUE(hurdle.Get(UNIQUE_SERVER_TAG).empty());
3927 ASSERT_TRUE(hurdle.Get(NON_UNIQUE_NAME) == "bob"); 3943 ASSERT_TRUE(hurdle.Get(NON_UNIQUE_NAME) == "bob");
3928 } 3944 }
3929 } 3945 }
3930 3946
3931 TEST_F(SyncerTest, GetUpdatesSetsRequestedTypes) { 3947 TEST_F(SyncerTest, GetUpdatesSetsRequestedTypes) {
3932 // The expectations of this test happen in the MockConnectionManager's 3948 // The expectations of this test happen in the MockConnectionManager's
3933 // GetUpdates handler. EnableDatatype sets the expectation value from our 3949 // GetUpdates handler. EnableDatatype sets the expectation value from our
3934 // set of enabled/disabled datatypes. 3950 // set of enabled/disabled datatypes.
3935 EnableDatatype(syncable::BOOKMARKS); 3951 EnableDatatype(syncable::BOOKMARKS);
3936 SyncShareAsDelegate(); 3952 SyncShareNudge();
3937 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 3953 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
3938 3954
3939 EnableDatatype(syncable::AUTOFILL); 3955 EnableDatatype(syncable::AUTOFILL);
3940 SyncShareAsDelegate(); 3956 SyncShareNudge();
3941 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 3957 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
3942 3958
3943 EnableDatatype(syncable::PREFERENCES); 3959 EnableDatatype(syncable::PREFERENCES);
3944 SyncShareAsDelegate(); 3960 SyncShareNudge();
3945 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 3961 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
3946 3962
3947 DisableDatatype(syncable::BOOKMARKS); 3963 DisableDatatype(syncable::BOOKMARKS);
3948 SyncShareAsDelegate(); 3964 SyncShareNudge();
3949 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 3965 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
3950 3966
3951 DisableDatatype(syncable::AUTOFILL); 3967 DisableDatatype(syncable::AUTOFILL);
3952 SyncShareAsDelegate(); 3968 SyncShareNudge();
3953 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 3969 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
3954 3970
3955 DisableDatatype(syncable::PREFERENCES); 3971 DisableDatatype(syncable::PREFERENCES);
3956 EnableDatatype(syncable::AUTOFILL); 3972 EnableDatatype(syncable::AUTOFILL);
3957 SyncShareAsDelegate(); 3973 SyncShareNudge();
3958 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 3974 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
3959 } 3975 }
3960 3976
3977 // A typical scenario: server and client each have one update for the other.
3978 // It is the "happy path" alternative to the test below.
3979 TEST_F(SyncerTest, UpdateThenCommit) {
3980 syncable::Id to_receive = ids_.NewServerId();
3981 syncable::Id to_commit = ids_.NewLocalId();
3982
3983 mock_server_->AddUpdateDirectory(to_receive, ids_.root(), "x", 1, 10);
3984 int64 commit_handle = CreateUnsyncedDirectory("y", to_commit);
3985 SyncShareNudge();
3986
3987 ReadTransaction trans(FROM_HERE, directory());
3988
3989 Entry received(&trans, GET_BY_ID, to_receive);
3990 ASSERT_TRUE(received.good());
3991 EXPECT_FALSE(received.Get(IS_UNSYNCED));
3992 EXPECT_FALSE(received.Get(IS_UNAPPLIED_UPDATE));
3993
3994 Entry committed(&trans, GET_BY_HANDLE, commit_handle);
3995 ASSERT_TRUE(committed.good());
3996 EXPECT_FALSE(committed.Get(IS_UNSYNCED));
3997 EXPECT_FALSE(committed.Get(IS_UNAPPLIED_UPDATE));
3998 }
3999
4000 // Same as above, but this time we fail to download updates.
4001 // We should not attempt to commit anything unless we successfully downloaded
4002 // updates, otherwise we risk causing a server-side conflict.
4003 TEST_F(SyncerTest, UpdateFailsThenDontCommit) {
4004 syncable::Id to_receive = ids_.NewServerId();
4005 syncable::Id to_commit = ids_.NewLocalId();
4006
4007 mock_server_->AddUpdateDirectory(to_receive, ids_.root(), "x", 1, 10);
4008 int64 commit_handle = CreateUnsyncedDirectory("y", to_commit);
4009 mock_server_->FailNextPostBufferToPathCall();
4010 SyncShareNudge();
4011
4012 ReadTransaction trans(FROM_HERE, directory());
4013
4014 // We did not receive this update.
4015 Entry received(&trans, GET_BY_ID, to_receive);
4016 ASSERT_FALSE(received.good());
4017
4018 // And our local update remains unapplied.
4019 Entry committed(&trans, GET_BY_HANDLE, commit_handle);
4020 ASSERT_TRUE(committed.good());
4021 EXPECT_TRUE(committed.Get(IS_UNSYNCED));
4022 EXPECT_FALSE(committed.Get(IS_UNAPPLIED_UPDATE));
4023
4024 // Inform the Mock we won't be fetching all updates.
4025 mock_server_->ClearUpdatesQueue();
4026 }
4027
4028 // Downloads two updates and applies them successfully.
4029 // This is the "happy path" alternative to the test below.
4030 TEST_F(SyncerTest, ConfigureDownloadsTwoBatchesSuccess) {
4031 syncable::Id node1 = ids_.NewServerId();
4032 syncable::Id node2 = ids_.NewServerId();
4033
4034 // Construct the first GetUpdates response.
4035 mock_server_->AddUpdateDirectory(node1, ids_.root(), "one", 1, 10);
4036 mock_server_->SetChangesRemaining(1);
4037 mock_server_->NextUpdateBatch();
4038
4039 // Construct the second GetUpdates response.
4040 mock_server_->AddUpdateDirectory(node2, ids_.root(), "two", 1, 20);
4041
4042 SyncShareConfigure();
4043
4044 ReadTransaction trans(FROM_HERE, directory());
4045 // Both nodes should be downloaded and applied.
4046
4047 Entry n1(&trans, GET_BY_ID, node1);
4048 ASSERT_TRUE(n1.good());
4049 EXPECT_FALSE(n1.Get(IS_UNAPPLIED_UPDATE));
4050
4051 Entry n2(&trans, GET_BY_ID, node2);
4052 ASSERT_TRUE(n2.good());
4053 EXPECT_FALSE(n2.Get(IS_UNAPPLIED_UPDATE));
4054 }
4055
4056 // Same as the above case, but this time the second batch fails to download.
4057 TEST_F(SyncerTest, ConfigureFailsDontApplyUpdates) {
4058 syncable::Id node1 = ids_.NewServerId();
4059 syncable::Id node2 = ids_.NewServerId();
4060
4061 // The scenario: we have two batches of updates with one update each. A
4062 // normal confgure step would download all the updates one batch at a time and
4063 // apply them. This configure will succeed in downloading the first batch
4064 // then fail when downloading the second.
4065 mock_server_->FailNthPostBufferToPathCall(2);
4066
4067 // Construct the first GetUpdates response.
4068 mock_server_->AddUpdateDirectory(node1, ids_.root(), "one", 1, 10);
4069 mock_server_->SetChangesRemaining(1);
4070 mock_server_->NextUpdateBatch();
4071
4072 // Consutrct the second GetUpdates response.
4073 mock_server_->AddUpdateDirectory(node2, ids_.root(), "two", 1, 20);
4074
4075 SyncShareConfigure();
4076
4077 ReadTransaction trans(FROM_HERE, directory());
4078
4079 // The first node was downloaded, but not applied.
4080 Entry n1(&trans, GET_BY_ID, node1);
4081 ASSERT_TRUE(n1.good());
4082 EXPECT_TRUE(n1.Get(IS_UNAPPLIED_UPDATE));
4083
4084 // The second node was not downloaded.
4085 Entry n2(&trans, GET_BY_ID, node2);
4086 EXPECT_FALSE(n2.good());
4087
4088 // One update remains undownloaded.
4089 mock_server_->ClearUpdatesQueue();
4090 }
4091
3961 // Test what happens if a client deletes, then recreates, an object very 4092 // Test what happens if a client deletes, then recreates, an object very
3962 // quickly. It is possible that the deletion gets sent as a commit, and 4093 // quickly. It is possible that the deletion gets sent as a commit, and
3963 // the undelete happens during the commit request. The principle here 4094 // the undelete happens during the commit request. The principle here
3964 // is that with a single committing client, conflicts should never 4095 // is that with a single committing client, conflicts should never
3965 // be encountered, and a client encountering its past actions during 4096 // be encountered, and a client encountering its past actions during
3966 // getupdates should never feed back to override later actions. 4097 // getupdates should never feed back to override later actions.
3967 // 4098 //
3968 // In cases of ordering A-F below, the outcome should be the same. 4099 // In cases of ordering A-F below, the outcome should be the same.
3969 // Exercised by UndeleteDuringCommit: 4100 // Exercised by UndeleteDuringCommit:
3970 // A. Delete - commit - undelete - commitresponse. 4101 // A. Delete - commit - undelete - commitresponse.
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4088 } 4219 }
4089 4220
4090 protected: 4221 protected:
4091 const std::string client_tag_; 4222 const std::string client_tag_;
4092 int64 metahandle_; 4223 int64 metahandle_;
4093 }; 4224 };
4094 4225
4095 TEST_F(SyncerUndeletionTest, UndeleteDuringCommit) { 4226 TEST_F(SyncerUndeletionTest, UndeleteDuringCommit) {
4096 Create(); 4227 Create();
4097 ExpectUnsyncedCreation(); 4228 ExpectUnsyncedCreation();
4098 SyncShareAsDelegate(); 4229 SyncShareNudge();
4099 4230
4100 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4231 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4101 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4232 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4102 ExpectSyncedAndCreated(); 4233 ExpectSyncedAndCreated();
4103 4234
4104 // Delete, begin committing the delete, then undelete while committing. 4235 // Delete, begin committing the delete, then undelete while committing.
4105 Delete(); 4236 Delete();
4106 ExpectUnsyncedDeletion(); 4237 ExpectUnsyncedDeletion();
4107 mock_server_->SetMidCommitCallback( 4238 mock_server_->SetMidCommitCallback(
4108 base::Bind(&SyncerUndeletionTest::Undelete, base::Unretained(this))); 4239 base::Bind(&SyncerUndeletionTest::Undelete, base::Unretained(this)));
4109 SyncShareAsDelegate(); 4240 SyncShareNudge();
4110 4241
4111 // The item ought to exist as an unsynced undeletion (meaning, 4242 // The item ought to exist as an unsynced undeletion (meaning,
4112 // we think that the next commit ought to be a recreation commit). 4243 // we think that the next commit ought to be a recreation commit).
4113 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4244 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4114 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4245 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4115 ExpectUnsyncedUndeletion(); 4246 ExpectUnsyncedUndeletion();
4116 4247
4117 // Now, encounter a GetUpdates corresponding to the deletion from 4248 // Now, encounter a GetUpdates corresponding to the deletion from
4118 // the server. The undeletion should prevail again and be committed. 4249 // the server. The undeletion should prevail again and be committed.
4119 // None of this should trigger any conflict detection -- it is perfectly 4250 // None of this should trigger any conflict detection -- it is perfectly
4120 // normal to recieve updates from our own commits. 4251 // normal to recieve updates from our own commits.
4121 mock_server_->SetMidCommitCallback(base::Closure()); 4252 mock_server_->SetMidCommitCallback(base::Closure());
4122 mock_server_->AddUpdateTombstone(Get(metahandle_, ID)); 4253 mock_server_->AddUpdateTombstone(Get(metahandle_, ID));
4123 SyncShareAsDelegate(); 4254 SyncShareNudge();
4124 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4255 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4125 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4256 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4126 ExpectSyncedAndCreated(); 4257 ExpectSyncedAndCreated();
4127 } 4258 }
4128 4259
4129 TEST_F(SyncerUndeletionTest, UndeleteBeforeCommit) { 4260 TEST_F(SyncerUndeletionTest, UndeleteBeforeCommit) {
4130 Create(); 4261 Create();
4131 ExpectUnsyncedCreation(); 4262 ExpectUnsyncedCreation();
4132 SyncShareAsDelegate(); 4263 SyncShareNudge();
4133 4264
4134 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4265 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4135 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4266 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4136 ExpectSyncedAndCreated(); 4267 ExpectSyncedAndCreated();
4137 4268
4138 // Delete and undelete, then sync to pick up the result. 4269 // Delete and undelete, then sync to pick up the result.
4139 Delete(); 4270 Delete();
4140 ExpectUnsyncedDeletion(); 4271 ExpectUnsyncedDeletion();
4141 Undelete(); 4272 Undelete();
4142 ExpectUnsyncedEdit(); // Edit, not undelete: server thinks it exists. 4273 ExpectUnsyncedEdit(); // Edit, not undelete: server thinks it exists.
4143 SyncShareAsDelegate(); 4274 SyncShareNudge();
4144 4275
4145 // The item ought to have committed successfully. 4276 // The item ought to have committed successfully.
4146 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4277 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4147 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4278 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4148 ExpectSyncedAndCreated(); 4279 ExpectSyncedAndCreated();
4149 EXPECT_EQ(2, Get(metahandle_, BASE_VERSION)); 4280 EXPECT_EQ(2, Get(metahandle_, BASE_VERSION));
4150 4281
4151 // Now, encounter a GetUpdates corresponding to the just-committed 4282 // Now, encounter a GetUpdates corresponding to the just-committed
4152 // update. 4283 // update.
4153 mock_server_->AddUpdateFromLastCommit(); 4284 mock_server_->AddUpdateFromLastCommit();
4154 SyncShareAsDelegate(); 4285 SyncShareNudge();
4155 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4286 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4156 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4287 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4157 ExpectSyncedAndCreated(); 4288 ExpectSyncedAndCreated();
4158 } 4289 }
4159 4290
4160 TEST_F(SyncerUndeletionTest, UndeleteAfterCommitButBeforeGetUpdates) { 4291 TEST_F(SyncerUndeletionTest, UndeleteAfterCommitButBeforeGetUpdates) {
4161 Create(); 4292 Create();
4162 ExpectUnsyncedCreation(); 4293 ExpectUnsyncedCreation();
4163 SyncShareAsDelegate(); 4294 SyncShareNudge();
4164 4295
4165 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4296 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4166 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4297 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4167 ExpectSyncedAndCreated(); 4298 ExpectSyncedAndCreated();
4168 4299
4169 // Delete and commit. 4300 // Delete and commit.
4170 Delete(); 4301 Delete();
4171 ExpectUnsyncedDeletion(); 4302 ExpectUnsyncedDeletion();
4172 SyncShareAsDelegate(); 4303 SyncShareNudge();
4173 4304
4174 // The item ought to have committed successfully. 4305 // The item ought to have committed successfully.
4175 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4306 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4176 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4307 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4177 ExpectSyncedAndDeleted(); 4308 ExpectSyncedAndDeleted();
4178 4309
4179 // Before the GetUpdates, the item is locally undeleted. 4310 // Before the GetUpdates, the item is locally undeleted.
4180 Undelete(); 4311 Undelete();
4181 ExpectUnsyncedUndeletion(); 4312 ExpectUnsyncedUndeletion();
4182 4313
4183 // Now, encounter a GetUpdates corresponding to the just-committed 4314 // Now, encounter a GetUpdates corresponding to the just-committed
4184 // deletion update. The undeletion should prevail. 4315 // deletion update. The undeletion should prevail.
4185 mock_server_->AddUpdateFromLastCommit(); 4316 mock_server_->AddUpdateFromLastCommit();
4186 SyncShareAsDelegate(); 4317 SyncShareNudge();
4187 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4318 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4188 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4319 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4189 ExpectSyncedAndCreated(); 4320 ExpectSyncedAndCreated();
4190 } 4321 }
4191 4322
4192 TEST_F(SyncerUndeletionTest, UndeleteAfterDeleteAndGetUpdates) { 4323 TEST_F(SyncerUndeletionTest, UndeleteAfterDeleteAndGetUpdates) {
4193 Create(); 4324 Create();
4194 ExpectUnsyncedCreation(); 4325 ExpectUnsyncedCreation();
4195 SyncShareAsDelegate(); 4326 SyncShareNudge();
4196 4327
4197 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4328 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4198 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4329 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4199 ExpectSyncedAndCreated(); 4330 ExpectSyncedAndCreated();
4200 4331
4201 mock_server_->AddUpdateFromLastCommit(); 4332 mock_server_->AddUpdateFromLastCommit();
4202 SyncShareAsDelegate(); 4333 SyncShareNudge();
4203 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4334 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4204 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4335 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4205 ExpectSyncedAndCreated(); 4336 ExpectSyncedAndCreated();
4206 4337
4207 // Delete and commit. 4338 // Delete and commit.
4208 Delete(); 4339 Delete();
4209 ExpectUnsyncedDeletion(); 4340 ExpectUnsyncedDeletion();
4210 SyncShareAsDelegate(); 4341 SyncShareNudge();
4211 4342
4212 // The item ought to have committed successfully. 4343 // The item ought to have committed successfully.
4213 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4344 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4214 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4345 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4215 ExpectSyncedAndDeleted(); 4346 ExpectSyncedAndDeleted();
4216 4347
4217 // Now, encounter a GetUpdates corresponding to the just-committed 4348 // Now, encounter a GetUpdates corresponding to the just-committed
4218 // deletion update. Should be consistent. 4349 // deletion update. Should be consistent.
4219 mock_server_->AddUpdateFromLastCommit(); 4350 mock_server_->AddUpdateFromLastCommit();
4220 SyncShareAsDelegate(); 4351 SyncShareNudge();
4221 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4352 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4222 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4353 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4223 ExpectSyncedAndDeleted(); 4354 ExpectSyncedAndDeleted();
4224 4355
4225 // After the GetUpdates, the item is locally undeleted. 4356 // After the GetUpdates, the item is locally undeleted.
4226 Undelete(); 4357 Undelete();
4227 ExpectUnsyncedUndeletion(); 4358 ExpectUnsyncedUndeletion();
4228 4359
4229 // Now, encounter a GetUpdates corresponding to the just-committed 4360 // Now, encounter a GetUpdates corresponding to the just-committed
4230 // deletion update. The undeletion should prevail. 4361 // deletion update. The undeletion should prevail.
4231 SyncShareAsDelegate(); 4362 SyncShareNudge();
4232 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4363 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4233 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4364 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4234 ExpectSyncedAndCreated(); 4365 ExpectSyncedAndCreated();
4235 } 4366 }
4236 4367
4237 // Test processing of undeletion GetUpdateses. 4368 // Test processing of undeletion GetUpdateses.
4238 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletes) { 4369 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletes) {
4239 Create(); 4370 Create();
4240 ExpectUnsyncedCreation(); 4371 ExpectUnsyncedCreation();
4241 SyncShareAsDelegate(); 4372 SyncShareNudge();
4242 4373
4243 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4374 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4244 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4375 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4245 ExpectSyncedAndCreated(); 4376 ExpectSyncedAndCreated();
4246 4377
4247 // Add a delete from the server. 4378 // Add a delete from the server.
4248 mock_server_->AddUpdateFromLastCommit(); 4379 mock_server_->AddUpdateFromLastCommit();
4249 SyncShareAsDelegate(); 4380 SyncShareNudge();
4250 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4381 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4251 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4382 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4252 ExpectSyncedAndCreated(); 4383 ExpectSyncedAndCreated();
4253 4384
4254 // Some other client deletes the item. 4385 // Some other client deletes the item.
4255 mock_server_->AddUpdateTombstone(Get(metahandle_, ID)); 4386 mock_server_->AddUpdateTombstone(Get(metahandle_, ID));
4256 SyncShareAsDelegate(); 4387 SyncShareNudge();
4257 4388
4258 // The update ought to have applied successfully. 4389 // The update ought to have applied successfully.
4259 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4390 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4260 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4391 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4261 ExpectSyncedAndDeleted(); 4392 ExpectSyncedAndDeleted();
4262 4393
4263 // Undelete it locally. 4394 // Undelete it locally.
4264 Undelete(); 4395 Undelete();
4265 ExpectUnsyncedUndeletion(); 4396 ExpectUnsyncedUndeletion();
4266 SyncShareAsDelegate(); 4397 SyncShareNudge();
4267 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4398 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4268 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4399 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4269 ExpectSyncedAndCreated(); 4400 ExpectSyncedAndCreated();
4270 4401
4271 // Now, encounter a GetUpdates corresponding to the just-committed 4402 // Now, encounter a GetUpdates corresponding to the just-committed
4272 // deletion update. The undeletion should prevail. 4403 // deletion update. The undeletion should prevail.
4273 mock_server_->AddUpdateFromLastCommit(); 4404 mock_server_->AddUpdateFromLastCommit();
4274 SyncShareAsDelegate(); 4405 SyncShareNudge();
4275 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4406 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4276 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4407 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4277 ExpectSyncedAndCreated(); 4408 ExpectSyncedAndCreated();
4278 } 4409 }
4279 4410
4280 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletesImmediately) { 4411 TEST_F(SyncerUndeletionTest, UndeleteAfterOtherClientDeletesImmediately) {
4281 Create(); 4412 Create();
4282 ExpectUnsyncedCreation(); 4413 ExpectUnsyncedCreation();
4283 SyncShareAsDelegate(); 4414 SyncShareNudge();
4284 4415
4285 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4416 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4286 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4417 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4287 ExpectSyncedAndCreated(); 4418 ExpectSyncedAndCreated();
4288 4419
4289 // Some other client deletes the item before we get a chance 4420 // Some other client deletes the item before we get a chance
4290 // to GetUpdates our original request. 4421 // to GetUpdates our original request.
4291 mock_server_->AddUpdateTombstone(Get(metahandle_, ID)); 4422 mock_server_->AddUpdateTombstone(Get(metahandle_, ID));
4292 SyncShareAsDelegate(); 4423 SyncShareNudge();
4293 4424
4294 // The update ought to have applied successfully. 4425 // The update ought to have applied successfully.
4295 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4426 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4296 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4427 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4297 ExpectSyncedAndDeleted(); 4428 ExpectSyncedAndDeleted();
4298 4429
4299 // Undelete it locally. 4430 // Undelete it locally.
4300 Undelete(); 4431 Undelete();
4301 ExpectUnsyncedUndeletion(); 4432 ExpectUnsyncedUndeletion();
4302 SyncShareAsDelegate(); 4433 SyncShareNudge();
4303 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4434 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4304 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4435 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4305 ExpectSyncedAndCreated(); 4436 ExpectSyncedAndCreated();
4306 4437
4307 // Now, encounter a GetUpdates corresponding to the just-committed 4438 // Now, encounter a GetUpdates corresponding to the just-committed
4308 // deletion update. The undeletion should prevail. 4439 // deletion update. The undeletion should prevail.
4309 mock_server_->AddUpdateFromLastCommit(); 4440 mock_server_->AddUpdateFromLastCommit();
4310 SyncShareAsDelegate(); 4441 SyncShareNudge();
4311 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4442 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4312 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4443 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4313 ExpectSyncedAndCreated(); 4444 ExpectSyncedAndCreated();
4314 } 4445 }
4315 4446
4316 TEST_F(SyncerUndeletionTest, OtherClientUndeletes) { 4447 TEST_F(SyncerUndeletionTest, OtherClientUndeletes) {
4317 Create(); 4448 Create();
4318 ExpectUnsyncedCreation(); 4449 ExpectUnsyncedCreation();
4319 SyncShareAsDelegate(); 4450 SyncShareNudge();
4320 4451
4321 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4452 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4322 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4453 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4323 ExpectSyncedAndCreated(); 4454 ExpectSyncedAndCreated();
4324 4455
4325 // Get the updates of our just-committed entry. 4456 // Get the updates of our just-committed entry.
4326 mock_server_->AddUpdateFromLastCommit(); 4457 mock_server_->AddUpdateFromLastCommit();
4327 SyncShareAsDelegate(); 4458 SyncShareNudge();
4328 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4459 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4329 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4460 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4330 ExpectSyncedAndCreated(); 4461 ExpectSyncedAndCreated();
4331 4462
4332 // We delete the item. 4463 // We delete the item.
4333 Delete(); 4464 Delete();
4334 ExpectUnsyncedDeletion(); 4465 ExpectUnsyncedDeletion();
4335 SyncShareAsDelegate(); 4466 SyncShareNudge();
4336 4467
4337 // The update ought to have applied successfully. 4468 // The update ought to have applied successfully.
4338 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4469 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4339 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4470 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4340 ExpectSyncedAndDeleted(); 4471 ExpectSyncedAndDeleted();
4341 4472
4342 // Now, encounter a GetUpdates corresponding to the just-committed 4473 // Now, encounter a GetUpdates corresponding to the just-committed
4343 // deletion update. 4474 // deletion update.
4344 mock_server_->AddUpdateFromLastCommit(); 4475 mock_server_->AddUpdateFromLastCommit();
4345 SyncShareAsDelegate(); 4476 SyncShareNudge();
4346 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4477 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4347 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4478 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4348 ExpectSyncedAndDeleted(); 4479 ExpectSyncedAndDeleted();
4349 4480
4350 // Some other client undeletes the item. 4481 // Some other client undeletes the item.
4351 mock_server_->AddUpdateBookmark(Get(metahandle_, ID), 4482 mock_server_->AddUpdateBookmark(Get(metahandle_, ID),
4352 Get(metahandle_, PARENT_ID), 4483 Get(metahandle_, PARENT_ID),
4353 "Thadeusz", 100, 1000); 4484 "Thadeusz", 100, 1000);
4354 mock_server_->SetLastUpdateClientTag(client_tag_); 4485 mock_server_->SetLastUpdateClientTag(client_tag_);
4355 SyncShareAsDelegate(); 4486 SyncShareNudge();
4356 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4487 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4357 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4488 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4358 ExpectSyncedAndCreated(); 4489 ExpectSyncedAndCreated();
4359 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME)); 4490 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME));
4360 } 4491 }
4361 4492
4362 TEST_F(SyncerUndeletionTest, OtherClientUndeletesImmediately) { 4493 TEST_F(SyncerUndeletionTest, OtherClientUndeletesImmediately) {
4363 Create(); 4494 Create();
4364 ExpectUnsyncedCreation(); 4495 ExpectUnsyncedCreation();
4365 SyncShareAsDelegate(); 4496 SyncShareNudge();
4366 4497
4367 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4498 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4368 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4499 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4369 ExpectSyncedAndCreated(); 4500 ExpectSyncedAndCreated();
4370 4501
4371 // Get the updates of our just-committed entry. 4502 // Get the updates of our just-committed entry.
4372 mock_server_->AddUpdateFromLastCommit(); 4503 mock_server_->AddUpdateFromLastCommit();
4373 SyncShareAsDelegate(); 4504 SyncShareNudge();
4374 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4505 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4375 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4506 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4376 ExpectSyncedAndCreated(); 4507 ExpectSyncedAndCreated();
4377 4508
4378 // We delete the item. 4509 // We delete the item.
4379 Delete(); 4510 Delete();
4380 ExpectUnsyncedDeletion(); 4511 ExpectUnsyncedDeletion();
4381 SyncShareAsDelegate(); 4512 SyncShareNudge();
4382 4513
4383 // The update ought to have applied successfully. 4514 // The update ought to have applied successfully.
4384 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4515 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4385 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4516 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4386 ExpectSyncedAndDeleted(); 4517 ExpectSyncedAndDeleted();
4387 4518
4388 // Some other client undeletes before we see the update from our 4519 // Some other client undeletes before we see the update from our
4389 // commit. 4520 // commit.
4390 mock_server_->AddUpdateBookmark(Get(metahandle_, ID), 4521 mock_server_->AddUpdateBookmark(Get(metahandle_, ID),
4391 Get(metahandle_, PARENT_ID), 4522 Get(metahandle_, PARENT_ID),
4392 "Thadeusz", 100, 1000); 4523 "Thadeusz", 100, 1000);
4393 mock_server_->SetLastUpdateClientTag(client_tag_); 4524 mock_server_->SetLastUpdateClientTag(client_tag_);
4394 SyncShareAsDelegate(); 4525 SyncShareNudge();
4395 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems()); 4526 EXPECT_EQ(0, session_->status_controller().TotalNumConflictingItems());
4396 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests()); 4527 EXPECT_EQ(1, mock_server_->GetAndClearNumGetUpdatesRequests());
4397 ExpectSyncedAndCreated(); 4528 ExpectSyncedAndCreated();
4398 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME)); 4529 EXPECT_EQ("Thadeusz", Get(metahandle_, NON_UNIQUE_NAME));
4399 } 4530 }
4400 4531
4401 // A group of tests exercising the syncer's handling of sibling ordering, as 4532 // A group of tests exercising the syncer's handling of sibling ordering, as
4402 // represented in the sync protocol. 4533 // represented in the sync protocol.
4403 class SyncerPositionUpdateTest : public SyncerTest { 4534 class SyncerPositionUpdateTest : public SyncerTest {
4404 public: 4535 public:
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4449 4580
4450 TEST_F(SyncerPositionUpdateTest, InOrderPositive) { 4581 TEST_F(SyncerPositionUpdateTest, InOrderPositive) {
4451 // Add a bunch of items in increasing order, starting with just positive 4582 // Add a bunch of items in increasing order, starting with just positive
4452 // position values. 4583 // position values.
4453 AddRootItemWithPosition(100); 4584 AddRootItemWithPosition(100);
4454 AddRootItemWithPosition(199); 4585 AddRootItemWithPosition(199);
4455 AddRootItemWithPosition(200); 4586 AddRootItemWithPosition(200);
4456 AddRootItemWithPosition(201); 4587 AddRootItemWithPosition(201);
4457 AddRootItemWithPosition(400); 4588 AddRootItemWithPosition(400);
4458 4589
4459 SyncShareAsDelegate(); 4590 SyncShareNudge();
4460 ExpectLocalItemsInServerOrder(); 4591 ExpectLocalItemsInServerOrder();
4461 } 4592 }
4462 4593
4463 TEST_F(SyncerPositionUpdateTest, InOrderNegative) { 4594 TEST_F(SyncerPositionUpdateTest, InOrderNegative) {
4464 // Test negative position values, but in increasing order. 4595 // Test negative position values, but in increasing order.
4465 AddRootItemWithPosition(-400); 4596 AddRootItemWithPosition(-400);
4466 AddRootItemWithPosition(-201); 4597 AddRootItemWithPosition(-201);
4467 AddRootItemWithPosition(-200); 4598 AddRootItemWithPosition(-200);
4468 AddRootItemWithPosition(-150); 4599 AddRootItemWithPosition(-150);
4469 AddRootItemWithPosition(100); 4600 AddRootItemWithPosition(100);
4470 4601
4471 SyncShareAsDelegate(); 4602 SyncShareNudge();
4472 ExpectLocalItemsInServerOrder(); 4603 ExpectLocalItemsInServerOrder();
4473 } 4604 }
4474 4605
4475 TEST_F(SyncerPositionUpdateTest, ReverseOrder) { 4606 TEST_F(SyncerPositionUpdateTest, ReverseOrder) {
4476 // Test when items are sent in the reverse order. 4607 // Test when items are sent in the reverse order.
4477 AddRootItemWithPosition(400); 4608 AddRootItemWithPosition(400);
4478 AddRootItemWithPosition(201); 4609 AddRootItemWithPosition(201);
4479 AddRootItemWithPosition(200); 4610 AddRootItemWithPosition(200);
4480 AddRootItemWithPosition(100); 4611 AddRootItemWithPosition(100);
4481 AddRootItemWithPosition(-150); 4612 AddRootItemWithPosition(-150);
4482 AddRootItemWithPosition(-201); 4613 AddRootItemWithPosition(-201);
4483 AddRootItemWithPosition(-200); 4614 AddRootItemWithPosition(-200);
4484 AddRootItemWithPosition(-400); 4615 AddRootItemWithPosition(-400);
4485 4616
4486 SyncShareAsDelegate(); 4617 SyncShareNudge();
4487 ExpectLocalItemsInServerOrder(); 4618 ExpectLocalItemsInServerOrder();
4488 } 4619 }
4489 4620
4490 TEST_F(SyncerPositionUpdateTest, RandomOrderInBatches) { 4621 TEST_F(SyncerPositionUpdateTest, RandomOrderInBatches) {
4491 // Mix it all up, interleaving position values, and try multiple batches of 4622 // Mix it all up, interleaving position values, and try multiple batches of
4492 // updates. 4623 // updates.
4493 AddRootItemWithPosition(400); 4624 AddRootItemWithPosition(400);
4494 AddRootItemWithPosition(201); 4625 AddRootItemWithPosition(201);
4495 AddRootItemWithPosition(-400); 4626 AddRootItemWithPosition(-400);
4496 AddRootItemWithPosition(100); 4627 AddRootItemWithPosition(100);
4497 4628
4498 SyncShareAsDelegate(); 4629 SyncShareNudge();
4499 ExpectLocalItemsInServerOrder(); 4630 ExpectLocalItemsInServerOrder();
4500 4631
4501 AddRootItemWithPosition(-150); 4632 AddRootItemWithPosition(-150);
4502 AddRootItemWithPosition(-200); 4633 AddRootItemWithPosition(-200);
4503 AddRootItemWithPosition(200); 4634 AddRootItemWithPosition(200);
4504 AddRootItemWithPosition(-201); 4635 AddRootItemWithPosition(-201);
4505 4636
4506 SyncShareAsDelegate(); 4637 SyncShareNudge();
4507 ExpectLocalItemsInServerOrder(); 4638 ExpectLocalItemsInServerOrder();
4508 4639
4509 AddRootItemWithPosition(-144); 4640 AddRootItemWithPosition(-144);
4510 4641
4511 SyncShareAsDelegate(); 4642 SyncShareNudge();
4512 ExpectLocalItemsInServerOrder(); 4643 ExpectLocalItemsInServerOrder();
4513 } 4644 }
4514 4645
4515 class SyncerPositionTiebreakingTest : public SyncerTest { 4646 class SyncerPositionTiebreakingTest : public SyncerTest {
4516 public: 4647 public:
4517 SyncerPositionTiebreakingTest() 4648 SyncerPositionTiebreakingTest()
4518 : low_id_(Id::CreateFromServerId("A")), 4649 : low_id_(Id::CreateFromServerId("A")),
4519 mid_id_(Id::CreateFromServerId("M")), 4650 mid_id_(Id::CreateFromServerId("M")),
4520 high_id_(Id::CreateFromServerId("Z")), 4651 high_id_(Id::CreateFromServerId("Z")),
4521 next_revision_(1) { 4652 next_revision_(1) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
4561 4692
4562 private: 4693 private:
4563 int next_revision_; 4694 int next_revision_;
4564 DISALLOW_COPY_AND_ASSIGN(SyncerPositionTiebreakingTest); 4695 DISALLOW_COPY_AND_ASSIGN(SyncerPositionTiebreakingTest);
4565 }; 4696 };
4566 4697
4567 TEST_F(SyncerPositionTiebreakingTest, LowMidHigh) { 4698 TEST_F(SyncerPositionTiebreakingTest, LowMidHigh) {
4568 Add(low_id_); 4699 Add(low_id_);
4569 Add(mid_id_); 4700 Add(mid_id_);
4570 Add(high_id_); 4701 Add(high_id_);
4571 SyncShareAsDelegate(); 4702 SyncShareNudge();
4572 ExpectLocalOrderIsByServerId(); 4703 ExpectLocalOrderIsByServerId();
4573 } 4704 }
4574 4705
4575 TEST_F(SyncerPositionTiebreakingTest, LowHighMid) { 4706 TEST_F(SyncerPositionTiebreakingTest, LowHighMid) {
4576 Add(low_id_); 4707 Add(low_id_);
4577 Add(high_id_); 4708 Add(high_id_);
4578 Add(mid_id_); 4709 Add(mid_id_);
4579 SyncShareAsDelegate(); 4710 SyncShareNudge();
4580 ExpectLocalOrderIsByServerId(); 4711 ExpectLocalOrderIsByServerId();
4581 } 4712 }
4582 4713
4583 TEST_F(SyncerPositionTiebreakingTest, HighMidLow) { 4714 TEST_F(SyncerPositionTiebreakingTest, HighMidLow) {
4584 Add(high_id_); 4715 Add(high_id_);
4585 Add(mid_id_); 4716 Add(mid_id_);
4586 Add(low_id_); 4717 Add(low_id_);
4587 SyncShareAsDelegate(); 4718 SyncShareNudge();
4588 ExpectLocalOrderIsByServerId(); 4719 ExpectLocalOrderIsByServerId();
4589 } 4720 }
4590 4721
4591 TEST_F(SyncerPositionTiebreakingTest, HighLowMid) { 4722 TEST_F(SyncerPositionTiebreakingTest, HighLowMid) {
4592 Add(high_id_); 4723 Add(high_id_);
4593 Add(low_id_); 4724 Add(low_id_);
4594 Add(mid_id_); 4725 Add(mid_id_);
4595 SyncShareAsDelegate(); 4726 SyncShareNudge();
4596 ExpectLocalOrderIsByServerId(); 4727 ExpectLocalOrderIsByServerId();
4597 } 4728 }
4598 4729
4599 TEST_F(SyncerPositionTiebreakingTest, MidHighLow) { 4730 TEST_F(SyncerPositionTiebreakingTest, MidHighLow) {
4600 Add(mid_id_); 4731 Add(mid_id_);
4601 Add(high_id_); 4732 Add(high_id_);
4602 Add(low_id_); 4733 Add(low_id_);
4603 SyncShareAsDelegate(); 4734 SyncShareNudge();
4604 ExpectLocalOrderIsByServerId(); 4735 ExpectLocalOrderIsByServerId();
4605 } 4736 }
4606 4737
4607 TEST_F(SyncerPositionTiebreakingTest, MidLowHigh) { 4738 TEST_F(SyncerPositionTiebreakingTest, MidLowHigh) {
4608 Add(mid_id_); 4739 Add(mid_id_);
4609 Add(low_id_); 4740 Add(low_id_);
4610 Add(high_id_); 4741 Add(high_id_);
4611 SyncShareAsDelegate(); 4742 SyncShareNudge();
4612 ExpectLocalOrderIsByServerId(); 4743 ExpectLocalOrderIsByServerId();
4613 } 4744 }
4614 4745
4615 } // namespace browser_sync 4746 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698