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
3 // found in the LICENSE file.
5 #include "content/renderer/scheduler/deadline_task_runner.h"
7 #include "cc/test/ordered_simple_task_runner.h"
8 #include "cc/test/test_now_source.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
14 class DeadlineTaskRunnerTest
: public testing::Test
{
16 DeadlineTaskRunnerTest() {}
17 ~DeadlineTaskRunnerTest() override
{}
19 void SetUp() override
{
20 clock_
= cc::TestNowSource::Create(5000);
21 mock_task_runner_
= new cc::OrderedSimpleTaskRunner(clock_
, true);
22 deadline_task_runner_
.reset(new DeadlineTaskRunner(
23 base::Bind(&DeadlineTaskRunnerTest::TestTask
, base::Unretained(this)),
28 bool RunUntilIdle() { return mock_task_runner_
->RunUntilIdle(); }
30 void TestTask() { run_times_
.push_back(clock_
->Now()); }
32 scoped_refptr
<cc::TestNowSource
> clock_
;
33 scoped_refptr
<cc::OrderedSimpleTaskRunner
> mock_task_runner_
;
34 scoped_ptr
<DeadlineTaskRunner
> deadline_task_runner_
;
35 std::vector
<base::TimeTicks
> run_times_
;
38 TEST_F(DeadlineTaskRunnerTest
, RunOnce
) {
39 base::TimeTicks start_time
= clock_
->Now();
40 base::TimeDelta delay
= base::TimeDelta::FromMilliseconds(10);
41 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay
, clock_
->Now());
44 EXPECT_THAT(run_times_
, testing::ElementsAre(start_time
+ delay
));
47 TEST_F(DeadlineTaskRunnerTest
, RunTwice
) {
48 base::TimeDelta delay1
= base::TimeDelta::FromMilliseconds(10);
49 base::TimeTicks deadline1
= clock_
->Now() + delay1
;
50 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay1
, clock_
->Now());
53 base::TimeDelta delay2
= base::TimeDelta::FromMilliseconds(100);
54 base::TimeTicks deadline2
= clock_
->Now() + delay2
;
55 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay2
, clock_
->Now());
58 EXPECT_THAT(run_times_
, testing::ElementsAre(deadline1
, deadline2
));
61 TEST_F(DeadlineTaskRunnerTest
, EarlierDeadlinesTakePrecidence
) {
62 base::TimeTicks start_time
= clock_
->Now();
63 base::TimeDelta delay1
= base::TimeDelta::FromMilliseconds(1);
64 base::TimeDelta delay10
= base::TimeDelta::FromMilliseconds(10);
65 base::TimeDelta delay100
= base::TimeDelta::FromMilliseconds(100);
66 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay100
, clock_
->Now());
67 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay10
, clock_
->Now());
68 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay1
, clock_
->Now());
72 EXPECT_THAT(run_times_
, testing::ElementsAre(start_time
+ delay1
));
75 TEST_F(DeadlineTaskRunnerTest
, LaterDeadlinesIgnored
) {
76 base::TimeTicks start_time
= clock_
->Now();
77 base::TimeDelta delay100
= base::TimeDelta::FromMilliseconds(100);
78 base::TimeDelta delay10000
= base::TimeDelta::FromMilliseconds(10000);
79 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay100
, clock_
->Now());
80 deadline_task_runner_
->SetDeadline(FROM_HERE
, delay10000
, clock_
->Now());
84 EXPECT_THAT(run_times_
, testing::ElementsAre(start_time
+ delay100
));
87 TEST_F(DeadlineTaskRunnerTest
, DeleteDeadlineTaskRunnerAfterPosting
) {
88 deadline_task_runner_
->SetDeadline(
89 FROM_HERE
, base::TimeDelta::FromMilliseconds(10), clock_
->Now());
91 // Deleting the pending task should cancel it.
92 deadline_task_runner_
.reset(nullptr);
95 EXPECT_TRUE(run_times_
.empty());
98 } // namespace content