| Index: components/sync/engine_impl/sync_scheduler_impl_unittest.cc
|
| diff --git a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
|
| index fa5e417b623d5aa35830118d7a7a8de8e35c464d..71493bdd94471598146c63fdd37344c9dda65690 100644
|
| --- a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
|
| +++ b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
|
| @@ -83,7 +83,7 @@ void PumpLoop() {
|
| RunLoop();
|
| }
|
|
|
| -void PumpLoopFor(base::TimeDelta time) {
|
| +void PumpLoopFor(TimeDelta time) {
|
| // Allow the loop to run for the specified amount of time.
|
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| FROM_HERE, base::Bind(&QuitLoopNow), time);
|
| @@ -245,7 +245,7 @@ class SyncSchedulerImplTest : public testing::Test {
|
| return scheduler_->nudge_tracker_.IsAnyTypeBlocked();
|
| }
|
|
|
| - base::TimeDelta GetRetryTimerDelay() {
|
| + TimeDelta GetRetryTimerDelay() {
|
| EXPECT_TRUE(scheduler_->retry_timer_.IsRunning());
|
| return scheduler_->retry_timer_.GetCurrentDelay();
|
| }
|
| @@ -256,7 +256,7 @@ class SyncSchedulerImplTest : public testing::Test {
|
| return MockInvalidation::Build(version, payload);
|
| }
|
|
|
| - base::TimeDelta GetTypeBlockingTime(ModelType type) {
|
| + TimeDelta GetTypeBlockingTime(ModelType type) {
|
| NudgeTracker::TypeTrackerMap::const_iterator tracker_it =
|
| scheduler_->nudge_tracker_.type_trackers_.find(type);
|
| DCHECK(tracker_it != scheduler_->nudge_tracker_.type_trackers_.end());
|
| @@ -285,6 +285,11 @@ class SyncSchedulerImplTest : public testing::Test {
|
| return scheduler_->pending_wakeup_timer_.IsRunning();
|
| }
|
|
|
| + TimeDelta GetPendingWakeupTimerDelay() {
|
| + EXPECT_TRUE(scheduler_->pending_wakeup_timer_.IsRunning());
|
| + return scheduler_->pending_wakeup_timer_.GetCurrentDelay();
|
| + }
|
| +
|
| private:
|
| syncable::Directory* directory() {
|
| return test_user_share_.user_share()->directory.get();
|
| @@ -714,7 +719,7 @@ TEST_F(SyncSchedulerImplTest, PollingPersistenceBadClock) {
|
|
|
| // Set the start time to |poll_interval| in the future.
|
| TimeTicks optimal_start = TimeTicks::Now() + poll_interval;
|
| - StartSyncScheduler(base::Time::Now() + base::TimeDelta::FromMinutes(10));
|
| + StartSyncScheduler(base::Time::Now() + TimeDelta::FromMinutes(10));
|
|
|
| // Run again to wait for polling.
|
| RunLoop();
|
| @@ -1448,7 +1453,7 @@ TEST_F(SyncSchedulerImplTest, BackoffRelief) {
|
|
|
| // The new optimal time is now, since the desired poll should have happened
|
| // in the past.
|
| - optimal_job_time = base::TimeTicks::Now();
|
| + optimal_job_time = TimeTicks::Now();
|
| RunLoop();
|
| Mock::VerifyAndClearExpectations(syncer());
|
| ASSERT_EQ(kMinNumSamples, times.size());
|
| @@ -1627,7 +1632,7 @@ TEST_F(SyncSchedulerImplTest, SuccessfulRetry) {
|
| StartSyncScheduler(base::Time());
|
|
|
| SyncShareTimes times;
|
| - base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
|
| + TimeDelta delay = TimeDelta::FromMilliseconds(10);
|
| scheduler()->OnReceivedGuRetryDelay(delay);
|
| EXPECT_EQ(delay, GetRetryTimerDelay());
|
|
|
| @@ -1650,7 +1655,7 @@ TEST_F(SyncSchedulerImplTest, FailedRetry) {
|
|
|
| StartSyncScheduler(base::Time());
|
|
|
| - base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
|
| + TimeDelta delay = TimeDelta::FromMilliseconds(10);
|
| scheduler()->OnReceivedGuRetryDelay(delay);
|
|
|
| EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
|
| @@ -1679,8 +1684,8 @@ TEST_F(SyncSchedulerImplTest, ReceiveNewRetryDelay) {
|
| StartSyncScheduler(base::Time());
|
|
|
| SyncShareTimes times;
|
| - base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(100);
|
| - base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(200);
|
| + TimeDelta delay1 = TimeDelta::FromMilliseconds(100);
|
| + TimeDelta delay2 = TimeDelta::FromMilliseconds(200);
|
|
|
| scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE);
|
| scheduler()->OnReceivedGuRetryDelay(delay1);
|
| @@ -1761,14 +1766,14 @@ TEST_F(SyncSchedulerImplTest, PartialFailureWillExponentialBackoff) {
|
| EXPECT_TRUE(GetBackedOffTypes().HasAll(types));
|
| EXPECT_FALSE(scheduler()->IsBackingOff());
|
| EXPECT_FALSE(scheduler()->IsCurrentlyThrottled());
|
| - base::TimeDelta first_blocking_time = GetTypeBlockingTime(THEMES);
|
| + TimeDelta first_blocking_time = GetTypeBlockingTime(THEMES);
|
|
|
| SetTypeBlockingMode(THEMES, WaitInterval::EXPONENTIAL_BACKOFF_RETRYING);
|
| // This won't cause a sync cycle because the types are backed off.
|
| scheduler()->ScheduleLocalNudge(types, FROM_HERE);
|
| PumpLoop();
|
| PumpLoop();
|
| - base::TimeDelta second_blocking_time = GetTypeBlockingTime(THEMES);
|
| + TimeDelta second_blocking_time = GetTypeBlockingTime(THEMES);
|
|
|
| // The Exponential backoff should be between previous backoff 1.5 and 2.5
|
| // times.
|
| @@ -1900,4 +1905,48 @@ TEST_F(SyncSchedulerImplTest, TypeBackingOffAndFailureSync) {
|
| StopSyncScheduler();
|
| }
|
|
|
| +TEST_F(SyncSchedulerImplTest, InterleavedNudgesStillRestart) {
|
| + UseMockDelayProvider();
|
| + EXPECT_CALL(*delay(), GetDelay(_))
|
| + .WillOnce(Return(long_delay()))
|
| + .RetiresOnSaturation();
|
| + TimeDelta poll(TimeDelta::FromDays(1));
|
| + scheduler()->OnReceivedLongPollIntervalUpdate(poll);
|
| +
|
| + StartSyncScheduler(base::Time());
|
| + scheduler()->ScheduleLocalNudge({THEMES}, FROM_HERE);
|
| + PumpLoop(); // To get PerformDelayedNudge called.
|
| + EXPECT_FALSE(BlockTimerIsRunning());
|
| + EXPECT_FALSE(scheduler()->IsBackingOff());
|
| +
|
| + // This is the tricky piece. We have a gap while the sync job is bouncing to
|
| + // get onto the |pending_wakeup_timer_|, should be scheduled with no delay.
|
| + scheduler()->ScheduleLocalNudge({TYPED_URLS}, FROM_HERE);
|
| + EXPECT_TRUE(BlockTimerIsRunning());
|
| + EXPECT_EQ(TimeDelta(), GetPendingWakeupTimerDelay());
|
| + EXPECT_FALSE(scheduler()->IsBackingOff());
|
| +
|
| + // Setup mock as we're about to attempt to sync.
|
| + SyncShareTimes times;
|
| + EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
|
| + .WillOnce(DoAll(Invoke(test_util::SimulateCommitFailed),
|
| + RecordSyncShare(×, false)));
|
| + // Triggers the THEMES TrySyncCycleJobImpl(), which we've setup to fail. Its
|
| + // RestartWaiting won't schedule a delayed retry, as the TYPED_URLS nudge has
|
| + // a smaller delay. We verify this by making sure the delay is still zero.
|
| + PumpLoop();
|
| + EXPECT_TRUE(BlockTimerIsRunning());
|
| + EXPECT_EQ(TimeDelta(), GetPendingWakeupTimerDelay());
|
| + EXPECT_TRUE(scheduler()->IsBackingOff());
|
| +
|
| + // Triggers TYPED_URLS PerformDelayedNudge(), which should no-op, because
|
| + // we're no long healthy, and normal priorities shouldn't go through, but it
|
| + // does need to setup the |pending_wakeup_timer_|. The delay should be ~60
|
| + // seconds, so verifying it's greater than 50 should be safe.
|
| + PumpLoop();
|
| + EXPECT_TRUE(BlockTimerIsRunning());
|
| + EXPECT_LT(TimeDelta::FromSeconds(50), GetPendingWakeupTimerDelay());
|
| + EXPECT_TRUE(scheduler()->IsBackingOff());
|
| +}
|
| +
|
| } // namespace syncer
|
|
|