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

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: InitOnThread needed to call Init() 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 scheduler_->Init();
48 }
49
50 ~WorkerSchedulerImplTest() override {}
51
52 void TearDown() override {
53 // Check that all tests stop posting tasks.
54 while (mock_task_runner_->RunUntilIdle()) {
55 }
56 }
57
58 void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); }
59
60 void PostDelayedWakeupTask() {
61 // WorkerSchedulerImpl::Init causes a delayed task to be posted on the
62 // after wakeup control runner. We need a task to wake the system up
63 // AFTER the delay for this has expired.
64 default_task_runner_->PostDelayedTask(
65 FROM_HERE,
66 base::Bind(&NopTask),
67 base::TimeDelta::FromMilliseconds(100));
68 }
69
70 // Helper for posting several tasks of specific types. |task_descriptor| is a
71 // string with space delimited task identifiers. The first letter of each
72 // task identifier specifies the task type:
73 // - 'D': Default task
74 // - 'I': Idle task
75 void PostTestTasks(std::vector<std::string>* run_order,
76 const std::string& task_descriptor) {
77 std::istringstream stream(task_descriptor);
78 while (!stream.eof()) {
79 std::string task;
80 stream >> task;
81 switch (task[0]) {
82 case 'D':
83 default_task_runner_->PostTask(
84 FROM_HERE, base::Bind(&AppendToVectorTestTask, run_order, task));
85 break;
86 case 'I':
87 idle_task_runner_->PostIdleTask(
88 FROM_HERE,
89 base::Bind(&AppendToVectorIdleTestTask, run_order, task));
90 break;
91 default:
92 NOTREACHED();
93 }
94 }
95 }
96
97 protected:
98 scoped_refptr<cc::TestNowSource> clock_;
99 // Only one of mock_task_runner_ or message_loop_ will be set.
100 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
101
102 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
103 scoped_ptr<WorkerSchedulerImpl> scheduler_;
104 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
105 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
106
107 DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerImplTest);
108 };
109
110 TEST_F(WorkerSchedulerImplTest, TestPostDefaultTask) {
111 PostDelayedWakeupTask();
112
113 std::vector<std::string> run_order;
114 PostTestTasks(&run_order, "D1 D2 D3 D4");
115
116 RunUntilIdle();
117 EXPECT_THAT(run_order,
118 testing::ElementsAre(std::string("D1"), std::string("D2"),
119 std::string("D3"), std::string("D4")));
120 }
121
122 TEST_F(WorkerSchedulerImplTest, TestPostIdleTask) {
123 PostDelayedWakeupTask();
124
125 std::vector<std::string> run_order;
126 PostTestTasks(&run_order, "I1");
127
128 RunUntilIdle();
129 EXPECT_THAT(run_order, testing::ElementsAre(std::string("I1")));
130 }
131
132 TEST_F(WorkerSchedulerImplTest, TestPostIdleTask_NoWakeup) {
133 std::vector<std::string> run_order;
134 PostTestTasks(&run_order, "I1");
135
136 RunUntilIdle();
137 EXPECT_TRUE(run_order.empty());
rmcilroy 2015/04/02 11:01:26 Hmm, I see why this is happening but I'm wondering
138 }
139
140 TEST_F(WorkerSchedulerImplTest, TestPostDefaultAndIdleTasks) {
141 PostDelayedWakeupTask();
142
143 std::vector<std::string> run_order;
144 PostTestTasks(&run_order, "I1 D2 D3 D4");
145
146 RunUntilIdle();
147 EXPECT_THAT(run_order,
148 testing::ElementsAre(std::string("D2"), std::string("D3"),
149 std::string("D4"), std::string("I1")));
150 }
151
152 TEST_F(WorkerSchedulerImplTest, TestPostIdleTaskWithWakeupNeeded_NoWakeup) {
153 PostDelayedWakeupTask();
154
155 RunUntilIdle();
156 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
157 // InitiateLongIdlePeriod on the after wakeup control queue.
158
159 std::vector<std::string> run_order;
160 PostTestTasks(&run_order, "I1");
161
162 RunUntilIdle();
163 EXPECT_TRUE(run_order.empty());
164 }
165
166 TEST_F(WorkerSchedulerImplTest, TestPostIdleTaskWithWakeupNeeded_Wakeup) {
167 RunUntilIdle();
168 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
169 // InitiateLongIdlePeriod on the after wakeup control queue.
170
171 std::vector<std::string> run_order;
172 PostTestTasks(&run_order, "I1 D2");
173
174 RunUntilIdle();
175 EXPECT_THAT(run_order,
176 testing::ElementsAre(std::string("D2"), std::string("I1")));
177 }
178
179 TEST_F(WorkerSchedulerImplTest, TestPostDefaultDelayedAndIdleTasks) {
180 PostDelayedWakeupTask();
181
182 std::vector<std::string> run_order;
183 PostTestTasks(&run_order, "I1 D2 D3 D4");
184
185 default_task_runner_->PostDelayedTask(
186 FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "DELAYED"),
187 base::TimeDelta::FromMilliseconds(1000));
188
189 RunUntilIdle();
190 EXPECT_THAT(run_order,
191 testing::ElementsAre(std::string("D2"), std::string("D3"),
192 std::string("D4"), std::string("I1"),
193 std::string("DELAYED")));
194 }
195
196 TEST_F(WorkerSchedulerImplTest, TestIdleDeadlineWithPendingDelayedTask) {
197 PostDelayedWakeupTask();
198
199 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(140);
200 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay);
201 base::TimeTicks deadline;
202 idle_task_runner_->PostIdleTask(FROM_HERE,
203 base::Bind(&IdleTestTask, &deadline));
204
205 base::TimeTicks expected_deadline = clock_->Now() + delay;
206 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
207
208 RunUntilIdle();
209 EXPECT_EQ(expected_deadline, deadline);
210 }
211
212 TEST_F(WorkerSchedulerImplTest,
213 TestIdleDeadlineWithPendingDelayedTaskFarInTheFuture) {
214 PostDelayedWakeupTask();
215
216 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(1000);
217 base::TimeTicks task_run_time = clock_->Now() + delay;
218 default_task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay);
219 base::TimeTicks deadline;
220 idle_task_runner_->PostIdleTask(FROM_HERE,
221 base::Bind(&IdleTestTask, &deadline));
222
223 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
224
225 RunUntilIdle();
226 EXPECT_LT(deadline, task_run_time);
227 }
228
229 TEST_F(WorkerSchedulerImplTest,
230 TestPostIdleTaskAfterRunningUntilIdle_NoWakeUp) {
231 PostDelayedWakeupTask();
232
233 default_task_runner_->PostDelayedTask(
234 FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
235 RunUntilIdle();
236
237 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
238 // InitiateLongIdlePeriod on the after wakeup control queue. Without an other
239 // non-idle task posted, the idle tasks won't run.
240 std::vector<std::string> run_order;
241 PostTestTasks(&run_order, "I1 I2");
242
243 RunUntilIdle();
244 EXPECT_TRUE(run_order.empty());
245 }
246
247 TEST_F(WorkerSchedulerImplTest,
248 TestPostIdleTaskAfterRunningUntilIdle_WithWakeUp) {
249
250 PostDelayedWakeupTask();
251
252 default_task_runner_->PostDelayedTask(
253 FROM_HERE, base::Bind(&NopTask), base::TimeDelta::FromMilliseconds(1000));
254 RunUntilIdle();
255 // The delayed call to InitiateLongIdlePeriod happened and it posted a call to
256 // InitiateLongIdlePeriod on the after wakeup control queue. Without an other
257 // non-idle task posted, the idle tasks won't run.
258
259 std::vector<std::string> run_order;
260 PostTestTasks(&run_order, "I1 I2 D3");
261
262 RunUntilIdle();
263 EXPECT_THAT(run_order,
264 testing::ElementsAre(std::string("D3"), std::string("I1"),
265 std::string("I2")));
266 }
267
rmcilroy 2015/04/02 11:01:26 could you also add a test similar to SchedulerHel
alex clarke (OOO till 29th) 2015/04/02 15:19:28 Done.
268 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698