| Index: components/scheduler/child/idle_helper_unittest.cc
|
| diff --git a/components/scheduler/child/idle_helper_unittest.cc b/components/scheduler/child/idle_helper_unittest.cc
|
| deleted file mode 100644
|
| index 229000409e258eb5be2710959f7563cc4fee145b..0000000000000000000000000000000000000000
|
| --- a/components/scheduler/child/idle_helper_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1160 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "components/scheduler/child/idle_helper.h"
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/test/simple_test_tick_clock.h"
|
| -#include "cc/test/ordered_simple_task_runner.h"
|
| -#include "components/scheduler/base/real_time_domain.h"
|
| -#include "components/scheduler/base/task_queue.h"
|
| -#include "components/scheduler/base/task_queue_manager.h"
|
| -#include "components/scheduler/base/test_time_source.h"
|
| -#include "components/scheduler/child/scheduler_helper.h"
|
| -#include "components/scheduler/child/scheduler_tqm_delegate_for_test.h"
|
| -#include "components/scheduler/child/scheduler_tqm_delegate_impl.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using testing::_;
|
| -using testing::AnyNumber;
|
| -using testing::AtLeast;
|
| -using testing::Exactly;
|
| -using testing::Invoke;
|
| -using testing::Return;
|
| -
|
| -namespace scheduler {
|
| -
|
| -namespace {
|
| -void AppendToVectorTestTask(std::vector<std::string>* vector,
|
| - std::string value) {
|
| - vector->push_back(value);
|
| -}
|
| -
|
| -void AppendToVectorIdleTestTask(std::vector<std::string>* vector,
|
| - std::string value,
|
| - base::TimeTicks deadline) {
|
| - AppendToVectorTestTask(vector, value);
|
| -}
|
| -
|
| -void NullTask() {
|
| -}
|
| -
|
| -void NullIdleTask(base::TimeTicks deadline) {
|
| -}
|
| -
|
| -void AppendToVectorReentrantTask(base::SingleThreadTaskRunner* task_runner,
|
| - std::vector<int>* vector,
|
| - int* reentrant_count,
|
| - int max_reentrant_count) {
|
| - vector->push_back((*reentrant_count)++);
|
| - if (*reentrant_count < max_reentrant_count) {
|
| - task_runner->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(AppendToVectorReentrantTask, base::Unretained(task_runner),
|
| - vector, reentrant_count, max_reentrant_count));
|
| - }
|
| -}
|
| -
|
| -void IdleTestTask(int* run_count,
|
| - base::TimeTicks* deadline_out,
|
| - base::TimeTicks deadline) {
|
| - (*run_count)++;
|
| - *deadline_out = deadline;
|
| -}
|
| -
|
| -int max_idle_task_reposts = 2;
|
| -
|
| -void RepostingIdleTestTask(SingleThreadIdleTaskRunner* idle_task_runner,
|
| - int* run_count,
|
| - base::TimeTicks* deadline_out,
|
| - base::TimeTicks deadline) {
|
| - if ((*run_count + 1) < max_idle_task_reposts) {
|
| - idle_task_runner->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingIdleTestTask, base::Unretained(idle_task_runner),
|
| - run_count, deadline_out));
|
| - }
|
| - *deadline_out = deadline;
|
| - (*run_count)++;
|
| -}
|
| -
|
| -void RepostingUpdateClockIdleTestTask(
|
| - SingleThreadIdleTaskRunner* idle_task_runner,
|
| - int* run_count,
|
| - base::SimpleTestTickClock* 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->Advance(advance_time);
|
| -}
|
| -
|
| -void RepeatingTask(base::SingleThreadTaskRunner* task_runner,
|
| - int num_repeats,
|
| - base::TimeDelta delay) {
|
| - if (num_repeats > 1) {
|
| - task_runner->PostDelayedTask(
|
| - FROM_HERE, base::Bind(&RepeatingTask, base::Unretained(task_runner),
|
| - num_repeats - 1, delay),
|
| - delay);
|
| - }
|
| -}
|
| -
|
| -void UpdateClockIdleTestTask(base::SimpleTestTickClock* clock,
|
| - int* run_count,
|
| - base::TimeTicks set_time,
|
| - base::TimeTicks deadline) {
|
| - clock->Advance(set_time - clock->NowTicks());
|
| - (*run_count)++;
|
| -}
|
| -
|
| -void UpdateClockToDeadlineIdleTestTask(base::SimpleTestTickClock* clock,
|
| - int* run_count,
|
| - base::TimeTicks deadline) {
|
| - UpdateClockIdleTestTask(clock, run_count, deadline, deadline);
|
| -}
|
| -
|
| -void EndIdlePeriodIdleTask(IdleHelper* idle_helper, base::TimeTicks deadline) {
|
| - idle_helper->EndIdlePeriod();
|
| -}
|
| -
|
| -scoped_refptr<SchedulerTqmDelegate> CreateTaskRunnerDelegate(
|
| - base::MessageLoop* message_loop,
|
| - scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner,
|
| - std::unique_ptr<TestTimeSource> test_time_source) {
|
| - if (message_loop)
|
| - return SchedulerTqmDelegateImpl::Create(message_loop,
|
| - std::move(test_time_source));
|
| -
|
| - return SchedulerTqmDelegateForTest::Create(mock_task_runner,
|
| - std::move(test_time_source));
|
| -}
|
| -
|
| -}; // namespace
|
| -
|
| -class IdleHelperForTest : public IdleHelper, public IdleHelper::Delegate {
|
| - public:
|
| - explicit IdleHelperForTest(
|
| - SchedulerHelper* scheduler_helper,
|
| - base::TimeDelta required_quiescence_duration_before_long_idle_period)
|
| - : IdleHelper(scheduler_helper,
|
| - this,
|
| - "test.idle",
|
| - TRACE_DISABLED_BY_DEFAULT("test.idle"),
|
| - "TestSchedulerIdlePeriod",
|
| - required_quiescence_duration_before_long_idle_period) {}
|
| -
|
| - ~IdleHelperForTest() override {}
|
| -
|
| - // SchedulerHelperDelegate implementation:
|
| - MOCK_METHOD2(CanEnterLongIdlePeriod,
|
| - bool(base::TimeTicks now,
|
| - base::TimeDelta* next_long_idle_period_delay_out));
|
| -
|
| - MOCK_METHOD0(IsNotQuiescent, void());
|
| - MOCK_METHOD0(OnIdlePeriodStarted, void());
|
| - MOCK_METHOD0(OnIdlePeriodEnded, void());
|
| -};
|
| -
|
| -class BaseIdleHelperTest : public testing::Test {
|
| - public:
|
| - BaseIdleHelperTest(
|
| - base::MessageLoop* message_loop,
|
| - base::TimeDelta required_quiescence_duration_before_long_idle_period)
|
| - : clock_(new base::SimpleTestTickClock()),
|
| - mock_task_runner_(
|
| - message_loop
|
| - ? nullptr
|
| - : new cc::OrderedSimpleTaskRunner(clock_.get(), false)),
|
| - message_loop_(message_loop),
|
| - main_task_runner_(CreateTaskRunnerDelegate(
|
| - message_loop,
|
| - mock_task_runner_,
|
| - base::WrapUnique(new TestTimeSource(clock_.get())))),
|
| - scheduler_helper_(
|
| - new SchedulerHelper(main_task_runner_,
|
| - "test.idle",
|
| - TRACE_DISABLED_BY_DEFAULT("test.idle"),
|
| - TRACE_DISABLED_BY_DEFAULT("test.idle.debug"))),
|
| - idle_helper_(new IdleHelperForTest(
|
| - scheduler_helper_.get(),
|
| - required_quiescence_duration_before_long_idle_period)),
|
| - default_task_runner_(scheduler_helper_->DefaultTaskRunner()),
|
| - idle_task_runner_(idle_helper_->IdleTaskRunner()) {
|
| - clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
|
| - }
|
| -
|
| - ~BaseIdleHelperTest() override {}
|
| -
|
| - void SetUp() override {
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber());
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber());
|
| - EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _))
|
| - .Times(AnyNumber())
|
| - .WillRepeatedly(Return(true));
|
| - }
|
| -
|
| - void TearDown() override {
|
| - DCHECK(!mock_task_runner_.get() || !message_loop_.get());
|
| - if (mock_task_runner_.get()) {
|
| - // Check that all tests stop posting tasks.
|
| - mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| - while (mock_task_runner_->RunUntilIdle()) {
|
| - }
|
| - } else {
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| - }
|
| -
|
| - void RunUntilIdle() {
|
| - // Only one of mock_task_runner_ or message_loop_ should be set.
|
| - DCHECK(!mock_task_runner_.get() || !message_loop_.get());
|
| - if (mock_task_runner_.get())
|
| - mock_task_runner_->RunUntilIdle();
|
| - else
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| -
|
| - template <typename E>
|
| - static void CallForEachEnumValue(E first,
|
| - E last,
|
| - const char* (*function)(E)) {
|
| - for (E val = first; val < last;
|
| - val = static_cast<E>(static_cast<int>(val) + 1)) {
|
| - (*function)(val);
|
| - }
|
| - }
|
| -
|
| - static void CheckAllTaskQueueIdToString() {
|
| - CallForEachEnumValue<IdleHelper::IdlePeriodState>(
|
| - IdleHelper::IdlePeriodState::FIRST_IDLE_PERIOD_STATE,
|
| - IdleHelper::IdlePeriodState::IDLE_PERIOD_STATE_COUNT,
|
| - &IdleHelper::IdlePeriodStateToString);
|
| - }
|
| -
|
| - bool IsInIdlePeriod() const {
|
| - return idle_helper_->IsInIdlePeriod(
|
| - idle_helper_->SchedulerIdlePeriodState());
|
| - }
|
| -
|
| - protected:
|
| - static base::TimeDelta maximum_idle_period_duration() {
|
| - return base::TimeDelta::FromMilliseconds(
|
| - IdleHelper::kMaximumIdlePeriodMillis);
|
| - }
|
| -
|
| - static base::TimeDelta retry_enable_long_idle_period_delay() {
|
| - return base::TimeDelta::FromMilliseconds(
|
| - IdleHelper::kRetryEnableLongIdlePeriodDelayMillis);
|
| - }
|
| -
|
| - static base::TimeDelta minimum_idle_period_duration() {
|
| - return base::TimeDelta::FromMilliseconds(
|
| - IdleHelper::kMinimumIdlePeriodDurationMillis);
|
| - }
|
| -
|
| - base::TimeTicks CurrentIdleTaskDeadline() {
|
| - return idle_helper_->CurrentIdleTaskDeadline();
|
| - }
|
| -
|
| - void CheckIdlePeriodStateIs(const char* expected) {
|
| - EXPECT_STREQ(expected, IdleHelper::IdlePeriodStateToString(
|
| - idle_helper_->SchedulerIdlePeriodState()));
|
| - }
|
| -
|
| - std::unique_ptr<base::SimpleTestTickClock> clock_;
|
| - // Only one of mock_task_runner_ or message_loop_ will be set.
|
| - scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
|
| - std::unique_ptr<base::MessageLoop> message_loop_;
|
| -
|
| - scoped_refptr<SchedulerTqmDelegate> main_task_runner_;
|
| - std::unique_ptr<SchedulerHelper> scheduler_helper_;
|
| - std::unique_ptr<IdleHelperForTest> idle_helper_;
|
| - scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
|
| - scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BaseIdleHelperTest);
|
| -};
|
| -
|
| -class IdleHelperTest : public BaseIdleHelperTest {
|
| - public:
|
| - IdleHelperTest() : BaseIdleHelperTest(nullptr, base::TimeDelta()) {}
|
| -
|
| - ~IdleHelperTest() override {}
|
| -
|
| - TaskQueueManager* task_queue_manager() const {
|
| - return scheduler_helper_->GetTaskQueueManagerForTesting();
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(IdleHelperTest);
|
| -};
|
| -
|
| -TEST_F(IdleHelperTest, TestPostIdleTask) {
|
| - int run_count = 0;
|
| - base::TimeTicks expected_deadline =
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(2300);
|
| - base::TimeTicks deadline_in_task;
|
| -
|
| - clock_->Advance(base::TimeDelta::FromMilliseconds(100));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - expected_deadline);
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| - EXPECT_EQ(expected_deadline, deadline_in_task);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestPostIdleTask_EndIdlePeriod) {
|
| - int run_count = 0;
|
| - base::TimeTicks deadline_in_task;
|
| -
|
| - clock_->Advance(base::TimeDelta::FromMilliseconds(100));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - idle_helper_->EndIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestRepostingIdleTask) {
|
| - base::TimeTicks actual_deadline;
|
| - int run_count = 0;
|
| -
|
| - max_idle_task_reposts = 2;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingIdleTestTask, base::RetainedRef(idle_task_runner_),
|
| - &run_count, &actual_deadline));
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -
|
| - // Reposted tasks shouldn't run until next idle period.
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - EXPECT_EQ(2, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestIdleTaskExceedsDeadline) {
|
| - int run_count = 0;
|
| -
|
| - // Post two UpdateClockToDeadlineIdleTestTask tasks.
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_.get(), &run_count));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&UpdateClockToDeadlineIdleTestTask, clock_.get(), &run_count));
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Only the first idle task should execute since it's used up the deadline.
|
| - EXPECT_EQ(1, run_count);
|
| -
|
| - idle_helper_->EndIdlePeriod();
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Second task should be run on the next idle period.
|
| - EXPECT_EQ(2, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestPostIdleTaskAfterWakeup) {
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - idle_task_runner_->PostIdleTaskAfterWakeup(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Shouldn't run yet as no other task woke up the scheduler.
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - // Must start a new idle period before idle task runs.
|
| - idle_task_runner_->PostIdleTaskAfterWakeup(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Another after wakeup idle task shouldn't wake the scheduler.
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask));
|
| -
|
| - RunUntilIdle();
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Execution of default task queue task should trigger execution of idle task.
|
| - EXPECT_EQ(2, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestPostIdleTaskAfterWakeupWhileAwake) {
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - idle_task_runner_->PostIdleTaskAfterWakeup(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask));
|
| -
|
| - RunUntilIdle();
|
| - // Must start a new idle period before idle task runs.
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Should run as the scheduler was already awakened by the normal task.
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestPostIdleTaskWakesAfterWakeupIdleTask) {
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - idle_task_runner_->PostIdleTaskAfterWakeup(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Must start a new idle period before after-wakeup idle task runs.
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Normal idle task should wake up after-wakeup idle task.
|
| - EXPECT_EQ(2, run_count);
|
| -}
|
| -
|
| -class IdleHelperTestWithIdlePeriodObserver : public BaseIdleHelperTest {
|
| - public:
|
| - IdleHelperTestWithIdlePeriodObserver()
|
| - : BaseIdleHelperTest(nullptr, base::TimeDelta()) {}
|
| -
|
| - ~IdleHelperTestWithIdlePeriodObserver() override {}
|
| -
|
| - void SetUp() override {
|
| - // Don't set expectations on IdleHelper::Delegate.
|
| - }
|
| -
|
| - TaskQueueManager* task_queue_manager() const {
|
| - return scheduler_helper_->GetTaskQueueManagerForTesting();
|
| - }
|
| -
|
| - void ExpectIdlePeriodStartsButNeverEnds() {
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(1);
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(0);
|
| - }
|
| -
|
| - void ExpectIdlePeriodStartsAndEnds(const testing::Cardinality& cardinality) {
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(cardinality);
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(cardinality);
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(IdleHelperTestWithIdlePeriodObserver);
|
| -};
|
| -
|
| -TEST_F(IdleHelperTestWithIdlePeriodObserver, TestEnterButNotExitIdlePeriod) {
|
| - ExpectIdlePeriodStartsButNeverEnds();
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| -}
|
| -
|
| -TEST_F(IdleHelperTestWithIdlePeriodObserver, TestEnterAndExitIdlePeriod) {
|
| - BaseIdleHelperTest* fixture = this;
|
| - ON_CALL(*idle_helper_, OnIdlePeriodStarted())
|
| - .WillByDefault(
|
| - Invoke([fixture]() { EXPECT_TRUE(fixture->IsInIdlePeriod()); }));
|
| - ON_CALL(*idle_helper_, OnIdlePeriodEnded())
|
| - .WillByDefault(
|
| - Invoke([fixture]() { EXPECT_FALSE(fixture->IsInIdlePeriod()); }));
|
| -
|
| - ExpectIdlePeriodStartsAndEnds(Exactly(1));
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - idle_helper_->EndIdlePeriod();
|
| -}
|
| -
|
| -class IdleHelperWithMessageLoopTest : public BaseIdleHelperTest {
|
| - public:
|
| - IdleHelperWithMessageLoopTest()
|
| - : BaseIdleHelperTest(new base::MessageLoop(), base::TimeDelta()) {}
|
| - ~IdleHelperWithMessageLoopTest() override {}
|
| -
|
| - void PostFromNestedRunloop(std::vector<
|
| - std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) {
|
| - base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get());
|
| - for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) {
|
| - if (pair.second) {
|
| - idle_task_runner_->PostIdleTask(FROM_HERE, pair.first);
|
| - } else {
|
| - idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first);
|
| - }
|
| - }
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| -
|
| - void SetUp() override {
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber());
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber());
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(IdleHelperWithMessageLoopTest);
|
| -};
|
| -
|
| -TEST_F(IdleHelperWithMessageLoopTest,
|
| - NonNestableIdleTaskDoesntExecuteInNestedLoop) {
|
| - std::vector<std::string> order;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1")));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2")));
|
| -
|
| - std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>
|
| - tasks_to_post_from_nested_loop;
|
| - tasks_to_post_from_nested_loop.push_back(std::make_pair(
|
| - base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")),
|
| - false));
|
| - tasks_to_post_from_nested_loop.push_back(std::make_pair(
|
| - base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true));
|
| - tasks_to_post_from_nested_loop.push_back(std::make_pair(
|
| - base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true));
|
| -
|
| - default_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&IdleHelperWithMessageLoopTest::PostFromNestedRunloop,
|
| - base::Unretained(this),
|
| - base::Unretained(&tasks_to_post_from_nested_loop)));
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - // Note we expect task 3 to run last because it's non-nestable.
|
| - EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"),
|
| - std::string("4"), std::string("5"),
|
| - std::string("3")));
|
| -}
|
| -
|
| -TEST_F(IdleHelperTestWithIdlePeriodObserver, TestLongIdlePeriod) {
|
| - base::TimeTicks expected_deadline =
|
| - clock_->NowTicks() + maximum_idle_period_duration();
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _))
|
| - .Times(1)
|
| - .WillRepeatedly(Return(true));
|
| - ExpectIdlePeriodStartsButNeverEnds();
|
| -
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count); // Shouldn't run yet as no idle period.
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count); // Should have run in a long idle time.
|
| - EXPECT_EQ(expected_deadline, deadline_in_task);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodWithPendingDelayedTask) {
|
| - base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(30);
|
| - base::TimeTicks expected_deadline = clock_->NowTicks() + pending_task_delay;
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
|
| - pending_task_delay);
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count); // Should have run in a long idle time.
|
| - EXPECT_EQ(expected_deadline, deadline_in_task);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodWithLatePendingDelayedTask) {
|
| - base::TimeDelta pending_task_delay = base::TimeDelta::FromMilliseconds(10);
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
|
| - pending_task_delay);
|
| -
|
| - // Advance clock until after delayed task was meant to be run.
|
| - clock_->Advance(base::TimeDelta::FromMilliseconds(20));
|
| -
|
| - // Post an idle task and then EnableLongIdlePeriod. Since there is a late
|
| - // pending delayed task this shouldn't actually start an idle period.
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - // After the delayed task has been run we should trigger an idle period.
|
| - clock_->Advance(maximum_idle_period_duration());
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTestWithIdlePeriodObserver, TestLongIdlePeriodRepeating) {
|
| - mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| - std::vector<base::TimeTicks> actual_deadlines;
|
| - int run_count = 0;
|
| -
|
| - EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _))
|
| - .Times(4)
|
| - .WillRepeatedly(Return(true));
|
| - ExpectIdlePeriodStartsAndEnds(AtLeast(2));
|
| -
|
| - max_idle_task_reposts = 3;
|
| - base::TimeTicks clock_before(clock_->NowTicks());
|
| - base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingUpdateClockIdleTestTask,
|
| - base::RetainedRef(idle_task_runner_), &run_count, clock_.get(),
|
| - idle_task_runtime, &actual_deadlines));
|
| -
|
| - // Check each idle task runs in their own idle period.
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - 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()));
|
| -
|
| - max_idle_task_reposts = 5;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingUpdateClockIdleTestTask,
|
| - base::RetainedRef(idle_task_runner_), &run_count, clock_.get(),
|
| - idle_task_runtime, &actual_deadlines));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&EndIdlePeriodIdleTask, base::Unretained(idle_helper_.get())));
|
| -
|
| - // Ensure that reposting tasks stop after EndIdlePeriod is called.
|
| - RunUntilIdle();
|
| - EXPECT_EQ(4, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodDoesNotWakeScheduler) {
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - // Start a long idle period and get the time it should end.
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - // The scheduler should not run the enable_next_long_idle_period task if
|
| - // there are no idle tasks and no other task woke up the scheduler, thus
|
| - // the idle period deadline shouldn't update at the end of the current long
|
| - // idle period.
|
| - base::TimeTicks idle_period_deadline = CurrentIdleTaskDeadline();
|
| - clock_->Advance(maximum_idle_period_duration());
|
| - RunUntilIdle();
|
| -
|
| - base::TimeTicks new_idle_period_deadline = CurrentIdleTaskDeadline();
|
| - EXPECT_EQ(idle_period_deadline, new_idle_period_deadline);
|
| -
|
| - // Posting a after-wakeup idle task also shouldn't wake the scheduler or
|
| - // initiate the next long idle period.
|
| - idle_task_runner_->PostIdleTaskAfterWakeup(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - RunUntilIdle();
|
| - new_idle_period_deadline = CurrentIdleTaskDeadline();
|
| - EXPECT_EQ(idle_period_deadline, new_idle_period_deadline);
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - // Running a normal task should initiate a new long idle period though.
|
| - default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask));
|
| - RunUntilIdle();
|
| - new_idle_period_deadline = CurrentIdleTaskDeadline();
|
| - EXPECT_EQ(idle_period_deadline + maximum_idle_period_duration(),
|
| - new_idle_period_deadline);
|
| -
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTestWithIdlePeriodObserver,
|
| - TestLongIdlePeriodWhenNotCanEnterLongIdlePeriod) {
|
| - base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000);
|
| - base::TimeDelta halfDelay = base::TimeDelta::FromMilliseconds(500);
|
| - base::TimeTicks delayOver = clock_->NowTicks() + delay;
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - ON_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _))
|
| - .WillByDefault(Invoke(
|
| - [delay, delayOver](base::TimeTicks now,
|
| - base::TimeDelta* next_long_idle_period_delay_out) {
|
| - if (now >= delayOver)
|
| - return true;
|
| - *next_long_idle_period_delay_out = delay;
|
| - return false;
|
| - }));
|
| -
|
| - EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)).Times(2);
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber());
|
| -
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - // Make sure Idle tasks don't run until the delay has occurred.
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - clock_->Advance(halfDelay);
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - // Delay is finished, idle task should run.
|
| - clock_->Advance(halfDelay);
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodImmediatelyRestartsIfMaxDeadline) {
|
| - std::vector<base::TimeTicks> actual_deadlines;
|
| - int run_count = 0;
|
| -
|
| - base::TimeTicks clock_before(clock_->NowTicks());
|
| - base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10));
|
| -
|
| - // The second idle period should happen immediately after the first the
|
| - // they have max deadlines.
|
| - max_idle_task_reposts = 2;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingUpdateClockIdleTestTask,
|
| - base::RetainedRef(idle_task_runner_), &run_count, clock_.get(),
|
| - idle_task_runtime, &actual_deadlines));
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(2, run_count);
|
| - EXPECT_THAT(
|
| - actual_deadlines,
|
| - testing::ElementsAre(
|
| - clock_before + maximum_idle_period_duration(),
|
| - clock_before + idle_task_runtime + maximum_idle_period_duration()));
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodRestartWaitsIfNotMaxDeadline) {
|
| - base::TimeTicks actual_deadline;
|
| - int run_count = 0;
|
| -
|
| - base::TimeDelta pending_task_delay(base::TimeDelta::FromMilliseconds(20));
|
| - base::TimeDelta idle_task_duration(base::TimeDelta::FromMilliseconds(10));
|
| - base::TimeTicks expected_deadline(clock_->NowTicks() + pending_task_delay +
|
| - maximum_idle_period_duration() +
|
| - retry_enable_long_idle_period_delay());
|
| -
|
| - // Post delayed task to ensure idle period doesn't have a max deadline.
|
| - default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
|
| - pending_task_delay);
|
| -
|
| - max_idle_task_reposts = 2;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingIdleTestTask, base::RetainedRef(idle_task_runner_),
|
| - &run_count, &actual_deadline));
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| - clock_->Advance(idle_task_duration);
|
| -
|
| - // Next idle period shouldn't happen until the pending task has been run.
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -
|
| - // Once the pending task is run the new idle period should start.
|
| - clock_->Advance(pending_task_delay - idle_task_duration);
|
| -
|
| - // Since the idle period tried to start before the pending task ran we have to
|
| - // wait for the idle helper to retry starting the long idle period.
|
| - clock_->Advance(retry_enable_long_idle_period_delay());
|
| - RunUntilIdle();
|
| -
|
| - EXPECT_EQ(2, run_count);
|
| - EXPECT_EQ(expected_deadline, actual_deadline);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodPaused) {
|
| - mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| - std::vector<base::TimeTicks> actual_deadlines;
|
| - int run_count = 0;
|
| -
|
| - // If there are no idle tasks posted we should start in the paused state.
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - CheckIdlePeriodStateIs("in_long_idle_period_paused");
|
| - // There shouldn't be any delayed tasks posted by the idle helper when paused.
|
| - base::TimeTicks next_pending_delayed_task;
|
| - EXPECT_FALSE(scheduler_helper_->real_time_domain()->NextScheduledRunTime(
|
| - &next_pending_delayed_task));
|
| -
|
| - // Posting a task should transition us to the an active state.
|
| - max_idle_task_reposts = 2;
|
| - base::TimeTicks clock_before(clock_->NowTicks());
|
| - base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingUpdateClockIdleTestTask,
|
| - base::RetainedRef(idle_task_runner_), &run_count, clock_.get(),
|
| - idle_task_runtime, &actual_deadlines));
|
| - RunUntilIdle();
|
| - EXPECT_EQ(2, run_count);
|
| - EXPECT_THAT(
|
| - actual_deadlines,
|
| - testing::ElementsAre(
|
| - clock_before + maximum_idle_period_duration(),
|
| - clock_before + idle_task_runtime + maximum_idle_period_duration()));
|
| -
|
| - // Once all task have been run we should go back to the paused state.
|
| - CheckIdlePeriodStateIs("in_long_idle_period_paused");
|
| - EXPECT_FALSE(scheduler_helper_->real_time_domain()->NextScheduledRunTime(
|
| - &next_pending_delayed_task));
|
| -
|
| - idle_helper_->EndIdlePeriod();
|
| - CheckIdlePeriodStateIs("not_in_idle_period");
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, TestLongIdlePeriodWhenShutdown) {
|
| - base::TimeTicks deadline_in_task;
|
| - int run_count = 0;
|
| -
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - scheduler_helper_->Shutdown();
|
| -
|
| - // We shouldn't be able to enter a long idle period when shutdown
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - CheckIdlePeriodStateIs("not_in_idle_period");
|
| - EXPECT_EQ(0, run_count);
|
| -}
|
| -
|
| -void TestCanExceedIdleDeadlineIfRequiredTask(IdleHelperForTest* idle_helper,
|
| - bool* can_exceed_idle_deadline_out,
|
| - int* run_count,
|
| - base::TimeTicks deadline) {
|
| - *can_exceed_idle_deadline_out =
|
| - idle_helper->CanExceedIdleDeadlineIfRequired();
|
| - (*run_count)++;
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, CanExceedIdleDeadlineIfRequired) {
|
| - int run_count = 0;
|
| - bool can_exceed_idle_deadline = false;
|
| -
|
| - // Should return false if not in an idle period.
|
| - EXPECT_FALSE(idle_helper_->CanExceedIdleDeadlineIfRequired());
|
| -
|
| - // Should return false for short idle periods.
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(),
|
| - &can_exceed_idle_deadline, &run_count));
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(10));
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| - EXPECT_FALSE(can_exceed_idle_deadline);
|
| -
|
| - // Should return false for a long idle period which is shortened due to a
|
| - // pending delayed task.
|
| - default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
|
| - base::TimeDelta::FromMilliseconds(10));
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(),
|
| - &can_exceed_idle_deadline, &run_count));
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(2, run_count);
|
| - EXPECT_FALSE(can_exceed_idle_deadline);
|
| -
|
| - // Next long idle period will be for the maximum time, so
|
| - // CanExceedIdleDeadlineIfRequired should return true.
|
| - clock_->Advance(maximum_idle_period_duration());
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, idle_helper_.get(),
|
| - &can_exceed_idle_deadline, &run_count));
|
| - RunUntilIdle();
|
| - EXPECT_EQ(3, run_count);
|
| - EXPECT_TRUE(can_exceed_idle_deadline);
|
| -}
|
| -
|
| -class IdleHelperWithQuiescencePeriodTest : public BaseIdleHelperTest {
|
| - public:
|
| - enum {
|
| - kQuiescenceDelayMs = 100,
|
| - kLongIdlePeriodMs = 50,
|
| - };
|
| -
|
| - IdleHelperWithQuiescencePeriodTest()
|
| - : BaseIdleHelperTest(
|
| - nullptr,
|
| - base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs)) {}
|
| -
|
| - ~IdleHelperWithQuiescencePeriodTest() override {}
|
| -
|
| - void SetUp() override {
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(AnyNumber());
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(AnyNumber());
|
| - EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _))
|
| - .Times(AnyNumber())
|
| - .WillRepeatedly(Return(true));
|
| - EXPECT_CALL(*idle_helper_, IsNotQuiescent()).Times(AnyNumber());
|
| - }
|
| -
|
| - void MakeNonQuiescent() {
|
| - // Run an arbitrary task so we're deemed to be not quiescent.
|
| - default_task_runner_->PostTask(FROM_HERE, base::Bind(NullTask));
|
| - RunUntilIdle();
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(IdleHelperWithQuiescencePeriodTest);
|
| -};
|
| -
|
| -class IdleHelperWithQuiescencePeriodTestWithIdlePeriodObserver :
|
| - public IdleHelperWithQuiescencePeriodTest {
|
| - public:
|
| -
|
| - IdleHelperWithQuiescencePeriodTestWithIdlePeriodObserver()
|
| - : IdleHelperWithQuiescencePeriodTest() {}
|
| -
|
| - ~IdleHelperWithQuiescencePeriodTestWithIdlePeriodObserver() override {}
|
| -
|
| - void SetUp() override {
|
| - // Don't set expectations on IdleHelper::Delegate.
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(
|
| - IdleHelperWithQuiescencePeriodTestWithIdlePeriodObserver);
|
| -};
|
| -
|
| -
|
| -TEST_F(IdleHelperWithQuiescencePeriodTest,
|
| - LongIdlePeriodStartsImmediatelyIfQuiescent) {
|
| - base::TimeTicks actual_deadline;
|
| - int run_count = 0;
|
| - max_idle_task_reposts = 1;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingIdleTestTask, base::RetainedRef(idle_task_runner_),
|
| - &run_count, &actual_deadline));
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperWithQuiescencePeriodTestWithIdlePeriodObserver,
|
| - LongIdlePeriodDoesNotStartsImmediatelyIfBusy) {
|
| - MakeNonQuiescent();
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodStarted()).Times(0);
|
| - EXPECT_CALL(*idle_helper_, OnIdlePeriodEnded()).Times(0);
|
| - EXPECT_CALL(*idle_helper_, CanEnterLongIdlePeriod(_, _)).Times(0);
|
| - EXPECT_CALL(*idle_helper_, IsNotQuiescent()).Times(AtLeast(1));
|
| -
|
| - base::TimeTicks actual_deadline;
|
| - int run_count = 0;
|
| - max_idle_task_reposts = 1;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepostingIdleTestTask, base::RetainedRef(idle_task_runner_),
|
| - &run_count, &actual_deadline));
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| -
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - scheduler_helper_->Shutdown();
|
| -}
|
| -
|
| -TEST_F(IdleHelperWithQuiescencePeriodTest,
|
| - LongIdlePeriodStartsAfterQuiescence) {
|
| - MakeNonQuiescent();
|
| - mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| -
|
| - // Run a repeating task so we're deemed to be busy for the next 400ms.
|
| - default_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&RepeatingTask, base::Unretained(default_task_runner_.get()),
|
| - 10, base::TimeDelta::FromMilliseconds(40)));
|
| -
|
| - int run_count = 0;
|
| - // In this scenario EnableLongIdlePeriod deems us not to be quiescent 5x in
|
| - // a row.
|
| - base::TimeTicks expected_deadline =
|
| - clock_->NowTicks() + base::TimeDelta::FromMilliseconds(
|
| - 5 * kQuiescenceDelayMs + kLongIdlePeriodMs);
|
| - base::TimeTicks deadline_in_task;
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| - EXPECT_EQ(expected_deadline, deadline_in_task);
|
| -}
|
| -
|
| -TEST_F(IdleHelperWithQuiescencePeriodTest,
|
| - QuescienceCheckedForAfterLongIdlePeriodEnds) {
|
| - mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| -
|
| - idle_task_runner_->PostIdleTask(FROM_HERE, base::Bind(&NullIdleTask));
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| -
|
| - // Post a normal task to make the scheduler non-quiescent.
|
| - default_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask));
|
| - RunUntilIdle();
|
| -
|
| - // Post an idle task. The idle task won't run initially because the system is
|
| - // not judged to be quiescent, but should be run after the quiescence delay.
|
| - int run_count = 0;
|
| - base::TimeTicks deadline_in_task;
|
| - base::TimeTicks expected_deadline =
|
| - clock_->NowTicks() +
|
| - base::TimeDelta::FromMilliseconds(kQuiescenceDelayMs + kLongIdlePeriodMs);
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, run_count);
|
| - EXPECT_EQ(expected_deadline, deadline_in_task);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, NoShortIdlePeriodWhenDeadlineTooClose) {
|
| - int run_count = 0;
|
| - base::TimeTicks deadline_in_task;
|
| -
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| -
|
| - base::TimeDelta half_a_ms(base::TimeDelta::FromMicroseconds(50));
|
| - base::TimeTicks less_than_min_deadline(
|
| - clock_->NowTicks() + minimum_idle_period_duration() - half_a_ms);
|
| - base::TimeTicks more_than_min_deadline(
|
| - clock_->NowTicks() + minimum_idle_period_duration() + half_a_ms);
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - less_than_min_deadline);
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - idle_helper_->StartIdlePeriod(
|
| - IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, clock_->NowTicks(),
|
| - more_than_min_deadline);
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -TEST_F(IdleHelperTest, NoLongIdlePeriodWhenDeadlineTooClose) {
|
| - int run_count = 0;
|
| - base::TimeTicks deadline_in_task;
|
| -
|
| - base::TimeDelta half_a_ms(base::TimeDelta::FromMicroseconds(50));
|
| - base::TimeDelta less_than_min_deadline_duration(
|
| - minimum_idle_period_duration() - half_a_ms);
|
| - base::TimeDelta more_than_min_deadline_duration(
|
| - minimum_idle_period_duration() + half_a_ms);
|
| -
|
| - idle_task_runner_->PostIdleTask(
|
| - FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task));
|
| - default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
|
| - less_than_min_deadline_duration);
|
| -
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - idle_helper_->EndIdlePeriod();
|
| - clock_->Advance(maximum_idle_period_duration());
|
| - RunUntilIdle();
|
| - EXPECT_EQ(0, run_count);
|
| -
|
| - default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NullTask),
|
| - more_than_min_deadline_duration);
|
| - idle_helper_->EnableLongIdlePeriod();
|
| - RunUntilIdle();
|
| - EXPECT_EQ(1, run_count);
|
| -}
|
| -
|
| -} // namespace scheduler
|
|
|