| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "platform/scheduler/child/idle_helper.h" | 5 #include "platform/scheduler/child/idle_helper.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner, | 136 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner, |
| 137 std::unique_ptr<TestTimeSource> test_time_source) { | 137 std::unique_ptr<TestTimeSource> test_time_source) { |
| 138 if (message_loop) | 138 if (message_loop) |
| 139 return SchedulerTqmDelegateImpl::Create(message_loop, | 139 return SchedulerTqmDelegateImpl::Create(message_loop, |
| 140 std::move(test_time_source)); | 140 std::move(test_time_source)); |
| 141 | 141 |
| 142 return SchedulerTqmDelegateForTest::Create(mock_task_runner, | 142 return SchedulerTqmDelegateForTest::Create(mock_task_runner, |
| 143 std::move(test_time_source)); | 143 std::move(test_time_source)); |
| 144 } | 144 } |
| 145 | 145 |
| 146 void ShutdownIdleTask(IdleHelper* helper, |
| 147 bool* shutdown_task_run, |
| 148 base::TimeTicks deadline) { |
| 149 *shutdown_task_run = true; |
| 150 helper->Shutdown(); |
| 151 } |
| 152 |
| 146 }; // namespace | 153 }; // namespace |
| 147 | 154 |
| 148 class IdleHelperForTest : public IdleHelper, public IdleHelper::Delegate { | 155 class IdleHelperForTest : public IdleHelper, public IdleHelper::Delegate { |
| 149 public: | 156 public: |
| 150 explicit IdleHelperForTest( | 157 explicit IdleHelperForTest( |
| 151 SchedulerHelper* scheduler_helper, | 158 SchedulerHelper* scheduler_helper, |
| 152 base::TimeDelta required_quiescence_duration_before_long_idle_period) | 159 base::TimeDelta required_quiescence_duration_before_long_idle_period) |
| 153 : IdleHelper(scheduler_helper, | 160 : IdleHelper(scheduler_helper, |
| 154 this, | 161 this, |
| 155 "test.idle", | 162 "test.idle", |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 | 208 |
| 202 void SetUp() override { | 209 void SetUp() override { |
| 203 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); | 210 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); |
| 204 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); | 211 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); |
| 205 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) | 212 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) |
| 206 .Times(AnyNumber()) | 213 .Times(AnyNumber()) |
| 207 .WillRepeatedly(Return(true)); | 214 .WillRepeatedly(Return(true)); |
| 208 } | 215 } |
| 209 | 216 |
| 210 void TearDown() override { | 217 void TearDown() override { |
| 218 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); |
| 219 idle_helper_->Shutdown(); |
| 211 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); | 220 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
| 212 if (mock_task_runner_.get()) { | 221 if (mock_task_runner_.get()) { |
| 213 // Check that all tests stop posting tasks. | 222 // Check that all tests stop posting tasks. |
| 214 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 223 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 215 while (mock_task_runner_->RunUntilIdle()) { | 224 while (mock_task_runner_->RunUntilIdle()) { |
| 216 } | 225 } |
| 217 } else { | 226 } else { |
| 218 base::RunLoop().RunUntilIdle(); | 227 base::RunLoop().RunUntilIdle(); |
| 219 } | 228 } |
| 220 } | 229 } |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 idle_helper_->EndIdlePeriod(); | 781 idle_helper_->EndIdlePeriod(); |
| 773 CheckIdlePeriodStateIs("not_in_idle_period"); | 782 CheckIdlePeriodStateIs("not_in_idle_period"); |
| 774 } | 783 } |
| 775 | 784 |
| 776 TEST_F(IdleHelperTest, TestLongIdlePeriodWhenShutdown) { | 785 TEST_F(IdleHelperTest, TestLongIdlePeriodWhenShutdown) { |
| 777 base::TimeTicks deadline_in_task; | 786 base::TimeTicks deadline_in_task; |
| 778 int run_count = 0; | 787 int run_count = 0; |
| 779 | 788 |
| 780 idle_task_runner_->PostIdleTask( | 789 idle_task_runner_->PostIdleTask( |
| 781 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 790 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 782 scheduler_helper_->Shutdown(); | 791 idle_helper_->Shutdown(); |
| 783 | 792 |
| 784 // We shouldn't be able to enter a long idle period when shutdown | 793 // We shouldn't be able to enter a long idle period when shutdown |
| 785 idle_helper_->EnableLongIdlePeriod(); | 794 idle_helper_->EnableLongIdlePeriod(); |
| 786 RunUntilIdle(); | 795 RunUntilIdle(); |
| 787 CheckIdlePeriodStateIs("not_in_idle_period"); | 796 CheckIdlePeriodStateIs("not_in_idle_period"); |
| 788 EXPECT_EQ(0, run_count); | 797 EXPECT_EQ(0, run_count); |
| 789 } | 798 } |
| 790 | 799 |
| 791 void TestCanExceedIdleDeadlineIfRequiredTask(IdleHelperForTest* idle_helper, | 800 void TestCanExceedIdleDeadlineIfRequiredTask(IdleHelperForTest* idle_helper, |
| 792 bool* can_exceed_idle_deadline_out, | 801 bool* can_exceed_idle_deadline_out, |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 RunUntilIdle(); | 1045 RunUntilIdle(); |
| 1037 EXPECT_EQ(0, run_count); | 1046 EXPECT_EQ(0, run_count); |
| 1038 | 1047 |
| 1039 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 1048 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 1040 more_than_min_deadline_duration); | 1049 more_than_min_deadline_duration); |
| 1041 idle_helper_->EnableLongIdlePeriod(); | 1050 idle_helper_->EnableLongIdlePeriod(); |
| 1042 RunUntilIdle(); | 1051 RunUntilIdle(); |
| 1043 EXPECT_EQ(1, run_count); | 1052 EXPECT_EQ(1, run_count); |
| 1044 } | 1053 } |
| 1045 | 1054 |
| 1055 TEST_F(IdleHelperWithQuiescencePeriodTest, |
| 1056 PendingEnableLongIdlePeriodNotRunAfterShutdown) { |
| 1057 MakeNonQuiescent(); |
| 1058 |
| 1059 bool shutdown_task_run = false; |
| 1060 int run_count = 0; |
| 1061 base::TimeTicks deadline_in_task; |
| 1062 idle_task_runner_->PostIdleTask( |
| 1063 FROM_HERE, |
| 1064 base::Bind(&ShutdownIdleTask, base::Unretained(idle_helper_.get()), |
| 1065 &shutdown_task_run)); |
| 1066 idle_task_runner_->PostIdleTask( |
| 1067 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 1068 |
| 1069 // Delayed call to IdleHelper::EnableLongIdlePeriod enables idle tasks. |
| 1070 idle_helper_->EnableLongIdlePeriod(); |
| 1071 clock_->Advance(maximum_idle_period_duration() * 2.0); |
| 1072 mock_task_runner_->RunPendingTasks(); |
| 1073 EXPECT_TRUE(shutdown_task_run); |
| 1074 EXPECT_EQ(0, run_count); |
| 1075 |
| 1076 // Shutdown immediately after idle period started should prevent the idle |
| 1077 // task from running. |
| 1078 idle_helper_->Shutdown(); |
| 1079 mock_task_runner_->RunUntilIdle(); |
| 1080 EXPECT_EQ(0, run_count); |
| 1081 } |
| 1082 |
| 1046 } // namespace scheduler | 1083 } // namespace scheduler |
| 1047 } // namespace blink | 1084 } // namespace blink |
| OLD | NEW |