Index: sync/engine/sync_scheduler_unittest.cc |
diff --git a/sync/engine/sync_scheduler_unittest.cc b/sync/engine/sync_scheduler_unittest.cc |
index 1d43844cddb4fa3a804321d69bc2352807950165..b6cdf6adf96c60cb37a8da27159e1a7f0728fa43 100644 |
--- a/sync/engine/sync_scheduler_unittest.cc |
+++ b/sync/engine/sync_scheduler_unittest.cc |
@@ -194,8 +194,12 @@ class SyncSchedulerTest : public testing::Test { |
QuitLoopNow(); |
} |
- void StartSyncScheduler(SyncScheduler::Mode mode) { |
- scheduler()->Start(mode); |
+ void StartSyncConfiguration() { |
+ scheduler()->Start(SyncScheduler::CONFIGURATION_MODE, base::Time()); |
+ } |
+ |
+ void StartSyncScheduler(base::Time last_poll_time) { |
+ scheduler()->Start(SyncScheduler::NORMAL_MODE, last_poll_time); |
} |
// This stops the scheduler synchronously. |
@@ -209,7 +213,7 @@ class SyncSchedulerTest : public testing::Test { |
bool RunAndGetBackoff() { |
ModelTypeSet nudge_types(THEMES); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(nudge_types, FROM_HERE); |
RunLoop(); |
@@ -264,21 +268,21 @@ void RecordSyncShareImpl(SyncShareTimes* times) { |
times->push_back(TimeTicks::Now()); |
} |
-ACTION_P(RecordSyncShare, times) { |
+ACTION_P2(RecordSyncShare, times, success) { |
RecordSyncShareImpl(times); |
if (base::MessageLoop::current()->is_running()) |
QuitLoopNow(); |
- return true; |
+ return success; |
} |
-ACTION_P2(RecordSyncShareMultiple, times, quit_after) { |
+ACTION_P3(RecordSyncShareMultiple, times, quit_after, success) { |
RecordSyncShareImpl(times); |
EXPECT_LE(times->size(), quit_after); |
if (times->size() >= quit_after && |
base::MessageLoop::current()->is_running()) { |
QuitLoopNow(); |
} |
- return true; |
+ return success; |
} |
ACTION_P(StopScheduler, scheduler) { |
@@ -291,9 +295,9 @@ ACTION(AddFailureAndQuitLoopNow) { |
return true; |
} |
-ACTION(QuitLoopNowAction) { |
+ACTION_P(QuitLoopNowAction, success) { |
QuitLoopNow(); |
- return true; |
+ return success; |
} |
// Test nudge scheduling. |
@@ -303,10 +307,10 @@ TEST_F(SyncSchedulerTest, Nudge) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))) |
+ RecordSyncShare(×, true))) |
.RetiresOnSaturation(); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(model_types, FROM_HERE); |
RunLoop(); |
@@ -319,7 +323,7 @@ TEST_F(SyncSchedulerTest, Nudge) { |
model_types.Put(TYPED_URLS); |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×2))); |
+ RecordSyncShare(×2, true))); |
scheduler()->ScheduleLocalNudge(model_types, FROM_HERE); |
RunLoop(); |
} |
@@ -332,9 +336,9 @@ TEST_F(SyncSchedulerTest, Config) { |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -358,13 +362,13 @@ TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { |
SyncShareTimes times; |
const ModelTypeSet model_types(THEMES); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
- RecordSyncShare(×))) |
+ RecordSyncShare(×, false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, false))); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -389,7 +393,7 @@ TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
RunLoop(); |
ASSERT_EQ(1, ready_counter.times_called()); |
@@ -404,14 +408,14 @@ TEST_F(SyncSchedulerTest, ConfigWithStop) { |
SyncShareTimes times; |
const ModelTypeSet model_types(THEMES); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
// Make ConfigureSyncShare call scheduler->Stop(). It is not supposed to call |
// retry_task or dereference configuration params. |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
StopScheduler(scheduler()), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, false))); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -436,12 +440,12 @@ TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { |
.WillRepeatedly(Return(TimeDelta::FromMilliseconds(50))); |
SyncShareTimes times; |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
// Request a configure and make sure it fails. |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, false))); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
ConfigurationParams params( |
@@ -459,7 +463,7 @@ TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { |
// Ask for a nudge while dealing with repeated configure failure. |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureFailed), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, false))); |
scheduler()->ScheduleLocalNudge(model_types, FROM_HERE); |
RunLoop(); |
// Note that we're not RunLoop()ing for the NUDGE we just scheduled, but |
@@ -471,25 +475,25 @@ TEST_F(SyncSchedulerTest, NudgeWithConfigWithBackingOff) { |
// Let the next configure retry succeed. |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
RunLoop(); |
// Now change the mode so nudge can execute. |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ RecordSyncShare(×, true))); |
+ StartSyncScheduler(base::Time()); |
PumpLoop(); |
} |
// Test that nudges are coalesced. |
TEST_F(SyncSchedulerTest, NudgeCoalescing) { |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
SyncShareTimes times; |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
const ModelTypeSet types1(THEMES), types2(TYPED_URLS), types3(THEMES); |
TimeTicks optimal_time = TimeTicks::Now() + default_delay(); |
scheduler()->ScheduleLocalNudge(types1, FROM_HERE); |
@@ -504,19 +508,19 @@ TEST_F(SyncSchedulerTest, NudgeCoalescing) { |
SyncShareTimes times2; |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×2))); |
+ RecordSyncShare(×2, true))); |
scheduler()->ScheduleLocalNudge(types3, FROM_HERE); |
RunLoop(); |
} |
// Test that nudges are coalesced. |
TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
SyncShareTimes times; |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
ModelTypeSet types1(THEMES), types2(TYPED_URLS), types3; |
// Create a huge time delay. |
@@ -542,12 +546,12 @@ TEST_F(SyncSchedulerTest, NudgeCoalescingWithDifferentTimings) { |
// Test nudge scheduling. |
TEST_F(SyncSchedulerTest, NudgeWithStates) { |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
SyncShareTimes times1; |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×1))) |
+ RecordSyncShare(×1, true))) |
.RetiresOnSaturation(); |
scheduler()->ScheduleInvalidationNudge( |
THEMES, BuildInvalidation(10, "test"), FROM_HERE); |
@@ -559,7 +563,7 @@ TEST_F(SyncSchedulerTest, NudgeWithStates) { |
SyncShareTimes times2; |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×2))); |
+ RecordSyncShare(×2, true))); |
scheduler()->ScheduleInvalidationNudge( |
TYPED_URLS, BuildInvalidation(10, "test2"), FROM_HERE); |
RunLoop(); |
@@ -572,12 +576,61 @@ TEST_F(SyncSchedulerTest, Polling) { |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
.WillRepeatedly( |
DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
+ |
+ scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
+ |
+ TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
+ StartSyncScheduler(base::Time()); |
+ |
+ // Run again to wait for polling. |
+ RunLoop(); |
+ |
+ StopSyncScheduler(); |
+ AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); |
+} |
+ |
+// Test that we reuse the previous poll time on startup, triggering the first |
+// poll based on when the last one happened. Subsequent polls should have the |
+// normal delay. |
+TEST_F(SyncSchedulerTest, PollingPersistence) { |
+ SyncShareTimes times; |
+ // Use a large poll interval that wouldn't normally get hit on its own for |
+ // some time yet. |
+ TimeDelta poll_interval(TimeDelta::FromMilliseconds(500)); |
+ EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
+ .WillRepeatedly( |
+ DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
+ |
+ scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
+ |
+ // Set the start time to now, as the poll was overdue. |
+ TimeTicks optimal_start = TimeTicks::Now(); |
+ StartSyncScheduler(base::Time::Now() - poll_interval); |
+ |
+ // Run again to wait for polling. |
+ RunLoop(); |
+ |
+ StopSyncScheduler(); |
+ AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); |
+} |
+ |
+// Test that if the persisted poll is in the future, it's ignored (the case |
+// where the local time has been modified). |
+TEST_F(SyncSchedulerTest, PollingPersistenceBadClock) { |
+ SyncShareTimes times; |
+ TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
+ EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
+ .WillRepeatedly( |
+ DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
+ // Set the start time to |poll_interval| in the future. |
TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time::Now() + base::TimeDelta::FromMinutes(10)); |
// Run again to wait for polling. |
RunLoop(); |
@@ -593,13 +646,13 @@ TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
.WillRepeatedly( |
DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); |
scheduler()->SetNotificationsEnabled(false); |
TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Run again to wait for polling. |
RunLoop(); |
@@ -622,10 +675,10 @@ TEST_F(SyncSchedulerTest, PollIntervalUpdate) { |
.WillRepeatedly( |
DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
WithArg<1>( |
- RecordSyncShareMultiple(×, kMinNumSamples)))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, true)))); |
TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Run again to wait for polling. |
RunLoop(); |
@@ -644,15 +697,15 @@ TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll( |
WithArg<2>(sessions::test_util::SimulateThrottled(throttle)), |
- Return(true))) |
+ Return(false))) |
.WillRepeatedly(AddFailureAndQuitLoopNow()); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(types, FROM_HERE); |
PumpLoop(); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -679,15 +732,15 @@ TEST_F(SyncSchedulerTest, ThrottlingExpiresFromPoll) { |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillOnce(DoAll( |
WithArg<1>(sessions::test_util::SimulateThrottled(throttle1)), |
- Return(true))) |
+ Return(false))) |
.RetiresOnSaturation(); |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillRepeatedly( |
DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Run again to wait for polling. |
RunLoop(); |
@@ -706,14 +759,14 @@ TEST_F(SyncSchedulerTest, ThrottlingExpiresFromNudge) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll( |
WithArg<2>(sessions::test_util::SimulateThrottled(throttle1)), |
- Return(true))) |
+ Return(false))) |
.RetiresOnSaturation(); |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- QuitLoopNowAction())); |
+ QuitLoopNowAction(true))); |
const ModelTypeSet types(THEMES); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(types, FROM_HERE); |
PumpLoop(); // To get PerformDelayedNudge called. |
@@ -735,14 +788,14 @@ TEST_F(SyncSchedulerTest, ThrottlingExpiresFromConfigure) { |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll( |
WithArg<2>(sessions::test_util::SimulateThrottled(throttle1)), |
- Return(true))) |
+ Return(false))) |
.RetiresOnSaturation(); |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
- QuitLoopNowAction())); |
+ QuitLoopNowAction(true))); |
const ModelTypeSet types(THEMES); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -780,10 +833,10 @@ TEST_F(SyncSchedulerTest, TypeThrottlingBlocksNudge) { |
.WillOnce(DoAll( |
WithArg<2>( |
sessions::test_util::SimulateTypesThrottled(types, throttle1)), |
- Return(true))) |
+ Return(false))) |
.RetiresOnSaturation(); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(types, FROM_HERE); |
PumpLoop(); // To get PerformDelayedNudge called. |
PumpLoop(); // To get TrySyncSessionJob called |
@@ -815,10 +868,10 @@ TEST_F(SyncSchedulerTest, TypeThrottlingDoesBlockOtherSources) { |
WithArg<2>( |
sessions::test_util::SimulateTypesThrottled( |
throttled_types, throttle1)), |
- Return(true))) |
+ Return(false))) |
.RetiresOnSaturation(); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(throttled_types, FROM_HERE); |
PumpLoop(); // To get PerformDelayedNudge called. |
PumpLoop(); // To get TrySyncSessionJob called |
@@ -838,7 +891,7 @@ TEST_F(SyncSchedulerTest, TypeThrottlingDoesBlockOtherSources) { |
// Local nudges for non-throttled types will trigger a sync. |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
scheduler()->ScheduleLocalNudge(unthrottled_types, FROM_HERE); |
RunLoop(); |
Mock::VerifyAndClearExpectations(syncer()); |
@@ -852,7 +905,7 @@ TEST_F(SyncSchedulerTest, ConfigurationMode) { |
SyncShareTimes times; |
scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
const ModelTypeSet nudge_types(TYPED_URLS); |
scheduler()->ScheduleLocalNudge(nudge_types, FROM_HERE); |
@@ -862,7 +915,7 @@ TEST_F(SyncSchedulerTest, ConfigurationMode) { |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConfigureSuccess), |
- RecordSyncShare(×))) |
+ RecordSyncShare(×, true))) |
.RetiresOnSaturation(); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -884,12 +937,12 @@ TEST_F(SyncSchedulerTest, ConfigurationMode) { |
SyncShareTimes times2; |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×2))); |
+ RecordSyncShare(×2, true))); |
// TODO(tim): Figure out how to remove this dangerous need to reset |
// routing info between mode switches. |
context()->SetRoutingInfo(routing_info()); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
RunLoop(); |
Mock::VerifyAndClearExpectations(syncer()); |
@@ -909,12 +962,12 @@ class BackoffTriggersSyncSchedulerTest : public SyncSchedulerTest { |
} |
}; |
-// Have the sycner fail during commit. Expect that the scheduler enters |
+// Have the syncer fail during commit. Expect that the scheduler enters |
// backoff. |
TEST_F(BackoffTriggersSyncSchedulerTest, FailCommitOnce) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
- QuitLoopNowAction())); |
+ QuitLoopNowAction(false))); |
EXPECT_TRUE(RunAndGetBackoff()); |
} |
@@ -924,9 +977,9 @@ TEST_F(BackoffTriggersSyncSchedulerTest, FailDownloadOnceThenSucceed) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll( |
Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
- Return(true))) |
+ Return(false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- QuitLoopNowAction())); |
+ QuitLoopNowAction(true))); |
EXPECT_FALSE(RunAndGetBackoff()); |
} |
@@ -936,9 +989,9 @@ TEST_F(BackoffTriggersSyncSchedulerTest, FailCommitOnceThenSucceed) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll( |
Invoke(sessions::test_util::SimulateCommitFailed), |
- Return(true))) |
+ Return(false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- QuitLoopNowAction())); |
+ QuitLoopNowAction(true))); |
EXPECT_FALSE(RunAndGetBackoff()); |
} |
@@ -948,10 +1001,10 @@ TEST_F(BackoffTriggersSyncSchedulerTest, FailDownloadTwice) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll( |
Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
- Return(true))) |
+ Return(false))) |
.WillRepeatedly(DoAll( |
- Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
- QuitLoopNowAction())); |
+ Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
+ QuitLoopNowAction(false))); |
EXPECT_TRUE(RunAndGetBackoff()); |
} |
@@ -961,11 +1014,11 @@ TEST_F(BackoffTriggersSyncSchedulerTest, FailGetEncryptionKey) { |
EXPECT_CALL(*syncer(), ConfigureSyncShare(_,_,_)) |
.WillOnce(DoAll( |
Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), |
- Return(true))) |
+ Return(false))) |
.WillRepeatedly(DoAll( |
- Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), |
- QuitLoopNowAction())); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ Invoke(sessions::test_util::SimulateGetEncryptionKeyFailed), |
+ QuitLoopNowAction(false))); |
+ StartSyncConfiguration(); |
ModelTypeSet types(THEMES); |
CallbackCounter ready_counter; |
@@ -992,11 +1045,11 @@ TEST_F(SyncSchedulerTest, BackoffDropsJobs) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
- RecordSyncShareMultiple(×, 1U))); |
+ RecordSyncShareMultiple(×, 1U, false))); |
EXPECT_CALL(*delay(), GetDelay(_)). |
WillRepeatedly(Return(TimeDelta::FromDays(1))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// This nudge should fail and put us into backoff. Thanks to our mock |
// GetDelay() setup above, this will be a long backoff. |
@@ -1017,7 +1070,7 @@ TEST_F(SyncSchedulerTest, BackoffDropsJobs) { |
EXPECT_CALL(*delay(), GetDelay(_)).Times(0); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
CallbackCounter ready_counter; |
CallbackCounter retry_counter; |
@@ -1041,7 +1094,7 @@ TEST_F(SyncSchedulerTest, BackoffElevation) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)).Times(kMinNumSamples) |
.WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, false))); |
const TimeDelta first = TimeDelta::FromSeconds(kInitialBackoffRetrySeconds); |
const TimeDelta second = TimeDelta::FromMilliseconds(20); |
@@ -1060,7 +1113,7 @@ TEST_F(SyncSchedulerTest, BackoffElevation) { |
.RetiresOnSaturation(); |
EXPECT_CALL(*delay(), GetDelay(fifth)).WillOnce(Return(sixth)); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Run again with a nudge. |
scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE); |
@@ -1076,8 +1129,6 @@ TEST_F(SyncSchedulerTest, BackoffElevation) { |
// Test that things go back to normal once a retry makes forward progress. |
TEST_F(SyncSchedulerTest, BackoffRelief) { |
SyncShareTimes times; |
- const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
- scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
UseMockDelayProvider(); |
const TimeDelta backoff = TimeDelta::FromMilliseconds(10); |
@@ -1085,12 +1136,12 @@ TEST_F(SyncSchedulerTest, BackoffRelief) { |
// Optimal start for the post-backoff poll party. |
TimeTicks optimal_start = TimeTicks::Now(); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Kick off the test with a failed nudge. |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, false))); |
scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE); |
RunLoop(); |
Mock::VerifyAndClearExpectations(syncer()); |
@@ -1102,7 +1153,7 @@ TEST_F(SyncSchedulerTest, BackoffRelief) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll( |
Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
RunLoop(); |
Mock::VerifyAndClearExpectations(syncer()); |
optimal_job_time = optimal_job_time + backoff; |
@@ -1113,38 +1164,46 @@ TEST_F(SyncSchedulerTest, BackoffRelief) { |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillRepeatedly(DoAll( |
Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
+ const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
+ scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
+ |
+ // The new optimal time is now, since the desired poll should have happened |
+ // in the past. |
+ optimal_job_time = base::TimeTicks::Now(); |
RunLoop(); |
Mock::VerifyAndClearExpectations(syncer()); |
ASSERT_EQ(kMinNumSamples, times.size()); |
for (size_t i = 2; i < times.size(); i++) { |
- optimal_job_time = optimal_job_time + poll; |
SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); |
EXPECT_GE(times[i], optimal_job_time); |
+ optimal_job_time = optimal_job_time + poll; |
} |
StopSyncScheduler(); |
} |
-// Test that poll failures are ignored. They should have no effect on |
-// subsequent poll attempts, nor should they trigger a backoff/retry. |
+// Test that poll failures are treated like any other failure. They should |
+// result in retry with backoff. |
TEST_F(SyncSchedulerTest, TransientPollFailure) { |
SyncShareTimes times; |
const TimeDelta poll_interval(TimeDelta::FromMilliseconds(10)); |
scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
UseMockDelayProvider(); // Will cause test failure if backoff is initiated. |
+ EXPECT_CALL(*delay(), GetDelay(_)) |
+ .WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollFailed), |
- RecordSyncShare(×))) |
+ RecordSyncShare(×, false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Run the unsucessful poll. The failed poll should not trigger backoff. |
RunLoop(); |
- EXPECT_FALSE(scheduler()->IsBackingOff()); |
+ EXPECT_TRUE(scheduler()->IsBackingOff()); |
// Run the successful poll. |
RunLoop(); |
@@ -1158,10 +1217,10 @@ TEST_F(SyncSchedulerTest, StartWhenNotConnected) { |
connection()->UpdateConnectionStatus(); |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), |
- Return(true))) |
+ Return(false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
Return(true))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE); |
// Should save the nudge for until after the server is reachable. |
@@ -1178,13 +1237,13 @@ TEST_F(SyncSchedulerTest, ServerConnectionChangeDuringBackoff) { |
EXPECT_CALL(*delay(), GetDelay(_)) |
.WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
connection()->SetServerNotReachable(); |
connection()->UpdateConnectionStatus(); |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), |
- Return(true))) |
+ Return(false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
Return(true))); |
@@ -1208,17 +1267,17 @@ TEST_F(SyncSchedulerTest, ConnectionChangeCanaryPreemptedByNudge) { |
EXPECT_CALL(*delay(), GetDelay(_)) |
.WillRepeatedly(Return(TimeDelta::FromMilliseconds(0))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
connection()->SetServerNotReachable(); |
connection()->UpdateConnectionStatus(); |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateConnectionFailure), |
- Return(true))) |
+ Return(false))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
Return(true))) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- QuitLoopNowAction())); |
+ QuitLoopNowAction(true))); |
scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE); |
@@ -1242,7 +1301,7 @@ TEST_F(SyncSchedulerTest, DoubleCanaryInConfigure) { |
.WillRepeatedly(DoAll( |
Invoke(sessions::test_util::SimulateConfigureConnectionFailure), |
Return(true))); |
- StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
+ StartSyncConfiguration(); |
connection()->SetServerNotReachable(); |
connection()->UpdateConnectionStatus(); |
@@ -1272,10 +1331,10 @@ TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillRepeatedly( |
DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ RecordSyncShareMultiple(×, kMinNumSamples, true))); |
connection()->SetServerStatus(HttpResponse::SYNC_AUTH_ERROR); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
// Run to wait for polling. |
RunLoop(); |
@@ -1285,7 +1344,7 @@ TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
// poll once more |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
scheduler()->OnCredentialsUpdated(); |
connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK); |
RunLoop(); |
@@ -1293,7 +1352,7 @@ TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
} |
TEST_F(SyncSchedulerTest, SuccessfulRetry) { |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
SyncShareTimes times; |
base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
@@ -1303,7 +1362,7 @@ TEST_F(SyncSchedulerTest, SuccessfulRetry) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce( |
DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
// Run to wait for retrying. |
RunLoop(); |
@@ -1312,11 +1371,13 @@ TEST_F(SyncSchedulerTest, SuccessfulRetry) { |
} |
TEST_F(SyncSchedulerTest, FailedRetry) { |
+ SyncShareTimes times; |
+ |
UseMockDelayProvider(); |
EXPECT_CALL(*delay(), GetDelay(_)) |
.WillRepeatedly(Return(TimeDelta::FromMilliseconds(10))); |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
scheduler()->OnReceivedGuRetryDelay(delay); |
@@ -1324,7 +1385,7 @@ TEST_F(SyncSchedulerTest, FailedRetry) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce( |
DoAll(Invoke(sessions::test_util::SimulateDownloadUpdatesFailed), |
- QuitLoopNowAction())); |
+ RecordSyncShare(×, false))); |
// Run to wait for retrying. |
RunLoop(); |
@@ -1333,7 +1394,7 @@ TEST_F(SyncSchedulerTest, FailedRetry) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce( |
DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- QuitLoopNowAction())); |
+ RecordSyncShare(×, true))); |
// Run to wait for second retrying. |
RunLoop(); |
@@ -1346,7 +1407,7 @@ ACTION_P2(VerifyRetryTimerDelay, scheduler_test, expected_delay) { |
} |
TEST_F(SyncSchedulerTest, ReceiveNewRetryDelay) { |
- StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ StartSyncScheduler(base::Time()); |
SyncShareTimes times; |
base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(100); |
@@ -1360,7 +1421,7 @@ TEST_F(SyncSchedulerTest, ReceiveNewRetryDelay) { |
.WillOnce(DoAll( |
WithoutArgs(VerifyRetryTimerDelay(this, delay1)), |
WithArg<2>(sessions::test_util::SimulateGuRetryDelayCommand(delay2)), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
// Run nudge GU. |
RunLoop(); |
@@ -1368,7 +1429,7 @@ TEST_F(SyncSchedulerTest, ReceiveNewRetryDelay) { |
EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
.WillOnce(DoAll(Invoke(sessions::test_util::SimulateNormalSuccess), |
- RecordSyncShare(×))); |
+ RecordSyncShare(×, true))); |
// Run to wait for retrying. |
RunLoop(); |