Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: components/sync/engine_impl/sync_scheduler_impl_unittest.cc

Issue 2911603003: [Sync] Stop dropping pending restarts from interleaved nudges. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/sync/engine_impl/sync_scheduler_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "components/sync/engine_impl/sync_scheduler_impl.h" 5 #include "components/sync/engine_impl/sync_scheduler_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <vector> 10 #include <vector>
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 76
77 void PumpLoop() { 77 void PumpLoop() {
78 // Do it this way instead of RunAllPending to pump loop exactly once 78 // Do it this way instead of RunAllPending to pump loop exactly once
79 // (necessary in the presence of timers; see comment in 79 // (necessary in the presence of timers; see comment in
80 // QuitLoopNow). 80 // QuitLoopNow).
81 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, 81 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
82 base::Bind(&QuitLoopNow)); 82 base::Bind(&QuitLoopNow));
83 RunLoop(); 83 RunLoop();
84 } 84 }
85 85
86 void PumpLoopFor(base::TimeDelta time) { 86 void PumpLoopFor(TimeDelta time) {
87 // Allow the loop to run for the specified amount of time. 87 // Allow the loop to run for the specified amount of time.
88 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 88 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
89 FROM_HERE, base::Bind(&QuitLoopNow), time); 89 FROM_HERE, base::Bind(&QuitLoopNow), time);
90 RunLoop(); 90 RunLoop();
91 } 91 }
92 92
93 static const size_t kMinNumSamples = 5; 93 static const size_t kMinNumSamples = 5;
94 94
95 // Test harness for the SyncScheduler. Test the delays and backoff timers used 95 // Test harness for the SyncScheduler. Test the delays and backoff timers used
96 // in response to various events. 96 // in response to various events.
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 backed_off_types.Put(type_it.Get()); 238 backed_off_types.Put(type_it.Get());
239 } 239 }
240 } 240 }
241 return backed_off_types; 241 return backed_off_types;
242 } 242 }
243 243
244 bool IsAnyTypeBlocked() { 244 bool IsAnyTypeBlocked() {
245 return scheduler_->nudge_tracker_.IsAnyTypeBlocked(); 245 return scheduler_->nudge_tracker_.IsAnyTypeBlocked();
246 } 246 }
247 247
248 base::TimeDelta GetRetryTimerDelay() { 248 TimeDelta GetRetryTimerDelay() {
249 EXPECT_TRUE(scheduler_->retry_timer_.IsRunning()); 249 EXPECT_TRUE(scheduler_->retry_timer_.IsRunning());
250 return scheduler_->retry_timer_.GetCurrentDelay(); 250 return scheduler_->retry_timer_.GetCurrentDelay();
251 } 251 }
252 252
253 static std::unique_ptr<InvalidationInterface> BuildInvalidation( 253 static std::unique_ptr<InvalidationInterface> BuildInvalidation(
254 int64_t version, 254 int64_t version,
255 const std::string& payload) { 255 const std::string& payload) {
256 return MockInvalidation::Build(version, payload); 256 return MockInvalidation::Build(version, payload);
257 } 257 }
258 258
259 base::TimeDelta GetTypeBlockingTime(ModelType type) { 259 TimeDelta GetTypeBlockingTime(ModelType type) {
260 NudgeTracker::TypeTrackerMap::const_iterator tracker_it = 260 NudgeTracker::TypeTrackerMap::const_iterator tracker_it =
261 scheduler_->nudge_tracker_.type_trackers_.find(type); 261 scheduler_->nudge_tracker_.type_trackers_.find(type);
262 DCHECK(tracker_it != scheduler_->nudge_tracker_.type_trackers_.end()); 262 DCHECK(tracker_it != scheduler_->nudge_tracker_.type_trackers_.end());
263 DCHECK(tracker_it->second->wait_interval_.get()); 263 DCHECK(tracker_it->second->wait_interval_.get());
264 return tracker_it->second->wait_interval_->length; 264 return tracker_it->second->wait_interval_->length;
265 } 265 }
266 266
267 void SetTypeBlockingMode(ModelType type, WaitInterval::BlockingMode mode) { 267 void SetTypeBlockingMode(ModelType type, WaitInterval::BlockingMode mode) {
268 NudgeTracker::TypeTrackerMap::const_iterator tracker_it = 268 NudgeTracker::TypeTrackerMap::const_iterator tracker_it =
269 scheduler_->nudge_tracker_.type_trackers_.find(type); 269 scheduler_->nudge_tracker_.type_trackers_.find(type);
270 DCHECK(tracker_it != scheduler_->nudge_tracker_.type_trackers_.end()); 270 DCHECK(tracker_it != scheduler_->nudge_tracker_.type_trackers_.end());
271 DCHECK(tracker_it->second->wait_interval_.get()); 271 DCHECK(tracker_it->second->wait_interval_.get());
272 tracker_it->second->wait_interval_->mode = mode; 272 tracker_it->second->wait_interval_->mode = mode;
273 } 273 }
274 274
275 void NewSchedulerForLocalBackend() { 275 void NewSchedulerForLocalBackend() {
276 // The old syncer is destroyed with the scheduler that owns it. 276 // The old syncer is destroyed with the scheduler that owns it.
277 syncer_ = new testing::StrictMock<MockSyncer>(); 277 syncer_ = new testing::StrictMock<MockSyncer>();
278 scheduler_ = base::MakeUnique<SyncSchedulerImpl>( 278 scheduler_ = base::MakeUnique<SyncSchedulerImpl>(
279 "TestSyncScheduler", BackoffDelayProvider::FromDefaults(), context(), 279 "TestSyncScheduler", BackoffDelayProvider::FromDefaults(), context(),
280 syncer_, true); 280 syncer_, true);
281 scheduler_->SetDefaultNudgeDelay(default_delay()); 281 scheduler_->SetDefaultNudgeDelay(default_delay());
282 } 282 }
283 283
284 bool BlockTimerIsRunning() const { 284 bool BlockTimerIsRunning() const {
285 return scheduler_->pending_wakeup_timer_.IsRunning(); 285 return scheduler_->pending_wakeup_timer_.IsRunning();
286 } 286 }
287 287
288 TimeDelta GetPendingWakeupTimerDelay() {
289 EXPECT_TRUE(scheduler_->pending_wakeup_timer_.IsRunning());
290 return scheduler_->pending_wakeup_timer_.GetCurrentDelay();
291 }
292
288 private: 293 private:
289 syncable::Directory* directory() { 294 syncable::Directory* directory() {
290 return test_user_share_.user_share()->directory.get(); 295 return test_user_share_.user_share()->directory.get();
291 } 296 }
292 297
293 base::MessageLoop loop_; 298 base::MessageLoop loop_;
294 TestUserShare test_user_share_; 299 TestUserShare test_user_share_;
295 CancelationSignal cancelation_signal_; 300 CancelationSignal cancelation_signal_;
296 std::unique_ptr<MockConnectionManager> connection_; 301 std::unique_ptr<MockConnectionManager> connection_;
297 std::unique_ptr<ModelTypeRegistry> model_type_registry_; 302 std::unique_ptr<ModelTypeRegistry> model_type_registry_;
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 EXPECT_CALL(*syncer(), PollSyncShare(_, _)) 712 EXPECT_CALL(*syncer(), PollSyncShare(_, _))
708 .Times(AtLeast(kMinNumSamples)) 713 .Times(AtLeast(kMinNumSamples))
709 .WillRepeatedly( 714 .WillRepeatedly(
710 DoAll(Invoke(test_util::SimulatePollSuccess), 715 DoAll(Invoke(test_util::SimulatePollSuccess),
711 RecordSyncShareMultiple(&times, kMinNumSamples, true))); 716 RecordSyncShareMultiple(&times, kMinNumSamples, true)));
712 717
713 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval); 718 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval);
714 719
715 // Set the start time to |poll_interval| in the future. 720 // Set the start time to |poll_interval| in the future.
716 TimeTicks optimal_start = TimeTicks::Now() + poll_interval; 721 TimeTicks optimal_start = TimeTicks::Now() + poll_interval;
717 StartSyncScheduler(base::Time::Now() + base::TimeDelta::FromMinutes(10)); 722 StartSyncScheduler(base::Time::Now() + TimeDelta::FromMinutes(10));
718 723
719 // Run again to wait for polling. 724 // Run again to wait for polling.
720 RunLoop(); 725 RunLoop();
721 726
722 StopSyncScheduler(); 727 StopSyncScheduler();
723 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval); 728 AnalyzePollRun(times, kMinNumSamples, optimal_start, poll_interval);
724 } 729 }
725 730
726 // Test that the short poll interval is used. 731 // Test that the short poll interval is used.
727 TEST_F(SyncSchedulerImplTest, PollNotificationsDisabled) { 732 TEST_F(SyncSchedulerImplTest, PollNotificationsDisabled) {
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 // Now let the Poll timer do its thing. 1446 // Now let the Poll timer do its thing.
1442 EXPECT_CALL(*syncer(), PollSyncShare(_, _)) 1447 EXPECT_CALL(*syncer(), PollSyncShare(_, _))
1443 .WillRepeatedly( 1448 .WillRepeatedly(
1444 DoAll(Invoke(test_util::SimulatePollSuccess), 1449 DoAll(Invoke(test_util::SimulatePollSuccess),
1445 RecordSyncShareMultiple(&times, kMinNumSamples, true))); 1450 RecordSyncShareMultiple(&times, kMinNumSamples, true)));
1446 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); 1451 const TimeDelta poll(TimeDelta::FromMilliseconds(10));
1447 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 1452 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
1448 1453
1449 // The new optimal time is now, since the desired poll should have happened 1454 // The new optimal time is now, since the desired poll should have happened
1450 // in the past. 1455 // in the past.
1451 optimal_job_time = base::TimeTicks::Now(); 1456 optimal_job_time = TimeTicks::Now();
1452 RunLoop(); 1457 RunLoop();
1453 Mock::VerifyAndClearExpectations(syncer()); 1458 Mock::VerifyAndClearExpectations(syncer());
1454 ASSERT_EQ(kMinNumSamples, times.size()); 1459 ASSERT_EQ(kMinNumSamples, times.size());
1455 for (size_t i = 2; i < times.size(); i++) { 1460 for (size_t i = 2; i < times.size(); i++) {
1456 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); 1461 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")");
1457 EXPECT_GE(times[i], optimal_job_time); 1462 EXPECT_GE(times[i], optimal_job_time);
1458 optimal_job_time = optimal_job_time + poll; 1463 optimal_job_time = optimal_job_time + poll;
1459 } 1464 }
1460 1465
1461 StopSyncScheduler(); 1466 StopSyncScheduler();
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1620 scheduler()->OnCredentialsUpdated(); 1625 scheduler()->OnCredentialsUpdated();
1621 connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK); 1626 connection()->SetServerStatus(HttpResponse::SERVER_CONNECTION_OK);
1622 RunLoop(); 1627 RunLoop();
1623 StopSyncScheduler(); 1628 StopSyncScheduler();
1624 } 1629 }
1625 1630
1626 TEST_F(SyncSchedulerImplTest, SuccessfulRetry) { 1631 TEST_F(SyncSchedulerImplTest, SuccessfulRetry) {
1627 StartSyncScheduler(base::Time()); 1632 StartSyncScheduler(base::Time());
1628 1633
1629 SyncShareTimes times; 1634 SyncShareTimes times;
1630 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); 1635 TimeDelta delay = TimeDelta::FromMilliseconds(10);
1631 scheduler()->OnReceivedGuRetryDelay(delay); 1636 scheduler()->OnReceivedGuRetryDelay(delay);
1632 EXPECT_EQ(delay, GetRetryTimerDelay()); 1637 EXPECT_EQ(delay, GetRetryTimerDelay());
1633 1638
1634 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _)) 1639 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
1635 .WillOnce(DoAll(Invoke(test_util::SimulateNormalSuccess), 1640 .WillOnce(DoAll(Invoke(test_util::SimulateNormalSuccess),
1636 RecordSyncShare(&times, true))); 1641 RecordSyncShare(&times, true)));
1637 1642
1638 // Run to wait for retrying. 1643 // Run to wait for retrying.
1639 RunLoop(); 1644 RunLoop();
1640 1645
1641 StopSyncScheduler(); 1646 StopSyncScheduler();
1642 } 1647 }
1643 1648
1644 TEST_F(SyncSchedulerImplTest, FailedRetry) { 1649 TEST_F(SyncSchedulerImplTest, FailedRetry) {
1645 SyncShareTimes times; 1650 SyncShareTimes times;
1646 1651
1647 UseMockDelayProvider(); 1652 UseMockDelayProvider();
1648 EXPECT_CALL(*delay(), GetDelay(_)) 1653 EXPECT_CALL(*delay(), GetDelay(_))
1649 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(10))); 1654 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(10)));
1650 1655
1651 StartSyncScheduler(base::Time()); 1656 StartSyncScheduler(base::Time());
1652 1657
1653 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); 1658 TimeDelta delay = TimeDelta::FromMilliseconds(10);
1654 scheduler()->OnReceivedGuRetryDelay(delay); 1659 scheduler()->OnReceivedGuRetryDelay(delay);
1655 1660
1656 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _)) 1661 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
1657 .WillOnce(DoAll(Invoke(test_util::SimulateDownloadUpdatesFailed), 1662 .WillOnce(DoAll(Invoke(test_util::SimulateDownloadUpdatesFailed),
1658 RecordSyncShare(&times, false))); 1663 RecordSyncShare(&times, false)));
1659 1664
1660 // Run to wait for retrying. 1665 // Run to wait for retrying.
1661 RunLoop(); 1666 RunLoop();
1662 1667
1663 EXPECT_TRUE(scheduler()->IsBackingOff()); 1668 EXPECT_TRUE(scheduler()->IsBackingOff());
1664 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _)) 1669 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
1665 .WillOnce(DoAll(Invoke(test_util::SimulateNormalSuccess), 1670 .WillOnce(DoAll(Invoke(test_util::SimulateNormalSuccess),
1666 RecordSyncShare(&times, true))); 1671 RecordSyncShare(&times, true)));
1667 1672
1668 // Run to wait for second retrying. 1673 // Run to wait for second retrying.
1669 RunLoop(); 1674 RunLoop();
1670 1675
1671 StopSyncScheduler(); 1676 StopSyncScheduler();
1672 } 1677 }
1673 1678
1674 ACTION_P2(VerifyRetryTimerDelay, scheduler_test, expected_delay) { 1679 ACTION_P2(VerifyRetryTimerDelay, scheduler_test, expected_delay) {
1675 EXPECT_EQ(expected_delay, scheduler_test->GetRetryTimerDelay()); 1680 EXPECT_EQ(expected_delay, scheduler_test->GetRetryTimerDelay());
1676 } 1681 }
1677 1682
1678 TEST_F(SyncSchedulerImplTest, ReceiveNewRetryDelay) { 1683 TEST_F(SyncSchedulerImplTest, ReceiveNewRetryDelay) {
1679 StartSyncScheduler(base::Time()); 1684 StartSyncScheduler(base::Time());
1680 1685
1681 SyncShareTimes times; 1686 SyncShareTimes times;
1682 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(100); 1687 TimeDelta delay1 = TimeDelta::FromMilliseconds(100);
1683 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(200); 1688 TimeDelta delay2 = TimeDelta::FromMilliseconds(200);
1684 1689
1685 scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE); 1690 scheduler()->ScheduleLocalNudge(ModelTypeSet(THEMES), FROM_HERE);
1686 scheduler()->OnReceivedGuRetryDelay(delay1); 1691 scheduler()->OnReceivedGuRetryDelay(delay1);
1687 EXPECT_EQ(delay1, GetRetryTimerDelay()); 1692 EXPECT_EQ(delay1, GetRetryTimerDelay());
1688 1693
1689 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _)) 1694 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
1690 .WillOnce( 1695 .WillOnce(
1691 DoAll(WithoutArgs(VerifyRetryTimerDelay(this, delay1)), 1696 DoAll(WithoutArgs(VerifyRetryTimerDelay(this, delay1)),
1692 WithArg<2>(test_util::SimulateGuRetryDelayCommand(delay2)), 1697 WithArg<2>(test_util::SimulateGuRetryDelayCommand(delay2)),
1693 RecordSyncShare(&times, true))); 1698 RecordSyncShare(&times, true)));
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1754 WithArg<2>(test_util::SimulatePartialFailure(types)), Return(true))) 1759 WithArg<2>(test_util::SimulatePartialFailure(types)), Return(true)))
1755 .RetiresOnSaturation(); 1760 .RetiresOnSaturation();
1756 1761
1757 StartSyncScheduler(base::Time()); 1762 StartSyncScheduler(base::Time());
1758 scheduler()->ScheduleLocalNudge(types, FROM_HERE); 1763 scheduler()->ScheduleLocalNudge(types, FROM_HERE);
1759 PumpLoop(); // To get PerformDelayedNudge called. 1764 PumpLoop(); // To get PerformDelayedNudge called.
1760 PumpLoop(); // To get TrySyncCycleJob called 1765 PumpLoop(); // To get TrySyncCycleJob called
1761 EXPECT_TRUE(GetBackedOffTypes().HasAll(types)); 1766 EXPECT_TRUE(GetBackedOffTypes().HasAll(types));
1762 EXPECT_FALSE(scheduler()->IsBackingOff()); 1767 EXPECT_FALSE(scheduler()->IsBackingOff());
1763 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled()); 1768 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled());
1764 base::TimeDelta first_blocking_time = GetTypeBlockingTime(THEMES); 1769 TimeDelta first_blocking_time = GetTypeBlockingTime(THEMES);
1765 1770
1766 SetTypeBlockingMode(THEMES, WaitInterval::EXPONENTIAL_BACKOFF_RETRYING); 1771 SetTypeBlockingMode(THEMES, WaitInterval::EXPONENTIAL_BACKOFF_RETRYING);
1767 // This won't cause a sync cycle because the types are backed off. 1772 // This won't cause a sync cycle because the types are backed off.
1768 scheduler()->ScheduleLocalNudge(types, FROM_HERE); 1773 scheduler()->ScheduleLocalNudge(types, FROM_HERE);
1769 PumpLoop(); 1774 PumpLoop();
1770 PumpLoop(); 1775 PumpLoop();
1771 base::TimeDelta second_blocking_time = GetTypeBlockingTime(THEMES); 1776 TimeDelta second_blocking_time = GetTypeBlockingTime(THEMES);
1772 1777
1773 // The Exponential backoff should be between previous backoff 1.5 and 2.5 1778 // The Exponential backoff should be between previous backoff 1.5 and 2.5
1774 // times. 1779 // times.
1775 EXPECT_LE(first_blocking_time * 1.5, second_blocking_time); 1780 EXPECT_LE(first_blocking_time * 1.5, second_blocking_time);
1776 EXPECT_GE(first_blocking_time * 2.5, second_blocking_time); 1781 EXPECT_GE(first_blocking_time * 2.5, second_blocking_time);
1777 1782
1778 StopSyncScheduler(); 1783 StopSyncScheduler();
1779 } 1784 }
1780 1785
1781 // If a datatype is in backoff or throttling, pending_wakeup_timer_ should 1786 // If a datatype is in backoff or throttling, pending_wakeup_timer_ should
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 // Timer is still scheduled for another backoff datatype. 1898 // Timer is still scheduled for another backoff datatype.
1894 EXPECT_TRUE(GetBackedOffTypes().HasAll(themes_types)); 1899 EXPECT_TRUE(GetBackedOffTypes().HasAll(themes_types));
1895 EXPECT_FALSE(GetBackedOffTypes().HasAll(typed_urls_types)); 1900 EXPECT_FALSE(GetBackedOffTypes().HasAll(typed_urls_types));
1896 EXPECT_TRUE(BlockTimerIsRunning()); 1901 EXPECT_TRUE(BlockTimerIsRunning());
1897 EXPECT_FALSE(scheduler()->IsBackingOff()); 1902 EXPECT_FALSE(scheduler()->IsBackingOff());
1898 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled()); 1903 EXPECT_FALSE(scheduler()->IsCurrentlyThrottled());
1899 1904
1900 StopSyncScheduler(); 1905 StopSyncScheduler();
1901 } 1906 }
1902 1907
1908 TEST_F(SyncSchedulerImplTest, InterleavedNudgesStillRestart) {
1909 UseMockDelayProvider();
1910 EXPECT_CALL(*delay(), GetDelay(_))
1911 .WillOnce(Return(long_delay()))
1912 .RetiresOnSaturation();
1913 TimeDelta poll(TimeDelta::FromDays(1));
1914 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
1915
1916 StartSyncScheduler(base::Time());
1917 scheduler()->ScheduleLocalNudge({THEMES}, FROM_HERE);
1918 PumpLoop(); // To get PerformDelayedNudge called.
1919 EXPECT_FALSE(BlockTimerIsRunning());
1920 EXPECT_FALSE(scheduler()->IsBackingOff());
1921
1922 // This is the tricky piece. We have a gap while the sync job is bouncing to
1923 // get onto the |pending_wakeup_timer_|, should be scheduled with no delay.
1924 scheduler()->ScheduleLocalNudge({TYPED_URLS}, FROM_HERE);
1925 EXPECT_TRUE(BlockTimerIsRunning());
1926 EXPECT_EQ(TimeDelta(), GetPendingWakeupTimerDelay());
1927 EXPECT_FALSE(scheduler()->IsBackingOff());
1928
1929 // Setup mock as we're about to attempt to sync.
1930 SyncShareTimes times;
1931 EXPECT_CALL(*syncer(), NormalSyncShare(_, _, _))
1932 .WillOnce(DoAll(Invoke(test_util::SimulateCommitFailed),
1933 RecordSyncShare(&times, false)));
1934 // Triggers the THEMES TrySyncCycleJobImpl(), which we've setup to fail. Its
1935 // RestartWaiting won't schedule a delayed retry, as the TYPED_URLS nudge has
1936 // a smaller delay. We verify this by making sure the delay is still zero.
1937 PumpLoop();
1938 EXPECT_TRUE(BlockTimerIsRunning());
1939 EXPECT_EQ(TimeDelta(), GetPendingWakeupTimerDelay());
1940 EXPECT_TRUE(scheduler()->IsBackingOff());
1941
1942 // Triggers TYPED_URLS PerformDelayedNudge(), which should no-op, because
1943 // we're no long healthy, and normal priorities shouldn't go through, but it
1944 // does need to setup the |pending_wakeup_timer_|. The delay should be ~60
1945 // seconds, so verifying it's greater than 50 should be safe.
1946 PumpLoop();
1947 EXPECT_TRUE(BlockTimerIsRunning());
1948 EXPECT_LT(TimeDelta::FromSeconds(50), GetPendingWakeupTimerDelay());
1949 EXPECT_TRUE(scheduler()->IsBackingOff());
1950 }
1951
1903 } // namespace syncer 1952 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/engine_impl/sync_scheduler_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698