| 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
|
|
|