Index: sync/engine/sync_scheduler_unittest.cc |
diff --git a/sync/engine/sync_scheduler_unittest.cc b/sync/engine/sync_scheduler_unittest.cc |
index 97d9ab8d6f703e48d85c6c93116d2cbb4b523984..62aa2c9c2ca30b9b60d5eefab209c4001d40448f 100644 |
--- a/sync/engine/sync_scheduler_unittest.cc |
+++ b/sync/engine/sync_scheduler_unittest.cc |
@@ -34,6 +34,7 @@ using testing::Mock; |
using testing::Return; |
using testing::WithArg; |
using testing::WithArgs; |
+using testing::WithoutArgs; |
namespace syncer { |
using sessions::SyncSession; |
@@ -51,6 +52,7 @@ class MockSyncer : public Syncer { |
sync_pb::GetUpdatesCallerInfo::GetUpdatesSource, |
SyncSession*)); |
MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, sessions::SyncSession*)); |
+ MOCK_METHOD2(RetrySyncShare, bool(ModelTypeSet, sessions::SyncSession*)); |
}; |
MockSyncer::MockSyncer() |
@@ -210,6 +212,11 @@ class SyncSchedulerTest : public testing::Test { |
return scheduler_->nudge_tracker_.GetThrottledTypes(); |
} |
+ base::TimeDelta GetRetryTimerDelay() { |
+ EXPECT_TRUE(scheduler_->retry_timer_.IsRunning()); |
+ return scheduler_->retry_timer_.GetCurrentDelay(); |
+ } |
+ |
private: |
syncable::Directory* directory() { |
return dir_maker_.directory(); |
@@ -539,8 +546,9 @@ TEST_F(SyncSchedulerTest, Polling) { |
SyncShareTimes times; |
TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
- .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ .WillRepeatedly( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ RecordSyncShareMultiple(×, kMinNumSamples))); |
scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
@@ -559,8 +567,9 @@ TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { |
SyncShareTimes times; |
TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
- .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ .WillRepeatedly( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ RecordSyncShareMultiple(×, kMinNumSamples))); |
scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); |
scheduler()->SetNotificationsEnabled(false); |
@@ -587,7 +596,7 @@ TEST_F(SyncSchedulerTest, PollIntervalUpdate) { |
sessions::test_util::SimulatePollIntervalUpdate(poll2)), |
Return(true))) |
.WillRepeatedly( |
- DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
WithArg<1>( |
RecordSyncShareMultiple(×, kMinNumSamples)))); |
@@ -678,8 +687,9 @@ TEST_F(SyncSchedulerTest, ThrottlingExpiresFromPoll) { |
Return(true))) |
.RetiresOnSaturation(); |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
- .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ .WillRepeatedly( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ RecordSyncShareMultiple(×, kMinNumSamples))); |
TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; |
StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
@@ -1111,7 +1121,7 @@ TEST_F(SyncSchedulerTest, BackoffRelief) { |
// Now let the Poll timer do its thing. |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
.WillRepeatedly(DoAll( |
- Invoke(sessions::test_util::SimulatePollSuccess), |
+ Invoke(sessions::test_util::SimulatePollRetrySuccess), |
RecordSyncShareMultiple(×, kMinNumSamples))); |
RunLoop(); |
Mock::VerifyAndClearExpectations(syncer()); |
@@ -1134,9 +1144,9 @@ TEST_F(SyncSchedulerTest, TransientPollFailure) { |
UseMockDelayProvider(); // Will cause test failure if backoff is initiated. |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
- .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollFailed), |
+ .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollRetryFailed), |
RecordSyncShare(×))) |
- .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
+ .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
RecordSyncShare(×))); |
StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
@@ -1269,8 +1279,9 @@ TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
::testing::InSequence seq; |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
- .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
- RecordSyncShareMultiple(×, kMinNumSamples))); |
+ .WillRepeatedly( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ RecordSyncShareMultiple(×, kMinNumSamples))); |
connection()->SetServerStatus(HttpResponse::SYNC_AUTH_ERROR); |
StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
@@ -1282,7 +1293,7 @@ TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
// but after poll finished with auth error from poll timer it should retry |
// poll once more |
EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
- .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), |
+ .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
RecordSyncShare(×))); |
scheduler()->OnCredentialsUpdated(); |
connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK); |
@@ -1290,4 +1301,89 @@ TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
StopSyncScheduler(); |
} |
+TEST_F(SyncSchedulerTest, SuccessfulRetry) { |
+ StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ |
+ SyncShareTimes times; |
+ base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1); |
+ scheduler()->OnReceivedGuRetryDelay(delay); |
+ EXPECT_EQ(delay, GetRetryTimerDelay()); |
+ |
+ EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
+ .WillOnce( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ RecordSyncShare(×))); |
+ |
+ // Run to wait for retrying. |
+ RunLoop(); |
+ |
+ StopSyncScheduler(); |
+} |
+ |
+TEST_F(SyncSchedulerTest, FailedRetry) { |
+ UseMockDelayProvider(); |
+ EXPECT_CALL(*delay(), GetDelay(_)) |
+ .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
+ |
+ StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ |
+ base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1); |
+ scheduler()->OnReceivedGuRetryDelay(delay); |
+ |
+ EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
+ .WillOnce( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetryFailed), |
+ QuitLoopNowAction())); |
+ |
+ // Run to wait for retrying. |
+ RunLoop(); |
+ |
+ EXPECT_TRUE(scheduler()->IsBackingOff()); |
+ EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
+ .WillOnce( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ QuitLoopNowAction())); |
+ |
+ // Run to wait for second retrying. |
+ RunLoop(); |
+ |
+ StopSyncScheduler(); |
+} |
+ |
+ACTION_P2(VerifyRetryTimerDelay, scheduler_test, expected_delay) { |
+ EXPECT_EQ(expected_delay, scheduler_test->GetRetryTimerDelay()); |
+} |
+ |
+TEST_F(SyncSchedulerTest, ReceiveNewRetryDelay) { |
+ StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
+ |
+ SyncShareTimes times; |
+ base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(100); |
+ base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(200); |
+ |
+ scheduler()->ScheduleLocalRefreshRequest(zero(), ModelTypeSet(BOOKMARKS), |
+ FROM_HERE); |
+ scheduler()->OnReceivedGuRetryDelay(delay1); |
+ |
+ EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
+ .WillOnce(DoAll( |
+ WithoutArgs(VerifyRetryTimerDelay(this, delay1)), |
+ WithArg<2>(sessions::test_util::SimulateGuRetryDelayCommand(delay2)), |
+ WithoutArgs(VerifyRetryTimerDelay(this, delay2)), |
+ RecordSyncShare(×))); |
+ |
+ // Run nudge GU. |
+ RunLoop(); |
+ |
+ EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
+ .WillOnce( |
+ DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
+ RecordSyncShare(×))); |
+ |
+ // Run to wait for retrying. |
+ RunLoop(); |
+ |
+ StopSyncScheduler(); |
+} |
+ |
} // namespace syncer |