| OLD | NEW |
| 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/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 using base::TimeDelta; | 27 using base::TimeDelta; |
| 28 using base::TimeTicks; | 28 using base::TimeTicks; |
| 29 using testing::_; | 29 using testing::_; |
| 30 using testing::AtLeast; | 30 using testing::AtLeast; |
| 31 using testing::DoAll; | 31 using testing::DoAll; |
| 32 using testing::Invoke; | 32 using testing::Invoke; |
| 33 using testing::Mock; | 33 using testing::Mock; |
| 34 using testing::Return; | 34 using testing::Return; |
| 35 using testing::WithArg; | 35 using testing::WithArg; |
| 36 using testing::WithArgs; | 36 using testing::WithArgs; |
| 37 using testing::WithoutArgs; |
| 37 | 38 |
| 38 namespace syncer { | 39 namespace syncer { |
| 39 using sessions::SyncSession; | 40 using sessions::SyncSession; |
| 40 using sessions::SyncSessionContext; | 41 using sessions::SyncSessionContext; |
| 41 using sync_pb::GetUpdatesCallerInfo; | 42 using sync_pb::GetUpdatesCallerInfo; |
| 42 | 43 |
| 43 class MockSyncer : public Syncer { | 44 class MockSyncer : public Syncer { |
| 44 public: | 45 public: |
| 45 MockSyncer(); | 46 MockSyncer(); |
| 46 MOCK_METHOD3(NormalSyncShare, bool(ModelTypeSet, | 47 MOCK_METHOD3(NormalSyncShare, bool(ModelTypeSet, |
| 47 const sessions::NudgeTracker&, | 48 const sessions::NudgeTracker&, |
| 48 sessions::SyncSession*)); | 49 sessions::SyncSession*)); |
| 49 MOCK_METHOD3(ConfigureSyncShare, | 50 MOCK_METHOD3(ConfigureSyncShare, |
| 50 bool(ModelTypeSet, | 51 bool(ModelTypeSet, |
| 51 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource, | 52 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource, |
| 52 SyncSession*)); | 53 SyncSession*)); |
| 53 MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, sessions::SyncSession*)); | 54 MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, sessions::SyncSession*)); |
| 55 MOCK_METHOD2(RetrySyncShare, bool(ModelTypeSet, sessions::SyncSession*)); |
| 54 }; | 56 }; |
| 55 | 57 |
| 56 MockSyncer::MockSyncer() | 58 MockSyncer::MockSyncer() |
| 57 : Syncer(NULL) {} | 59 : Syncer(NULL) {} |
| 58 | 60 |
| 59 typedef std::vector<TimeTicks> SyncShareTimes; | 61 typedef std::vector<TimeTicks> SyncShareTimes; |
| 60 | 62 |
| 61 void QuitLoopNow() { | 63 void QuitLoopNow() { |
| 62 // We use QuitNow() instead of Quit() as the latter may get stalled | 64 // We use QuitNow() instead of Quit() as the latter may get stalled |
| 63 // indefinitely in the presence of repeated timers with low delays | 65 // indefinitely in the presence of repeated timers with low delays |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 delay_ = new MockDelayProvider(); | 205 delay_ = new MockDelayProvider(); |
| 204 scheduler_->delay_provider_.reset(delay_); | 206 scheduler_->delay_provider_.reset(delay_); |
| 205 } | 207 } |
| 206 | 208 |
| 207 SyncSessionContext* context() { return context_.get(); } | 209 SyncSessionContext* context() { return context_.get(); } |
| 208 | 210 |
| 209 ModelTypeSet GetThrottledTypes() { | 211 ModelTypeSet GetThrottledTypes() { |
| 210 return scheduler_->nudge_tracker_.GetThrottledTypes(); | 212 return scheduler_->nudge_tracker_.GetThrottledTypes(); |
| 211 } | 213 } |
| 212 | 214 |
| 215 base::TimeDelta GetRetryTimerDelay() { |
| 216 EXPECT_TRUE(scheduler_->retry_timer_.IsRunning()); |
| 217 return scheduler_->retry_timer_.GetCurrentDelay(); |
| 218 } |
| 219 |
| 213 private: | 220 private: |
| 214 syncable::Directory* directory() { | 221 syncable::Directory* directory() { |
| 215 return dir_maker_.directory(); | 222 return dir_maker_.directory(); |
| 216 } | 223 } |
| 217 | 224 |
| 218 base::MessageLoop loop_; | 225 base::MessageLoop loop_; |
| 219 TestDirectorySetterUpper dir_maker_; | 226 TestDirectorySetterUpper dir_maker_; |
| 220 CancelationSignal cancelation_signal_; | 227 CancelationSignal cancelation_signal_; |
| 221 scoped_ptr<MockConnectionManager> connection_; | 228 scoped_ptr<MockConnectionManager> connection_; |
| 222 scoped_ptr<SyncSessionContext> context_; | 229 scoped_ptr<SyncSessionContext> context_; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 RecordSyncShare(×2))); | 539 RecordSyncShare(×2))); |
| 533 scheduler()->ScheduleInvalidationNudge(zero(), invalidations2, FROM_HERE); | 540 scheduler()->ScheduleInvalidationNudge(zero(), invalidations2, FROM_HERE); |
| 534 RunLoop(); | 541 RunLoop(); |
| 535 } | 542 } |
| 536 | 543 |
| 537 // Test that polling works as expected. | 544 // Test that polling works as expected. |
| 538 TEST_F(SyncSchedulerTest, Polling) { | 545 TEST_F(SyncSchedulerTest, Polling) { |
| 539 SyncShareTimes times; | 546 SyncShareTimes times; |
| 540 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 547 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
| 541 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) | 548 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
| 542 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 549 .WillRepeatedly( |
| 543 RecordSyncShareMultiple(×, kMinNumSamples))); | 550 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 551 RecordSyncShareMultiple(×, kMinNumSamples))); |
| 544 | 552 |
| 545 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); | 553 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
| 546 | 554 |
| 547 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; | 555 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
| 548 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 556 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 549 | 557 |
| 550 // Run again to wait for polling. | 558 // Run again to wait for polling. |
| 551 RunLoop(); | 559 RunLoop(); |
| 552 | 560 |
| 553 StopSyncScheduler(); | 561 StopSyncScheduler(); |
| 554 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); | 562 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); |
| 555 } | 563 } |
| 556 | 564 |
| 557 // Test that the short poll interval is used. | 565 // Test that the short poll interval is used. |
| 558 TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { | 566 TEST_F(SyncSchedulerTest, PollNotificationsDisabled) { |
| 559 SyncShareTimes times; | 567 SyncShareTimes times; |
| 560 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); | 568 TimeDelta poll_interval(TimeDelta::FromMilliseconds(30)); |
| 561 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) | 569 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
| 562 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 570 .WillRepeatedly( |
| 563 RecordSyncShareMultiple(×, kMinNumSamples))); | 571 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 572 RecordSyncShareMultiple(×, kMinNumSamples))); |
| 564 | 573 |
| 565 scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); | 574 scheduler()->OnReceivedShortPollIntervalUpdate(poll_interval); |
| 566 scheduler()->SetNotificationsEnabled(false); | 575 scheduler()->SetNotificationsEnabled(false); |
| 567 | 576 |
| 568 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; | 577 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; |
| 569 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 578 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 570 | 579 |
| 571 // Run again to wait for polling. | 580 // Run again to wait for polling. |
| 572 RunLoop(); | 581 RunLoop(); |
| 573 | 582 |
| 574 StopSyncScheduler(); | 583 StopSyncScheduler(); |
| 575 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); | 584 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); |
| 576 } | 585 } |
| 577 | 586 |
| 578 // Test that polling intervals are updated when needed. | 587 // Test that polling intervals are updated when needed. |
| 579 TEST_F(SyncSchedulerTest, PollIntervalUpdate) { | 588 TEST_F(SyncSchedulerTest, PollIntervalUpdate) { |
| 580 SyncShareTimes times; | 589 SyncShareTimes times; |
| 581 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); | 590 TimeDelta poll1(TimeDelta::FromMilliseconds(120)); |
| 582 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); | 591 TimeDelta poll2(TimeDelta::FromMilliseconds(30)); |
| 583 scheduler()->OnReceivedLongPollIntervalUpdate(poll1); | 592 scheduler()->OnReceivedLongPollIntervalUpdate(poll1); |
| 584 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) | 593 EXPECT_CALL(*syncer(), PollSyncShare(_,_)).Times(AtLeast(kMinNumSamples)) |
| 585 .WillOnce(DoAll( | 594 .WillOnce(DoAll( |
| 586 WithArgs<0,1>( | 595 WithArgs<0,1>( |
| 587 sessions::test_util::SimulatePollIntervalUpdate(poll2)), | 596 sessions::test_util::SimulatePollIntervalUpdate(poll2)), |
| 588 Return(true))) | 597 Return(true))) |
| 589 .WillRepeatedly( | 598 .WillRepeatedly( |
| 590 DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 599 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 591 WithArg<1>( | 600 WithArg<1>( |
| 592 RecordSyncShareMultiple(×, kMinNumSamples)))); | 601 RecordSyncShareMultiple(×, kMinNumSamples)))); |
| 593 | 602 |
| 594 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; | 603 TimeTicks optimal_start = TimeTicks::Now() + poll1 + poll2; |
| 595 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 604 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 596 | 605 |
| 597 // Run again to wait for polling. | 606 // Run again to wait for polling. |
| 598 RunLoop(); | 607 RunLoop(); |
| 599 | 608 |
| 600 StopSyncScheduler(); | 609 StopSyncScheduler(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); | 680 TimeDelta throttle1(TimeDelta::FromMilliseconds(150)); |
| 672 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 681 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
| 673 | 682 |
| 674 ::testing::InSequence seq; | 683 ::testing::InSequence seq; |
| 675 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) | 684 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 676 .WillOnce(DoAll( | 685 .WillOnce(DoAll( |
| 677 WithArg<1>(sessions::test_util::SimulateThrottled(throttle1)), | 686 WithArg<1>(sessions::test_util::SimulateThrottled(throttle1)), |
| 678 Return(true))) | 687 Return(true))) |
| 679 .RetiresOnSaturation(); | 688 .RetiresOnSaturation(); |
| 680 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) | 689 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 681 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 690 .WillRepeatedly( |
| 682 RecordSyncShareMultiple(×, kMinNumSamples))); | 691 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 692 RecordSyncShareMultiple(×, kMinNumSamples))); |
| 683 | 693 |
| 684 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; | 694 TimeTicks optimal_start = TimeTicks::Now() + poll + throttle1; |
| 685 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 695 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 686 | 696 |
| 687 // Run again to wait for polling. | 697 // Run again to wait for polling. |
| 688 RunLoop(); | 698 RunLoop(); |
| 689 | 699 |
| 690 StopSyncScheduler(); | 700 StopSyncScheduler(); |
| 691 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll); | 701 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll); |
| 692 } | 702 } |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1104 RecordSyncShare(×))); | 1114 RecordSyncShare(×))); |
| 1105 RunLoop(); | 1115 RunLoop(); |
| 1106 Mock::VerifyAndClearExpectations(syncer()); | 1116 Mock::VerifyAndClearExpectations(syncer()); |
| 1107 optimal_job_time = optimal_job_time + backoff; | 1117 optimal_job_time = optimal_job_time + backoff; |
| 1108 ASSERT_EQ(2U, times.size()); | 1118 ASSERT_EQ(2U, times.size()); |
| 1109 EXPECT_GE(times[1], optimal_job_time); | 1119 EXPECT_GE(times[1], optimal_job_time); |
| 1110 | 1120 |
| 1111 // Now let the Poll timer do its thing. | 1121 // Now let the Poll timer do its thing. |
| 1112 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) | 1122 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 1113 .WillRepeatedly(DoAll( | 1123 .WillRepeatedly(DoAll( |
| 1114 Invoke(sessions::test_util::SimulatePollSuccess), | 1124 Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1115 RecordSyncShareMultiple(×, kMinNumSamples))); | 1125 RecordSyncShareMultiple(×, kMinNumSamples))); |
| 1116 RunLoop(); | 1126 RunLoop(); |
| 1117 Mock::VerifyAndClearExpectations(syncer()); | 1127 Mock::VerifyAndClearExpectations(syncer()); |
| 1118 ASSERT_EQ(kMinNumSamples, times.size()); | 1128 ASSERT_EQ(kMinNumSamples, times.size()); |
| 1119 for (size_t i = 2; i < times.size(); i++) { | 1129 for (size_t i = 2; i < times.size(); i++) { |
| 1120 optimal_job_time = optimal_job_time + poll; | 1130 optimal_job_time = optimal_job_time + poll; |
| 1121 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); | 1131 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); |
| 1122 EXPECT_GE(times[i], optimal_job_time); | 1132 EXPECT_GE(times[i], optimal_job_time); |
| 1123 } | 1133 } |
| 1124 | 1134 |
| 1125 StopSyncScheduler(); | 1135 StopSyncScheduler(); |
| 1126 } | 1136 } |
| 1127 | 1137 |
| 1128 // Test that poll failures are ignored. They should have no effect on | 1138 // Test that poll failures are ignored. They should have no effect on |
| 1129 // subsequent poll attempts, nor should they trigger a backoff/retry. | 1139 // subsequent poll attempts, nor should they trigger a backoff/retry. |
| 1130 TEST_F(SyncSchedulerTest, TransientPollFailure) { | 1140 TEST_F(SyncSchedulerTest, TransientPollFailure) { |
| 1131 SyncShareTimes times; | 1141 SyncShareTimes times; |
| 1132 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(1)); | 1142 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(1)); |
| 1133 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); | 1143 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); |
| 1134 UseMockDelayProvider(); // Will cause test failure if backoff is initiated. | 1144 UseMockDelayProvider(); // Will cause test failure if backoff is initiated. |
| 1135 | 1145 |
| 1136 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) | 1146 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 1137 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollFailed), | 1147 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollRetryFailed), |
| 1138 RecordSyncShare(×))) | 1148 RecordSyncShare(×))) |
| 1139 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 1149 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1140 RecordSyncShare(×))); | 1150 RecordSyncShare(×))); |
| 1141 | 1151 |
| 1142 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1152 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1143 | 1153 |
| 1144 // Run the unsucessful poll. The failed poll should not trigger backoff. | 1154 // Run the unsucessful poll. The failed poll should not trigger backoff. |
| 1145 RunLoop(); | 1155 RunLoop(); |
| 1146 EXPECT_FALSE(scheduler()->IsBackingOff()); | 1156 EXPECT_FALSE(scheduler()->IsBackingOff()); |
| 1147 | 1157 |
| 1148 // Run the successful poll. | 1158 // Run the successful poll. |
| 1149 RunLoop(); | 1159 RunLoop(); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1262 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. | 1272 PumpLoop(); // Run the nudge, that will fail and schedule a quick retry. |
| 1263 } | 1273 } |
| 1264 | 1274 |
| 1265 TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { | 1275 TEST_F(SyncSchedulerTest, PollFromCanaryAfterAuthError) { |
| 1266 SyncShareTimes times; | 1276 SyncShareTimes times; |
| 1267 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 1277 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
| 1268 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 1278 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
| 1269 | 1279 |
| 1270 ::testing::InSequence seq; | 1280 ::testing::InSequence seq; |
| 1271 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) | 1281 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 1272 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 1282 .WillRepeatedly( |
| 1273 RecordSyncShareMultiple(×, kMinNumSamples))); | 1283 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1284 RecordSyncShareMultiple(×, kMinNumSamples))); |
| 1274 | 1285 |
| 1275 connection()->SetServerStatus(HttpResponse::SYNC_AUTH_ERROR); | 1286 connection()->SetServerStatus(HttpResponse::SYNC_AUTH_ERROR); |
| 1276 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1287 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1277 | 1288 |
| 1278 // Run to wait for polling. | 1289 // Run to wait for polling. |
| 1279 RunLoop(); | 1290 RunLoop(); |
| 1280 | 1291 |
| 1281 // Normally OnCredentialsUpdated calls TryCanaryJob that doesn't run Poll, | 1292 // Normally OnCredentialsUpdated calls TryCanaryJob that doesn't run Poll, |
| 1282 // but after poll finished with auth error from poll timer it should retry | 1293 // but after poll finished with auth error from poll timer it should retry |
| 1283 // poll once more | 1294 // poll once more |
| 1284 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) | 1295 EXPECT_CALL(*syncer(), PollSyncShare(_,_)) |
| 1285 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollSuccess), | 1296 .WillOnce(DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1286 RecordSyncShare(×))); | 1297 RecordSyncShare(×))); |
| 1287 scheduler()->OnCredentialsUpdated(); | 1298 scheduler()->OnCredentialsUpdated(); |
| 1288 connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK); | 1299 connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK); |
| 1289 RunLoop(); | 1300 RunLoop(); |
| 1290 StopSyncScheduler(); | 1301 StopSyncScheduler(); |
| 1291 } | 1302 } |
| 1292 | 1303 |
| 1304 TEST_F(SyncSchedulerTest, SuccessfulRetry) { |
| 1305 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1306 |
| 1307 SyncShareTimes times; |
| 1308 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1); |
| 1309 scheduler()->OnReceivedGuRetryDelay(delay); |
| 1310 EXPECT_EQ(delay, GetRetryTimerDelay()); |
| 1311 |
| 1312 EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
| 1313 .WillOnce( |
| 1314 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1315 RecordSyncShare(×))); |
| 1316 |
| 1317 // Run to wait for retrying. |
| 1318 RunLoop(); |
| 1319 |
| 1320 StopSyncScheduler(); |
| 1321 } |
| 1322 |
| 1323 TEST_F(SyncSchedulerTest, FailedRetry) { |
| 1324 UseMockDelayProvider(); |
| 1325 EXPECT_CALL(*delay(), GetDelay(_)) |
| 1326 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
| 1327 |
| 1328 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1329 |
| 1330 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1); |
| 1331 scheduler()->OnReceivedGuRetryDelay(delay); |
| 1332 |
| 1333 EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
| 1334 .WillOnce( |
| 1335 DoAll(Invoke(sessions::test_util::SimulatePollRetryFailed), |
| 1336 QuitLoopNowAction())); |
| 1337 |
| 1338 // Run to wait for retrying. |
| 1339 RunLoop(); |
| 1340 |
| 1341 EXPECT_TRUE(scheduler()->IsBackingOff()); |
| 1342 EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
| 1343 .WillOnce( |
| 1344 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1345 QuitLoopNowAction())); |
| 1346 |
| 1347 // Run to wait for second retrying. |
| 1348 RunLoop(); |
| 1349 |
| 1350 StopSyncScheduler(); |
| 1351 } |
| 1352 |
| 1353 ACTION_P2(VerifyRetryTimerDelay, scheduler_test, expected_delay) { |
| 1354 EXPECT_EQ(expected_delay, scheduler_test->GetRetryTimerDelay()); |
| 1355 } |
| 1356 |
| 1357 TEST_F(SyncSchedulerTest, ReceiveNewRetryDelay) { |
| 1358 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1359 |
| 1360 SyncShareTimes times; |
| 1361 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(100); |
| 1362 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(200); |
| 1363 |
| 1364 scheduler()->ScheduleLocalRefreshRequest(zero(), ModelTypeSet(BOOKMARKS), |
| 1365 FROM_HERE); |
| 1366 scheduler()->OnReceivedGuRetryDelay(delay1); |
| 1367 |
| 1368 EXPECT_CALL(*syncer(), NormalSyncShare(_,_,_)) |
| 1369 .WillOnce(DoAll( |
| 1370 WithoutArgs(VerifyRetryTimerDelay(this, delay1)), |
| 1371 WithArg<2>(sessions::test_util::SimulateGuRetryDelayCommand(delay2)), |
| 1372 WithoutArgs(VerifyRetryTimerDelay(this, delay2)), |
| 1373 RecordSyncShare(×))); |
| 1374 |
| 1375 // Run nudge GU. |
| 1376 RunLoop(); |
| 1377 |
| 1378 EXPECT_CALL(*syncer(), RetrySyncShare(_,_)) |
| 1379 .WillOnce( |
| 1380 DoAll(Invoke(sessions::test_util::SimulatePollRetrySuccess), |
| 1381 RecordSyncShare(×))); |
| 1382 |
| 1383 // Run to wait for retrying. |
| 1384 RunLoop(); |
| 1385 |
| 1386 StopSyncScheduler(); |
| 1387 } |
| 1388 |
| 1293 } // namespace syncer | 1389 } // namespace syncer |
| OLD | NEW |