Index: sync/engine/sync_scheduler_unittest.cc |
diff --git a/sync/engine/sync_scheduler_unittest.cc b/sync/engine/sync_scheduler_unittest.cc |
index e5876554e81a53bdc4f95d95c8bac398f93bc835..091e7042cd25f50060c39e339fd6c2dd3cc2e8a9 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() |
@@ -216,6 +218,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(); |
rlarocque
2014/01/10 22:41:13
This seems like a grey area in the API. I'm not s
|
+ } |
+ |
private: |
syncable::Directory* directory() { |
return dir_maker_.directory(); |
@@ -545,8 +552,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); |
@@ -565,8 +573,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); |
@@ -593,7 +602,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)))); |
@@ -684,8 +693,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); |
@@ -1117,7 +1127,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()); |
@@ -1140,9 +1150,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); |
@@ -1275,8 +1285,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); |
@@ -1288,7 +1299,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); |
@@ -1296,4 +1307,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(10); |
+ base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); |
+ |
+ scheduler()->OnReceivedGuRetryDelay(delay1); |
+ scheduler()->ScheduleLocalRefreshRequest(zero(), ModelTypeSet(BOOKMARKS), |
+ FROM_HERE); |
+ |
+ EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
+ .WillOnce(DoAll( |
+ WithoutArgs(VerifyRetryTimerDelay(this, delay1)), |
rlarocque
2014/01/10 22:41:13
nit: Maybe put this into an expectation just befor
haitaol1
2014/01/10 23:45:03
I'd like to verify pre/post conditions tightly aro
rlarocque
2014/01/10 23:47:59
That's valid. I suggested alternatives because:
-
|
+ WithArg<2>(sessions::test_util::SimulateGuRetryDelayCommand(delay2)), |
+ WithoutArgs(VerifyRetryTimerDelay(this, delay2)), |
rlarocque
2014/01/10 22:41:13
nit: I think it would be more clear to perform thi
|
+ 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 |