| Index: content/child/scheduler/worker_scheduler_impl_unittest.cc
 | 
| diff --git a/content/child/scheduler/worker_scheduler_impl_unittest.cc b/content/child/scheduler/worker_scheduler_impl_unittest.cc
 | 
| deleted file mode 100644
 | 
| index eed8f55b3d523a1763a847c993616074643b965a..0000000000000000000000000000000000000000
 | 
| --- a/content/child/scheduler/worker_scheduler_impl_unittest.cc
 | 
| +++ /dev/null
 | 
| @@ -1,420 +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 "content/child/scheduler/worker_scheduler_impl.h"
 | 
| -
 | 
| -#include "base/callback.h"
 | 
| -#include "base/strings/stringprintf.h"
 | 
| -#include "cc/test/ordered_simple_task_runner.h"
 | 
| -#include "content/child/scheduler/nestable_task_runner_for_test.h"
 | 
| -#include "content/child/scheduler/scheduler_message_loop_delegate.h"
 | 
| -#include "testing/gmock/include/gmock/gmock.h"
 | 
| -#include "testing/gtest/include/gtest/gtest.h"
 | 
| -
 | 
| -using testing::ElementsAreArray;
 | 
| -
 | 
| -namespace content {
 | 
| -
 | 
| -namespace {
 | 
| -void NopTask() {
 | 
| -}
 | 
| -
 | 
| -int TimeTicksToIntMs(const base::TimeTicks& time) {
 | 
| -  return static_cast<int>((time - base::TimeTicks()).InMilliseconds());
 | 
| -}
 | 
| -
 | 
| -void WakeUpTask(std::vector<std::string>* timeline, cc::TestNowSource* clock) {
 | 
| -  if (timeline) {
 | 
| -    timeline->push_back(base::StringPrintf(
 | 
| -        "run WakeUpTask @ %d", TimeTicksToIntMs(clock->Now())));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void RecordTimelineTask(std::vector<std::string>* timeline,
 | 
| -                        cc::TestNowSource* clock) {
 | 
| -  timeline->push_back(base::StringPrintf(
 | 
| -      "run RecordTimelineTask @ %d", TimeTicksToIntMs(clock->Now())));
 | 
| -}
 | 
| -
 | 
| -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 TimelineIdleTestTask(std::vector<std::string>* timeline,
 | 
| -                          base::TimeTicks deadline) {
 | 
| -  timeline->push_back(base::StringPrintf("run TimelineIdleTestTask deadline %d",
 | 
| -                                         TimeTicksToIntMs(deadline)));
 | 
| -}
 | 
| -
 | 
| -};  // namespace
 | 
| -
 | 
| -class WorkerSchedulerImplForTest : public WorkerSchedulerImpl {
 | 
| - public:
 | 
| -  WorkerSchedulerImplForTest(
 | 
| -      scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner,
 | 
| -      scoped_refptr<cc::TestNowSource> clock_)
 | 
| -      : WorkerSchedulerImpl(main_task_runner),
 | 
| -        clock_(clock_),
 | 
| -        timeline_(nullptr) {}
 | 
| -
 | 
| -  void RecordTimelineEvents(std::vector<std::string>* timeline) {
 | 
| -    timeline_ = timeline;
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  bool CanEnterLongIdlePeriod(
 | 
| -      base::TimeTicks now,
 | 
| -      base::TimeDelta* next_long_idle_period_delay_out) override {
 | 
| -    if (timeline_) {
 | 
| -      timeline_->push_back(base::StringPrintf("CanEnterLongIdlePeriod @ %d",
 | 
| -                                              TimeTicksToIntMs(now)));
 | 
| -    }
 | 
| -    return WorkerSchedulerImpl::CanEnterLongIdlePeriod(
 | 
| -        now, next_long_idle_period_delay_out);
 | 
| -  }
 | 
| -
 | 
| -  void IsNotQuiescent() override {
 | 
| -    if (timeline_) {
 | 
| -      timeline_->push_back(base::StringPrintf("IsNotQuiescent @ %d",
 | 
| -                                              TimeTicksToIntMs(clock_->Now())));
 | 
| -    }
 | 
| -    WorkerSchedulerImpl::IsNotQuiescent();
 | 
| -  }
 | 
| -
 | 
| -  scoped_refptr<cc::TestNowSource> clock_;
 | 
| -  std::vector<std::string>* timeline_;  // NOT OWNED
 | 
| -};
 | 
| -
 | 
| -class WorkerSchedulerImplTest : public testing::Test {
 | 
| - public:
 | 
| -  WorkerSchedulerImplTest()
 | 
| -      : clock_(cc::TestNowSource::Create(5000)),
 | 
| -        mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, true)),
 | 
| -        nestable_task_runner_(
 | 
| -            NestableTaskRunnerForTest::Create(mock_task_runner_)),
 | 
| -        scheduler_(
 | 
| -            new WorkerSchedulerImplForTest(nestable_task_runner_, clock_)),
 | 
| -        timeline_(nullptr) {
 | 
| -    scheduler_->SetTimeSourceForTesting(clock_);
 | 
| -  }
 | 
| -
 | 
| -  ~WorkerSchedulerImplTest() override {}
 | 
| -
 | 
| -  void TearDown() override {
 | 
| -    // Check that all tests stop posting tasks.
 | 
| -    while (mock_task_runner_->RunUntilIdle()) {
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void Init() {
 | 
| -    scheduler_->Init();
 | 
| -    default_task_runner_ = scheduler_->DefaultTaskRunner();
 | 
| -    idle_task_runner_ = scheduler_->IdleTaskRunner();
 | 
| -    timeline_ = nullptr;
 | 
| -  }
 | 
| -
 | 
| -  void RecordTimelineEvents(std::vector<std::string>* timeline) {
 | 
| -    timeline_ = timeline;
 | 
| -    scheduler_->RecordTimelineEvents(timeline);
 | 
| -  }
 | 
| -
 | 
| -  void RunUntilIdle() {
 | 
| -    if (timeline_) {
 | 
| -      timeline_->push_back(base::StringPrintf("RunUntilIdle begin @ %d",
 | 
| -                                              TimeTicksToIntMs(clock_->Now())));
 | 
| -    }
 | 
| -    mock_task_runner_->RunUntilIdle();
 | 
| -    if (timeline_) {
 | 
| -      timeline_->push_back(base::StringPrintf("RunUntilIdle end @ %d",
 | 
| -                                              TimeTicksToIntMs(clock_->Now())));
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void InitAndPostDelayedWakeupTask() {
 | 
| -    Init();
 | 
| -    // WorkerSchedulerImpl::Init causes a delayed task to be posted on the
 | 
| -    // after wakeup control runner.  We need a task to wake the system up
 | 
| -    // AFTER the delay for this has expired.
 | 
| -    default_task_runner_->PostDelayedTask(
 | 
| -        FROM_HERE, base::Bind(&WakeUpTask, base::Unretained(timeline_),
 | 
| -                              base::Unretained(clock_.get())),
 | 
| -        base::TimeDelta::FromMilliseconds(100));
 | 
| -  }
 | 
| -
 | 
| -  // Helper for posting several tasks of specific types. |task_descriptor| is a
 | 
| -  // string with space delimited task identifiers. The first letter of each
 | 
| -  // task identifier specifies the task type:
 | 
| -  // - 'D': Default task
 | 
| -  // - 'I': Idle task
 | 
| -  void PostTestTasks(std::vector<std::string>* run_order,
 | 
| -                     const std::string& task_descriptor) {
 | 
| -    std::istringstream stream(task_descriptor);
 | 
| -    while (!stream.eof()) {
 | 
| -      std::string task;
 | 
| -      stream >> task;
 | 
| -      switch (task[0]) {
 | 
| -        case 'D':
 | 
| -          default_task_runner_->PostTask(
 | 
| -              FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task));
 | 
| -          break;
 | 
| -        case 'I':
 | 
| -          idle_task_runner_->PostIdleTask(
 | 
| -              FROM_HERE,
 | 
| -              base::Bind(&AppendToVectorIdleTestTask, run_order, task));
 | 
| -          break;
 | 
| -        default:
 | 
| -          NOTREACHED();
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  static base::TimeDelta maximum_idle_period_duration() {
 | 
| -    return base::TimeDelta::FromMilliseconds(
 | 
| -        SchedulerHelper::kMaximumIdlePeriodMillis);
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  scoped_refptr<cc::TestNowSource> clock_;
 | 
| -  // Only one of mock_task_runner_ or message_loop_ will be set.
 | 
| -  scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
 | 
| -
 | 
| -  scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
 | 
| -  scoped_ptr<WorkerSchedulerImplForTest> scheduler_;
 | 
| -  scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
 | 
| -  scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
 | 
| -  std::vector<std::string>* timeline_;  // NOT OWNED
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerImplTest);
 | 
| -};
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestPostDefaultTask) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "D1 D2 D3 D4");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_THAT(run_order,
 | 
| -              testing::ElementsAre(std::string("D1"), std::string("D2"),
 | 
| -                                   std::string("D3"), std::string("D4")));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestPostIdleTask) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_THAT(run_order, testing::ElementsAre(std::string("I1")));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestPostIdleTask_NoWakeup) {
 | 
| -  Init();
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_TRUE(run_order.empty());
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestPostDefaultAndIdleTasks) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1 D2 D3 D4");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_THAT(run_order,
 | 
| -              testing::ElementsAre(std::string("D2"), std::string("D3"),
 | 
| -                                   std::string("D4"), std::string("I1")));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestPostIdleTaskWithWakeupNeeded_NoWakeup) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  // The delayed call to EnableLongIdlePeriod happened and it posted a call to
 | 
| -  // EnableLongIdlePeriod on the after wakeup control queue.
 | 
| -
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_TRUE(run_order.empty());
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestPostDefaultDelayedAndIdleTasks) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1 D2 D3 D4");
 | 
| -
 | 
| -  default_task_runner_->PostDelayedTask(
 | 
| -      FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "DELAYED"),
 | 
| -      base::TimeDelta::FromMilliseconds(1000));
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_THAT(run_order,
 | 
| -              testing::ElementsAre(std::string("D2"), std::string("D3"),
 | 
| -                                   std::string("D4"), std::string("I1"),
 | 
| -                                   std::string("DELAYED")));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestIdleDeadlineWithPendingDelayedTask) {
 | 
| -  std::vector<std::string> timeline;
 | 
| -  RecordTimelineEvents(&timeline);
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  timeline.push_back("Post delayed and idle tasks");
 | 
| -  // Post a delayed task timed to occur mid way during the long idle period.
 | 
| -  default_task_runner_->PostDelayedTask(
 | 
| -      FROM_HERE, base::Bind(&RecordTimelineTask, base::Unretained(&timeline),
 | 
| -                            base::Unretained(clock_.get())),
 | 
| -      base::TimeDelta::FromMilliseconds(420));
 | 
| -  idle_task_runner_->PostIdleTask(FROM_HERE,
 | 
| -                                  base::Bind(&TimelineIdleTestTask, &timeline));
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -
 | 
| -  std::string expected_timeline[] = {
 | 
| -      "CanEnterLongIdlePeriod @ 5",
 | 
| -      "Post delayed and idle tasks",
 | 
| -      "IsNotQuiescent @ 105",
 | 
| -      "CanEnterLongIdlePeriod @ 405",
 | 
| -      "run TimelineIdleTestTask deadline 425",  // Note the short 20ms deadline.
 | 
| -      "CanEnterLongIdlePeriod @ 425",
 | 
| -      "run RecordTimelineTask @ 425"};
 | 
| -
 | 
| -  EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest,
 | 
| -       TestIdleDeadlineWithPendingDelayedTaskFarInTheFuture) {
 | 
| -  std::vector<std::string> timeline;
 | 
| -  RecordTimelineEvents(&timeline);
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  timeline.push_back("Post delayed and idle tasks");
 | 
| -  // Post a delayed task timed to occur well after the long idle period.
 | 
| -  default_task_runner_->PostDelayedTask(
 | 
| -      FROM_HERE, base::Bind(&RecordTimelineTask, base::Unretained(&timeline),
 | 
| -                            base::Unretained(clock_.get())),
 | 
| -      base::TimeDelta::FromMilliseconds(1000));
 | 
| -  idle_task_runner_->PostIdleTask(FROM_HERE,
 | 
| -                                  base::Bind(&TimelineIdleTestTask, &timeline));
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -
 | 
| -  std::string expected_timeline[] = {
 | 
| -      "CanEnterLongIdlePeriod @ 5",
 | 
| -      "Post delayed and idle tasks",
 | 
| -      "IsNotQuiescent @ 105",
 | 
| -      "CanEnterLongIdlePeriod @ 405",
 | 
| -      "run TimelineIdleTestTask deadline 455",  // Note the full 50ms deadline.
 | 
| -      "CanEnterLongIdlePeriod @ 455",
 | 
| -      "run RecordTimelineTask @ 1005"};
 | 
| -
 | 
| -  EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest,
 | 
| -       TestPostIdleTaskAfterRunningUntilIdle_NoWakeUp) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  default_task_runner_->PostDelayedTask(
 | 
| -      FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
 | 
| -  RunUntilIdle();
 | 
| -
 | 
| -  // The delayed call to EnableLongIdlePeriod happened and it posted a call to
 | 
| -  // EnableLongIdlePeriod on the after wakeup control queue. Without an other
 | 
| -  // non-idle task posted, the idle tasks won't run.
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1 I2");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_TRUE(run_order.empty());
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest,
 | 
| -       TestPostIdleTaskAfterRunningUntilIdle_WithWakeUp) {
 | 
| -  InitAndPostDelayedWakeupTask();
 | 
| -
 | 
| -  default_task_runner_->PostDelayedTask(
 | 
| -      FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
 | 
| -  RunUntilIdle();
 | 
| -  // The delayed call to EnableLongIdlePeriod happened and it posted a call to
 | 
| -  // EnableLongIdlePeriod on the after wakeup control queue. Without an other
 | 
| -  // non-idle task posted, the idle tasks won't run.
 | 
| -
 | 
| -  std::vector<std::string> run_order;
 | 
| -  PostTestTasks(&run_order, "I1 I2 D3");
 | 
| -
 | 
| -  RunUntilIdle();
 | 
| -  EXPECT_THAT(run_order,
 | 
| -              testing::ElementsAre(std::string("D3"), std::string("I1"),
 | 
| -                                   std::string("I2")));
 | 
| -}
 | 
| -
 | 
| -TEST_F(WorkerSchedulerImplTest, TestLongIdlePeriodTimeline) {
 | 
| -  Init();
 | 
| -
 | 
| -  std::vector<std::string> timeline;
 | 
| -  RecordTimelineEvents(&timeline);
 | 
| -
 | 
| -  // The scheduler should not run the initiate_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 =
 | 
| -      scheduler_->CurrentIdleTaskDeadlineForTesting();
 | 
| -  clock_->AdvanceNow(maximum_idle_period_duration());
 | 
| -  RunUntilIdle();
 | 
| -
 | 
| -  base::TimeTicks new_idle_period_deadline =
 | 
| -      scheduler_->CurrentIdleTaskDeadlineForTesting();
 | 
| -  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.
 | 
| -  timeline.push_back("PostIdleTaskAfterWakeup");
 | 
| -  idle_task_runner_->PostIdleTaskAfterWakeup(
 | 
| -      FROM_HERE, base::Bind(&TimelineIdleTestTask, &timeline));
 | 
| -  RunUntilIdle();
 | 
| -  new_idle_period_deadline = scheduler_->CurrentIdleTaskDeadlineForTesting();
 | 
| -
 | 
| -  // Running a normal task should initiate a new long idle period after waiting
 | 
| -  // 300ms for quiescence.
 | 
| -  timeline.push_back("Post RecordTimelineTask");
 | 
| -  default_task_runner_->PostTask(
 | 
| -      FROM_HERE, base::Bind(&RecordTimelineTask, base::Unretained(&timeline),
 | 
| -                            base::Unretained(clock_.get())));
 | 
| -  RunUntilIdle();
 | 
| -
 | 
| -  std::string expected_timeline[] = {
 | 
| -      "RunUntilIdle begin @ 55",
 | 
| -      "RunUntilIdle end @ 55",
 | 
| -      "PostIdleTaskAfterWakeup",
 | 
| -      "RunUntilIdle begin @ 55",  // NOTE idle task doesn't run till later.
 | 
| -      "RunUntilIdle end @ 55",
 | 
| -      "Post RecordTimelineTask",
 | 
| -      "RunUntilIdle begin @ 55",
 | 
| -      "run RecordTimelineTask @ 55",
 | 
| -      "IsNotQuiescent @ 55",  // NOTE we have to wait for quiescence.
 | 
| -      "CanEnterLongIdlePeriod @ 355",
 | 
| -      "run TimelineIdleTestTask deadline 405",
 | 
| -      "CanEnterLongIdlePeriod @ 405",
 | 
| -      "RunUntilIdle end @ 455"};
 | 
| -
 | 
| -  EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
 | 
| -}
 | 
| -
 | 
| -}  // namespace content
 | 
| 
 |