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

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

Issue 6182004: [SYNC] Refactor SyncSourceInfo and add support in chrome invalidation client ... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Added util functions Created 9 years, 11 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <list> 5 #include <list>
6 #include <map> 6 #include <map>
7 7
8 #include "base/lock.h" 8 #include "base/lock.h"
9 #include "base/scoped_ptr.h" 9 #include "base/scoped_ptr.h"
10 #include "base/time.h" 10 #include "base/time.h"
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 if (!syncer_thread()->RequestResume()) 162 if (!syncer_thread()->RequestResume())
163 return false; 163 return false;
164 return event.TimedWait(max_wait_time_); 164 return event.TimedWait(max_wait_time_);
165 } 165 }
166 166
167 void PreventThreadFromPolling() { 167 void PreventThreadFromPolling() {
168 const TimeDelta poll_interval = TimeDelta::FromMinutes(5); 168 const TimeDelta poll_interval = TimeDelta::FromMinutes(5);
169 syncer_thread()->SetSyncerShortPollInterval(poll_interval); 169 syncer_thread()->SetSyncerShortPollInterval(poll_interval);
170 } 170 }
171 171
172 // Compare a provided SyncSouceInfo::ModelTypeMap to the pending nudge info
173 // stored in the SyncerThread vault.
174 bool CompareNudgeTypesToVault(const sessions::ModelTypeMap& lhs) {
175 const sessions::ModelTypeMap& vault_nudge_types =
176 syncer_thread()->vault_.pending_nudge_types_;
177 return lhs == vault_nudge_types;
178 }
179
180 // Compare a provided ModelTypeBitset to the pending nudge info stored in the
181 // SyncerThread vault. Nudge info in vault must not have any non-empty
182 // payloads.
183 bool CompareNudgeTypesBitSetToVault(const syncable::ModelTypeBitSet& lhs) {
184 sessions::ModelTypeMap model_types_with_payloads;
185 sessions::BuildModelTypeMapFromModelTypeBitSet(lhs,
186 std::string(),
187 &model_types_with_payloads);
188 return CompareNudgeTypesToVault(model_types_with_payloads);
189 }
190
191
172 private: 192 private:
173 193
174 virtual void OnSyncEngineEvent(const SyncEngineEvent& event) { 194 virtual void OnSyncEngineEvent(const SyncEngineEvent& event) {
175 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) 195 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED)
176 sync_cycle_ended_event_.Signal(); 196 sync_cycle_ended_event_.Signal();
177 } 197 }
178 198
179 protected: 199 protected:
180 TimeDelta max_wait_time_; 200 TimeDelta max_wait_time_;
181 SyncSessionContext* context_; 201 SyncSessionContext* context_;
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 false); 481 false);
462 482
463 ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, 483 ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds,
464 interval.poll_delta.InSeconds()); 484 interval.poll_delta.InSeconds());
465 ASSERT_EQ(WaitInterval::NORMAL, interval.mode); 485 ASSERT_EQ(WaitInterval::NORMAL, interval.mode);
466 ASSERT_FALSE(interval.had_nudge_during_backoff); 486 ASSERT_FALSE(interval.had_nudge_during_backoff);
467 ASSERT_FALSE(continue_sync_cycle_param); 487 ASSERT_FALSE(continue_sync_cycle_param);
468 } 488 }
469 489
470 { 490 {
471
472 // Now try with unsynced local items. 491 // Now try with unsynced local items.
473 context->set_last_snapshot(SessionSnapshotForTest(0, 1)); 492 context->set_last_snapshot(SessionSnapshotForTest(0, 1));
474 bool continue_sync_cycle_param = false; 493 bool continue_sync_cycle_param = false;
475 494
476 WaitInterval interval = syncer_thread->CalculatePollingWaitTime( 495 WaitInterval interval = syncer_thread->CalculatePollingWaitTime(
477 0, 496 0,
478 &user_idle_milliseconds_param, 497 &user_idle_milliseconds_param,
479 &continue_sync_cycle_param, 498 &continue_sync_cycle_param,
480 false); 499 false);
481 500
(...skipping 23 matching lines...) Expand all
505 524
506 ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, 525 ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds,
507 interval.poll_delta.InSeconds()); 526 interval.poll_delta.InSeconds());
508 ASSERT_EQ(WaitInterval::NORMAL, interval.mode); 527 ASSERT_EQ(WaitInterval::NORMAL, interval.mode);
509 ASSERT_FALSE(interval.had_nudge_during_backoff); 528 ASSERT_FALSE(interval.had_nudge_during_backoff);
510 ASSERT_FALSE(continue_sync_cycle_param); 529 ASSERT_FALSE(continue_sync_cycle_param);
511 } 530 }
512 531
513 // Regression for exponential backoff reset when the syncer is nudged. 532 // Regression for exponential backoff reset when the syncer is nudged.
514 { 533 {
515
516 context->set_last_snapshot(SessionSnapshotForTest(0, 1)); 534 context->set_last_snapshot(SessionSnapshotForTest(0, 1));
517 bool continue_sync_cycle_param = false; 535 bool continue_sync_cycle_param = false;
518 536
519 // Expect move from default polling interval to exponential backoff due to 537 // Expect move from default polling interval to exponential backoff due to
520 // unsynced_count != 0. 538 // unsynced_count != 0.
521 WaitInterval interval = syncer_thread->CalculatePollingWaitTime( 539 WaitInterval interval = syncer_thread->CalculatePollingWaitTime(
522 3600, 540 3600,
523 &user_idle_milliseconds_param, 541 &user_idle_milliseconds_param,
524 &continue_sync_cycle_param, 542 &continue_sync_cycle_param,
525 false); 543 false);
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 // The SyncerThread should be waiting for the poll now. Nudge it to sync 743 // The SyncerThread should be waiting for the poll now. Nudge it to sync
726 // immediately (5ms). 744 // immediately (5ms).
727 syncable::ModelTypeBitSet model_types; 745 syncable::ModelTypeBitSet model_types;
728 model_types[syncable::BOOKMARKS] = true; 746 model_types[syncable::BOOKMARKS] = true;
729 747
730 // Paused so we can verify the nudge types safely. 748 // Paused so we can verify the nudge types safely.
731 syncer_thread()->RequestPause(); 749 syncer_thread()->RequestPause();
732 syncer_thread()->NudgeSyncerWithDataTypes(5, 750 syncer_thread()->NudgeSyncerWithDataTypes(5,
733 SyncerThread::kUnknown, 751 SyncerThread::kUnknown,
734 model_types); 752 model_types);
735 EXPECT_EQ(model_types, syncer_thread()->vault_.pending_nudge_types_); 753 EXPECT_TRUE(CompareNudgeTypesBitSetToVault(model_types));
736 syncer_thread()->RequestResume(); 754 syncer_thread()->RequestResume();
737 755
738 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1)); 756 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1));
739 EXPECT_EQ(static_cast<unsigned int>(2), 757 EXPECT_EQ(static_cast<unsigned int>(2),
740 interceptor.times_sync_occured().size()); 758 interceptor.times_sync_occured().size());
741 759
742 // SyncerThread should be waiting again. Signal it to stop. 760 // SyncerThread should be waiting again. Signal it to stop.
743 EXPECT_TRUE(syncer_thread()->Stop(2000)); 761 EXPECT_TRUE(syncer_thread()->Stop(2000));
744 EXPECT_TRUE(syncer_thread()->vault_.pending_nudge_types_.none()); 762 EXPECT_TRUE(syncer_thread()->vault_.pending_nudge_types_.empty());
745 } 763 }
746 764
747 TEST_F(SyncerThreadWithSyncerTest, NudgeWithDataTypesCoalesced) { 765 TEST_F(SyncerThreadWithSyncerTest, NudgeWithDataTypesCoalesced) {
748 SyncShareIntercept interceptor; 766 SyncShareIntercept interceptor;
749 connection()->SetMidCommitObserver(&interceptor); 767 connection()->SetMidCommitObserver(&interceptor);
750 // We don't want a poll to happen during this test (except the first one). 768 // We don't want a poll to happen during this test (except the first one).
751 PreventThreadFromPolling(); 769 PreventThreadFromPolling();
752 EXPECT_TRUE(syncer_thread()->Start()); 770 EXPECT_TRUE(syncer_thread()->Start());
753 metadb()->Open(); 771 metadb()->Open();
754 syncer_thread()->CreateSyncer(metadb()->name()); 772 syncer_thread()->CreateSyncer(metadb()->name());
755 const TimeDelta poll_interval = TimeDelta::FromMinutes(5); 773 const TimeDelta poll_interval = TimeDelta::FromMinutes(5);
756 interceptor.WaitForSyncShare(1, poll_interval + poll_interval); 774 interceptor.WaitForSyncShare(1, poll_interval + poll_interval);
757 EXPECT_EQ(static_cast<unsigned int>(1), 775 EXPECT_EQ(static_cast<unsigned int>(1),
758 interceptor.times_sync_occured().size()); 776 interceptor.times_sync_occured().size());
759 777
760 // The SyncerThread should be waiting for the poll now. Nudge it to sync 778 // The SyncerThread should be waiting for the poll now. Nudge it to sync
761 // immediately (5ms). 779 // immediately (5ms).
762 syncable::ModelTypeBitSet model_types; 780 syncable::ModelTypeBitSet model_types;
763 model_types[syncable::BOOKMARKS] = true; 781 model_types[syncable::BOOKMARKS] = true;
764 782
765 // Paused so we can verify the nudge types safely. 783 // Paused so we can verify the nudge types safely.
766 syncer_thread()->RequestPause(); 784 syncer_thread()->RequestPause();
767 syncer_thread()->NudgeSyncerWithDataTypes(100, 785 syncer_thread()->NudgeSyncerWithDataTypes(100,
768 SyncerThread::kUnknown, 786 SyncerThread::kUnknown,
769 model_types); 787 model_types);
770 EXPECT_EQ(model_types, syncer_thread()->vault_.pending_nudge_types_); 788 EXPECT_TRUE(CompareNudgeTypesBitSetToVault(model_types));
771 789
772 model_types[syncable::BOOKMARKS] = false; 790 model_types[syncable::BOOKMARKS] = false;
773 model_types[syncable::AUTOFILL] = true; 791 model_types[syncable::AUTOFILL] = true;
774 syncer_thread()->NudgeSyncerWithDataTypes(0, 792 syncer_thread()->NudgeSyncerWithDataTypes(0,
775 SyncerThread::kUnknown, 793 SyncerThread::kUnknown,
776 model_types); 794 model_types);
777 795
778 // Reset BOOKMARKS for expectations. 796 // Reset BOOKMARKS for expectations.
779 model_types[syncable::BOOKMARKS] = true; 797 model_types[syncable::BOOKMARKS] = true;
780 EXPECT_EQ(model_types, syncer_thread()->vault_.pending_nudge_types_); 798 EXPECT_TRUE(CompareNudgeTypesBitSetToVault(model_types));
781 799
782 syncer_thread()->RequestResume(); 800 syncer_thread()->RequestResume();
783 801
784 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1)); 802 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1));
785 EXPECT_EQ(static_cast<unsigned int>(2), 803 EXPECT_EQ(static_cast<unsigned int>(2),
786 interceptor.times_sync_occured().size()); 804 interceptor.times_sync_occured().size());
787 805
788 // SyncerThread should be waiting again. Signal it to stop. 806 // SyncerThread should be waiting again. Signal it to stop.
789 EXPECT_TRUE(syncer_thread()->Stop(2000)); 807 EXPECT_TRUE(syncer_thread()->Stop(2000));
790 EXPECT_TRUE(syncer_thread()->vault_.pending_nudge_types_.none()); 808 EXPECT_TRUE(syncer_thread()->vault_.pending_nudge_types_.empty());
809 }
810
811 TEST_F(SyncerThreadWithSyncerTest, NudgeWithPayloads) {
812 SyncShareIntercept interceptor;
813 connection()->SetMidCommitObserver(&interceptor);
814 // We don't want a poll to happen during this test (except the first one).
815 PreventThreadFromPolling();
816 EXPECT_TRUE(syncer_thread()->Start());
817 metadb()->Open();
818 syncer_thread()->CreateSyncer(metadb()->name());
819 const TimeDelta poll_interval = TimeDelta::FromMinutes(5);
820 interceptor.WaitForSyncShare(1, poll_interval + poll_interval);
821 EXPECT_EQ(static_cast<unsigned int>(1),
822 interceptor.times_sync_occured().size());
823
824 // The SyncerThread should be waiting for the poll now. Nudge it to sync
825 // immediately (5ms).
826 sessions::ModelTypeMap nudge_types;
827 nudge_types[syncable::BOOKMARKS] = "test";
828
829 // Paused so we can verify the nudge types safely.
830 syncer_thread()->RequestPause();
831 syncer_thread()->NudgeSyncerWithPayloads(5,
832 SyncerThread::kUnknown,
833 nudge_types);
834 EXPECT_TRUE(CompareNudgeTypesToVault(nudge_types));
835 syncer_thread()->RequestResume();
836
837 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1));
838 EXPECT_EQ(static_cast<unsigned int>(2),
839 interceptor.times_sync_occured().size());
840
841 // SyncerThread should be waiting again. Signal it to stop.
842 EXPECT_TRUE(syncer_thread()->Stop(2000));
843 EXPECT_TRUE(syncer_thread()->vault_.pending_nudge_types_.empty());
844 }
845
846 TEST_F(SyncerThreadWithSyncerTest, NudgeWithPayloadsCoalesced) {
847 SyncShareIntercept interceptor;
848 connection()->SetMidCommitObserver(&interceptor);
849 // We don't want a poll to happen during this test (except the first one).
850 PreventThreadFromPolling();
851 EXPECT_TRUE(syncer_thread()->Start());
852 metadb()->Open();
853 syncer_thread()->CreateSyncer(metadb()->name());
854 const TimeDelta poll_interval = TimeDelta::FromMinutes(5);
855 interceptor.WaitForSyncShare(1, poll_interval + poll_interval);
856 EXPECT_EQ(static_cast<unsigned int>(1),
857 interceptor.times_sync_occured().size());
858
859 // The SyncerThread should be waiting for the poll now. Nudge it to sync
860 // immediately (5ms).
861 sessions::ModelTypeMap nudge_types;
862 nudge_types[syncable::BOOKMARKS] = "books";
863
864 // Paused so we can verify the nudge types safely.
865 syncer_thread()->RequestPause();
866 syncer_thread()->NudgeSyncerWithPayloads(100,
867 SyncerThread::kUnknown,
868 nudge_types);
869 EXPECT_TRUE(CompareNudgeTypesToVault(nudge_types));
870
871 nudge_types.erase(syncable::BOOKMARKS);
872 nudge_types[syncable::AUTOFILL] = "auto";
873 syncer_thread()->NudgeSyncerWithPayloads(0,
874 SyncerThread::kUnknown,
875 nudge_types);
876
877 // Reset BOOKMARKS for expectations.
878 nudge_types[syncable::BOOKMARKS] = "books";
879 EXPECT_TRUE(CompareNudgeTypesToVault(nudge_types));
880
881 syncer_thread()->RequestResume();
882
883 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1));
884 EXPECT_EQ(static_cast<unsigned int>(2),
885 interceptor.times_sync_occured().size());
886
887 // SyncerThread should be waiting again. Signal it to stop.
888 EXPECT_TRUE(syncer_thread()->Stop(2000));
889 EXPECT_TRUE(syncer_thread()->vault_.pending_nudge_types_.empty());
791 } 890 }
792 891
793 TEST_F(SyncerThreadWithSyncerTest, Throttling) { 892 TEST_F(SyncerThreadWithSyncerTest, Throttling) {
794 SyncShareIntercept interceptor; 893 SyncShareIntercept interceptor;
795 connection()->SetMidCommitObserver(&interceptor); 894 connection()->SetMidCommitObserver(&interceptor);
796 const TimeDelta poll_interval = TimeDelta::FromMilliseconds(10); 895 const TimeDelta poll_interval = TimeDelta::FromMilliseconds(10);
797 syncer_thread()->SetSyncerShortPollInterval(poll_interval); 896 syncer_thread()->SetSyncerShortPollInterval(poll_interval);
798 897
799 EXPECT_TRUE(syncer_thread()->Start()); 898 EXPECT_TRUE(syncer_thread()->Start());
800 metadb()->Open(); 899 metadb()->Open();
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
1126 EXPECT_CALL(listener, OnSyncEngineEvent( 1225 EXPECT_CALL(listener, OnSyncEngineEvent(
1127 Field(&SyncEngineEvent::what_happened, 1226 Field(&SyncEngineEvent::what_happened,
1128 SyncEngineEvent::SYNCER_THREAD_EXITING))); 1227 SyncEngineEvent::SYNCER_THREAD_EXITING)));
1129 1228
1130 ASSERT_TRUE(Resume(&listener)); 1229 ASSERT_TRUE(Resume(&listener));
1131 ASSERT_TRUE(sync_cycle_ended_event.TimedWait(max_wait_time_)); 1230 ASSERT_TRUE(sync_cycle_ended_event.TimedWait(max_wait_time_));
1132 EXPECT_TRUE(syncer_thread()->Stop(2000)); 1231 EXPECT_TRUE(syncer_thread()->Stop(2000));
1133 } 1232 }
1134 1233
1135 } // namespace browser_sync 1234 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698