Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Unified Diff: components/scheduler/child/worker_scheduler_impl_unittest.cc

Issue 2118903002: scheduler: Move the Blink scheduler into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/scheduler/child/worker_scheduler_impl_unittest.cc
diff --git a/components/scheduler/child/worker_scheduler_impl_unittest.cc b/components/scheduler/child/worker_scheduler_impl_unittest.cc
deleted file mode 100644
index c5ff4a6253e1924854dac05190a7bf6da6815374..0000000000000000000000000000000000000000
--- a/components/scheduler/child/worker_scheduler_impl_unittest.cc
+++ /dev/null
@@ -1,385 +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/worker_scheduler_impl.h"
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "cc/test/ordered_simple_task_runner.h"
-#include "components/scheduler/base/test_time_source.h"
-#include "components/scheduler/child/scheduler_tqm_delegate_for_test.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::ElementsAreArray;
-
-namespace scheduler {
-
-namespace {
-void NopTask() {
-}
-
-int TimeTicksToIntMs(const base::TimeTicks& time) {
- return static_cast<int>((time - base::TimeTicks()).InMilliseconds());
-}
-
-void RecordTimelineTask(std::vector<std::string>* timeline,
- base::SimpleTestTickClock* clock) {
- timeline->push_back(base::StringPrintf("run RecordTimelineTask @ %d",
- TimeTicksToIntMs(clock->NowTicks())));
-}
-
-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<SchedulerTqmDelegate> main_task_runner,
- base::SimpleTestTickClock* 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_->NowTicks())));
- }
- WorkerSchedulerImpl::IsNotQuiescent();
- }
-
- base::SimpleTestTickClock* clock_; // NOT OWNED
- std::vector<std::string>* timeline_; // NOT OWNED
-};
-
-class WorkerSchedulerImplTest : public testing::Test {
- public:
- WorkerSchedulerImplTest()
- : clock_(new base::SimpleTestTickClock()),
- mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_.get(), true)),
- main_task_runner_(SchedulerTqmDelegateForTest::Create(
- mock_task_runner_,
- base::WrapUnique(new TestTimeSource(clock_.get())))),
- scheduler_(
- new WorkerSchedulerImplForTest(main_task_runner_, clock_.get())),
- timeline_(nullptr) {
- clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
- }
-
- ~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_->NowTicks())));
- }
- mock_task_runner_->RunUntilIdle();
- if (timeline_) {
- timeline_->push_back(base::StringPrintf(
- "RunUntilIdle end @ %d", TimeTicksToIntMs(clock_->NowTicks())));
- }
- }
-
- // 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(
- IdleHelper::kMaximumIdlePeriodMillis);
- }
-
- protected:
- 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_;
-
- scoped_refptr<SchedulerTqmDelegate> main_task_runner_;
- std::unique_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) {
- Init();
-
- 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) {
- Init();
-
- std::vector<std::string> run_order;
- PostTestTasks(&run_order, "I1");
-
- RunUntilIdle();
- EXPECT_THAT(run_order, testing::ElementsAre(std::string("I1")));
-}
-
-TEST_F(WorkerSchedulerImplTest, TestPostDefaultAndIdleTasks) {
- Init();
-
- 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, TestPostDefaultDelayedAndIdleTasks) {
- Init();
-
- 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, TestIdleTaskWhenIsNotQuiescent) {
- std::vector<std::string> timeline;
- RecordTimelineEvents(&timeline);
- Init();
-
- timeline.push_back("Post default task");
- // Post a delayed task timed to occur mid way during the long idle period.
- default_task_runner_->PostTask(
- FROM_HERE, base::Bind(&RecordTimelineTask, base::Unretained(&timeline),
- base::Unretained(clock_.get())));
- RunUntilIdle();
-
- timeline.push_back("Post idle task");
- idle_task_runner_->PostIdleTask(FROM_HERE,
- base::Bind(&TimelineIdleTestTask, &timeline));
-
- RunUntilIdle();
-
- std::string expected_timeline[] = {"CanEnterLongIdlePeriod @ 5",
- "Post default task",
- "run RecordTimelineTask @ 5",
- "Post idle task",
- "IsNotQuiescent @ 5",
- "CanEnterLongIdlePeriod @ 305",
- "run TimelineIdleTestTask deadline 355"};
-
- EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
-}
-
-TEST_F(WorkerSchedulerImplTest, TestIdleDeadlineWithPendingDelayedTask) {
- std::vector<std::string> timeline;
- RecordTimelineEvents(&timeline);
- Init();
-
- 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(20));
- idle_task_runner_->PostIdleTask(FROM_HERE,
- base::Bind(&TimelineIdleTestTask, &timeline));
-
- RunUntilIdle();
-
- std::string expected_timeline[] = {
- "CanEnterLongIdlePeriod @ 5",
- "Post delayed and idle tasks",
- "CanEnterLongIdlePeriod @ 5",
- "run TimelineIdleTestTask deadline 25", // Note the short 20ms deadline.
- "run RecordTimelineTask @ 25"};
-
- EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
-}
-
-TEST_F(WorkerSchedulerImplTest,
- TestIdleDeadlineWithPendingDelayedTaskFarInTheFuture) {
- std::vector<std::string> timeline;
- RecordTimelineEvents(&timeline);
- Init();
-
- 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(500));
- idle_task_runner_->PostIdleTask(FROM_HERE,
- base::Bind(&TimelineIdleTestTask, &timeline));
-
- RunUntilIdle();
-
- std::string expected_timeline[] = {
- "CanEnterLongIdlePeriod @ 5",
- "Post delayed and idle tasks",
- "CanEnterLongIdlePeriod @ 5",
- "run TimelineIdleTestTask deadline 55", // Note the full 50ms deadline.
- "run RecordTimelineTask @ 505"};
-
- EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
-}
-
-TEST_F(WorkerSchedulerImplTest, TestPostIdleTaskAfterRunningUntilIdle) {
- Init();
-
- default_task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
- RunUntilIdle();
-
- 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_->Advance(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",
- "RunUntilIdle end @ 355"};
-
- EXPECT_THAT(timeline, ElementsAreArray(expected_timeline));
-}
-
-} // namespace scheduler
« no previous file with comments | « components/scheduler/child/worker_scheduler_impl.cc ('k') | components/scheduler/common/scheduler_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698