Index: components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
diff --git a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
index bde837caf14e70b73d6991f76ee329c8c6018725..151888ce69382de642c91f136da3ad09c757ca25 100644 |
--- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
+++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
@@ -78,17 +78,37 @@ void RepostingIdleTestTask(SingleThreadIdleTaskRunner* idle_task_runner, |
(*run_count)++; |
} |
+void RepostingUpdateClockIdleTestTask( |
+ SingleThreadIdleTaskRunner* idle_task_runner, |
+ int* run_count, |
+ scoped_refptr<cc::TestNowSource> clock, |
+ base::TimeDelta advance_time, |
+ std::vector<base::TimeTicks>* deadlines, |
+ base::TimeTicks deadline) { |
+ if ((*run_count + 1) < max_idle_task_reposts) { |
+ idle_task_runner->PostIdleTask( |
+ FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, |
+ base::Unretained(idle_task_runner), run_count, |
+ clock, advance_time, deadlines)); |
+ } |
+ deadlines->push_back(deadline); |
+ (*run_count)++; |
+ clock->AdvanceNow(advance_time); |
+} |
+ |
+void WillBeginFrameIdleTask(RendererScheduler* scheduler, |
+ scoped_refptr<cc::TestNowSource> clock, |
+ base::TimeTicks deadline) { |
+ scheduler->WillBeginFrame(cc::BeginFrameArgs::Create( |
+ BEGINFRAME_FROM_HERE, clock->Now(), base::TimeTicks(), |
+ base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); |
+} |
+ |
void UpdateClockToDeadlineIdleTestTask( |
cc::TestNowSource* clock, |
- base::SingleThreadTaskRunner* task_runner, |
int* run_count, |
base::TimeTicks deadline) { |
clock->SetNow(deadline); |
- // Due to the way in which OrderedSimpleTestRunner orders tasks and the fact |
- // that we updated the time within a task, the delayed pending task to call |
- // EndIdlePeriod will not happen until after a TaskQueueManager DoWork, so |
- // post a normal task here to ensure it runs before the next idle task. |
- task_runner->PostTask(FROM_HERE, base::Bind(NullTask)); |
(*run_count)++; |
} |
@@ -386,11 +406,11 @@ TEST_F(RendererSchedulerImplTest, TestIdleTaskExceedsDeadline) { |
// Post two UpdateClockToDeadlineIdleTestTask tasks. |
idle_task_runner_->PostIdleTask( |
- FROM_HERE, base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, |
- default_task_runner_, &run_count)); |
+ FROM_HERE, |
+ base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, &run_count)); |
idle_task_runner_->PostIdleTask( |
- FROM_HERE, base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, |
- default_task_runner_, &run_count)); |
+ FROM_HERE, |
+ base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, &run_count)); |
EnableIdleTasks(); |
RunUntilIdle(); |
@@ -1210,31 +1230,40 @@ TEST_F(RendererSchedulerImplTest, |
} |
TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodRepeating) { |
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
+ std::vector<base::TimeTicks> actual_deadlines; |
int run_count = 0; |
max_idle_task_reposts = 3; |
+ base::TimeTicks clock_before(clock_->Now()); |
+ base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); |
idle_task_runner_->PostIdleTask( |
FROM_HERE, |
- base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); |
- |
+ base::Bind(&RepostingUpdateClockIdleTestTask, idle_task_runner_, |
+ &run_count, clock_, idle_task_runtime, &actual_deadlines)); |
scheduler_->BeginFrameNotExpectedSoon(); |
RunUntilIdle(); |
- EXPECT_EQ(1, run_count); // Should only run once per idle period. |
- |
- // Advance time to start of next long idle period and check task reposted task |
- // gets run. |
- clock_->AdvanceNow(maximum_idle_period_duration()); |
- RunUntilIdle(); |
- EXPECT_EQ(2, run_count); |
- |
- // Advance time to start of next long idle period then end idle period with a |
- // new BeginMainFrame and check idle task doesn't run. |
- clock_->AdvanceNow(maximum_idle_period_duration()); |
- scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
- BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
- base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); |
+ EXPECT_EQ(3, run_count); |
+ EXPECT_THAT( |
+ actual_deadlines, |
+ testing::ElementsAre( |
+ clock_before + maximum_idle_period_duration(), |
+ clock_before + idle_task_runtime + maximum_idle_period_duration(), |
+ clock_before + (2 * idle_task_runtime) + |
+ maximum_idle_period_duration())); |
+ |
+ // Check that idle tasks don't run after the idle period ends with a |
+ // new BeginMainFrame. |
+ max_idle_task_reposts = 5; |
+ idle_task_runner_->PostIdleTask( |
+ FROM_HERE, |
+ base::Bind(&RepostingUpdateClockIdleTestTask, idle_task_runner_, |
+ &run_count, clock_, idle_task_runtime, &actual_deadlines)); |
+ idle_task_runner_->PostIdleTask( |
+ FROM_HERE, base::Bind(&WillBeginFrameIdleTask, |
+ base::Unretained(scheduler_.get()), clock_)); |
RunUntilIdle(); |
- EXPECT_EQ(2, run_count); |
+ EXPECT_EQ(4, run_count); |
} |
TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodDoesNotWakeScheduler) { |
@@ -1355,6 +1384,7 @@ TEST_F(RendererSchedulerImplTest, CanExceedIdleDeadlineIfRequired) { |
TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { |
int run_count = 0; |
+ max_idle_task_reposts = 2; |
idle_task_runner_->PostIdleTask( |
FROM_HERE, |
base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); |
@@ -1363,19 +1393,19 @@ TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { |
RunUntilIdle(); |
EXPECT_EQ(0, run_count); |
- // When we hide the renderer it should start an idle period. |
+ // When we hide the renderer it should start a max deadline idle period, which |
+ // will run an idle task and then immediately start a new idle period, which |
+ // runs the second idle task. |
scheduler_->OnRendererHidden(); |
RunUntilIdle(); |
- EXPECT_EQ(1, run_count); |
- |
- // Advance time to start of next long idle period and check task reposted task |
- // gets run. |
- clock_->AdvanceNow(maximum_idle_period_duration()); |
- RunUntilIdle(); |
EXPECT_EQ(2, run_count); |
// Advance time by amount of time by the maximum amount of time we execute |
// idle tasks when hidden (plus some slack) - idle period should have ended. |
+ max_idle_task_reposts = 3; |
+ idle_task_runner_->PostIdleTask( |
+ FROM_HERE, |
+ base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); |
clock_->AdvanceNow(end_idle_when_hidden_delay() + |
base::TimeDelta::FromMilliseconds(10)); |
RunUntilIdle(); |