| 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 "components/scheduler/child/idle_helper.h" | 5 #include "components/scheduler/child/idle_helper.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/test/simple_test_tick_clock.h" |
| 8 #include "cc/test/ordered_simple_task_runner.h" | 9 #include "cc/test/ordered_simple_task_runner.h" |
| 9 #include "cc/test/test_now_source.h" | |
| 10 #include "components/scheduler/child/nestable_task_runner_for_test.h" | 10 #include "components/scheduler/child/nestable_task_runner_for_test.h" |
| 11 #include "components/scheduler/child/scheduler_helper.h" | 11 #include "components/scheduler/child/scheduler_helper.h" |
| 12 #include "components/scheduler/child/scheduler_message_loop_delegate.h" | 12 #include "components/scheduler/child/scheduler_message_loop_delegate.h" |
| 13 #include "components/scheduler/child/task_queue_manager.h" | 13 #include "components/scheduler/child/task_queue_manager.h" |
| 14 #include "components/scheduler/child/test_time_source.h" | 14 #include "components/scheduler/child/test_time_source.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 using testing::_; | 18 using testing::_; |
| 19 using testing::AnyNumber; | 19 using testing::AnyNumber; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 base::Bind(&RepostingIdleTestTask, base::Unretained(idle_task_runner), | 74 base::Bind(&RepostingIdleTestTask, base::Unretained(idle_task_runner), |
| 75 run_count, deadline_out)); | 75 run_count, deadline_out)); |
| 76 } | 76 } |
| 77 *deadline_out = deadline; | 77 *deadline_out = deadline; |
| 78 (*run_count)++; | 78 (*run_count)++; |
| 79 } | 79 } |
| 80 | 80 |
| 81 void RepostingUpdateClockIdleTestTask( | 81 void RepostingUpdateClockIdleTestTask( |
| 82 SingleThreadIdleTaskRunner* idle_task_runner, | 82 SingleThreadIdleTaskRunner* idle_task_runner, |
| 83 int* run_count, | 83 int* run_count, |
| 84 scoped_refptr<cc::TestNowSource> clock, | 84 base::SimpleTestTickClock* clock, |
| 85 base::TimeDelta advance_time, | 85 base::TimeDelta advance_time, |
| 86 std::vector<base::TimeTicks>* deadlines, | 86 std::vector<base::TimeTicks>* deadlines, |
| 87 base::TimeTicks deadline) { | 87 base::TimeTicks deadline) { |
| 88 if ((*run_count + 1) < max_idle_task_reposts) { | 88 if ((*run_count + 1) < max_idle_task_reposts) { |
| 89 idle_task_runner->PostIdleTask( | 89 idle_task_runner->PostIdleTask( |
| 90 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, | 90 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, |
| 91 base::Unretained(idle_task_runner), run_count, | 91 base::Unretained(idle_task_runner), run_count, |
| 92 clock, advance_time, deadlines)); | 92 clock, advance_time, deadlines)); |
| 93 } | 93 } |
| 94 deadlines->push_back(deadline); | 94 deadlines->push_back(deadline); |
| 95 (*run_count)++; | 95 (*run_count)++; |
| 96 clock->AdvanceNow(advance_time); | 96 clock->Advance(advance_time); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void RepeatingTask(base::SingleThreadTaskRunner* task_runner, | 99 void RepeatingTask(base::SingleThreadTaskRunner* task_runner, |
| 100 int num_repeats, | 100 int num_repeats, |
| 101 base::TimeDelta delay) { | 101 base::TimeDelta delay) { |
| 102 if (num_repeats > 1) { | 102 if (num_repeats > 1) { |
| 103 task_runner->PostDelayedTask( | 103 task_runner->PostDelayedTask( |
| 104 FROM_HERE, base::Bind(&RepeatingTask, base::Unretained(task_runner), | 104 FROM_HERE, base::Bind(&RepeatingTask, base::Unretained(task_runner), |
| 105 num_repeats - 1, delay), | 105 num_repeats - 1, delay), |
| 106 delay); | 106 delay); |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 | 109 |
| 110 void UpdateClockIdleTestTask(scoped_refptr<cc::TestNowSource> clock, | 110 void UpdateClockIdleTestTask(base::SimpleTestTickClock* clock, |
| 111 int* run_count, | 111 int* run_count, |
| 112 base::TimeTicks set_time, | 112 base::TimeTicks set_time, |
| 113 base::TimeTicks deadline) { | 113 base::TimeTicks deadline) { |
| 114 clock->SetNow(set_time); | 114 clock->Advance(set_time - clock->NowTicks()); |
| 115 (*run_count)++; | 115 (*run_count)++; |
| 116 } | 116 } |
| 117 | 117 |
| 118 void UpdateClockToDeadlineIdleTestTask(scoped_refptr<cc::TestNowSource> clock, | 118 void UpdateClockToDeadlineIdleTestTask(base::SimpleTestTickClock* clock, |
| 119 int* run_count, | 119 int* run_count, |
| 120 base::TimeTicks deadline) { | 120 base::TimeTicks deadline) { |
| 121 UpdateClockIdleTestTask(clock, run_count, deadline, deadline); | 121 UpdateClockIdleTestTask(clock, run_count, deadline, deadline); |
| 122 } | 122 } |
| 123 | 123 |
| 124 void EndIdlePeriodIdleTask(IdleHelper* idle_helper, base::TimeTicks deadline) { | 124 void EndIdlePeriodIdleTask(IdleHelper* idle_helper, base::TimeTicks deadline) { |
| 125 idle_helper->EndIdlePeriod(); | 125 idle_helper->EndIdlePeriod(); |
| 126 } | 126 } |
| 127 | 127 |
| 128 scoped_refptr<NestableSingleThreadTaskRunner> | 128 scoped_refptr<NestableSingleThreadTaskRunner> |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 MOCK_METHOD0(IsNotQuiescent, void()); | 160 MOCK_METHOD0(IsNotQuiescent, void()); |
| 161 MOCK_METHOD0(OnIdlePeriodStarted, void()); | 161 MOCK_METHOD0(OnIdlePeriodStarted, void()); |
| 162 MOCK_METHOD0(OnIdlePeriodEnded, void()); | 162 MOCK_METHOD0(OnIdlePeriodEnded, void()); |
| 163 }; | 163 }; |
| 164 | 164 |
| 165 class BaseIdleHelperTest : public testing::Test { | 165 class BaseIdleHelperTest : public testing::Test { |
| 166 public: | 166 public: |
| 167 BaseIdleHelperTest( | 167 BaseIdleHelperTest( |
| 168 base::MessageLoop* message_loop, | 168 base::MessageLoop* message_loop, |
| 169 base::TimeDelta required_quiescence_duration_before_long_idle_period) | 169 base::TimeDelta required_quiescence_duration_before_long_idle_period) |
| 170 : clock_(cc::TestNowSource::Create(5000)), | 170 : clock_(new base::SimpleTestTickClock()), |
| 171 mock_task_runner_(message_loop | 171 mock_task_runner_( |
| 172 ? nullptr | 172 message_loop |
| 173 : new cc::OrderedSimpleTaskRunner(clock_, false)), | 173 ? nullptr |
| 174 : new cc::OrderedSimpleTaskRunner(clock_.get(), false)), |
| 174 message_loop_(message_loop), | 175 message_loop_(message_loop), |
| 175 nestable_task_runner_( | 176 nestable_task_runner_( |
| 176 CreateNestableSingleThreadTaskRunner(message_loop, | 177 CreateNestableSingleThreadTaskRunner(message_loop, |
| 177 mock_task_runner_)), | 178 mock_task_runner_)), |
| 178 scheduler_helper_( | 179 scheduler_helper_( |
| 179 new SchedulerHelper(nestable_task_runner_, | 180 new SchedulerHelper(nestable_task_runner_, |
| 180 "test.idle", | 181 "test.idle", |
| 181 TRACE_DISABLED_BY_DEFAULT("test.idle"), | 182 TRACE_DISABLED_BY_DEFAULT("test.idle"), |
| 182 SchedulerHelper::TASK_QUEUE_COUNT + 1)), | 183 SchedulerHelper::TASK_QUEUE_COUNT + 1)), |
| 183 idle_helper_(new IdleHelperForTest( | 184 idle_helper_(new IdleHelperForTest( |
| 184 scheduler_helper_.get(), | 185 scheduler_helper_.get(), |
| 185 required_quiescence_duration_before_long_idle_period)), | 186 required_quiescence_duration_before_long_idle_period)), |
| 186 default_task_runner_(scheduler_helper_->DefaultTaskRunner()), | 187 default_task_runner_(scheduler_helper_->DefaultTaskRunner()), |
| 187 idle_task_runner_(idle_helper_->IdleTaskRunner()) { | 188 idle_task_runner_(idle_helper_->IdleTaskRunner()) { |
| 189 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
| 188 scheduler_helper_->SetTimeSourceForTesting( | 190 scheduler_helper_->SetTimeSourceForTesting( |
| 189 make_scoped_ptr(new TestTimeSource(clock_))); | 191 make_scoped_ptr(new TestTimeSource(clock_.get()))); |
| 190 scheduler_helper_->GetTaskQueueManagerForTesting()->SetTimeSourceForTesting( | 192 scheduler_helper_->GetTaskQueueManagerForTesting()->SetTimeSourceForTesting( |
| 191 make_scoped_ptr(new TestTimeSource(clock_))); | 193 make_scoped_ptr(new TestTimeSource(clock_.get()))); |
| 192 } | 194 } |
| 193 | 195 |
| 194 ~BaseIdleHelperTest() override {} | 196 ~BaseIdleHelperTest() override {} |
| 195 | 197 |
| 196 void SetUp() override { | 198 void SetUp() override { |
| 197 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); | 199 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); |
| 198 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); | 200 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); |
| 199 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) | 201 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) |
| 200 .Times(AnyNumber()) | 202 .Times(AnyNumber()) |
| 201 .WillRepeatedly(Return(true)); | 203 .WillRepeatedly(Return(true)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 | 264 |
| 263 base::TimeTicks CurrentIdleTaskDeadline() { | 265 base::TimeTicks CurrentIdleTaskDeadline() { |
| 264 return idle_helper_->CurrentIdleTaskDeadline(); | 266 return idle_helper_->CurrentIdleTaskDeadline(); |
| 265 } | 267 } |
| 266 | 268 |
| 267 void CheckIdlePeriodStateIs(const char* expected) { | 269 void CheckIdlePeriodStateIs(const char* expected) { |
| 268 EXPECT_STREQ(expected, IdleHelper::IdlePeriodStateToString( | 270 EXPECT_STREQ(expected, IdleHelper::IdlePeriodStateToString( |
| 269 idle_helper_->SchedulerIdlePeriodState())); | 271 idle_helper_->SchedulerIdlePeriodState())); |
| 270 } | 272 } |
| 271 | 273 |
| 272 scoped_refptr<cc::TestNowSource> clock_; | 274 scoped_ptr<base::SimpleTestTickClock> clock_; |
| 273 // Only one of mock_task_runner_ or message_loop_ will be set. | 275 // Only one of mock_task_runner_ or message_loop_ will be set. |
| 274 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; | 276 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; |
| 275 scoped_ptr<base::MessageLoop> message_loop_; | 277 scoped_ptr<base::MessageLoop> message_loop_; |
| 276 | 278 |
| 277 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_; | 279 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_; |
| 278 scoped_ptr<SchedulerHelper> scheduler_helper_; | 280 scoped_ptr<SchedulerHelper> scheduler_helper_; |
| 279 scoped_ptr<IdleHelperForTest> idle_helper_; | 281 scoped_ptr<IdleHelperForTest> idle_helper_; |
| 280 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; | 282 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; |
| 281 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; | 283 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; |
| 282 | 284 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 293 return scheduler_helper_->GetTaskQueueManagerForTesting(); | 295 return scheduler_helper_->GetTaskQueueManagerForTesting(); |
| 294 } | 296 } |
| 295 | 297 |
| 296 private: | 298 private: |
| 297 DISALLOW_COPY_AND_ASSIGN(IdleHelperTest); | 299 DISALLOW_COPY_AND_ASSIGN(IdleHelperTest); |
| 298 }; | 300 }; |
| 299 | 301 |
| 300 TEST_F(IdleHelperTest, TestPostIdleTask) { | 302 TEST_F(IdleHelperTest, TestPostIdleTask) { |
| 301 int run_count = 0; | 303 int run_count = 0; |
| 302 base::TimeTicks expected_deadline = | 304 base::TimeTicks expected_deadline = |
| 303 clock_->Now() + base::TimeDelta::FromMilliseconds(2300); | 305 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(2300); |
| 304 base::TimeTicks deadline_in_task; | 306 base::TimeTicks deadline_in_task; |
| 305 | 307 |
| 306 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 308 clock_->Advance(base::TimeDelta::FromMilliseconds(100)); |
| 307 idle_task_runner_->PostIdleTask( | 309 idle_task_runner_->PostIdleTask( |
| 308 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 310 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 309 | 311 |
| 310 RunUntilIdle(); | 312 RunUntilIdle(); |
| 311 EXPECT_EQ(0, run_count); | 313 EXPECT_EQ(0, run_count); |
| 312 | 314 |
| 313 idle_helper_->StartIdlePeriod( | 315 idle_helper_->StartIdlePeriod( |
| 314 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 316 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 315 expected_deadline); | 317 expected_deadline); |
| 316 RunUntilIdle(); | 318 RunUntilIdle(); |
| 317 EXPECT_EQ(1, run_count); | 319 EXPECT_EQ(1, run_count); |
| 318 EXPECT_EQ(expected_deadline, deadline_in_task); | 320 EXPECT_EQ(expected_deadline, deadline_in_task); |
| 319 } | 321 } |
| 320 | 322 |
| 321 TEST_F(IdleHelperTest, TestPostIdleTask_EndIdlePeriod) { | 323 TEST_F(IdleHelperTest, TestPostIdleTask_EndIdlePeriod) { |
| 322 int run_count = 0; | 324 int run_count = 0; |
| 323 base::TimeTicks deadline_in_task; | 325 base::TimeTicks deadline_in_task; |
| 324 | 326 |
| 325 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 327 clock_->Advance(base::TimeDelta::FromMilliseconds(100)); |
| 326 idle_task_runner_->PostIdleTask( | 328 idle_task_runner_->PostIdleTask( |
| 327 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 329 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 328 | 330 |
| 329 RunUntilIdle(); | 331 RunUntilIdle(); |
| 330 EXPECT_EQ(0, run_count); | 332 EXPECT_EQ(0, run_count); |
| 331 | 333 |
| 332 idle_helper_->StartIdlePeriod( | 334 idle_helper_->StartIdlePeriod( |
| 333 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 335 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 334 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 336 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 335 idle_helper_->EndIdlePeriod(); | 337 idle_helper_->EndIdlePeriod(); |
| 336 RunUntilIdle(); | 338 RunUntilIdle(); |
| 337 EXPECT_EQ(0, run_count); | 339 EXPECT_EQ(0, run_count); |
| 338 } | 340 } |
| 339 | 341 |
| 340 TEST_F(IdleHelperTest, TestRepostingIdleTask) { | 342 TEST_F(IdleHelperTest, TestRepostingIdleTask) { |
| 341 base::TimeTicks actual_deadline; | 343 base::TimeTicks actual_deadline; |
| 342 int run_count = 0; | 344 int run_count = 0; |
| 343 | 345 |
| 344 max_idle_task_reposts = 2; | 346 max_idle_task_reposts = 2; |
| 345 idle_task_runner_->PostIdleTask( | 347 idle_task_runner_->PostIdleTask( |
| 346 FROM_HERE, base::Bind(&RepostingIdleTestTask, idle_task_runner_, | 348 FROM_HERE, base::Bind(&RepostingIdleTestTask, idle_task_runner_, |
| 347 &run_count, &actual_deadline)); | 349 &run_count, &actual_deadline)); |
| 348 idle_helper_->StartIdlePeriod( | 350 idle_helper_->StartIdlePeriod( |
| 349 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 351 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 350 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 352 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 351 RunUntilIdle(); | 353 RunUntilIdle(); |
| 352 EXPECT_EQ(1, run_count); | 354 EXPECT_EQ(1, run_count); |
| 353 | 355 |
| 354 // Reposted tasks shouldn't run until next idle period. | 356 // Reposted tasks shouldn't run until next idle period. |
| 355 RunUntilIdle(); | 357 RunUntilIdle(); |
| 356 EXPECT_EQ(1, run_count); | 358 EXPECT_EQ(1, run_count); |
| 357 | 359 |
| 358 idle_helper_->StartIdlePeriod( | 360 idle_helper_->StartIdlePeriod( |
| 359 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 361 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 360 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 362 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 361 RunUntilIdle(); | 363 RunUntilIdle(); |
| 362 EXPECT_EQ(2, run_count); | 364 EXPECT_EQ(2, run_count); |
| 363 } | 365 } |
| 364 | 366 |
| 365 TEST_F(IdleHelperTest, TestIdleTaskExceedsDeadline) { | 367 TEST_F(IdleHelperTest, TestIdleTaskExceedsDeadline) { |
| 366 int run_count = 0; | 368 int run_count = 0; |
| 367 | 369 |
| 368 // Post two UpdateClockToDeadlineIdleTestTask tasks. | 370 // Post two UpdateClockToDeadlineIdleTestTask tasks. |
| 369 idle_task_runner_->PostIdleTask( | 371 idle_task_runner_->PostIdleTask( |
| 370 FROM_HERE, | 372 FROM_HERE, |
| 371 base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, &run_count)); | 373 base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_.get(), &run_count)); |
| 372 idle_task_runner_->PostIdleTask( | 374 idle_task_runner_->PostIdleTask( |
| 373 FROM_HERE, | 375 FROM_HERE, |
| 374 base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_, &run_count)); | 376 base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_.get(), &run_count)); |
| 375 | 377 |
| 376 idle_helper_->StartIdlePeriod( | 378 idle_helper_->StartIdlePeriod( |
| 377 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 379 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 378 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 380 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 379 RunUntilIdle(); | 381 RunUntilIdle(); |
| 380 // Only the first idle task should execute since it's used up the deadline. | 382 // Only the first idle task should execute since it's used up the deadline. |
| 381 EXPECT_EQ(1, run_count); | 383 EXPECT_EQ(1, run_count); |
| 382 | 384 |
| 383 idle_helper_->EndIdlePeriod(); | 385 idle_helper_->EndIdlePeriod(); |
| 384 idle_helper_->StartIdlePeriod( | 386 idle_helper_->StartIdlePeriod( |
| 385 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 387 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 386 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 388 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 387 RunUntilIdle(); | 389 RunUntilIdle(); |
| 388 // Second task should be run on the next idle period. | 390 // Second task should be run on the next idle period. |
| 389 EXPECT_EQ(2, run_count); | 391 EXPECT_EQ(2, run_count); |
| 390 } | 392 } |
| 391 | 393 |
| 392 TEST_F(IdleHelperTest, TestPostIdleTaskAfterWakeup) { | 394 TEST_F(IdleHelperTest, TestPostIdleTaskAfterWakeup) { |
| 393 base::TimeTicks deadline_in_task; | 395 base::TimeTicks deadline_in_task; |
| 394 int run_count = 0; | 396 int run_count = 0; |
| 395 | 397 |
| 396 idle_task_runner_->PostIdleTaskAfterWakeup( | 398 idle_task_runner_->PostIdleTaskAfterWakeup( |
| 397 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 399 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 398 | 400 |
| 399 idle_helper_->StartIdlePeriod( | 401 idle_helper_->StartIdlePeriod( |
| 400 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 402 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 401 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 403 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 402 RunUntilIdle(); | 404 RunUntilIdle(); |
| 403 // Shouldn't run yet as no other task woke up the scheduler. | 405 // Shouldn't run yet as no other task woke up the scheduler. |
| 404 EXPECT_EQ(0, run_count); | 406 EXPECT_EQ(0, run_count); |
| 405 | 407 |
| 406 // Must start a new idle period before idle task runs. | 408 // Must start a new idle period before idle task runs. |
| 407 idle_task_runner_->PostIdleTaskAfterWakeup( | 409 idle_task_runner_->PostIdleTaskAfterWakeup( |
| 408 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 410 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 409 | 411 |
| 410 idle_helper_->StartIdlePeriod( | 412 idle_helper_->StartIdlePeriod( |
| 411 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 413 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 412 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 414 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 413 RunUntilIdle(); | 415 RunUntilIdle(); |
| 414 // Another after wakeup idle task shouldn't wake the scheduler. | 416 // Another after wakeup idle task shouldn't wake the scheduler. |
| 415 EXPECT_EQ(0, run_count); | 417 EXPECT_EQ(0, run_count); |
| 416 | 418 |
| 417 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 419 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
| 418 | 420 |
| 419 RunUntilIdle(); | 421 RunUntilIdle(); |
| 420 idle_helper_->StartIdlePeriod( | 422 idle_helper_->StartIdlePeriod( |
| 421 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 423 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 422 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 424 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 423 RunUntilIdle(); | 425 RunUntilIdle(); |
| 424 // Execution of default task queue task should trigger execution of idle task. | 426 // Execution of default task queue task should trigger execution of idle task. |
| 425 EXPECT_EQ(2, run_count); | 427 EXPECT_EQ(2, run_count); |
| 426 } | 428 } |
| 427 | 429 |
| 428 TEST_F(IdleHelperTest, TestPostIdleTaskAfterWakeupWhileAwake) { | 430 TEST_F(IdleHelperTest, TestPostIdleTaskAfterWakeupWhileAwake) { |
| 429 base::TimeTicks deadline_in_task; | 431 base::TimeTicks deadline_in_task; |
| 430 int run_count = 0; | 432 int run_count = 0; |
| 431 | 433 |
| 432 idle_task_runner_->PostIdleTaskAfterWakeup( | 434 idle_task_runner_->PostIdleTaskAfterWakeup( |
| 433 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 435 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 434 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 436 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
| 435 | 437 |
| 436 RunUntilIdle(); | 438 RunUntilIdle(); |
| 437 // Must start a new idle period before idle task runs. | 439 // Must start a new idle period before idle task runs. |
| 438 idle_helper_->StartIdlePeriod( | 440 idle_helper_->StartIdlePeriod( |
| 439 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 441 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 440 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 442 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 441 RunUntilIdle(); | 443 RunUntilIdle(); |
| 442 // Should run as the scheduler was already awakened by the normal task. | 444 // Should run as the scheduler was already awakened by the normal task. |
| 443 EXPECT_EQ(1, run_count); | 445 EXPECT_EQ(1, run_count); |
| 444 } | 446 } |
| 445 | 447 |
| 446 TEST_F(IdleHelperTest, TestPostIdleTaskWakesAfterWakeupIdleTask) { | 448 TEST_F(IdleHelperTest, TestPostIdleTaskWakesAfterWakeupIdleTask) { |
| 447 base::TimeTicks deadline_in_task; | 449 base::TimeTicks deadline_in_task; |
| 448 int run_count = 0; | 450 int run_count = 0; |
| 449 | 451 |
| 450 idle_task_runner_->PostIdleTaskAfterWakeup( | 452 idle_task_runner_->PostIdleTaskAfterWakeup( |
| 451 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 453 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 452 idle_task_runner_->PostIdleTask( | 454 idle_task_runner_->PostIdleTask( |
| 453 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 455 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 454 | 456 |
| 455 idle_helper_->StartIdlePeriod( | 457 idle_helper_->StartIdlePeriod( |
| 456 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 458 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 457 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 459 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 458 RunUntilIdle(); | 460 RunUntilIdle(); |
| 459 // Must start a new idle period before after-wakeup idle task runs. | 461 // Must start a new idle period before after-wakeup idle task runs. |
| 460 idle_helper_->StartIdlePeriod( | 462 idle_helper_->StartIdlePeriod( |
| 461 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 463 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 462 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 464 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 463 RunUntilIdle(); | 465 RunUntilIdle(); |
| 464 // Normal idle task should wake up after-wakeup idle task. | 466 // Normal idle task should wake up after-wakeup idle task. |
| 465 EXPECT_EQ(2, run_count); | 467 EXPECT_EQ(2, run_count); |
| 466 } | 468 } |
| 467 | 469 |
| 468 class IdleHelperTestWithIdlePeriodObserver : public BaseIdleHelperTest { | 470 class IdleHelperTestWithIdlePeriodObserver : public BaseIdleHelperTest { |
| 469 public: | 471 public: |
| 470 IdleHelperTestWithIdlePeriodObserver() | 472 IdleHelperTestWithIdlePeriodObserver() |
| 471 : BaseIdleHelperTest(nullptr, base::TimeDelta()) {} | 473 : BaseIdleHelperTest(nullptr, base::TimeDelta()) {} |
| 472 | 474 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 491 } | 493 } |
| 492 | 494 |
| 493 private: | 495 private: |
| 494 DISALLOW_COPY_AND_ASSIGN(IdleHelperTestWithIdlePeriodObserver); | 496 DISALLOW_COPY_AND_ASSIGN(IdleHelperTestWithIdlePeriodObserver); |
| 495 }; | 497 }; |
| 496 | 498 |
| 497 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestEnterButNotExitIdlePeriod) { | 499 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestEnterButNotExitIdlePeriod) { |
| 498 ExpectIdlePeriodStartsButNeverEnds(); | 500 ExpectIdlePeriodStartsButNeverEnds(); |
| 499 | 501 |
| 500 idle_helper_->StartIdlePeriod( | 502 idle_helper_->StartIdlePeriod( |
| 501 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 503 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 502 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 504 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 503 } | 505 } |
| 504 | 506 |
| 505 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestEnterAndExitIdlePeriod) { | 507 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestEnterAndExitIdlePeriod) { |
| 506 BaseIdleHelperTest* fixture = this; | 508 BaseIdleHelperTest* fixture = this; |
| 507 ON_CALL(*idle_helper_, OnIdlePeriodStarted()) | 509 ON_CALL(*idle_helper_, OnIdlePeriodStarted()) |
| 508 .WillByDefault( | 510 .WillByDefault( |
| 509 Invoke([fixture]() { EXPECT_TRUE(fixture->IsInIdlePeriod()); })); | 511 Invoke([fixture]() { EXPECT_TRUE(fixture->IsInIdlePeriod()); })); |
| 510 ON_CALL(*idle_helper_, OnIdlePeriodEnded()) | 512 ON_CALL(*idle_helper_, OnIdlePeriodEnded()) |
| 511 .WillByDefault( | 513 .WillByDefault( |
| 512 Invoke([fixture]() { EXPECT_FALSE(fixture->IsInIdlePeriod()); })); | 514 Invoke([fixture]() { EXPECT_FALSE(fixture->IsInIdlePeriod()); })); |
| 513 | 515 |
| 514 ExpectIdlePeriodStartsAndEnds(Exactly(1)); | 516 ExpectIdlePeriodStartsAndEnds(Exactly(1)); |
| 515 | 517 |
| 516 idle_helper_->StartIdlePeriod( | 518 idle_helper_->StartIdlePeriod( |
| 517 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 519 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 518 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 520 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 519 idle_helper_->EndIdlePeriod(); | 521 idle_helper_->EndIdlePeriod(); |
| 520 } | 522 } |
| 521 | 523 |
| 522 class IdleHelperWithMessageLoopTest : public BaseIdleHelperTest { | 524 class IdleHelperWithMessageLoopTest : public BaseIdleHelperTest { |
| 523 public: | 525 public: |
| 524 IdleHelperWithMessageLoopTest() | 526 IdleHelperWithMessageLoopTest() |
| 525 : BaseIdleHelperTest(new base::MessageLoop(), base::TimeDelta()) {} | 527 : BaseIdleHelperTest(new base::MessageLoop(), base::TimeDelta()) {} |
| 526 ~IdleHelperWithMessageLoopTest() override {} | 528 ~IdleHelperWithMessageLoopTest() override {} |
| 527 | 529 |
| 528 void PostFromNestedRunloop(std::vector< | 530 void PostFromNestedRunloop(std::vector< |
| 529 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) { | 531 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) { |
| 530 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get()); | 532 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get()); |
| 531 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) { | 533 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) { |
| 532 if (pair.second) { | 534 if (pair.second) { |
| 533 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first); | 535 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first); |
| 534 } else { | 536 } else { |
| 535 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first); | 537 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first); |
| 536 } | 538 } |
| 537 } | 539 } |
| 538 idle_helper_->StartIdlePeriod( | 540 idle_helper_->StartIdlePeriod( |
| 539 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 541 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 540 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 542 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 541 message_loop_->RunUntilIdle(); | 543 message_loop_->RunUntilIdle(); |
| 542 } | 544 } |
| 543 | 545 |
| 544 void SetUp() override { | 546 void SetUp() override { |
| 545 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); | 547 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); |
| 546 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); | 548 EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber()); |
| 547 } | 549 } |
| 548 | 550 |
| 549 private: | 551 private: |
| 550 DISALLOW_COPY_AND_ASSIGN(IdleHelperWithMessageLoopTest); | 552 DISALLOW_COPY_AND_ASSIGN(IdleHelperWithMessageLoopTest); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 570 tasks_to_post_from_nested_loop.push_back(std::make_pair( | 572 tasks_to_post_from_nested_loop.push_back(std::make_pair( |
| 571 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true)); | 573 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true)); |
| 572 | 574 |
| 573 default_task_runner_->PostTask( | 575 default_task_runner_->PostTask( |
| 574 FROM_HERE, | 576 FROM_HERE, |
| 575 base::Bind(&IdleHelperWithMessageLoopTest::PostFromNestedRunloop, | 577 base::Bind(&IdleHelperWithMessageLoopTest::PostFromNestedRunloop, |
| 576 base::Unretained(this), | 578 base::Unretained(this), |
| 577 base::Unretained(&tasks_to_post_from_nested_loop))); | 579 base::Unretained(&tasks_to_post_from_nested_loop))); |
| 578 | 580 |
| 579 idle_helper_->StartIdlePeriod( | 581 idle_helper_->StartIdlePeriod( |
| 580 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 582 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 581 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 583 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 582 RunUntilIdle(); | 584 RunUntilIdle(); |
| 583 // Note we expect task 3 to run last because it's non-nestable. | 585 // Note we expect task 3 to run last because it's non-nestable. |
| 584 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), | 586 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), |
| 585 std::string("4"), std::string("5"), | 587 std::string("4"), std::string("5"), |
| 586 std::string("3"))); | 588 std::string("3"))); |
| 587 } | 589 } |
| 588 | 590 |
| 589 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestLongIdlePeriod) { | 591 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestLongIdlePeriod) { |
| 590 base::TimeTicks expected_deadline = | 592 base::TimeTicks expected_deadline = |
| 591 clock_->Now() + maximum_idle_period_duration(); | 593 clock_->NowTicks() + maximum_idle_period_duration(); |
| 592 base::TimeTicks deadline_in_task; | 594 base::TimeTicks deadline_in_task; |
| 593 int run_count = 0; | 595 int run_count = 0; |
| 594 | 596 |
| 595 idle_task_runner_->PostIdleTask( | 597 idle_task_runner_->PostIdleTask( |
| 596 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 598 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 597 | 599 |
| 598 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) | 600 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) |
| 599 .Times(1) | 601 .Times(1) |
| 600 .WillRepeatedly(Return(true)); | 602 .WillRepeatedly(Return(true)); |
| 601 ExpectIdlePeriodStartsButNeverEnds(); | 603 ExpectIdlePeriodStartsButNeverEnds(); |
| 602 | 604 |
| 603 RunUntilIdle(); | 605 RunUntilIdle(); |
| 604 EXPECT_EQ(0, run_count); // Shouldn't run yet as no idle period. | 606 EXPECT_EQ(0, run_count); // Shouldn't run yet as no idle period. |
| 605 | 607 |
| 606 idle_helper_->EnableLongIdlePeriod(); | 608 idle_helper_->EnableLongIdlePeriod(); |
| 607 RunUntilIdle(); | 609 RunUntilIdle(); |
| 608 EXPECT_EQ(1, run_count); // Should have run in a long idle time. | 610 EXPECT_EQ(1, run_count); // Should have run in a long idle time. |
| 609 EXPECT_EQ(expected_deadline, deadline_in_task); | 611 EXPECT_EQ(expected_deadline, deadline_in_task); |
| 610 } | 612 } |
| 611 | 613 |
| 612 TEST_F(IdleHelperTest, TestLongIdlePeriodWithPendingDelayedTask) { | 614 TEST_F(IdleHelperTest, TestLongIdlePeriodWithPendingDelayedTask) { |
| 613 base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(30); | 615 base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(30); |
| 614 base::TimeTicks expected_deadline = clock_->Now() + pending_task_delay; | 616 base::TimeTicks expected_deadline = clock_->NowTicks() + pending_task_delay; |
| 615 base::TimeTicks deadline_in_task; | 617 base::TimeTicks deadline_in_task; |
| 616 int run_count = 0; | 618 int run_count = 0; |
| 617 | 619 |
| 618 idle_task_runner_->PostIdleTask( | 620 idle_task_runner_->PostIdleTask( |
| 619 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 621 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 620 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 622 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 621 pending_task_delay); | 623 pending_task_delay); |
| 622 | 624 |
| 623 idle_helper_->EnableLongIdlePeriod(); | 625 idle_helper_->EnableLongIdlePeriod(); |
| 624 RunUntilIdle(); | 626 RunUntilIdle(); |
| 625 EXPECT_EQ(1, run_count); // Should have run in a long idle time. | 627 EXPECT_EQ(1, run_count); // Should have run in a long idle time. |
| 626 EXPECT_EQ(expected_deadline, deadline_in_task); | 628 EXPECT_EQ(expected_deadline, deadline_in_task); |
| 627 } | 629 } |
| 628 | 630 |
| 629 TEST_F(IdleHelperTest, TestLongIdlePeriodWithLatePendingDelayedTask) { | 631 TEST_F(IdleHelperTest, TestLongIdlePeriodWithLatePendingDelayedTask) { |
| 630 base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(10); | 632 base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(10); |
| 631 base::TimeTicks deadline_in_task; | 633 base::TimeTicks deadline_in_task; |
| 632 int run_count = 0; | 634 int run_count = 0; |
| 633 | 635 |
| 634 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 636 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 635 pending_task_delay); | 637 pending_task_delay); |
| 636 | 638 |
| 637 // Advance clock until after delayed task was meant to be run. | 639 // Advance clock until after delayed task was meant to be run. |
| 638 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(20)); | 640 clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 639 | 641 |
| 640 // Post an idle task and then EnableLongIdlePeriod. Since there is a late | 642 // Post an idle task and then EnableLongIdlePeriod. Since there is a late |
| 641 // pending delayed task this shouldn't actually start an idle period. | 643 // pending delayed task this shouldn't actually start an idle period. |
| 642 idle_task_runner_->PostIdleTask( | 644 idle_task_runner_->PostIdleTask( |
| 643 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 645 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 644 idle_helper_->EnableLongIdlePeriod(); | 646 idle_helper_->EnableLongIdlePeriod(); |
| 645 RunUntilIdle(); | 647 RunUntilIdle(); |
| 646 EXPECT_EQ(0, run_count); | 648 EXPECT_EQ(0, run_count); |
| 647 | 649 |
| 648 // After the delayed task has been run we should trigger an idle period. | 650 // After the delayed task has been run we should trigger an idle period. |
| 649 clock_->AdvanceNow(maximum_idle_period_duration()); | 651 clock_->Advance(maximum_idle_period_duration()); |
| 650 RunUntilIdle(); | 652 RunUntilIdle(); |
| 651 EXPECT_EQ(1, run_count); | 653 EXPECT_EQ(1, run_count); |
| 652 } | 654 } |
| 653 | 655 |
| 654 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestLongIdlePeriodRepeating) { | 656 TEST_F(IdleHelperTestWithIdlePeriodObserver, TestLongIdlePeriodRepeating) { |
| 655 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 657 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 656 std::vector<base::TimeTicks> actual_deadlines; | 658 std::vector<base::TimeTicks> actual_deadlines; |
| 657 int run_count = 0; | 659 int run_count = 0; |
| 658 | 660 |
| 659 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) | 661 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) |
| 660 .Times(4) | 662 .Times(4) |
| 661 .WillRepeatedly(Return(true)); | 663 .WillRepeatedly(Return(true)); |
| 662 ExpectIdlePeriodStartsAndEnds(AtLeast(2)); | 664 ExpectIdlePeriodStartsAndEnds(AtLeast(2)); |
| 663 | 665 |
| 664 max_idle_task_reposts = 3; | 666 max_idle_task_reposts = 3; |
| 665 base::TimeTicks clock_before(clock_->Now()); | 667 base::TimeTicks clock_before(clock_->NowTicks()); |
| 666 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); | 668 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); |
| 667 idle_task_runner_->PostIdleTask( | 669 idle_task_runner_->PostIdleTask( |
| 668 FROM_HERE, | 670 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, |
| 669 base::Bind(&RepostingUpdateClockIdleTestTask, idle_task_runner_, | 671 idle_task_runner_, &run_count, clock_.get(), |
| 670 &run_count, clock_, idle_task_runtime, &actual_deadlines)); | 672 idle_task_runtime, &actual_deadlines)); |
| 671 | 673 |
| 672 // Check each idle task runs in their own idle period. | 674 // Check each idle task runs in their own idle period. |
| 673 idle_helper_->EnableLongIdlePeriod(); | 675 idle_helper_->EnableLongIdlePeriod(); |
| 674 RunUntilIdle(); | 676 RunUntilIdle(); |
| 675 EXPECT_EQ(3, run_count); | 677 EXPECT_EQ(3, run_count); |
| 676 EXPECT_THAT( | 678 EXPECT_THAT( |
| 677 actual_deadlines, | 679 actual_deadlines, |
| 678 testing::ElementsAre( | 680 testing::ElementsAre( |
| 679 clock_before + maximum_idle_period_duration(), | 681 clock_before + maximum_idle_period_duration(), |
| 680 clock_before + idle_task_runtime + maximum_idle_period_duration(), | 682 clock_before + idle_task_runtime + maximum_idle_period_duration(), |
| 681 clock_before + (2 * idle_task_runtime) + | 683 clock_before + (2 * idle_task_runtime) + |
| 682 maximum_idle_period_duration())); | 684 maximum_idle_period_duration())); |
| 683 | 685 |
| 684 max_idle_task_reposts = 5; | 686 max_idle_task_reposts = 5; |
| 685 idle_task_runner_->PostIdleTask( | 687 idle_task_runner_->PostIdleTask( |
| 686 FROM_HERE, | 688 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, |
| 687 base::Bind(&RepostingUpdateClockIdleTestTask, idle_task_runner_, | 689 idle_task_runner_, &run_count, clock_.get(), |
| 688 &run_count, clock_, idle_task_runtime, &actual_deadlines)); | 690 idle_task_runtime, &actual_deadlines)); |
| 689 idle_task_runner_->PostIdleTask( | 691 idle_task_runner_->PostIdleTask( |
| 690 FROM_HERE, | 692 FROM_HERE, |
| 691 base::Bind(&EndIdlePeriodIdleTask, base::Unretained(idle_helper_.get()))); | 693 base::Bind(&EndIdlePeriodIdleTask, base::Unretained(idle_helper_.get()))); |
| 692 | 694 |
| 693 // Ensure that reposting tasks stop after EndIdlePeriod is called. | 695 // Ensure that reposting tasks stop after EndIdlePeriod is called. |
| 694 RunUntilIdle(); | 696 RunUntilIdle(); |
| 695 EXPECT_EQ(4, run_count); | 697 EXPECT_EQ(4, run_count); |
| 696 } | 698 } |
| 697 | 699 |
| 698 TEST_F(IdleHelperTest, TestLongIdlePeriodDoesNotWakeScheduler) { | 700 TEST_F(IdleHelperTest, TestLongIdlePeriodDoesNotWakeScheduler) { |
| 699 base::TimeTicks deadline_in_task; | 701 base::TimeTicks deadline_in_task; |
| 700 int run_count = 0; | 702 int run_count = 0; |
| 701 | 703 |
| 702 // Start a long idle period and get the time it should end. | 704 // Start a long idle period and get the time it should end. |
| 703 idle_helper_->EnableLongIdlePeriod(); | 705 idle_helper_->EnableLongIdlePeriod(); |
| 704 // The scheduler should not run the enable_next_long_idle_period task if | 706 // The scheduler should not run the enable_next_long_idle_period task if |
| 705 // there are no idle tasks and no other task woke up the scheduler, thus | 707 // there are no idle tasks and no other task woke up the scheduler, thus |
| 706 // the idle period deadline shouldn't update at the end of the current long | 708 // the idle period deadline shouldn't update at the end of the current long |
| 707 // idle period. | 709 // idle period. |
| 708 base::TimeTicks idle_period_deadline = CurrentIdleTaskDeadline(); | 710 base::TimeTicks idle_period_deadline = CurrentIdleTaskDeadline(); |
| 709 clock_->AdvanceNow(maximum_idle_period_duration()); | 711 clock_->Advance(maximum_idle_period_duration()); |
| 710 RunUntilIdle(); | 712 RunUntilIdle(); |
| 711 | 713 |
| 712 base::TimeTicks new_idle_period_deadline = CurrentIdleTaskDeadline(); | 714 base::TimeTicks new_idle_period_deadline = CurrentIdleTaskDeadline(); |
| 713 EXPECT_EQ(idle_period_deadline, new_idle_period_deadline); | 715 EXPECT_EQ(idle_period_deadline, new_idle_period_deadline); |
| 714 | 716 |
| 715 // Posting a after-wakeup idle task also shouldn't wake the scheduler or | 717 // Posting a after-wakeup idle task also shouldn't wake the scheduler or |
| 716 // initiate the next long idle period. | 718 // initiate the next long idle period. |
| 717 idle_task_runner_->PostIdleTaskAfterWakeup( | 719 idle_task_runner_->PostIdleTaskAfterWakeup( |
| 718 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 720 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 719 RunUntilIdle(); | 721 RunUntilIdle(); |
| 720 new_idle_period_deadline = CurrentIdleTaskDeadline(); | 722 new_idle_period_deadline = CurrentIdleTaskDeadline(); |
| 721 EXPECT_EQ(idle_period_deadline, new_idle_period_deadline); | 723 EXPECT_EQ(idle_period_deadline, new_idle_period_deadline); |
| 722 EXPECT_EQ(0, run_count); | 724 EXPECT_EQ(0, run_count); |
| 723 | 725 |
| 724 // Running a normal task should initiate a new long idle period though. | 726 // Running a normal task should initiate a new long idle period though. |
| 725 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 727 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
| 726 RunUntilIdle(); | 728 RunUntilIdle(); |
| 727 new_idle_period_deadline = CurrentIdleTaskDeadline(); | 729 new_idle_period_deadline = CurrentIdleTaskDeadline(); |
| 728 EXPECT_EQ(idle_period_deadline + maximum_idle_period_duration(), | 730 EXPECT_EQ(idle_period_deadline + maximum_idle_period_duration(), |
| 729 new_idle_period_deadline); | 731 new_idle_period_deadline); |
| 730 | 732 |
| 731 EXPECT_EQ(1, run_count); | 733 EXPECT_EQ(1, run_count); |
| 732 } | 734 } |
| 733 | 735 |
| 734 TEST_F(IdleHelperTestWithIdlePeriodObserver, | 736 TEST_F(IdleHelperTestWithIdlePeriodObserver, |
| 735 TestLongIdlePeriodWhenNotCanEnterLongIdlePeriod) { | 737 TestLongIdlePeriodWhenNotCanEnterLongIdlePeriod) { |
| 736 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000); | 738 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000); |
| 737 base::TimeDelta halfDelay = base::TimeDelta::FromMilliseconds(500); | 739 base::TimeDelta halfDelay = base::TimeDelta::FromMilliseconds(500); |
| 738 base::TimeTicks delayOver = clock_->Now() + delay; | 740 base::TimeTicks delayOver = clock_->NowTicks() + delay; |
| 739 base::TimeTicks deadline_in_task; | 741 base::TimeTicks deadline_in_task; |
| 740 int run_count = 0; | 742 int run_count = 0; |
| 741 | 743 |
| 742 ON_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) | 744 ON_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)) |
| 743 .WillByDefault(Invoke( | 745 .WillByDefault(Invoke( |
| 744 [delay, delayOver](base::TimeTicks now, | 746 [delay, delayOver](base::TimeTicks now, |
| 745 base::TimeDelta* next_long_idle_period_delay_out) { | 747 base::TimeDelta* next_long_idle_period_delay_out) { |
| 746 if (now >= delayOver) | 748 if (now >= delayOver) |
| 747 return true; | 749 return true; |
| 748 *next_long_idle_period_delay_out = delay; | 750 *next_long_idle_period_delay_out = delay; |
| 749 return false; | 751 return false; |
| 750 })); | 752 })); |
| 751 | 753 |
| 752 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)).Times(2); | 754 EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)).Times(2); |
| 753 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); | 755 EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber()); |
| 754 | 756 |
| 755 idle_task_runner_->PostIdleTask( | 757 idle_task_runner_->PostIdleTask( |
| 756 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 758 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 757 | 759 |
| 758 // Make sure Idle tasks don't run until the delay has occurred. | 760 // Make sure Idle tasks don't run until the delay has occurred. |
| 759 idle_helper_->EnableLongIdlePeriod(); | 761 idle_helper_->EnableLongIdlePeriod(); |
| 760 RunUntilIdle(); | 762 RunUntilIdle(); |
| 761 EXPECT_EQ(0, run_count); | 763 EXPECT_EQ(0, run_count); |
| 762 | 764 |
| 763 clock_->AdvanceNow(halfDelay); | 765 clock_->Advance(halfDelay); |
| 764 RunUntilIdle(); | 766 RunUntilIdle(); |
| 765 EXPECT_EQ(0, run_count); | 767 EXPECT_EQ(0, run_count); |
| 766 | 768 |
| 767 // Delay is finished, idle task should run. | 769 // Delay is finished, idle task should run. |
| 768 clock_->AdvanceNow(halfDelay); | 770 clock_->Advance(halfDelay); |
| 769 RunUntilIdle(); | 771 RunUntilIdle(); |
| 770 EXPECT_EQ(1, run_count); | 772 EXPECT_EQ(1, run_count); |
| 771 } | 773 } |
| 772 | 774 |
| 773 TEST_F(IdleHelperTest, TestLongIdlePeriodImmediatelyRestartsIfMaxDeadline) { | 775 TEST_F(IdleHelperTest, TestLongIdlePeriodImmediatelyRestartsIfMaxDeadline) { |
| 774 std::vector<base::TimeTicks> actual_deadlines; | 776 std::vector<base::TimeTicks> actual_deadlines; |
| 775 int run_count = 0; | 777 int run_count = 0; |
| 776 | 778 |
| 777 base::TimeTicks clock_before(clock_->Now()); | 779 base::TimeTicks clock_before(clock_->NowTicks()); |
| 778 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); | 780 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); |
| 779 | 781 |
| 780 // The second idle period should happen immediately after the first the | 782 // The second idle period should happen immediately after the first the |
| 781 // they have max deadlines. | 783 // they have max deadlines. |
| 782 max_idle_task_reposts = 2; | 784 max_idle_task_reposts = 2; |
| 783 idle_task_runner_->PostIdleTask( | 785 idle_task_runner_->PostIdleTask( |
| 784 FROM_HERE, | 786 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, |
| 785 base::Bind(&RepostingUpdateClockIdleTestTask, idle_task_runner_, | 787 idle_task_runner_, &run_count, clock_.get(), |
| 786 &run_count, clock_, idle_task_runtime, &actual_deadlines)); | 788 idle_task_runtime, &actual_deadlines)); |
| 787 | 789 |
| 788 idle_helper_->EnableLongIdlePeriod(); | 790 idle_helper_->EnableLongIdlePeriod(); |
| 789 RunUntilIdle(); | 791 RunUntilIdle(); |
| 790 EXPECT_EQ(2, run_count); | 792 EXPECT_EQ(2, run_count); |
| 791 EXPECT_THAT( | 793 EXPECT_THAT( |
| 792 actual_deadlines, | 794 actual_deadlines, |
| 793 testing::ElementsAre( | 795 testing::ElementsAre( |
| 794 clock_before + maximum_idle_period_duration(), | 796 clock_before + maximum_idle_period_duration(), |
| 795 clock_before + idle_task_runtime + maximum_idle_period_duration())); | 797 clock_before + idle_task_runtime + maximum_idle_period_duration())); |
| 796 } | 798 } |
| 797 | 799 |
| 798 TEST_F(IdleHelperTest, TestLongIdlePeriodRestartWaitsIfNotMaxDeadline) { | 800 TEST_F(IdleHelperTest, TestLongIdlePeriodRestartWaitsIfNotMaxDeadline) { |
| 799 base::TimeTicks actual_deadline; | 801 base::TimeTicks actual_deadline; |
| 800 int run_count = 0; | 802 int run_count = 0; |
| 801 | 803 |
| 802 base::TimeDelta pending_task_delay(base::TimeDelta::FromMilliseconds(20)); | 804 base::TimeDelta pending_task_delay(base::TimeDelta::FromMilliseconds(20)); |
| 803 base::TimeDelta idle_task_duration(base::TimeDelta::FromMilliseconds(10)); | 805 base::TimeDelta idle_task_duration(base::TimeDelta::FromMilliseconds(10)); |
| 804 base::TimeTicks expected_deadline(clock_->Now() + pending_task_delay + | 806 base::TimeTicks expected_deadline(clock_->NowTicks() + pending_task_delay + |
| 805 maximum_idle_period_duration() + | 807 maximum_idle_period_duration() + |
| 806 retry_enable_long_idle_period_delay()); | 808 retry_enable_long_idle_period_delay()); |
| 807 | 809 |
| 808 // Post delayed task to ensure idle period doesn't have a max deadline. | 810 // Post delayed task to ensure idle period doesn't have a max deadline. |
| 809 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 811 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 810 pending_task_delay); | 812 pending_task_delay); |
| 811 | 813 |
| 812 max_idle_task_reposts = 2; | 814 max_idle_task_reposts = 2; |
| 813 idle_task_runner_->PostIdleTask( | 815 idle_task_runner_->PostIdleTask( |
| 814 FROM_HERE, base::Bind(&RepostingIdleTestTask, idle_task_runner_, | 816 FROM_HERE, base::Bind(&RepostingIdleTestTask, idle_task_runner_, |
| 815 &run_count, &actual_deadline)); | 817 &run_count, &actual_deadline)); |
| 816 idle_helper_->EnableLongIdlePeriod(); | 818 idle_helper_->EnableLongIdlePeriod(); |
| 817 RunUntilIdle(); | 819 RunUntilIdle(); |
| 818 EXPECT_EQ(1, run_count); | 820 EXPECT_EQ(1, run_count); |
| 819 clock_->AdvanceNow(idle_task_duration); | 821 clock_->Advance(idle_task_duration); |
| 820 | 822 |
| 821 // Next idle period shouldn't happen until the pending task has been run. | 823 // Next idle period shouldn't happen until the pending task has been run. |
| 822 RunUntilIdle(); | 824 RunUntilIdle(); |
| 823 EXPECT_EQ(1, run_count); | 825 EXPECT_EQ(1, run_count); |
| 824 | 826 |
| 825 // Once the pending task is run the new idle period should start. | 827 // Once the pending task is run the new idle period should start. |
| 826 clock_->AdvanceNow(pending_task_delay - idle_task_duration); | 828 clock_->Advance(pending_task_delay - idle_task_duration); |
| 827 RunUntilIdle(); | 829 RunUntilIdle(); |
| 828 // Since the idle period tried to start before the pending task ran we have to | 830 // Since the idle period tried to start before the pending task ran we have to |
| 829 // wait for the idle helper to retry starting the long idle period. | 831 // wait for the idle helper to retry starting the long idle period. |
| 830 clock_->AdvanceNow(retry_enable_long_idle_period_delay()); | 832 clock_->Advance(retry_enable_long_idle_period_delay()); |
| 831 RunUntilIdle(); | 833 RunUntilIdle(); |
| 832 | 834 |
| 833 EXPECT_EQ(2, run_count); | 835 EXPECT_EQ(2, run_count); |
| 834 EXPECT_EQ(expected_deadline, actual_deadline); | 836 EXPECT_EQ(expected_deadline, actual_deadline); |
| 835 } | 837 } |
| 836 | 838 |
| 837 TEST_F(IdleHelperTest, TestLongIdlePeriodPaused) { | 839 TEST_F(IdleHelperTest, TestLongIdlePeriodPaused) { |
| 838 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 840 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 839 std::vector<base::TimeTicks> actual_deadlines; | 841 std::vector<base::TimeTicks> actual_deadlines; |
| 840 int run_count = 0; | 842 int run_count = 0; |
| 841 | 843 |
| 842 // If there are no idle tasks posted we should start in the paused state. | 844 // If there are no idle tasks posted we should start in the paused state. |
| 843 idle_helper_->EnableLongIdlePeriod(); | 845 idle_helper_->EnableLongIdlePeriod(); |
| 844 CheckIdlePeriodStateIs("in_long_idle_period_paused"); | 846 CheckIdlePeriodStateIs("in_long_idle_period_paused"); |
| 845 // There shouldn't be any delayed tasks posted by the idle helper when paused. | 847 // There shouldn't be any delayed tasks posted by the idle helper when paused. |
| 846 EXPECT_EQ(base::TimeTicks(), | 848 EXPECT_EQ(base::TimeTicks(), |
| 847 scheduler_helper_->NextPendingDelayedTaskRunTime()); | 849 scheduler_helper_->NextPendingDelayedTaskRunTime()); |
| 848 | 850 |
| 849 // Posting a task should transition us to the an active state. | 851 // Posting a task should transition us to the an active state. |
| 850 max_idle_task_reposts = 2; | 852 max_idle_task_reposts = 2; |
| 851 base::TimeTicks clock_before(clock_->Now()); | 853 base::TimeTicks clock_before(clock_->NowTicks()); |
| 852 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); | 854 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); |
| 853 idle_task_runner_->PostIdleTask( | 855 idle_task_runner_->PostIdleTask( |
| 854 FROM_HERE, | 856 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, |
| 855 base::Bind(&RepostingUpdateClockIdleTestTask, idle_task_runner_, | 857 idle_task_runner_, &run_count, clock_.get(), |
| 856 &run_count, clock_, idle_task_runtime, &actual_deadlines)); | 858 idle_task_runtime, &actual_deadlines)); |
| 857 RunUntilIdle(); | 859 RunUntilIdle(); |
| 858 EXPECT_EQ(2, run_count); | 860 EXPECT_EQ(2, run_count); |
| 859 EXPECT_THAT( | 861 EXPECT_THAT( |
| 860 actual_deadlines, | 862 actual_deadlines, |
| 861 testing::ElementsAre( | 863 testing::ElementsAre( |
| 862 clock_before + maximum_idle_period_duration(), | 864 clock_before + maximum_idle_period_duration(), |
| 863 clock_before + idle_task_runtime + maximum_idle_period_duration())); | 865 clock_before + idle_task_runtime + maximum_idle_period_duration())); |
| 864 | 866 |
| 865 // Once all task have been run we should go back to the paused state. | 867 // Once all task have been run we should go back to the paused state. |
| 866 CheckIdlePeriodStateIs("in_long_idle_period_paused"); | 868 CheckIdlePeriodStateIs("in_long_idle_period_paused"); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 | 903 |
| 902 // Should return false if not in an idle period. | 904 // Should return false if not in an idle period. |
| 903 EXPECT_FALSE(idle_helper_->CanExceedIdleDeadlineIfRequired()); | 905 EXPECT_FALSE(idle_helper_->CanExceedIdleDeadlineIfRequired()); |
| 904 | 906 |
| 905 // Should return false for short idle periods. | 907 // Should return false for short idle periods. |
| 906 idle_task_runner_->PostIdleTask( | 908 idle_task_runner_->PostIdleTask( |
| 907 FROM_HERE, | 909 FROM_HERE, |
| 908 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(), | 910 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(), |
| 909 &can_exceed_idle_deadline, &run_count)); | 911 &can_exceed_idle_deadline, &run_count)); |
| 910 idle_helper_->StartIdlePeriod( | 912 idle_helper_->StartIdlePeriod( |
| 911 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 913 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 912 clock_->Now() + base::TimeDelta::FromMilliseconds(10)); | 914 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10)); |
| 913 RunUntilIdle(); | 915 RunUntilIdle(); |
| 914 EXPECT_EQ(1, run_count); | 916 EXPECT_EQ(1, run_count); |
| 915 EXPECT_FALSE(can_exceed_idle_deadline); | 917 EXPECT_FALSE(can_exceed_idle_deadline); |
| 916 | 918 |
| 917 // Should return false for a long idle period which is shortened due to a | 919 // Should return false for a long idle period which is shortened due to a |
| 918 // pending delayed task. | 920 // pending delayed task. |
| 919 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 921 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 920 base::TimeDelta::FromMilliseconds(10)); | 922 base::TimeDelta::FromMilliseconds(10)); |
| 921 idle_task_runner_->PostIdleTask( | 923 idle_task_runner_->PostIdleTask( |
| 922 FROM_HERE, | 924 FROM_HERE, |
| 923 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(), | 925 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(), |
| 924 &can_exceed_idle_deadline, &run_count)); | 926 &can_exceed_idle_deadline, &run_count)); |
| 925 idle_helper_->EnableLongIdlePeriod(); | 927 idle_helper_->EnableLongIdlePeriod(); |
| 926 RunUntilIdle(); | 928 RunUntilIdle(); |
| 927 EXPECT_EQ(2, run_count); | 929 EXPECT_EQ(2, run_count); |
| 928 EXPECT_FALSE(can_exceed_idle_deadline); | 930 EXPECT_FALSE(can_exceed_idle_deadline); |
| 929 | 931 |
| 930 // Next long idle period will be for the maximum time, so | 932 // Next long idle period will be for the maximum time, so |
| 931 // CanExceedIdleDeadlineIfRequired should return true. | 933 // CanExceedIdleDeadlineIfRequired should return true. |
| 932 clock_->AdvanceNow(maximum_idle_period_duration()); | 934 clock_->Advance(maximum_idle_period_duration()); |
| 933 idle_task_runner_->PostIdleTask( | 935 idle_task_runner_->PostIdleTask( |
| 934 FROM_HERE, | 936 FROM_HERE, |
| 935 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(), | 937 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(), |
| 936 &can_exceed_idle_deadline, &run_count)); | 938 &can_exceed_idle_deadline, &run_count)); |
| 937 RunUntilIdle(); | 939 RunUntilIdle(); |
| 938 EXPECT_EQ(3, run_count); | 940 EXPECT_EQ(3, run_count); |
| 939 EXPECT_TRUE(can_exceed_idle_deadline); | 941 EXPECT_TRUE(can_exceed_idle_deadline); |
| 940 } | 942 } |
| 941 | 943 |
| 942 class IdleHelperWithQuiescencePeriodTest : public BaseIdleHelperTest { | 944 class IdleHelperWithQuiescencePeriodTest : public BaseIdleHelperTest { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1037 // Run a repeating task so we're deemed to be busy for the next 400ms. | 1039 // Run a repeating task so we're deemed to be busy for the next 400ms. |
| 1038 default_task_runner_->PostTask( | 1040 default_task_runner_->PostTask( |
| 1039 FROM_HERE, | 1041 FROM_HERE, |
| 1040 base::Bind(&RepeatingTask, base::Unretained(default_task_runner_.get()), | 1042 base::Bind(&RepeatingTask, base::Unretained(default_task_runner_.get()), |
| 1041 10, base::TimeDelta::FromMilliseconds(40))); | 1043 10, base::TimeDelta::FromMilliseconds(40))); |
| 1042 | 1044 |
| 1043 int run_count = 0; | 1045 int run_count = 0; |
| 1044 // In this scenario EnableLongIdlePeriod deems us not to be quiescent 5x in | 1046 // In this scenario EnableLongIdlePeriod deems us not to be quiescent 5x in |
| 1045 // a row. | 1047 // a row. |
| 1046 base::TimeTicks expected_deadline = | 1048 base::TimeTicks expected_deadline = |
| 1047 clock_->Now() + base::TimeDelta::FromMilliseconds(5 * kQuiescenceDelayMs + | 1049 clock_->NowTicks() + base::TimeDelta::FromMilliseconds( |
| 1048 kLongIdlePeriodMs); | 1050 5 * kQuiescenceDelayMs + kLongIdlePeriodMs); |
| 1049 base::TimeTicks deadline_in_task; | 1051 base::TimeTicks deadline_in_task; |
| 1050 idle_task_runner_->PostIdleTask( | 1052 idle_task_runner_->PostIdleTask( |
| 1051 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 1053 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 1052 | 1054 |
| 1053 idle_helper_->EnableLongIdlePeriod(); | 1055 idle_helper_->EnableLongIdlePeriod(); |
| 1054 RunUntilIdle(); | 1056 RunUntilIdle(); |
| 1055 EXPECT_EQ(1, run_count); | 1057 EXPECT_EQ(1, run_count); |
| 1056 EXPECT_EQ(expected_deadline, deadline_in_task); | 1058 EXPECT_EQ(expected_deadline, deadline_in_task); |
| 1057 } | 1059 } |
| 1058 | 1060 |
| 1059 TEST_F(IdleHelperWithQuiescencePeriodTest, | 1061 TEST_F(IdleHelperWithQuiescencePeriodTest, |
| 1060 QuescienceCheckedForAfterLongIdlePeriodEnds) { | 1062 QuescienceCheckedForAfterLongIdlePeriodEnds) { |
| 1061 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1063 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 1062 | 1064 |
| 1063 idle_task_runner_->PostIdleTask(FROM_HERE, base::Bind(&NullIdleTask)); | 1065 idle_task_runner_->PostIdleTask(FROM_HERE, base::Bind(&NullIdleTask)); |
| 1064 idle_helper_->EnableLongIdlePeriod(); | 1066 idle_helper_->EnableLongIdlePeriod(); |
| 1065 RunUntilIdle(); | 1067 RunUntilIdle(); |
| 1066 | 1068 |
| 1067 // Post a normal task to make the scheduler non-quiescent. | 1069 // Post a normal task to make the scheduler non-quiescent. |
| 1068 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 1070 default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
| 1069 RunUntilIdle(); | 1071 RunUntilIdle(); |
| 1070 | 1072 |
| 1071 // Post an idle task. The idle task won't run initially because the system is | 1073 // Post an idle task. The idle task won't run initially because the system is |
| 1072 // not judged to be quiescent, but should be run after the quiescence delay. | 1074 // not judged to be quiescent, but should be run after the quiescence delay. |
| 1073 int run_count = 0; | 1075 int run_count = 0; |
| 1074 base::TimeTicks deadline_in_task; | 1076 base::TimeTicks deadline_in_task; |
| 1075 base::TimeTicks expected_deadline = | 1077 base::TimeTicks expected_deadline = |
| 1076 clock_->Now() + | 1078 clock_->NowTicks() + |
| 1077 base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs); | 1079 base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs); |
| 1078 idle_task_runner_->PostIdleTask( | 1080 idle_task_runner_->PostIdleTask( |
| 1079 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 1081 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 1080 idle_helper_->EnableLongIdlePeriod(); | 1082 idle_helper_->EnableLongIdlePeriod(); |
| 1081 RunUntilIdle(); | 1083 RunUntilIdle(); |
| 1082 | 1084 |
| 1083 EXPECT_EQ(1, run_count); | 1085 EXPECT_EQ(1, run_count); |
| 1084 EXPECT_EQ(expected_deadline, deadline_in_task); | 1086 EXPECT_EQ(expected_deadline, deadline_in_task); |
| 1085 } | 1087 } |
| 1086 | 1088 |
| 1087 TEST_F(IdleHelperTest, NoShortIdlePeriodWhenDeadlineTooClose) { | 1089 TEST_F(IdleHelperTest, NoShortIdlePeriodWhenDeadlineTooClose) { |
| 1088 int run_count = 0; | 1090 int run_count = 0; |
| 1089 base::TimeTicks deadline_in_task; | 1091 base::TimeTicks deadline_in_task; |
| 1090 | 1092 |
| 1091 idle_task_runner_->PostIdleTask( | 1093 idle_task_runner_->PostIdleTask( |
| 1092 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 1094 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 1093 | 1095 |
| 1094 base::TimeDelta half_a_ms(base::TimeDelta::FromMicroseconds(50)); | 1096 base::TimeDelta half_a_ms(base::TimeDelta::FromMicroseconds(50)); |
| 1095 base::TimeTicks less_than_min_deadline( | 1097 base::TimeTicks less_than_min_deadline( |
| 1096 clock_->Now() + minimum_idle_period_duration() - half_a_ms); | 1098 clock_->NowTicks() + minimum_idle_period_duration() - half_a_ms); |
| 1097 base::TimeTicks more_than_min_deadline( | 1099 base::TimeTicks more_than_min_deadline( |
| 1098 clock_->Now() + minimum_idle_period_duration() + half_a_ms); | 1100 clock_->NowTicks() + minimum_idle_period_duration() + half_a_ms); |
| 1099 | 1101 |
| 1100 idle_helper_->StartIdlePeriod( | 1102 idle_helper_->StartIdlePeriod( |
| 1101 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 1103 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 1102 less_than_min_deadline); | 1104 less_than_min_deadline); |
| 1103 RunUntilIdle(); | 1105 RunUntilIdle(); |
| 1104 EXPECT_EQ(0, run_count); | 1106 EXPECT_EQ(0, run_count); |
| 1105 | 1107 |
| 1106 idle_helper_->StartIdlePeriod( | 1108 idle_helper_->StartIdlePeriod( |
| 1107 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->Now(), | 1109 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(), |
| 1108 more_than_min_deadline); | 1110 more_than_min_deadline); |
| 1109 RunUntilIdle(); | 1111 RunUntilIdle(); |
| 1110 EXPECT_EQ(1, run_count); | 1112 EXPECT_EQ(1, run_count); |
| 1111 } | 1113 } |
| 1112 | 1114 |
| 1113 TEST_F(IdleHelperTest, NoLongIdlePeriodWhenDeadlineTooClose) { | 1115 TEST_F(IdleHelperTest, NoLongIdlePeriodWhenDeadlineTooClose) { |
| 1114 int run_count = 0; | 1116 int run_count = 0; |
| 1115 base::TimeTicks deadline_in_task; | 1117 base::TimeTicks deadline_in_task; |
| 1116 | 1118 |
| 1117 base::TimeDelta half_a_ms(base::TimeDelta::FromMicroseconds(50)); | 1119 base::TimeDelta half_a_ms(base::TimeDelta::FromMicroseconds(50)); |
| 1118 base::TimeDelta less_than_min_deadline_duration( | 1120 base::TimeDelta less_than_min_deadline_duration( |
| 1119 minimum_idle_period_duration() - half_a_ms); | 1121 minimum_idle_period_duration() - half_a_ms); |
| 1120 base::TimeDelta more_than_min_deadline_duration( | 1122 base::TimeDelta more_than_min_deadline_duration( |
| 1121 minimum_idle_period_duration() + half_a_ms); | 1123 minimum_idle_period_duration() + half_a_ms); |
| 1122 | 1124 |
| 1123 idle_task_runner_->PostIdleTask( | 1125 idle_task_runner_->PostIdleTask( |
| 1124 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 1126 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
| 1125 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 1127 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 1126 less_than_min_deadline_duration); | 1128 less_than_min_deadline_duration); |
| 1127 | 1129 |
| 1128 idle_helper_->EnableLongIdlePeriod(); | 1130 idle_helper_->EnableLongIdlePeriod(); |
| 1129 RunUntilIdle(); | 1131 RunUntilIdle(); |
| 1130 EXPECT_EQ(0, run_count); | 1132 EXPECT_EQ(0, run_count); |
| 1131 | 1133 |
| 1132 idle_helper_->EndIdlePeriod(); | 1134 idle_helper_->EndIdlePeriod(); |
| 1133 clock_->AdvanceNow(maximum_idle_period_duration()); | 1135 clock_->Advance(maximum_idle_period_duration()); |
| 1134 RunUntilIdle(); | 1136 RunUntilIdle(); |
| 1135 EXPECT_EQ(0, run_count); | 1137 EXPECT_EQ(0, run_count); |
| 1136 | 1138 |
| 1137 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), | 1139 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask), |
| 1138 more_than_min_deadline_duration); | 1140 more_than_min_deadline_duration); |
| 1139 idle_helper_->EnableLongIdlePeriod(); | 1141 idle_helper_->EnableLongIdlePeriod(); |
| 1140 RunUntilIdle(); | 1142 RunUntilIdle(); |
| 1141 EXPECT_EQ(1, run_count); | 1143 EXPECT_EQ(1, run_count); |
| 1142 } | 1144 } |
| 1143 | 1145 |
| 1144 } // namespace scheduler | 1146 } // namespace scheduler |
| OLD | NEW |