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

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

Issue 10825439: sync: remove buggy freshness condition in SyncSchedulerImpl add defensive DCHECKs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: init Created 8 years, 4 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 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/callback.h" 6 #include "base/callback.h"
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/memory/weak_ptr.h" 8 #include "base/memory/weak_ptr.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/test/test_timeouts.h" 10 #include "base/test/test_timeouts.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 } 97 }
98 98
99 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&)); 99 MOCK_METHOD1(GetDelay, TimeDelta(const TimeDelta&));
100 }; 100 };
101 101
102 virtual void SetUp() { 102 virtual void SetUp() {
103 dir_maker_.SetUp(); 103 dir_maker_.SetUp();
104 syncer_ = new MockSyncer(); 104 syncer_ = new MockSyncer();
105 delay_ = NULL; 105 delay_ = NULL;
106 106
107 ModelSafeRoutingInfo routing_info; 107 routing_info_[BOOKMARKS] = GROUP_UI;
108 routing_info[BOOKMARKS] = GROUP_UI; 108 routing_info_[AUTOFILL] = GROUP_DB;
109 routing_info[AUTOFILL] = GROUP_DB; 109 routing_info_[THEMES] = GROUP_UI;
110 routing_info[THEMES] = GROUP_UI; 110 routing_info_[NIGORI] = GROUP_PASSIVE;
111 routing_info[NIGORI] = GROUP_PASSIVE;
112 111
113 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI))); 112 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_UI)));
114 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB))); 113 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_DB)));
115 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE))); 114 workers_.push_back(make_scoped_refptr(new FakeModelWorker(GROUP_PASSIVE)));
116 115
117 std::vector<ModelSafeWorker*> workers; 116 std::vector<ModelSafeWorker*> workers;
118 for (std::vector<scoped_refptr<FakeModelWorker> >::iterator it = 117 for (std::vector<scoped_refptr<FakeModelWorker> >::iterator it =
119 workers_.begin(); it != workers_.end(); ++it) { 118 workers_.begin(); it != workers_.end(); ++it) {
120 workers.push_back(it->get()); 119 workers.push_back(it->get());
121 } 120 }
122 121
123 connection_.reset(new MockConnectionManager(directory())); 122 connection_.reset(new MockConnectionManager(directory()));
124 connection_->SetServerReachable(); 123 connection_->SetServerReachable();
125 throttled_data_type_tracker_.reset(new ThrottledDataTypeTracker(NULL)); 124 throttled_data_type_tracker_.reset(new ThrottledDataTypeTracker(NULL));
126 context_.reset(new SyncSessionContext( 125 context_.reset(new SyncSessionContext(
127 connection_.get(), directory(), workers, 126 connection_.get(), directory(), workers,
128 &extensions_activity_monitor_, throttled_data_type_tracker_.get(), 127 &extensions_activity_monitor_, throttled_data_type_tracker_.get(),
129 std::vector<SyncEngineEventListener*>(), NULL, NULL, 128 std::vector<SyncEngineEventListener*>(), NULL, NULL,
130 true /* enable keystore encryption */)); 129 true /* enable keystore encryption */));
131 context_->set_routing_info(routing_info); 130 context_->set_routing_info(routing_info_);
132 context_->set_notifications_enabled(true); 131 context_->set_notifications_enabled(true);
133 context_->set_account_name("Test"); 132 context_->set_account_name("Test");
134 scheduler_.reset( 133 scheduler_.reset(
135 new SyncSchedulerImpl("TestSyncScheduler", 134 new SyncSchedulerImpl("TestSyncScheduler",
136 BackoffDelayProvider::FromDefaults(), 135 BackoffDelayProvider::FromDefaults(),
137 context(), 136 context(),
138 syncer_)); 137 syncer_));
139 } 138 }
140 139
141 SyncSchedulerImpl* scheduler() { return scheduler_.get(); } 140 SyncSchedulerImpl* scheduler() { return scheduler_.get(); }
141 const ModelSafeRoutingInfo& routing_info() { return routing_info_; }
142 MockSyncer* syncer() { return syncer_; } 142 MockSyncer* syncer() { return syncer_; }
143 MockDelayProvider* delay() { return delay_; } 143 MockDelayProvider* delay() { return delay_; }
144 MockConnectionManager* connection() { return connection_.get(); } 144 MockConnectionManager* connection() { return connection_.get(); }
145 TimeDelta zero() { return TimeDelta::FromSeconds(0); } 145 TimeDelta zero() { return TimeDelta::FromSeconds(0); }
146 TimeDelta timeout() { 146 TimeDelta timeout() {
147 return TestTimeouts::action_timeout(); 147 return TestTimeouts::action_timeout();
148 } 148 }
149 149
150 virtual void TearDown() { 150 virtual void TearDown() {
151 PumpLoop(); 151 PumpLoop();
(...skipping 24 matching lines...) Expand all
176 } 176 }
177 177
178 // This stops the scheduler synchronously. 178 // This stops the scheduler synchronously.
179 void StopSyncScheduler() { 179 void StopSyncScheduler() {
180 scheduler()->RequestStop(base::Bind(&SyncSchedulerTest::DoQuitLoopNow, 180 scheduler()->RequestStop(base::Bind(&SyncSchedulerTest::DoQuitLoopNow,
181 weak_ptr_factory_.GetWeakPtr())); 181 weak_ptr_factory_.GetWeakPtr()));
182 RunLoop(); 182 RunLoop();
183 } 183 }
184 184
185 bool RunAndGetBackoff() { 185 bool RunAndGetBackoff() {
186 ModelTypeSet nudge_types; 186 ModelTypeSet nudge_types(BOOKMARKS);
187 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 187 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
188 188
189 scheduler()->ScheduleNudgeAsync( 189 scheduler()->ScheduleNudgeAsync(
190 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); 190 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE);
191 RunLoop(); 191 RunLoop();
192 192
193 return scheduler()->IsBackingOff(); 193 return scheduler()->IsBackingOff();
194 } 194 }
195 195
196 void UseMockDelayProvider() { 196 void UseMockDelayProvider() {
(...skipping 28 matching lines...) Expand all
225 MessageLoop message_loop_; 225 MessageLoop message_loop_;
226 TestDirectorySetterUpper dir_maker_; 226 TestDirectorySetterUpper dir_maker_;
227 scoped_ptr<MockConnectionManager> connection_; 227 scoped_ptr<MockConnectionManager> connection_;
228 scoped_ptr<SyncSessionContext> context_; 228 scoped_ptr<SyncSessionContext> context_;
229 scoped_ptr<SyncSchedulerImpl> scheduler_; 229 scoped_ptr<SyncSchedulerImpl> scheduler_;
230 MockSyncer* syncer_; 230 MockSyncer* syncer_;
231 MockDelayProvider* delay_; 231 MockDelayProvider* delay_;
232 std::vector<scoped_refptr<FakeModelWorker> > workers_; 232 std::vector<scoped_refptr<FakeModelWorker> > workers_;
233 FakeExtensionsActivityMonitor extensions_activity_monitor_; 233 FakeExtensionsActivityMonitor extensions_activity_monitor_;
234 scoped_ptr<ThrottledDataTypeTracker> throttled_data_type_tracker_; 234 scoped_ptr<ThrottledDataTypeTracker> throttled_data_type_tracker_;
235 ModelSafeRoutingInfo routing_info_;
235 }; 236 };
236 237
237 void RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record) { 238 void RecordSyncShareImpl(SyncSession* s, SyncShareRecords* record) {
238 record->times.push_back(TimeTicks::Now()); 239 record->times.push_back(TimeTicks::Now());
239 record->snapshots.push_back(s->TakeSnapshot()); 240 record->snapshots.push_back(s->TakeSnapshot());
240 } 241 }
241 242
242 ACTION_P(RecordSyncShare, record) { 243 ACTION_P(RecordSyncShare, record) {
243 RecordSyncShareImpl(arg0, record); 244 RecordSyncShareImpl(arg0, record);
244 if (MessageLoop::current()->is_running()) 245 if (MessageLoop::current()->is_running())
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 model_types, 399 model_types,
399 TypesToRoutingInfo(model_types), 400 TypesToRoutingInfo(model_types),
400 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 401 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
401 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 402 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
402 ASSERT_EQ(0, counter.times_called()); 403 ASSERT_EQ(0, counter.times_called());
403 ASSERT_EQ(1U, records.snapshots.size()); 404 ASSERT_EQ(1U, records.snapshots.size());
404 405
405 scheduler()->ScheduleNudgeAsync( 406 scheduler()->ScheduleNudgeAsync(
406 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE); 407 zero(), NUDGE_SOURCE_LOCAL, model_types, FROM_HERE);
407 RunLoop(); 408 RunLoop();
409 // Note that we're not RunLoop()ing for the NUDGE we just scheduled, but
410 // for the first retry attempt from the config job (after
411 // waiting ~+/- 50ms).
408 ASSERT_EQ(2U, records.snapshots.size()); 412 ASSERT_EQ(2U, records.snapshots.size());
409 ASSERT_EQ(0, counter.times_called()); 413 ASSERT_EQ(0, counter.times_called());
414 EXPECT_EQ(GetUpdatesCallerInfo::RECONFIGURATION,
415 records.snapshots[1].source().updates_source);
410 416
411 RunLoop(); 417 RunLoop();
418 // This is the 3rd attempt, which we've set up to SimulateSuccess.
412 ASSERT_EQ(3U, records.snapshots.size()); 419 ASSERT_EQ(3U, records.snapshots.size());
413 ASSERT_EQ(1, counter.times_called()); 420 ASSERT_EQ(1, counter.times_called());
414 421
415 // Now change the mode so nudge can execute. 422 // Now change the mode so nudge can execute.
416 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 423 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
417 424
418 ASSERT_EQ(4U, records.snapshots.size()); 425 ASSERT_EQ(4U, records.snapshots.size());
419 426
420 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types, 427 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(model_types,
421 records.snapshots[2].source().types)); 428 records.snapshots[2].source().types));
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 692
686 // Test that a sync session is run through to completion. 693 // Test that a sync session is run through to completion.
687 TEST_F(SyncSchedulerTest, HasMoreToSync) { 694 TEST_F(SyncSchedulerTest, HasMoreToSync) {
688 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 695 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
689 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) 696 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync))
690 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 697 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
691 QuitLoopNowAction())); 698 QuitLoopNowAction()));
692 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 699 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
693 700
694 scheduler()->ScheduleNudgeAsync( 701 scheduler()->ScheduleNudgeAsync(
695 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 702 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE);
696 RunLoop(); 703 RunLoop();
697 // If more nudges are scheduled, they'll be waited on by TearDown, and would 704 // If more nudges are scheduled, they'll be waited on by TearDown, and would
698 // cause our expectation to break. 705 // cause our expectation to break.
699 } 706 }
700 707
701 // Test that continuations can go into backoff. 708 // Test that continuations can go into backoff.
702 TEST_F(SyncSchedulerTest, HasMoreToSyncThenFails) { 709 TEST_F(SyncSchedulerTest, HasMoreToSyncThenFails) {
703 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 710 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
704 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync)) 711 .WillOnce(Invoke(sessions::test_util::SimulateHasMoreToSync))
705 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 712 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
706 QuitLoopNowAction())); 713 QuitLoopNowAction()));
707 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 714 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
708 715
709 scheduler()->ScheduleNudgeAsync( 716 scheduler()->ScheduleNudgeAsync(
710 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 717 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE);
711 718
712 // We should detect the failure on the second sync share, and go into backoff. 719 // We should detect the failure on the second sync share, and go into backoff.
713 EXPECT_TRUE(RunAndGetBackoff()); 720 EXPECT_TRUE(RunAndGetBackoff());
714 } 721 }
715 722
716 // Test that no syncing occurs when throttled. 723 // Test that no syncing occurs when throttled.
717 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { 724 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) {
718 const ModelTypeSet types(BOOKMARKS); 725 const ModelTypeSet types(BOOKMARKS);
719 TimeDelta poll(TimeDelta::FromMilliseconds(5)); 726 TimeDelta poll(TimeDelta::FromMilliseconds(5));
720 TimeDelta throttle(TimeDelta::FromMinutes(10)); 727 TimeDelta throttle(TimeDelta::FromMinutes(10));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); 773 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll);
767 } 774 }
768 775
769 // Test nudges / polls don't run in config mode and config tasks do. 776 // Test nudges / polls don't run in config mode and config tasks do.
770 TEST_F(SyncSchedulerTest, ConfigurationMode) { 777 TEST_F(SyncSchedulerTest, ConfigurationMode) {
771 TimeDelta poll(TimeDelta::FromMilliseconds(15)); 778 TimeDelta poll(TimeDelta::FromMilliseconds(15));
772 SyncShareRecords records; 779 SyncShareRecords records;
773 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 780 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
774 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 781 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
775 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), 782 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
776 WithArg<0>(RecordSyncShare(&records)))); 783 WithArg<0>(RecordSyncShare(&records))))
784 .RetiresOnSaturation();
777 785
778 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 786 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
779 787
780 const ModelTypeSet nudge_types(AUTOFILL); 788 const ModelTypeSet nudge_types(AUTOFILL);
781 scheduler()->ScheduleNudgeAsync( 789 scheduler()->ScheduleNudgeAsync(
782 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); 790 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE);
783 scheduler()->ScheduleNudgeAsync( 791 scheduler()->ScheduleNudgeAsync(
784 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); 792 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE);
785 793
786 const ModelTypeSet config_types(BOOKMARKS); 794 const ModelTypeSet config_types(BOOKMARKS);
787 795
788 CallbackCounter counter; 796 CallbackCounter counter;
789 ConfigurationParams params( 797 ConfigurationParams params(
790 GetUpdatesCallerInfo::RECONFIGURATION, 798 GetUpdatesCallerInfo::RECONFIGURATION,
791 config_types, 799 config_types,
792 TypesToRoutingInfo(config_types), 800 TypesToRoutingInfo(config_types),
793 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 801 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
794 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); 802 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params));
795 ASSERT_EQ(1, counter.times_called()); 803 ASSERT_EQ(1, counter.times_called());
796 804
797 ASSERT_EQ(1U, records.snapshots.size()); 805 ASSERT_EQ(1U, records.snapshots.size());
798 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(config_types, 806 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(config_types,
799 records.snapshots[0].source().types)); 807 records.snapshots[0].source().types));
808
809 // Switch to NORMAL_MODE to ensure NUDGES were properly saved and run.
810 // SyncSchedulerWhiteboxTest also tests this, but here, we also wind up
811 // up testing that the freshness condition check doesn't cancel nudges
812 // that were scheduled to start before the config finished.
813 scheduler()->OnReceivedLongPollIntervalUpdate(TimeDelta::FromDays(1));
814 SyncShareRecords records2;
815 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
816 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
817 WithArg<0>(RecordSyncShare(&records2))));
818
819 // TODO(tim): Figure out how to remove this dangerous need to reset
820 // routing info between mode switches.
821 context()->set_routing_info(routing_info());
822 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
823
824 ASSERT_EQ(1U, records2.snapshots.size());
825 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
826 records2.snapshots[0].source().updates_source);
827 EXPECT_TRUE(CompareModelTypeSetToModelTypePayloadMap(nudge_types,
828 records2.snapshots[0].source().types));
829 PumpLoop();
800 } 830 }
801 831
802 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { 832 class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest {
803 void SetUp() { 833 void SetUp() {
804 SyncSchedulerTest::SetUp(); 834 SyncSchedulerTest::SetUp();
805 UseMockDelayProvider(); 835 UseMockDelayProvider();
806 EXPECT_CALL(*delay(), GetDelay(_)) 836 EXPECT_CALL(*delay(), GetDelay(_))
807 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); 837 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1)));
808 } 838 }
809 839
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 941 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
912 942
913 CallbackCounter counter; 943 CallbackCounter counter;
914 ConfigurationParams params( 944 ConfigurationParams params(
915 GetUpdatesCallerInfo::RECONFIGURATION, 945 GetUpdatesCallerInfo::RECONFIGURATION,
916 types, 946 types,
917 TypesToRoutingInfo(types), 947 TypesToRoutingInfo(types),
918 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); 948 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter)));
919 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params)); 949 ASSERT_FALSE(scheduler()->ScheduleConfiguration(params));
920 ASSERT_EQ(0, counter.times_called()); 950 ASSERT_EQ(0, counter.times_called());
921
922 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
923
924 scheduler()->ScheduleNudgeAsync(
925 zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE);
926 scheduler()->ScheduleNudgeAsync(
927 zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE);
928 PumpLoop();
929 } 951 }
930 952
931 // Test that backoff is shaping traffic properly with consecutive errors. 953 // Test that backoff is shaping traffic properly with consecutive errors.
932 TEST_F(SyncSchedulerTest, BackoffElevation) { 954 TEST_F(SyncSchedulerTest, BackoffElevation) {
933 SyncShareRecords r; 955 SyncShareRecords r;
934 UseMockDelayProvider(); 956 UseMockDelayProvider();
935 957
936 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(kMinNumSamples) 958 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(kMinNumSamples)
937 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 959 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
938 RecordSyncShareMultiple(&r, kMinNumSamples))); 960 RecordSyncShareMultiple(&r, kMinNumSamples)));
(...skipping 12 matching lines...) Expand all
951 EXPECT_CALL(*delay(), GetDelay(Eq(third))).WillOnce(Return(fourth)) 973 EXPECT_CALL(*delay(), GetDelay(Eq(third))).WillOnce(Return(fourth))
952 .RetiresOnSaturation(); 974 .RetiresOnSaturation();
953 EXPECT_CALL(*delay(), GetDelay(Eq(fourth))).WillOnce(Return(fifth)) 975 EXPECT_CALL(*delay(), GetDelay(Eq(fourth))).WillOnce(Return(fifth))
954 .RetiresOnSaturation(); 976 .RetiresOnSaturation();
955 EXPECT_CALL(*delay(), GetDelay(Eq(fifth))).WillOnce(Return(sixth)); 977 EXPECT_CALL(*delay(), GetDelay(Eq(fifth))).WillOnce(Return(sixth));
956 978
957 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 979 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
958 980
959 // Run again with a nudge. 981 // Run again with a nudge.
960 scheduler()->ScheduleNudgeAsync( 982 scheduler()->ScheduleNudgeAsync(
961 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 983 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE);
962 RunLoop(); 984 RunLoop();
963 985
964 ASSERT_EQ(kMinNumSamples, r.snapshots.size()); 986 ASSERT_EQ(kMinNumSamples, r.snapshots.size());
965 EXPECT_GE(r.times[1] - r.times[0], second); 987 EXPECT_GE(r.times[1] - r.times[0], second);
966 EXPECT_GE(r.times[2] - r.times[1], third); 988 EXPECT_GE(r.times[2] - r.times[1], third);
967 EXPECT_GE(r.times[3] - r.times[2], fourth); 989 EXPECT_GE(r.times[3] - r.times[2], fourth);
968 EXPECT_GE(r.times[4] - r.times[3], fifth); 990 EXPECT_GE(r.times[4] - r.times[3], fifth);
969 } 991 }
970 992
971 // Test that things go back to normal once a retry makes forward progress. 993 // Test that things go back to normal once a retry makes forward progress.
(...skipping 11 matching lines...) Expand all
983 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), 1005 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess),
984 RecordSyncShareMultiple(&r, kMinNumSamples))); 1006 RecordSyncShareMultiple(&r, kMinNumSamples)));
985 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); 1007 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff));
986 1008
987 // Optimal start for the post-backoff poll party. 1009 // Optimal start for the post-backoff poll party.
988 TimeTicks optimal_start = TimeTicks::Now(); 1010 TimeTicks optimal_start = TimeTicks::Now();
989 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1011 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
990 1012
991 // Run again to wait for polling. 1013 // Run again to wait for polling.
992 scheduler()->ScheduleNudgeAsync(zero(), NUDGE_SOURCE_LOCAL, 1014 scheduler()->ScheduleNudgeAsync(zero(), NUDGE_SOURCE_LOCAL,
993 ModelTypeSet(), FROM_HERE); 1015 ModelTypeSet(BOOKMARKS), FROM_HERE);
994 RunLoop(); 1016 RunLoop();
995 1017
996 StopSyncScheduler(); 1018 StopSyncScheduler();
997 1019
998 EXPECT_EQ(kMinNumSamples, r.times.size()); 1020 EXPECT_EQ(kMinNumSamples, r.times.size());
999 1021
1000 // The first nudge ran as soon as possible. It failed. 1022 // The first nudge ran as soon as possible. It failed.
1001 TimeTicks optimal_job_time = optimal_start; 1023 TimeTicks optimal_job_time = optimal_start;
1002 EXPECT_GE(r.times[0], optimal_job_time); 1024 EXPECT_GE(r.times[0], optimal_job_time);
1003 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 1025 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 } 1066 }
1045 1067
1046 // Test that appropriate syncer steps are requested for each job type. 1068 // Test that appropriate syncer steps are requested for each job type.
1047 TEST_F(SyncSchedulerTest, SyncerSteps) { 1069 TEST_F(SyncSchedulerTest, SyncerSteps) {
1048 // Nudges. 1070 // Nudges.
1049 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) 1071 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END))
1050 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); 1072 .WillOnce(Invoke(sessions::test_util::SimulateSuccess));
1051 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1073 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1052 1074
1053 scheduler()->ScheduleNudgeAsync( 1075 scheduler()->ScheduleNudgeAsync(
1054 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 1076 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE);
1055 PumpLoop(); 1077 PumpLoop();
1056 // Pump again to run job. 1078 // Pump again to run job.
1057 PumpLoop(); 1079 PumpLoop();
1058 1080
1059 StopSyncScheduler(); 1081 StopSyncScheduler();
1060 Mock::VerifyAndClearExpectations(syncer()); 1082 Mock::VerifyAndClearExpectations(syncer());
1061 1083
1062 // Configuration. 1084 // Configuration.
1063 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) 1085 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES))
1064 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); 1086 .WillOnce(Invoke(sessions::test_util::SimulateSuccess));
(...skipping 24 matching lines...) Expand all
1089 1111
1090 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1112 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1091 1113
1092 // Run again to wait for polling. 1114 // Run again to wait for polling.
1093 RunLoop(); 1115 RunLoop();
1094 1116
1095 StopSyncScheduler(); 1117 StopSyncScheduler();
1096 Mock::VerifyAndClearExpectations(syncer()); 1118 Mock::VerifyAndClearExpectations(syncer());
1097 } 1119 }
1098 1120
1099 // Test config tasks don't run during normal mode.
1100 // TODO(tim): Implement this test and then the functionality!
1101 TEST_F(SyncSchedulerTest, DISABLED_NoConfigDuringNormal) {
1102 }
1103
1104 // Test that starting the syncer thread without a valid connection doesn't 1121 // Test that starting the syncer thread without a valid connection doesn't
1105 // break things when a connection is detected. 1122 // break things when a connection is detected.
1106 TEST_F(SyncSchedulerTest, StartWhenNotConnected) { 1123 TEST_F(SyncSchedulerTest, StartWhenNotConnected) {
1107 connection()->SetServerNotReachable(); 1124 connection()->SetServerNotReachable();
1108 connection()->UpdateConnectionStatus(); 1125 connection()->UpdateConnectionStatus();
1109 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 1126 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
1110 .WillOnce(Invoke(sessions::test_util::SimulateConnectionFailure)) 1127 .WillOnce(Invoke(sessions::test_util::SimulateConnectionFailure))
1111 .WillOnce(QuitLoopNowAction()); 1128 .WillOnce(QuitLoopNowAction());
1112 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 1129 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1113 1130
1114 scheduler()->ScheduleNudgeAsync( 1131 scheduler()->ScheduleNudgeAsync(
1115 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 1132 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(BOOKMARKS), FROM_HERE);
1116 // Should save the nudge for until after the server is reachable. 1133 // Should save the nudge for until after the server is reachable.
1117 MessageLoop::current()->RunAllPending(); 1134 MessageLoop::current()->RunAllPending();
1118 1135
1119 connection()->SetServerReachable(); 1136 connection()->SetServerReachable();
1120 connection()->UpdateConnectionStatus(); 1137 connection()->UpdateConnectionStatus();
1121 scheduler()->OnConnectionStatusChange(); 1138 scheduler()->OnConnectionStatusChange();
1122 MessageLoop::current()->RunAllPending(); 1139 MessageLoop::current()->RunAllPending();
1123 } 1140 }
1124 1141
1125 } // namespace syncer 1142 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698