Chromium Code Reviews| Index: components/scheduler/child/scheduler_helper_unittest.cc |
| diff --git a/components/scheduler/child/scheduler_helper_unittest.cc b/components/scheduler/child/scheduler_helper_unittest.cc |
| index 0418c0be3250d172d00ad2ab9234bf1f5312a79d..6bd1213b889c6ca7e5ce5716ef7bb97daf911d9c 100644 |
| --- a/components/scheduler/child/scheduler_helper_unittest.cc |
| +++ b/components/scheduler/child/scheduler_helper_unittest.cc |
| @@ -130,7 +130,7 @@ class SchedulerHelperForTest : public SchedulerHelper, |
| bool(base::TimeTicks now, |
| base::TimeDelta* next_long_idle_period_delay_out)); |
| - MOCK_METHOD0(IsNotQuiescent, void()); |
| + void IsNotQuiescent() override {} |
| }; |
| class BaseSchedulerHelperTest : public testing::Test { |
| @@ -150,7 +150,9 @@ class BaseSchedulerHelperTest : public testing::Test { |
| nestable_task_runner_, |
| required_quiescence_duration_before_long_idle_period)), |
| default_task_runner_(scheduler_helper_->DefaultTaskRunner()), |
| - idle_task_runner_(scheduler_helper_->IdleTaskRunner()) { |
| + idle_task_runner_(scheduler_helper_->IdleTaskRunner()), |
| + control_task_runner_(scheduler_helper_->ControlTaskRunner()), |
| + shutdown_task_runner_(scheduler_helper_->ShutdownTaskRunner()) { |
| scheduler_helper_->SetTimeSourceForTesting( |
| make_scoped_ptr(new TestTimeSource(clock_))); |
| scheduler_helper_->GetTaskQueueManagerForTesting()->SetTimeSourceForTesting( |
| @@ -185,6 +187,8 @@ class BaseSchedulerHelperTest : public testing::Test { |
| // task identifier specifies the task type: |
| // - 'D': Default task |
| // - 'I': Idle task |
| + // - 'S': Shutdown task |
| + // - 'T': conTrol task (to avoid confusion with compositor tasks) |
| void PostTestTasks(std::vector<std::string>* run_order, |
| const std::string& task_descriptor) { |
| std::istringstream stream(task_descriptor); |
| @@ -201,6 +205,14 @@ class BaseSchedulerHelperTest : public testing::Test { |
| FROM_HERE, |
| base::Bind(&AppendToVectorIdleTestTask, run_order, task)); |
| break; |
| + case 'S': |
| + shutdown_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task)); |
| + break; |
| + case 'T': |
| + control_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task)); |
| + break; |
| default: |
| NOTREACHED(); |
| } |
| @@ -228,6 +240,8 @@ class BaseSchedulerHelperTest : public testing::Test { |
| scoped_ptr<SchedulerHelperForTest> scheduler_helper_; |
| scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; |
| scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; |
| + scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_; |
| + scoped_refptr<base::SingleThreadTaskRunner> shutdown_task_runner_; |
| DISALLOW_COPY_AND_ASSIGN(BaseSchedulerHelperTest); |
| }; |
| @@ -912,4 +926,43 @@ TEST_F(SchedulerHelperWithQuiescencePeriodTest, |
| EXPECT_EQ(expected_deadline, deadline_in_task); |
| } |
| +TEST_F(SchedulerHelperTest, |
| + TestPreShutdown_BlocksAllButControlAndShutdownTasks) { |
| + std::vector<std::string> run_order; |
| + PostTestTasks(&run_order, "D1 I1 T1"); |
|
Sami
2015/04/28 11:52:46
I noticed we weren't actually posting a shutdown t
|
| + |
| + scheduler_helper_->PreShutdown(); |
| + |
| + RunUntilIdle(); |
| + EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"))); |
| +} |
| + |
| +TEST_F(SchedulerHelperTest, TestPreShutdown_BlocksFutureLongIdleTasks) { |
| + int run_count = 0; |
| + |
| + EXPECT_CALL(*scheduler_helper_, CanEnterLongIdlePeriod(_, _)) |
| + .Times(2) |
| + .WillRepeatedly(Return(true)); |
| + |
| + max_idle_task_reposts = 3; |
| + idle_task_runner_->PostIdleTask( |
| + FROM_HERE, |
| + base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); |
| + |
| + scheduler_helper_->EnableLongIdlePeriod(); |
| + 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 |
| + // does not get run (it should be blocked by PreShutdown). |
| + scheduler_helper_->PreShutdown(); |
| + clock_->AdvanceNow(maximum_idle_period_duration()); |
| + RunUntilIdle(); |
| + EXPECT_EQ(1, run_count); |
| + |
| + // Must destroy all tasks posted to scheduler_helper_ before run_count goes |
| + // out of scope. |
| + scheduler_helper_.reset(); |
| +} |
| + |
| } // namespace scheduler |