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

Side by Side Diff: components/scheduler/child/task_queue_manager_unittest.cc

Issue 1374653003: scheduler: Add a base directory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed gn clobber build. Created 5 years, 2 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 2014 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 "components/scheduler/child/task_queue_manager.h"
6
7 #include "base/location.h"
8 #include "base/run_loop.h"
9 #include "base/single_thread_task_runner.h"
10 #include "base/test/simple_test_tick_clock.h"
11 #include "base/threading/thread.h"
12 #include "cc/test/ordered_simple_task_runner.h"
13 #include "components/scheduler/child/nestable_task_runner_for_test.h"
14 #include "components/scheduler/child/scheduler_task_runner_delegate_impl.h"
15 #include "components/scheduler/child/task_queue_impl.h"
16 #include "components/scheduler/child/task_queue_selector.h"
17 #include "components/scheduler/child/task_queue_sets.h"
18 #include "components/scheduler/child/test_time_source.h"
19 #include "components/scheduler/test/test_always_fail_time_source.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21
22 using testing::ElementsAre;
23 using testing::_;
24
25 namespace scheduler {
26
27 class TaskQueueManagerTest : public testing::Test {
28 public:
29 void DeleteTaskQueueManager() { manager_.reset(); }
30
31 protected:
32 void Initialize(size_t num_queues) {
33 now_src_.reset(new base::SimpleTestTickClock());
34 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000));
35 test_task_runner_ = make_scoped_refptr(
36 new cc::OrderedSimpleTaskRunner(now_src_.get(), false));
37 main_task_runner_ =
38 NestableTaskRunnerForTest::Create(test_task_runner_.get());
39 manager_ = make_scoped_ptr(new TaskQueueManager(
40 main_task_runner_, "test.scheduler", "test.scheduler.debug"));
41 manager_->SetTimeSourceForTesting(
42 make_scoped_ptr(new TestTimeSource(now_src_.get())));
43
44 for (size_t i = 0; i < num_queues; i++)
45 runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue")));
46 }
47
48 void InitializeWithRealMessageLoop(size_t num_queues) {
49 message_loop_.reset(new base::MessageLoop());
50 manager_ = make_scoped_ptr(new TaskQueueManager(
51 SchedulerTaskRunnerDelegateImpl::Create(message_loop_.get()),
52 "test.scheduler", "test.scheduler.debug"));
53
54 for (size_t i = 0; i < num_queues; i++)
55 runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue")));
56 }
57
58 scoped_ptr<base::MessageLoop> message_loop_;
59 scoped_ptr<base::SimpleTestTickClock> now_src_;
60 scoped_refptr<NestableTaskRunnerForTest> main_task_runner_;
61 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
62 scoped_ptr<TaskQueueManager> manager_;
63 std::vector<scoped_refptr<internal::TaskQueueImpl>> runners_;
64 };
65
66 void PostFromNestedRunloop(base::MessageLoop* message_loop,
67 base::SingleThreadTaskRunner* runner,
68 std::vector<std::pair<base::Closure, bool>>* tasks) {
69 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
70 for (std::pair<base::Closure, bool>& pair : *tasks) {
71 if (pair.second) {
72 runner->PostTask(FROM_HERE, pair.first);
73 } else {
74 runner->PostNonNestableTask(FROM_HERE, pair.first);
75 }
76 }
77 message_loop->RunUntilIdle();
78 }
79
80 void NullTask() {
81 }
82
83 void TestTask(int value, std::vector<int>* out_result) {
84 out_result->push_back(value);
85 }
86
87 TEST_F(TaskQueueManagerTest, SingleQueuePosting) {
88 Initialize(1u);
89
90 std::vector<int> run_order;
91 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
92 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
93 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
94
95 test_task_runner_->RunUntilIdle();
96 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
97 }
98
99 TEST_F(TaskQueueManagerTest, MultiQueuePosting) {
100 Initialize(3u);
101
102 std::vector<int> run_order;
103 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
104 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
105 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
106 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
107 runners_[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
108 runners_[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order));
109
110 test_task_runner_->RunUntilIdle();
111 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5, 6));
112 }
113
114 void NopTask() {
115 }
116
117 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) {
118 Initialize(3u);
119
120 manager_->SetTimeSourceForTesting(
121 make_scoped_ptr(new TestAlwaysFailTimeSource()));
122
123 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
124 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
125 runners_[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
126 runners_[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
127 runners_[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
128 runners_[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
129
130 test_task_runner_->RunUntilIdle();
131 }
132
133 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
134 InitializeWithRealMessageLoop(1u);
135
136 std::vector<int> run_order;
137 runners_[0]->PostNonNestableTask(FROM_HERE,
138 base::Bind(&TestTask, 1, &run_order));
139
140 message_loop_->RunUntilIdle();
141 EXPECT_THAT(run_order, ElementsAre(1));
142 }
143
144 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) {
145 InitializeWithRealMessageLoop(1u);
146
147 std::vector<int> run_order;
148 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
149 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
150 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
151 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
152 runners_[0]->PostNonNestableTask(FROM_HERE,
153 base::Bind(&TestTask, 5, &run_order));
154
155 message_loop_->RunUntilIdle();
156 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5));
157 }
158
159 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) {
160 InitializeWithRealMessageLoop(1u);
161
162 std::vector<int> run_order;
163 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
164 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
165
166 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
167 tasks_to_post_from_nested_loop.push_back(
168 std::make_pair(base::Bind(&TestTask, 3, &run_order), false));
169 tasks_to_post_from_nested_loop.push_back(
170 std::make_pair(base::Bind(&TestTask, 4, &run_order), true));
171 tasks_to_post_from_nested_loop.push_back(
172 std::make_pair(base::Bind(&TestTask, 5, &run_order), true));
173
174 runners_[0]->PostTask(
175 FROM_HERE,
176 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runners_[0],
177 base::Unretained(&tasks_to_post_from_nested_loop)));
178
179 message_loop_->RunUntilIdle();
180 // Note we expect task 3 to run last because it's non-nestable.
181 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3));
182 }
183
184 TEST_F(TaskQueueManagerTest, QueuePolling) {
185 Initialize(1u);
186
187 std::vector<int> run_order;
188 EXPECT_TRUE(runners_[0]->IsQueueEmpty());
189 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
190 EXPECT_FALSE(runners_[0]->IsQueueEmpty());
191
192 test_task_runner_->RunUntilIdle();
193 EXPECT_TRUE(runners_[0]->IsQueueEmpty());
194 }
195
196 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) {
197 Initialize(1u);
198
199 std::vector<int> run_order;
200 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
201 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
202 delay);
203 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
204 EXPECT_TRUE(runners_[0]->IsQueueEmpty());
205 EXPECT_TRUE(run_order.empty());
206
207 // The task doesn't run before the delay has completed.
208 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
209 EXPECT_TRUE(run_order.empty());
210
211 // After the delay has completed, the task runs normally.
212 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
213 EXPECT_THAT(run_order, ElementsAre(1));
214 }
215
216 bool MessageLoopTaskCounter(size_t* count) {
217 *count = *count + 1;
218 return true;
219 }
220
221 TEST_F(TaskQueueManagerTest, DelayedTaskExecutedInOneMessageLoopTask) {
222 Initialize(1u);
223
224 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
225 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay);
226
227 size_t task_count = 0;
228 test_task_runner_->RunTasksWhile(
229 base::Bind(&MessageLoopTaskCounter, &task_count));
230 EXPECT_EQ(1u, task_count);
231 }
232
233 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_DecendingOrder) {
234 Initialize(1u);
235
236 std::vector<int> run_order;
237 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
238 base::TimeDelta::FromMilliseconds(10));
239
240 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
241 base::TimeDelta::FromMilliseconds(8));
242
243 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
244 base::TimeDelta::FromMilliseconds(5));
245
246 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
247 test_task_runner_->DelayToNextTaskTime());
248
249 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
250 EXPECT_THAT(run_order, ElementsAre(3));
251 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
252 test_task_runner_->DelayToNextTaskTime());
253
254 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
255 EXPECT_THAT(run_order, ElementsAre(3, 2));
256 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
257 test_task_runner_->DelayToNextTaskTime());
258
259 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
260 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
261 }
262
263 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_AscendingOrder) {
264 Initialize(1u);
265
266 std::vector<int> run_order;
267 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
268 base::TimeDelta::FromMilliseconds(1));
269
270 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
271 base::TimeDelta::FromMilliseconds(5));
272
273 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
274 base::TimeDelta::FromMilliseconds(10));
275
276 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1),
277 test_task_runner_->DelayToNextTaskTime());
278
279 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
280 EXPECT_THAT(run_order, ElementsAre(1));
281 EXPECT_EQ(base::TimeDelta::FromMilliseconds(4),
282 test_task_runner_->DelayToNextTaskTime());
283
284 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(4));
285 EXPECT_THAT(run_order, ElementsAre(1, 2));
286 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
287 test_task_runner_->DelayToNextTaskTime());
288
289 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
290 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
291 }
292
293 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesUnderlyingDelayedTasks) {
294 Initialize(1u);
295
296 std::vector<int> run_order;
297 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
298 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
299 delay);
300 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
301 delay);
302 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
303 delay);
304
305 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
306 }
307
308 class TestObject {
309 public:
310 ~TestObject() { destructor_count_++; }
311
312 void Run() { FAIL() << "TestObject::Run should not be called"; }
313
314 static int destructor_count_;
315 };
316
317 int TestObject::destructor_count_ = 0;
318
319 TEST_F(TaskQueueManagerTest, PendingDelayedTasksRemovedOnShutdown) {
320 Initialize(1u);
321
322 TestObject::destructor_count_ = 0;
323
324 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
325 runners_[0]->PostDelayedTask(
326 FROM_HERE, base::Bind(&TestObject::Run, base::Owned(new TestObject())),
327 delay);
328 runners_[0]->PostTask(
329 FROM_HERE, base::Bind(&TestObject::Run, base::Owned(new TestObject())));
330
331 manager_.reset();
332
333 EXPECT_EQ(2, TestObject::destructor_count_);
334 }
335
336 TEST_F(TaskQueueManagerTest, ManualPumping) {
337 Initialize(1u);
338 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
339
340 std::vector<int> run_order;
341 // Posting a task when pumping is disabled doesn't result in work getting
342 // posted.
343 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
344 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
345
346 // However polling still works.
347 EXPECT_FALSE(runners_[0]->IsQueueEmpty());
348
349 // After pumping the task runs normally.
350 runners_[0]->PumpQueue();
351 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
352 test_task_runner_->RunUntilIdle();
353 EXPECT_THAT(run_order, ElementsAre(1));
354 }
355
356 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
357 Initialize(1u);
358 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
359
360 std::vector<int> run_order;
361 // Posting a task when pumping is disabled doesn't result in work getting
362 // posted.
363 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
364 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
365
366 // When pumping is enabled the task runs normally.
367 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
368 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
369 test_task_runner_->RunUntilIdle();
370 EXPECT_THAT(run_order, ElementsAre(1));
371 }
372
373 TEST_F(TaskQueueManagerTest, DenyRunning_BeforePosting) {
374 Initialize(1u);
375
376 std::vector<int> run_order;
377 runners_[0]->SetQueuePriority(TaskQueue::DISABLED_PRIORITY);
378 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
379
380 test_task_runner_->RunUntilIdle();
381 EXPECT_TRUE(run_order.empty());
382
383 runners_[0]->SetQueuePriority(TaskQueue::NORMAL_PRIORITY);
384 test_task_runner_->RunUntilIdle();
385 EXPECT_THAT(run_order, ElementsAre(1));
386 }
387
388 TEST_F(TaskQueueManagerTest, DenyRunning_AfterPosting) {
389 Initialize(1u);
390
391 std::vector<int> run_order;
392 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
393 runners_[0]->SetQueuePriority(TaskQueue::DISABLED_PRIORITY);
394
395 test_task_runner_->RunUntilIdle();
396 EXPECT_TRUE(run_order.empty());
397
398 runners_[0]->SetQueuePriority(TaskQueue::NORMAL_PRIORITY);
399 test_task_runner_->RunUntilIdle();
400 EXPECT_THAT(run_order, ElementsAre(1));
401 }
402
403 TEST_F(TaskQueueManagerTest, DenyRunning_ManuallyPumpedTransitionsToAuto) {
404 Initialize(1u);
405
406 std::vector<int> run_order;
407 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
408 runners_[0]->SetQueuePriority(TaskQueue::DISABLED_PRIORITY);
409 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
410
411 test_task_runner_->RunUntilIdle();
412 EXPECT_TRUE(run_order.empty());
413
414 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
415 runners_[0]->SetQueuePriority(TaskQueue::NORMAL_PRIORITY);
416 test_task_runner_->RunUntilIdle();
417 EXPECT_THAT(run_order, ElementsAre(1));
418 }
419
420 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
421 Initialize(1u);
422 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
423
424 std::vector<int> run_order;
425 // Posting a delayed task when pumping will apply the delay, but won't cause
426 // work to executed afterwards.
427 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
428 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
429 delay);
430
431 // After pumping but before the delay period has expired, task does not run.
432 runners_[0]->PumpQueue();
433 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
434 EXPECT_TRUE(run_order.empty());
435
436 // Once the delay has expired, pumping causes the task to run.
437 now_src_->Advance(base::TimeDelta::FromMilliseconds(5));
438 runners_[0]->PumpQueue();
439 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
440 test_task_runner_->RunPendingTasks();
441 EXPECT_THAT(run_order, ElementsAre(1));
442 }
443
444 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
445 Initialize(1u);
446 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
447
448 std::vector<int> run_order;
449 // Posting a delayed task when pumping will apply the delay, but won't cause
450 // work to executed afterwards.
451 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
452 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
453 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20));
454 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
455 delay1);
456 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
457 delay2);
458 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
459 delay3);
460
461 now_src_->Advance(base::TimeDelta::FromMilliseconds(15));
462 test_task_runner_->RunUntilIdle();
463 EXPECT_TRUE(run_order.empty());
464
465 // Once the delay has expired, pumping causes the task to run.
466 runners_[0]->PumpQueue();
467 test_task_runner_->RunUntilIdle();
468 EXPECT_THAT(run_order, ElementsAre(1, 2));
469 }
470
471 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
472 Initialize(1u);
473 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
474
475 std::vector<int> run_order;
476 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
477 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
478 delay);
479
480 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
481 EXPECT_TRUE(run_order.empty());
482 }
483
484 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
485 Initialize(1u);
486 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
487
488 std::vector<int> run_order;
489 // Posting two tasks and pumping twice should result in two tasks in the work
490 // queue.
491 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
492 runners_[0]->PumpQueue();
493 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
494 runners_[0]->PumpQueue();
495
496 EXPECT_EQ(2u, runners_[0]->WorkQueueSizeForTest());
497 }
498
499 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
500 int countdown,
501 std::vector<int>* out_result) {
502 out_result->push_back(countdown);
503 if (--countdown) {
504 runner->PostTask(FROM_HERE,
505 Bind(&ReentrantTestTask, runner, countdown, out_result));
506 }
507 }
508
509 TEST_F(TaskQueueManagerTest, ReentrantPosting) {
510 Initialize(1u);
511
512 std::vector<int> run_order;
513 runners_[0]->PostTask(FROM_HERE,
514 Bind(&ReentrantTestTask, runners_[0], 3, &run_order));
515
516 test_task_runner_->RunUntilIdle();
517 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
518 }
519
520 TEST_F(TaskQueueManagerTest, NoTasksAfterShutdown) {
521 Initialize(1u);
522
523 std::vector<int> run_order;
524 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
525 manager_.reset();
526 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
527
528 test_task_runner_->RunUntilIdle();
529 EXPECT_TRUE(run_order.empty());
530 }
531
532 void PostTaskToRunner(scoped_refptr<base::SingleThreadTaskRunner> runner,
533 std::vector<int>* run_order) {
534 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, run_order));
535 }
536
537 TEST_F(TaskQueueManagerTest, PostFromThread) {
538 InitializeWithRealMessageLoop(1u);
539
540 std::vector<int> run_order;
541 base::Thread thread("TestThread");
542 thread.Start();
543 thread.task_runner()->PostTask(
544 FROM_HERE, base::Bind(&PostTaskToRunner, runners_[0], &run_order));
545 thread.Stop();
546
547 message_loop_->RunUntilIdle();
548 EXPECT_THAT(run_order, ElementsAre(1));
549 }
550
551 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
552 int* run_count) {
553 (*run_count)++;
554 runner->PostTask(FROM_HERE, Bind(&RePostingTestTask,
555 base::Unretained(runner.get()), run_count));
556 }
557
558 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
559 Initialize(1u);
560
561 int run_count = 0;
562 runners_[0]->PostTask(
563 FROM_HERE, base::Bind(&RePostingTestTask, runners_[0], &run_count));
564
565 test_task_runner_->RunPendingTasks();
566 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
567 // will be two tasks here.
568 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
569 EXPECT_EQ(1, run_count);
570 }
571
572 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
573 InitializeWithRealMessageLoop(1u);
574
575 std::vector<int> run_order;
576 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
577 tasks_to_post_from_nested_loop.push_back(
578 std::make_pair(base::Bind(&TestTask, 1, &run_order), true));
579
580 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order));
581 runners_[0]->PostTask(
582 FROM_HERE,
583 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runners_[0],
584 base::Unretained(&tasks_to_post_from_nested_loop)));
585 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
586
587 message_loop_->RunUntilIdle();
588
589 EXPECT_THAT(run_order, ElementsAre(0, 2, 1));
590 }
591
592 TEST_F(TaskQueueManagerTest, WorkBatching) {
593 Initialize(1u);
594
595 manager_->SetWorkBatchSize(2);
596
597 std::vector<int> run_order;
598 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
599 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
600 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
601 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
602
603 // Running one task in the host message loop should cause two posted tasks to
604 // get executed.
605 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
606 test_task_runner_->RunPendingTasks();
607 EXPECT_THAT(run_order, ElementsAre(1, 2));
608
609 // The second task runs the remaining two posted tasks.
610 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
611 test_task_runner_->RunPendingTasks();
612 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
613 }
614
615 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
616 Initialize(2u);
617 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
618
619 std::vector<int> run_order;
620 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
621 test_task_runner_->RunUntilIdle();
622 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
623
624 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
625 test_task_runner_->RunUntilIdle();
626 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM.
627
628 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
629 test_task_runner_->RunUntilIdle();
630 // Executing a task on an auto pumped queue should wake the TQM.
631 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
632 }
633
634 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) {
635 Initialize(2u);
636 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
637
638 std::vector<int> run_order;
639 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
640 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
641 test_task_runner_->RunUntilIdle();
642 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake.
643 }
644
645 TEST_F(TaskQueueManagerTest,
646 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) {
647 Initialize(2u);
648 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
649 runners_[1]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
650
651 std::vector<int> run_order;
652 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
653 test_task_runner_->RunUntilIdle();
654 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
655
656 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
657 test_task_runner_->RunUntilIdle();
658 // This still shouldn't wake TQM as manual queue was not pumped.
659 EXPECT_TRUE(run_order.empty());
660
661 runners_[1]->PumpQueue();
662 test_task_runner_->RunUntilIdle();
663 // Executing a task on an auto pumped queue should wake the TQM.
664 EXPECT_THAT(run_order, ElementsAre(2, 1));
665 }
666
667 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
668 base::Closure task) {
669 task_runner->PostTask(FROM_HERE, task);
670 }
671
672 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) {
673 Initialize(2u);
674 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
675
676 std::vector<int> run_order;
677 // Check that a task which posts a task to an auto pump after wakeup queue
678 // doesn't cause the queue to wake up.
679 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order);
680 runners_[1]->PostTask(
681 FROM_HERE, base::Bind(&TestPostingTask, runners_[0], after_wakeup_task));
682 test_task_runner_->RunUntilIdle();
683 EXPECT_TRUE(run_order.empty());
684
685 // Wake up the queue.
686 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
687 test_task_runner_->RunUntilIdle();
688 EXPECT_THAT(run_order, ElementsAre(2, 1));
689 }
690
691 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) {
692 Initialize(2u);
693 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
694
695 std::vector<int> run_order;
696 // Check that a task which posts a task to an auto pump after wakeup queue
697 // doesn't cause the queue to wake up.
698 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order);
699 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order);
700 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestPostingTask, runners_[0],
701 after_wakeup_task_1));
702 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestPostingTask, runners_[0],
703 after_wakeup_task_2));
704 test_task_runner_->RunUntilIdle();
705 EXPECT_TRUE(run_order.empty());
706
707 // Wake up the queue.
708 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
709 test_task_runner_->RunUntilIdle();
710 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
711 }
712
713 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
714 Initialize(2u);
715 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
716
717 int run_count = 0;
718 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
719 // queue they don't wake each other and will eventually stop when no other
720 // tasks execute.
721 runners_[0]->PostTask(
722 FROM_HERE, base::Bind(&RePostingTestTask, runners_[0], &run_count));
723 runners_[0]->PostTask(
724 FROM_HERE, base::Bind(&RePostingTestTask, runners_[0], &run_count));
725 runners_[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
726 test_task_runner_->RunUntilIdle();
727 // The reposting tasks posted to the after wakeup queue shouldn't have woken
728 // each other up.
729 EXPECT_EQ(2, run_count);
730 }
731
732 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWithDontWakeQueue) {
733 Initialize(1u);
734
735 scoped_refptr<internal::TaskQueueImpl> queue0 = manager_->NewTaskQueue(
736 TaskQueue::Spec("test_queue 0")
737 .SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP));
738 scoped_refptr<internal::TaskQueueImpl> queue1 = manager_->NewTaskQueue(
739 TaskQueue::Spec("test_queue 0")
740 .SetWakeupPolicy(TaskQueue::WakeupPolicy::DONT_WAKE_OTHER_QUEUES));
741 scoped_refptr<internal::TaskQueueImpl> queue2 = runners_[0];
742
743 std::vector<int> run_order;
744 queue0->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
745 queue1->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
746 test_task_runner_->RunUntilIdle();
747 // Executing a DONT_WAKE_OTHER_QUEUES queue shouldn't wake the autopump after
748 // wakeup queue.
749 EXPECT_THAT(run_order, ElementsAre(2));
750
751 queue2->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
752 test_task_runner_->RunUntilIdle();
753 // Executing a CAN_WAKE_OTHER_QUEUES queue should wake the autopump after
754 // wakeup queue.
755 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
756 }
757
758 class MockTaskObserver : public base::MessageLoop::TaskObserver {
759 public:
760 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
761 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
762 };
763
764 TEST_F(TaskQueueManagerTest, TaskObserverAdding) {
765 InitializeWithRealMessageLoop(1u);
766 MockTaskObserver observer;
767
768 manager_->SetWorkBatchSize(2);
769 manager_->AddTaskObserver(&observer);
770
771 std::vector<int> run_order;
772 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
773 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
774
775 EXPECT_CALL(observer, WillProcessTask(_)).Times(2);
776 EXPECT_CALL(observer, DidProcessTask(_)).Times(2);
777 message_loop_->RunUntilIdle();
778 }
779
780 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) {
781 InitializeWithRealMessageLoop(1u);
782 MockTaskObserver observer;
783 manager_->SetWorkBatchSize(2);
784 manager_->AddTaskObserver(&observer);
785 manager_->RemoveTaskObserver(&observer);
786
787 std::vector<int> run_order;
788 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
789
790 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
791 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
792
793 message_loop_->RunUntilIdle();
794 }
795
796 void RemoveObserverTask(TaskQueueManager* manager,
797 base::MessageLoop::TaskObserver* observer) {
798 manager->RemoveTaskObserver(observer);
799 }
800
801 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) {
802 InitializeWithRealMessageLoop(1u);
803 MockTaskObserver observer;
804 manager_->SetWorkBatchSize(3);
805 manager_->AddTaskObserver(&observer);
806
807 runners_[0]->PostTask(
808 FROM_HERE, base::Bind(&RemoveObserverTask, manager_.get(), &observer));
809
810 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
811 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
812 message_loop_->RunUntilIdle();
813 }
814
815 TEST_F(TaskQueueManagerTest, QueueTaskObserverAdding) {
816 InitializeWithRealMessageLoop(2u);
817 MockTaskObserver observer;
818
819 manager_->SetWorkBatchSize(2);
820 runners_[0]->AddTaskObserver(&observer);
821
822 std::vector<int> run_order;
823 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
824 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
825
826 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
827 EXPECT_CALL(observer, DidProcessTask(_)).Times(1);
828 message_loop_->RunUntilIdle();
829 }
830
831 TEST_F(TaskQueueManagerTest, QueueTaskObserverRemoving) {
832 InitializeWithRealMessageLoop(1u);
833 MockTaskObserver observer;
834 manager_->SetWorkBatchSize(2);
835 runners_[0]->AddTaskObserver(&observer);
836 runners_[0]->RemoveTaskObserver(&observer);
837
838 std::vector<int> run_order;
839 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
840
841 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
842 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
843
844 message_loop_->RunUntilIdle();
845 }
846
847 void RemoveQueueObserverTask(scoped_refptr<TaskQueue> queue,
848 base::MessageLoop::TaskObserver* observer) {
849 queue->RemoveTaskObserver(observer);
850 }
851
852 TEST_F(TaskQueueManagerTest, QueueTaskObserverRemovingInsideTask) {
853 InitializeWithRealMessageLoop(1u);
854 MockTaskObserver observer;
855 runners_[0]->AddTaskObserver(&observer);
856
857 runners_[0]->PostTask(
858 FROM_HERE, base::Bind(&RemoveQueueObserverTask, runners_[0], &observer));
859
860 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
861 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
862 message_loop_->RunUntilIdle();
863 }
864
865 TEST_F(TaskQueueManagerTest, ThreadCheckAfterTermination) {
866 Initialize(1u);
867 EXPECT_TRUE(runners_[0]->RunsTasksOnCurrentThread());
868 manager_.reset();
869 EXPECT_TRUE(runners_[0]->RunsTasksOnCurrentThread());
870 }
871
872 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime) {
873 scoped_ptr<base::SimpleTestTickClock> clock(new base::SimpleTestTickClock());
874 clock->Advance(base::TimeDelta::FromMicroseconds(10000));
875 Initialize(2u);
876 manager_->SetTimeSourceForTesting(
877 make_scoped_ptr(new TestTimeSource(clock.get())));
878
879 // With no delayed tasks.
880 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null());
881
882 // With a non-delayed task.
883 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
884 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null());
885
886 // With a delayed task.
887 base::TimeDelta expected_delay = base::TimeDelta::FromMilliseconds(50);
888 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
889 EXPECT_EQ(clock->NowTicks() + expected_delay,
890 manager_->NextPendingDelayedTaskRunTime());
891
892 // With another delayed task in the same queue with a longer delay.
893 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask),
894 base::TimeDelta::FromMilliseconds(100));
895 EXPECT_EQ(clock->NowTicks() + expected_delay,
896 manager_->NextPendingDelayedTaskRunTime());
897
898 // With another delayed task in the same queue with a shorter delay.
899 expected_delay = base::TimeDelta::FromMilliseconds(20);
900 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
901 EXPECT_EQ(clock->NowTicks() + expected_delay,
902 manager_->NextPendingDelayedTaskRunTime());
903
904 // With another delayed task in a different queue with a shorter delay.
905 expected_delay = base::TimeDelta::FromMilliseconds(10);
906 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
907 EXPECT_EQ(clock->NowTicks() + expected_delay,
908 manager_->NextPendingDelayedTaskRunTime());
909
910 // Test it updates as time progresses
911 clock->Advance(expected_delay);
912 EXPECT_EQ(clock->NowTicks(), manager_->NextPendingDelayedTaskRunTime());
913 }
914
915 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime_MultipleQueues) {
916 Initialize(3u);
917
918 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(50);
919 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(5);
920 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(10);
921 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1);
922 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2);
923 runners_[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3);
924
925 EXPECT_EQ(now_src_->NowTicks() + delay2,
926 manager_->NextPendingDelayedTaskRunTime());
927 }
928
929 TEST_F(TaskQueueManagerTest, DeleteTaskQueueManagerInsideATask) {
930 Initialize(1u);
931
932 runners_[0]->PostTask(
933 FROM_HERE, base::Bind(&TaskQueueManagerTest::DeleteTaskQueueManager,
934 base::Unretained(this)));
935
936 // This should not crash, assuming DoWork detects the TaskQueueManager has
937 // been deleted.
938 test_task_runner_->RunUntilIdle();
939 }
940
941 TEST_F(TaskQueueManagerTest, GetAndClearSystemIsQuiescentBit) {
942 Initialize(3u);
943
944 scoped_refptr<internal::TaskQueueImpl> queue0 = manager_->NewTaskQueue(
945 TaskQueue::Spec("test_queue 0").SetShouldMonitorQuiescence(true));
946 scoped_refptr<internal::TaskQueueImpl> queue1 = manager_->NewTaskQueue(
947 TaskQueue::Spec("test_queue 1").SetShouldMonitorQuiescence(true));
948 scoped_refptr<internal::TaskQueueImpl> queue2 = manager_->NewTaskQueue(
949 TaskQueue::Spec("test_queue 2").SetShouldMonitorQuiescence(false));
950
951 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit());
952
953 queue0->PostTask(FROM_HERE, base::Bind(&NopTask));
954 test_task_runner_->RunUntilIdle();
955 EXPECT_FALSE(manager_->GetAndClearSystemIsQuiescentBit());
956 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit());
957
958 queue1->PostTask(FROM_HERE, base::Bind(&NopTask));
959 test_task_runner_->RunUntilIdle();
960 EXPECT_FALSE(manager_->GetAndClearSystemIsQuiescentBit());
961 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit());
962
963 queue2->PostTask(FROM_HERE, base::Bind(&NopTask));
964 test_task_runner_->RunUntilIdle();
965 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit());
966
967 queue0->PostTask(FROM_HERE, base::Bind(&NopTask));
968 queue1->PostTask(FROM_HERE, base::Bind(&NopTask));
969 test_task_runner_->RunUntilIdle();
970 EXPECT_FALSE(manager_->GetAndClearSystemIsQuiescentBit());
971 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit());
972 }
973
974 TEST_F(TaskQueueManagerTest, IsQueueEmpty) {
975 Initialize(2u);
976 internal::TaskQueueImpl* queue0 = runners_[0].get();
977 internal::TaskQueueImpl* queue1 = runners_[1].get();
978 queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
979 queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
980
981 EXPECT_TRUE(queue0->IsQueueEmpty());
982 EXPECT_TRUE(queue1->IsQueueEmpty());
983
984 queue0->PostTask(FROM_HERE, base::Bind(NullTask));
985 queue1->PostTask(FROM_HERE, base::Bind(NullTask));
986 EXPECT_FALSE(queue0->IsQueueEmpty());
987 EXPECT_FALSE(queue1->IsQueueEmpty());
988
989 test_task_runner_->RunUntilIdle();
990 EXPECT_TRUE(queue0->IsQueueEmpty());
991 EXPECT_FALSE(queue1->IsQueueEmpty());
992
993 queue1->PumpQueue();
994 EXPECT_TRUE(queue0->IsQueueEmpty());
995 EXPECT_FALSE(queue1->IsQueueEmpty());
996
997 test_task_runner_->RunUntilIdle();
998 EXPECT_TRUE(queue0->IsQueueEmpty());
999 EXPECT_TRUE(queue1->IsQueueEmpty());
1000 }
1001
1002 TEST_F(TaskQueueManagerTest, GetQueueState) {
1003 Initialize(2u);
1004 internal::TaskQueueImpl* queue0 = runners_[0].get();
1005 internal::TaskQueueImpl* queue1 = runners_[1].get();
1006 queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
1007 queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
1008
1009 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue0->GetQueueState());
1010 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue1->GetQueueState());
1011
1012 queue0->PostTask(FROM_HERE, base::Bind(NullTask));
1013 queue0->PostTask(FROM_HERE, base::Bind(NullTask));
1014 queue1->PostTask(FROM_HERE, base::Bind(NullTask));
1015 EXPECT_EQ(TaskQueue::QueueState::NEEDS_PUMPING, queue0->GetQueueState());
1016 EXPECT_EQ(TaskQueue::QueueState::NEEDS_PUMPING, queue1->GetQueueState());
1017
1018 test_task_runner_->SetRunTaskLimit(1);
1019 test_task_runner_->RunPendingTasks();
1020 EXPECT_EQ(TaskQueue::QueueState::HAS_WORK, queue0->GetQueueState());
1021 EXPECT_EQ(TaskQueue::QueueState::NEEDS_PUMPING, queue1->GetQueueState());
1022
1023 test_task_runner_->ClearRunTaskLimit();
1024 test_task_runner_->RunUntilIdle();
1025 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue0->GetQueueState());
1026 EXPECT_EQ(TaskQueue::QueueState::NEEDS_PUMPING, queue1->GetQueueState());
1027
1028 queue1->PumpQueue();
1029 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue0->GetQueueState());
1030 EXPECT_EQ(TaskQueue::QueueState::HAS_WORK, queue1->GetQueueState());
1031
1032 test_task_runner_->RunUntilIdle();
1033 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue0->GetQueueState());
1034 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue1->GetQueueState());
1035 }
1036
1037 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotSkipAHeadOfNonDelayedTask) {
1038 Initialize(2u);
1039
1040 std::vector<int> run_order;
1041 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
1042 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
1043 delay);
1044 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
1045 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
1046
1047 now_src_->Advance(delay * 2);
1048 // After task 2 has run, the automatic selector will have to choose between
1049 // tasks 1 and 3. The sequence numbers are used to choose between the two
1050 // tasks and if they are correct task 1 will run last.
1051 test_task_runner_->RunUntilIdle();
1052
1053 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
1054 }
1055
1056 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotSkipAHeadOfShorterDelayedTask) {
1057 Initialize(2u);
1058
1059 std::vector<int> run_order;
1060 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
1061 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(5);
1062 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
1063 delay1);
1064 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
1065 delay2);
1066
1067 now_src_->Advance(delay1 * 2);
1068 test_task_runner_->RunUntilIdle();
1069
1070 EXPECT_THAT(run_order, ElementsAre(2, 1));
1071 }
1072
1073 TEST_F(TaskQueueManagerTest, DelayedTaskWithAbsoluteRunTime) {
1074 Initialize(1u);
1075
1076 // One task in the past, two with the exact same run time and one in the
1077 // future.
1078 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
1079 base::TimeTicks runTime1 = now_src_->NowTicks() - delay;
1080 base::TimeTicks runTime2 = now_src_->NowTicks();
1081 base::TimeTicks runTime3 = now_src_->NowTicks();
1082 base::TimeTicks runTime4 = now_src_->NowTicks() + delay;
1083
1084 std::vector<int> run_order;
1085 runners_[0]->PostDelayedTaskAt(
1086 FROM_HERE, base::Bind(&TestTask, 1, &run_order), runTime1);
1087 runners_[0]->PostDelayedTaskAt(
1088 FROM_HERE, base::Bind(&TestTask, 2, &run_order), runTime2);
1089 runners_[0]->PostDelayedTaskAt(
1090 FROM_HERE, base::Bind(&TestTask, 3, &run_order), runTime3);
1091 runners_[0]->PostDelayedTaskAt(
1092 FROM_HERE, base::Bind(&TestTask, 4, &run_order), runTime4);
1093
1094 now_src_->Advance(2 * delay);
1095 test_task_runner_->RunUntilIdle();
1096
1097 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
1098 }
1099
1100 void CheckIsNested(bool* is_nested) {
1101 *is_nested = base::MessageLoop::current()->IsNested();
1102 }
1103
1104 void PostAndQuitFromNestedRunloop(base::RunLoop* run_loop,
1105 base::SingleThreadTaskRunner* runner,
1106 bool* was_nested) {
1107 base::MessageLoop::ScopedNestableTaskAllower allow(
1108 base::MessageLoop::current());
1109 runner->PostTask(FROM_HERE, run_loop->QuitClosure());
1110 runner->PostTask(FROM_HERE, base::Bind(&CheckIsNested, was_nested));
1111 run_loop->Run();
1112 }
1113
1114 TEST_F(TaskQueueManagerTest, QuitWhileNested) {
1115 // This test makes sure we don't continue running a work batch after a nested
1116 // run loop has been exited in the middle of the batch.
1117 InitializeWithRealMessageLoop(1u);
1118 manager_->SetWorkBatchSize(2);
1119
1120 bool was_nested = true;
1121 base::RunLoop run_loop;
1122 runners_[0]->PostTask(
1123 FROM_HERE,
1124 base::Bind(&PostAndQuitFromNestedRunloop, base::Unretained(&run_loop),
1125 runners_[0], base::Unretained(&was_nested)));
1126
1127 message_loop_->RunUntilIdle();
1128 EXPECT_FALSE(was_nested);
1129 }
1130
1131 class SequenceNumberCapturingTaskObserver
1132 : public base::MessageLoop::TaskObserver {
1133 public:
1134 // MessageLoop::TaskObserver overrides.
1135 void WillProcessTask(const base::PendingTask& pending_task) override {}
1136 void DidProcessTask(const base::PendingTask& pending_task) override {
1137 sequence_numbers_.push_back(pending_task.sequence_num);
1138 }
1139
1140 const std::vector<int>& sequence_numbers() const { return sequence_numbers_; }
1141
1142 private:
1143 std::vector<int> sequence_numbers_;
1144 };
1145
1146 TEST_F(TaskQueueManagerTest, SequenceNumSetWhenTaskIsPosted) {
1147 Initialize(1u);
1148
1149 SequenceNumberCapturingTaskObserver observer;
1150 manager_->AddTaskObserver(&observer);
1151
1152 // Register four tasks that will run in reverse order.
1153 std::vector<int> run_order;
1154 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
1155 base::TimeDelta::FromMilliseconds(30));
1156 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
1157 base::TimeDelta::FromMilliseconds(20));
1158 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
1159 base::TimeDelta::FromMilliseconds(10));
1160 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
1161
1162 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(40));
1163 ASSERT_THAT(run_order, ElementsAre(4, 3, 2, 1));
1164
1165 // The sequence numbers are a zero-based monotonically incrememting counter
1166 // which should be set when the task is posted rather than when it's enqueued
1167 // onto the incomming queue.
1168 EXPECT_THAT(observer.sequence_numbers(), ElementsAre(3, 2, 1, 0));
1169
1170 manager_->RemoveTaskObserver(&observer);
1171 }
1172
1173 TEST_F(TaskQueueManagerTest, NewTaskQueues) {
1174 Initialize(1u);
1175
1176 scoped_refptr<internal::TaskQueueImpl> queue1 =
1177 manager_->NewTaskQueue(TaskQueue::Spec("foo"));
1178 scoped_refptr<internal::TaskQueueImpl> queue2 =
1179 manager_->NewTaskQueue(TaskQueue::Spec("bar"));
1180 scoped_refptr<internal::TaskQueueImpl> queue3 =
1181 manager_->NewTaskQueue(TaskQueue::Spec("baz"));
1182
1183 ASSERT_NE(queue1, queue2);
1184 ASSERT_NE(queue1, queue3);
1185 ASSERT_NE(queue2, queue3);
1186
1187 std::vector<int> run_order;
1188 queue1->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
1189 queue2->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
1190 queue3->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
1191 test_task_runner_->RunUntilIdle();
1192
1193 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
1194 }
1195
1196 TEST_F(TaskQueueManagerTest, UnregisterTaskQueue) {
1197 Initialize(1u);
1198
1199 scoped_refptr<internal::TaskQueueImpl> queue1 =
1200 manager_->NewTaskQueue(TaskQueue::Spec("foo"));
1201 scoped_refptr<internal::TaskQueueImpl> queue2 =
1202 manager_->NewTaskQueue(TaskQueue::Spec("bar"));
1203 scoped_refptr<internal::TaskQueueImpl> queue3 =
1204 manager_->NewTaskQueue(TaskQueue::Spec("baz"));
1205
1206 ASSERT_NE(queue1, queue2);
1207 ASSERT_NE(queue1, queue3);
1208 ASSERT_NE(queue2, queue3);
1209
1210 std::vector<int> run_order;
1211 queue1->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
1212 queue2->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
1213 queue3->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
1214
1215 queue2->UnregisterTaskQueue();
1216 test_task_runner_->RunUntilIdle();
1217
1218 EXPECT_THAT(run_order, ElementsAre(1, 3));
1219 }
1220
1221 TEST_F(TaskQueueManagerTest, UnregisterTaskQueue_WithDelayedTasks) {
1222 Initialize(2u);
1223
1224 // Register three delayed tasks
1225 std::vector<int> run_order;
1226 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
1227 base::TimeDelta::FromMilliseconds(10));
1228 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
1229 base::TimeDelta::FromMilliseconds(20));
1230 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
1231 base::TimeDelta::FromMilliseconds(30));
1232
1233 runners_[1]->UnregisterTaskQueue();
1234 test_task_runner_->RunUntilIdle();
1235
1236 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(40));
1237 ASSERT_THAT(run_order, ElementsAre(1, 3));
1238 }
1239
1240 void PostTestTasksFromNestedMessageLoop(
1241 base::MessageLoop* message_loop,
1242 scoped_refptr<base::SingleThreadTaskRunner> main_runner,
1243 scoped_refptr<base::SingleThreadTaskRunner> wake_up_runner,
1244 std::vector<int>* run_order) {
1245 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
1246 main_runner->PostNonNestableTask(FROM_HERE,
1247 base::Bind(&TestTask, 1, run_order));
1248 // The following should never get executed.
1249 wake_up_runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, run_order));
1250 message_loop->RunUntilIdle();
1251 }
1252
1253 TEST_F(TaskQueueManagerTest, DeferredNonNestableTaskDoesNotTriggerWakeUp) {
1254 // This test checks that running (i.e., deferring) a non-nestable task in a
1255 // nested run loop does not trigger the pumping of an on-wakeup queue.
1256 InitializeWithRealMessageLoop(2u);
1257 runners_[1]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
1258
1259 std::vector<int> run_order;
1260 runners_[0]->PostTask(
1261 FROM_HERE,
1262 base::Bind(&PostTestTasksFromNestedMessageLoop, message_loop_.get(),
1263 runners_[0], runners_[1], base::Unretained(&run_order)));
1264
1265 message_loop_->RunUntilIdle();
1266 ASSERT_THAT(run_order, ElementsAre(1));
1267 }
1268
1269 namespace {
1270
1271 class MockObserver : public TaskQueueManager::Observer {
1272 public:
1273 MOCK_METHOD1(OnUnregisterTaskQueue,
1274 void(const scoped_refptr<internal::TaskQueueImpl>& queue));
1275 };
1276
1277 } // namespace
1278
1279 TEST_F(TaskQueueManagerTest, OnUnregisterTaskQueue) {
1280 Initialize(0u);
1281
1282 MockObserver observer;
1283 manager_->SetObserver(&observer);
1284
1285 scoped_refptr<internal::TaskQueueImpl> task_queue =
1286 manager_->NewTaskQueue(TaskQueue::Spec("test_queue"));
1287
1288 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1);
1289 task_queue->UnregisterTaskQueue();
1290
1291 manager_->SetObserver(nullptr);
1292 }
1293
1294 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/child/task_queue_manager_perftest.cc ('k') | components/scheduler/child/task_queue_selector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698