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

Side by Side Diff: content/child/scheduler/worker_scheduler_impl_unittest.cc

Issue 1033643004: Add a WorkerScheduler and a WebThreadImplForWorker (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Correct Diffbase Created 5 years, 8 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 unified diff | Download patch
OLDNEW
(Empty)
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.
4
5 #include "content/child/scheduler/worker_scheduler_impl.h"
6
7 #include "base/callback.h"
8 #include "cc/test/ordered_simple_task_runner.h"
9 #include "content/child/scheduler/nestable_task_runner_for_test.h"
10 #include "content/child/scheduler/scheduler_message_loop_delegate.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace content {
15
16 namespace {
17 void NopTask() {
18 }
19
20 void AppendToVectorTestTask(std::vector<std::string>* vector,
21 std::string value) {
22 vector->push_back(value);
23 }
24
25 void AppendToVectorIdleTestTask(std::vector<std::string>* vector,
26 std::string value,
27 base::TimeTicks deadline) {
28 AppendToVectorTestTask(vector, value);
29 }
30
31 void IdleTestTask(base::TimeTicks* deadline_out, base::TimeTicks deadline) {
32 *deadline_out = deadline;
33 }
34 }; // namespace
35
36 class WorkerSchedulerImplTest : public testing::Test {
37 public:
38 WorkerSchedulerImplTest()
39 : clock_(cc::TestNowSource::Create(5000)),
40 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, true)),
41 nestable_task_runner_(
42 NestableTaskRunnerForTest::Create(mock_task_runner_)),
43 scheduler_(new WorkerSchedulerImpl(nestable_task_runner_)),
44 default_task_runner_(scheduler_->DefaultTaskRunner()),
45 idle_task_runner_(scheduler_->IdleTaskRunner()) {
46 scheduler_->SetTimeSourceForTesting(clock_);
47 }
48
49 ~WorkerSchedulerImplTest() override {}
50
51 void TearDown() override {
52 // Check that all tests stop posting tasks.
53 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
54 while (mock_task_runner_->RunUntilIdle()) {
55 }
56 }
57
58 void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); }
59
60 // Helper for posting several tasks of specific types. |task_descriptor| is a
61 // string with space delimited task identifiers. The first letter of each
62 // task identifier specifies the task type:
63 // - 'D': Default task
64 // - 'I': Idle task
65 void PostTestTasks(std::vector<std::string>* run_order,
66 const std::string& task_descriptor) {
67 std::istringstream stream(task_descriptor);
68 while (!stream.eof()) {
69 std::string task;
70 stream >> task;
71 switch (task[0]) {
72 case 'D':
73 default_task_runner_->PostTask(
74 FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task));
75 break;
76 case 'I':
77 idle_task_runner_->PostIdleTask(
78 FROM_HERE,
79 base::Bind(&AppendToVectorIdleTestTask, run_order, task));
80 break;
81 default:
82 NOTREACHED();
83 }
84 }
85 }
86
87 protected:
88 scoped_refptr<cc::TestNowSource> clock_;
89 // Only one of mock_task_runner_ or message_loop_ will be set.
90 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
91
92 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
93 scoped_ptr<WorkerSchedulerImpl> scheduler_;
94 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
95 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
96
97 DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerImplTest);
98 };
99
100 TEST_F(WorkerSchedulerImplTest, TestPostDefaultTask) {
101 std::vector<std::string> run_order;
102 PostTestTasks(&run_order, "D1 D2 D3 D4");
103
104 RunUntilIdle();
105 EXPECT_THAT(run_order,
106 testing::ElementsAre(std::string("D1"), std::string("D2"),
107 std::string("D3"), std::string("D4")));
108 }
109
110 TEST_F(WorkerSchedulerImplTest, TestPostIdleTask) {
111 std::vector<std::string> run_order;
112 PostTestTasks(&run_order, "I1");
113
114 RunUntilIdle();
115 EXPECT_THAT(run_order, testing::ElementsAre(std::string("I1")));
116 }
117
118 TEST_F(WorkerSchedulerImplTest, TestPostDefaultAndIdleTasks) {
119 std::vector<std::string> run_order;
120 PostTestTasks(&run_order, "I1 D2 D3 D4");
121
122 RunUntilIdle();
123 EXPECT_THAT(run_order,
124 testing::ElementsAre(std::string("D2"), std::string("D3"),
125 std::string("D4"), std::string("I1")));
126 }
127
128 TEST_F(WorkerSchedulerImplTest, TestPostIdleTaskWithWakeupNeeded_NoWakeup) {
129 RunUntilIdle();
130 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
131 // InitiateLongIdlePeriod on the after wakeup control queue.
132
133 std::vector<std::string> run_order;
134 PostTestTasks(&run_order, "I1");
135
136 RunUntilIdle();
137 EXPECT_TRUE(run_order.empty());
138 }
139
140 TEST_F(WorkerSchedulerImplTest, TestPostIdleTaskWithWakeupNeeded_Wakeup) {
141 RunUntilIdle();
142 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
143 // InitiateLongIdlePeriod on the after wakeup control queue.
144
145 std::vector<std::string> run_order;
146 PostTestTasks(&run_order, "I1 D2");
147
148 RunUntilIdle();
149 EXPECT_THAT(run_order,
150 testing::ElementsAre(std::string("D2"), std::string("I1")));
151 }
152
153 TEST_F(WorkerSchedulerImplTest, TestPostDefaultDelayedAndIdleTasks) {
154 std::vector<std::string> run_order;
155 PostTestTasks(&run_order, "I1 D2 D3 D4");
156
157 default_task_runner_->PostDelayedTask(
158 FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "DELAYED"),
159 base::TimeDelta::FromMilliseconds(1000));
160
161 RunUntilIdle();
162 EXPECT_THAT(run_order,
163 testing::ElementsAre(std::string("D2"), std::string("D3"),
164 std::string("D4"), std::string("I1"),
165 std::string("DELAYED")));
166 }
167
168 TEST_F(WorkerSchedulerImplTest, TestIdleDeadlineWithPendingDelayedTask) {
169 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(140);
170 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay);
171 base::TimeTicks deadline;
172 idle_task_runner_->PostIdleTask(FROM_HERE,
173 base::Bind(&IdleTestTask, &deadline));
174
175 base::TimeTicks expected_deadline = clock_->Now() + delay;
176 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
177
178 RunUntilIdle();
179 EXPECT_EQ(expected_deadline, deadline);
180 }
181
182 TEST_F(WorkerSchedulerImplTest,
183 TestIdleDeadlineWithPendingDelayedTaskFarInTheFuture) {
184 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000);
185 base::TimeTicks task_run_time = clock_->Now() + delay;
186 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay);
187 base::TimeTicks deadline;
188 idle_task_runner_->PostIdleTask(FROM_HERE,
189 base::Bind(&IdleTestTask, &deadline));
190
191 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
192
193 RunUntilIdle();
194 EXPECT_LT(deadline, task_run_time);
195 }
196
197 TEST_F(WorkerSchedulerImplTest,
198 TestPostIdleTaskAfterRunningUntilIdle_NoWakeUp) {
199 default_task_runner_->PostDelayedTask(
200 FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
201 RunUntilIdle();
202 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
203 // InitiateLongIdlePeriod on the after wakeup control queue.
204
205 std::vector<std::string> run_order;
206 PostTestTasks(&run_order, "I1 I2");
207
208 RunUntilIdle();
209 EXPECT_TRUE(run_order.empty());
210 }
211
212 TEST_F(WorkerSchedulerImplTest,
213 TestPostIdleTaskAfterRunningUntilIdle_WithWakeUp) {
214 default_task_runner_->PostDelayedTask(
215 FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
216 RunUntilIdle();
217 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
218 // InitiateLongIdlePeriod on the after wakeup control queue.
219
220 std::vector<std::string> run_order;
221 PostTestTasks(&run_order, "I1 I2 D3");
222
223 RunUntilIdle();
224 EXPECT_THAT(run_order,
225 testing::ElementsAre(std::string("D3"), std::string("I1"),
226 std::string("I2")));
227 }
228
229 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698