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.
5 #include "content/renderer/scheduler/task_queue_manager.h"
7 #include "base/threading/thread.h"
8 #include "cc/test/ordered_simple_task_runner.h"
9 #include "cc/test/test_now_source.h"
10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h"
11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h"
12 #include "content/renderer/scheduler/task_queue_selector.h"
13 #include "testing/gmock/include/gmock/gmock.h"
15 using testing::ElementsAre
;
21 class SelectorForTest
: public TaskQueueSelector
{
23 ~SelectorForTest() override
{}
25 virtual void AppendQueueToService(size_t queue_index
) = 0;
27 virtual const std::vector
<const base::TaskQueue
*>& work_queues() = 0;
29 void AsValueInto(base::trace_event::TracedValue
* state
) const override
{}
32 // Always selects queue 0.
33 class AutomaticSelectorForTest
: public SelectorForTest
{
35 AutomaticSelectorForTest() {}
36 ~AutomaticSelectorForTest() override
{}
38 void RegisterWorkQueues(
39 const std::vector
<const base::TaskQueue
*>& work_queues
) override
{
40 work_queues_
= work_queues
;
43 bool SelectWorkQueueToService(size_t* out_queue_index
) override
{
44 for (size_t i
= 0; i
< work_queues_
.size(); i
++) {
45 if (!work_queues_
[i
]->empty()) {
53 void AppendQueueToService(size_t queue_index
) override
{
54 DCHECK(false) << "Not supported";
57 const std::vector
<const base::TaskQueue
*>& work_queues() override
{
62 std::vector
<const base::TaskQueue
*> work_queues_
;
64 DISALLOW_COPY_AND_ASSIGN(AutomaticSelectorForTest
);
67 class ExplicitSelectorForTest
: public SelectorForTest
{
69 ExplicitSelectorForTest() {}
70 ~ExplicitSelectorForTest() override
{}
72 void RegisterWorkQueues(
73 const std::vector
<const base::TaskQueue
*>& work_queues
) override
{
74 work_queues_
= work_queues
;
77 bool SelectWorkQueueToService(size_t* out_queue_index
) override
{
78 if (queues_to_service_
.empty())
80 *out_queue_index
= queues_to_service_
.front();
81 queues_to_service_
.pop_front();
85 void AppendQueueToService(size_t queue_index
) override
{
86 queues_to_service_
.push_back(queue_index
);
89 const std::vector
<const base::TaskQueue
*>& work_queues() override
{
94 std::deque
<size_t> queues_to_service_
;
95 std::vector
<const base::TaskQueue
*> work_queues_
;
97 DISALLOW_COPY_AND_ASSIGN(ExplicitSelectorForTest
);
100 class TaskQueueManagerTest
: public testing::Test
{
102 enum class SelectorType
{
107 void Initialize(size_t num_queues
, SelectorType type
) {
108 now_src_
= cc::TestNowSource::Create(1000);
110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_
, false));
111 selector_
= make_scoped_ptr(createSelectorForTest(type
));
112 manager_
= make_scoped_ptr(new TaskQueueManager(
113 num_queues
, NestableTaskRunnerForTest::Create(test_task_runner_
.get()),
115 manager_
->SetTimeSourceForTesting(now_src_
);
117 EXPECT_EQ(num_queues
, selector_
->work_queues().size());
120 void InitializeWithRealMessageLoop(size_t num_queues
, SelectorType type
) {
121 message_loop_
.reset(new base::MessageLoop());
122 selector_
= make_scoped_ptr(createSelectorForTest(type
));
123 manager_
= make_scoped_ptr(new TaskQueueManager(
125 RendererSchedulerMessageLoopDelegate::Create(message_loop_
.get()),
127 EXPECT_EQ(num_queues
, selector_
->work_queues().size());
130 SelectorForTest
* createSelectorForTest(SelectorType type
) {
132 case SelectorType::Automatic
:
133 return new AutomaticSelectorForTest();
135 case SelectorType::Explicit
:
136 return new ExplicitSelectorForTest();
142 scoped_refptr
<cc::TestNowSource
> now_src_
;
143 scoped_refptr
<cc::OrderedSimpleTaskRunner
> test_task_runner_
;
144 scoped_ptr
<SelectorForTest
> selector_
;
145 scoped_ptr
<TaskQueueManager
> manager_
;
146 scoped_ptr
<base::MessageLoop
> message_loop_
;
149 void PostFromNestedRunloop(base::MessageLoop
* message_loop
,
150 base::SingleThreadTaskRunner
* runner
,
151 std::vector
<std::pair
<base::Closure
, bool>>* tasks
) {
152 base::MessageLoop::ScopedNestableTaskAllower
allow(message_loop
);
153 for (std::pair
<base::Closure
, bool>& pair
: *tasks
) {
155 runner
->PostTask(FROM_HERE
, pair
.first
);
157 runner
->PostNonNestableTask(FROM_HERE
, pair
.first
);
160 message_loop
->RunUntilIdle();
163 void TestTask(int value
, std::vector
<int>* out_result
) {
164 out_result
->push_back(value
);
167 TEST_F(TaskQueueManagerTest
, SingleQueuePosting
) {
168 Initialize(1u, SelectorType::Automatic
);
170 std::vector
<int> run_order
;
171 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
172 manager_
->TaskRunnerForQueue(0);
174 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
175 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
176 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
));
178 test_task_runner_
->RunUntilIdle();
179 EXPECT_THAT(run_order
, ElementsAre(1, 2, 3));
182 TEST_F(TaskQueueManagerTest
, MultiQueuePosting
) {
183 Initialize(3u, SelectorType::Explicit
);
185 std::vector
<int> run_order
;
186 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[3] = {
187 manager_
->TaskRunnerForQueue(0),
188 manager_
->TaskRunnerForQueue(1),
189 manager_
->TaskRunnerForQueue(2)};
191 selector_
->AppendQueueToService(0);
192 selector_
->AppendQueueToService(1);
193 selector_
->AppendQueueToService(2);
194 selector_
->AppendQueueToService(0);
195 selector_
->AppendQueueToService(1);
196 selector_
->AppendQueueToService(2);
198 runners
[0]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
199 runners
[0]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
200 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
));
201 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 4, &run_order
));
202 runners
[2]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 5, &run_order
));
203 runners
[2]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 6, &run_order
));
205 test_task_runner_
->RunUntilIdle();
206 EXPECT_THAT(run_order
, ElementsAre(1, 3, 5, 2, 4, 6));
212 TEST_F(TaskQueueManagerTest
, NowNotCalledWhenThereAreNoDelayedTasks
) {
213 Initialize(3u, SelectorType::Explicit
);
215 scoped_refptr
<cc::TestNowSource
> now_src
= cc::TestNowSource::Create(1000);
216 manager_
->SetTimeSourceForTesting(now_src
);
218 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[3] = {
219 manager_
->TaskRunnerForQueue(0),
220 manager_
->TaskRunnerForQueue(1),
221 manager_
->TaskRunnerForQueue(2)};
223 selector_
->AppendQueueToService(0);
224 selector_
->AppendQueueToService(1);
225 selector_
->AppendQueueToService(2);
226 selector_
->AppendQueueToService(0);
227 selector_
->AppendQueueToService(1);
228 selector_
->AppendQueueToService(2);
230 runners
[0]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
231 runners
[0]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
232 runners
[1]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
233 runners
[1]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
234 runners
[2]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
235 runners
[2]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
237 test_task_runner_
->RunUntilIdle();
239 EXPECT_EQ(0, now_src
->NumNowCalls());
242 TEST_F(TaskQueueManagerTest
, NonNestableTaskPosting
) {
243 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
245 std::vector
<int> run_order
;
246 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
247 manager_
->TaskRunnerForQueue(0);
249 runner
->PostNonNestableTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
251 message_loop_
->RunUntilIdle();
252 EXPECT_THAT(run_order
, ElementsAre(1));
255 TEST_F(TaskQueueManagerTest
, NonNestableTaskExecutesInExpectedOrder
) {
256 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
258 std::vector
<int> run_order
;
259 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
260 manager_
->TaskRunnerForQueue(0);
262 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
263 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
264 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
));
265 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 4, &run_order
));
266 runner
->PostNonNestableTask(FROM_HERE
, base::Bind(&TestTask
, 5, &run_order
));
268 message_loop_
->RunUntilIdle();
269 EXPECT_THAT(run_order
, ElementsAre(1, 2, 3, 4, 5));
272 TEST_F(TaskQueueManagerTest
, NonNestableTaskDoesntExecuteInNestedLoop
) {
273 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
275 std::vector
<int> run_order
;
276 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
277 manager_
->TaskRunnerForQueue(0);
279 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
280 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
282 std::vector
<std::pair
<base::Closure
, bool>> tasks_to_post_from_nested_loop
;
283 tasks_to_post_from_nested_loop
.push_back(
284 std::make_pair(base::Bind(&TestTask
, 3, &run_order
), false));
285 tasks_to_post_from_nested_loop
.push_back(
286 std::make_pair(base::Bind(&TestTask
, 4, &run_order
), true));
287 tasks_to_post_from_nested_loop
.push_back(
288 std::make_pair(base::Bind(&TestTask
, 5, &run_order
), true));
292 base::Bind(&PostFromNestedRunloop
, message_loop_
.get(), runner
,
293 base::Unretained(&tasks_to_post_from_nested_loop
)));
295 message_loop_
->RunUntilIdle();
296 // Note we expect task 3 to run last because it's non-nestable.
297 EXPECT_THAT(run_order
, ElementsAre(1, 2, 4, 5, 3));
300 TEST_F(TaskQueueManagerTest
, QueuePolling
) {
301 Initialize(1u, SelectorType::Automatic
);
303 std::vector
<int> run_order
;
304 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
305 manager_
->TaskRunnerForQueue(0);
307 EXPECT_TRUE(manager_
->IsQueueEmpty(0));
308 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
309 EXPECT_FALSE(manager_
->IsQueueEmpty(0));
311 test_task_runner_
->RunUntilIdle();
312 EXPECT_TRUE(manager_
->IsQueueEmpty(0));
315 TEST_F(TaskQueueManagerTest
, DelayedTaskPosting
) {
316 Initialize(1u, SelectorType::Automatic
);
318 std::vector
<int> run_order
;
319 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
320 manager_
->TaskRunnerForQueue(0);
322 base::TimeDelta
delay(base::TimeDelta::FromMilliseconds(10));
323 runner
->PostDelayedTask(
324 FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
), delay
);
325 EXPECT_EQ(delay
, test_task_runner_
->DelayToNextTaskTime());
326 EXPECT_TRUE(manager_
->IsQueueEmpty(0));
327 EXPECT_TRUE(run_order
.empty());
329 // The task doesn't run before the delay has completed.
330 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
331 EXPECT_TRUE(run_order
.empty());
333 // After the delay has completed, the task runs normally.
334 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
335 EXPECT_THAT(run_order
, ElementsAre(1));
338 TEST_F(TaskQueueManagerTest
, DelayedTaskPosting_MultipleTasks_DecendingOrder
) {
339 Initialize(1u, SelectorType::Automatic
);
341 std::vector
<int> run_order
;
342 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
343 manager_
->TaskRunnerForQueue(0);
345 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
),
346 base::TimeDelta::FromMilliseconds(10));
348 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
),
349 base::TimeDelta::FromMilliseconds(8));
351 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
),
352 base::TimeDelta::FromMilliseconds(5));
354 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
355 test_task_runner_
->DelayToNextTaskTime());
357 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
358 EXPECT_THAT(run_order
, ElementsAre(3));
359 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
360 test_task_runner_
->DelayToNextTaskTime());
362 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
363 EXPECT_THAT(run_order
, ElementsAre(3, 2));
364 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
365 test_task_runner_
->DelayToNextTaskTime());
367 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
368 EXPECT_THAT(run_order
, ElementsAre(3, 2, 1));
371 TEST_F(TaskQueueManagerTest
, DelayedTaskPosting_MultipleTasks_AscendingOrder
) {
372 Initialize(1u, SelectorType::Automatic
);
374 std::vector
<int> run_order
;
375 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
376 manager_
->TaskRunnerForQueue(0);
378 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
),
379 base::TimeDelta::FromMilliseconds(1));
381 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
),
382 base::TimeDelta::FromMilliseconds(5));
384 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
),
385 base::TimeDelta::FromMilliseconds(10));
387 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1),
388 test_task_runner_
->DelayToNextTaskTime());
390 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
391 EXPECT_THAT(run_order
, ElementsAre(1));
392 EXPECT_EQ(base::TimeDelta::FromMilliseconds(4),
393 test_task_runner_
->DelayToNextTaskTime());
395 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(4));
396 EXPECT_THAT(run_order
, ElementsAre(1, 2));
397 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
398 test_task_runner_
->DelayToNextTaskTime());
400 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
401 EXPECT_THAT(run_order
, ElementsAre(1, 2, 3));
404 TEST_F(TaskQueueManagerTest
, PostDelayedTask_SharesUnderlyingDelayedTasks
) {
405 Initialize(1u, SelectorType::Automatic
);
407 std::vector
<int> run_order
;
408 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
409 manager_
->TaskRunnerForQueue(0);
411 base::TimeDelta
delay(base::TimeDelta::FromMilliseconds(10));
412 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
),
414 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
),
416 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
),
419 EXPECT_EQ(1u, test_task_runner_
->NumPendingTasks());
424 ~TestObject() { destructor_count_
++; }
426 void Run() { FAIL() << "TestObject::Run should not be called"; }
428 static int destructor_count_
;
431 int TestObject::destructor_count_
= 0;
433 TEST_F(TaskQueueManagerTest
, PendingDelayedTasksRemovedOnShutdown
) {
434 Initialize(1u, SelectorType::Automatic
);
436 TestObject::destructor_count_
= 0;
438 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
439 manager_
->TaskRunnerForQueue(0);
441 base::TimeDelta
delay(base::TimeDelta::FromMilliseconds(10));
442 runner
->PostDelayedTask(
443 FROM_HERE
, base::Bind(&TestObject::Run
, base::Owned(new TestObject())),
448 EXPECT_EQ(1, TestObject::destructor_count_
);
451 TEST_F(TaskQueueManagerTest
, ManualPumping
) {
452 Initialize(1u, SelectorType::Automatic
);
453 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL
);
455 std::vector
<int> run_order
;
456 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
457 manager_
->TaskRunnerForQueue(0);
459 // Posting a task when pumping is disabled doesn't result in work getting
461 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
462 EXPECT_FALSE(test_task_runner_
->HasPendingTasks());
464 // However polling still works.
465 EXPECT_FALSE(manager_
->IsQueueEmpty(0));
467 // After pumping the task runs normally.
468 manager_
->PumpQueue(0);
469 EXPECT_TRUE(test_task_runner_
->HasPendingTasks());
470 test_task_runner_
->RunUntilIdle();
471 EXPECT_THAT(run_order
, ElementsAre(1));
474 TEST_F(TaskQueueManagerTest
, ManualPumpingToggle
) {
475 Initialize(1u, SelectorType::Automatic
);
476 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL
);
478 std::vector
<int> run_order
;
479 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
480 manager_
->TaskRunnerForQueue(0);
482 // Posting a task when pumping is disabled doesn't result in work getting
484 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
485 EXPECT_FALSE(test_task_runner_
->HasPendingTasks());
487 // When pumping is enabled the task runs normally.
488 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO
);
489 EXPECT_TRUE(test_task_runner_
->HasPendingTasks());
490 test_task_runner_
->RunUntilIdle();
491 EXPECT_THAT(run_order
, ElementsAre(1));
494 TEST_F(TaskQueueManagerTest
, DenyRunning
) {
495 Initialize(1u, SelectorType::Explicit
);
497 std::vector
<int> run_order
;
498 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
499 manager_
->TaskRunnerForQueue(0);
500 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
502 // Since we haven't appended a work queue to be selected, the task doesn't
504 test_task_runner_
->RunUntilIdle();
505 EXPECT_TRUE(run_order
.empty());
507 // Pumping the queue again with a selected work queue runs the task.
508 manager_
->PumpQueue(0);
509 selector_
->AppendQueueToService(0);
510 test_task_runner_
->RunUntilIdle();
511 EXPECT_THAT(run_order
, ElementsAre(1));
514 TEST_F(TaskQueueManagerTest
, ManualPumpingWithDelayedTask
) {
515 Initialize(1u, SelectorType::Automatic
);
516 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL
);
518 std::vector
<int> run_order
;
519 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
520 manager_
->TaskRunnerForQueue(0);
522 // Posting a delayed task when pumping will apply the delay, but won't cause
523 // work to executed afterwards.
524 base::TimeDelta
delay(base::TimeDelta::FromMilliseconds(10));
525 runner
->PostDelayedTask(
526 FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
), delay
);
528 // After pumping but before the delay period has expired, task does not run.
529 manager_
->PumpQueue(0);
530 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
531 EXPECT_TRUE(run_order
.empty());
533 // Once the delay has expired, pumping causes the task to run.
534 now_src_
->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
535 manager_
->PumpQueue(0);
536 EXPECT_TRUE(test_task_runner_
->HasPendingTasks());
537 test_task_runner_
->RunPendingTasks();
538 EXPECT_THAT(run_order
, ElementsAre(1));
541 TEST_F(TaskQueueManagerTest
, ManualPumpingWithMultipleDelayedTasks
) {
542 Initialize(1u, SelectorType::Automatic
);
543 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL
);
545 std::vector
<int> run_order
;
546 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
547 manager_
->TaskRunnerForQueue(0);
549 // Posting a delayed task when pumping will apply the delay, but won't cause
550 // work to executed afterwards.
551 base::TimeDelta
delay1(base::TimeDelta::FromMilliseconds(1));
552 base::TimeDelta
delay2(base::TimeDelta::FromMilliseconds(10));
553 base::TimeDelta
delay3(base::TimeDelta::FromMilliseconds(20));
554 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
),
556 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
),
558 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
),
561 now_src_
->AdvanceNow(base::TimeDelta::FromMilliseconds(15));
562 test_task_runner_
->RunUntilIdle();
563 EXPECT_TRUE(run_order
.empty());
565 // Once the delay has expired, pumping causes the task to run.
566 manager_
->PumpQueue(0);
567 test_task_runner_
->RunUntilIdle();
568 EXPECT_THAT(run_order
, ElementsAre(1, 2));
571 TEST_F(TaskQueueManagerTest
, DelayedTasksDontAutoRunWithManualPumping
) {
572 Initialize(1u, SelectorType::Automatic
);
573 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL
);
575 std::vector
<int> run_order
;
576 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
577 manager_
->TaskRunnerForQueue(0);
579 base::TimeDelta
delay(base::TimeDelta::FromMilliseconds(10));
580 runner
->PostDelayedTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
),
583 test_task_runner_
->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
584 EXPECT_TRUE(run_order
.empty());
587 TEST_F(TaskQueueManagerTest
, ManualPumpingWithNonEmptyWorkQueue
) {
588 Initialize(1u, SelectorType::Automatic
);
589 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL
);
591 std::vector
<int> run_order
;
592 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
593 manager_
->TaskRunnerForQueue(0);
595 // Posting two tasks and pumping twice should result in two tasks in the work
597 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
598 manager_
->PumpQueue(0);
599 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
600 manager_
->PumpQueue(0);
602 EXPECT_EQ(2u, selector_
->work_queues()[0]->size());
605 void ReentrantTestTask(scoped_refptr
<base::SingleThreadTaskRunner
> runner
,
607 std::vector
<int>* out_result
) {
608 out_result
->push_back(countdown
);
610 runner
->PostTask(FROM_HERE
,
611 Bind(&ReentrantTestTask
, runner
, countdown
, out_result
));
615 TEST_F(TaskQueueManagerTest
, ReentrantPosting
) {
616 Initialize(1u, SelectorType::Automatic
);
618 std::vector
<int> run_order
;
619 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
620 manager_
->TaskRunnerForQueue(0);
622 runner
->PostTask(FROM_HERE
, Bind(&ReentrantTestTask
, runner
, 3, &run_order
));
624 test_task_runner_
->RunUntilIdle();
625 EXPECT_THAT(run_order
, ElementsAre(3, 2, 1));
628 TEST_F(TaskQueueManagerTest
, NoTasksAfterShutdown
) {
629 Initialize(1u, SelectorType::Automatic
);
631 std::vector
<int> run_order
;
632 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
633 manager_
->TaskRunnerForQueue(0);
635 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
638 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
640 test_task_runner_
->RunUntilIdle();
641 EXPECT_TRUE(run_order
.empty());
644 void PostTaskToRunner(scoped_refptr
<base::SingleThreadTaskRunner
> runner
,
645 std::vector
<int>* run_order
) {
646 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, run_order
));
649 TEST_F(TaskQueueManagerTest
, PostFromThread
) {
650 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
652 std::vector
<int> run_order
;
653 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
654 manager_
->TaskRunnerForQueue(0);
656 base::Thread
thread("TestThread");
658 thread
.message_loop()->PostTask(
659 FROM_HERE
, base::Bind(&PostTaskToRunner
, runner
, &run_order
));
662 message_loop_
->RunUntilIdle();
663 EXPECT_THAT(run_order
, ElementsAre(1));
666 void RePostingTestTask(scoped_refptr
<base::SingleThreadTaskRunner
> runner
,
671 Bind(&RePostingTestTask
, base::Unretained(runner
.get()), run_count
));
674 TEST_F(TaskQueueManagerTest
, DoWorkCantPostItselfMultipleTimes
) {
675 Initialize(1u, SelectorType::Automatic
);
676 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
677 manager_
->TaskRunnerForQueue(0);
680 runner
->PostTask(FROM_HERE
,
681 base::Bind(&RePostingTestTask
, runner
, &run_count
));
683 test_task_runner_
->RunPendingTasks();
684 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
685 // will be two tasks here.
686 EXPECT_EQ(1u, test_task_runner_
->NumPendingTasks());
687 EXPECT_EQ(1, run_count
);
690 TEST_F(TaskQueueManagerTest
, PostFromNestedRunloop
) {
691 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
693 std::vector
<int> run_order
;
694 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
695 manager_
->TaskRunnerForQueue(0);
697 std::vector
<std::pair
<base::Closure
, bool>> tasks_to_post_from_nested_loop
;
698 tasks_to_post_from_nested_loop
.push_back(
699 std::make_pair(base::Bind(&TestTask
, 1, &run_order
), true));
701 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 0, &run_order
));
703 FROM_HERE
, base::Bind(&PostFromNestedRunloop
, message_loop_
.get(), runner
,
704 base::Unretained(&tasks_to_post_from_nested_loop
)));
705 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
707 message_loop_
->RunUntilIdle();
709 EXPECT_THAT(run_order
, ElementsAre(0, 2, 1));
712 TEST_F(TaskQueueManagerTest
, WorkBatching
) {
713 Initialize(1u, SelectorType::Automatic
);
715 manager_
->SetWorkBatchSize(2);
717 std::vector
<int> run_order
;
718 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
719 manager_
->TaskRunnerForQueue(0);
721 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
722 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
723 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
));
724 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 4, &run_order
));
726 // Running one task in the host message loop should cause two posted tasks to
728 EXPECT_EQ(test_task_runner_
->NumPendingTasks(), 1u);
729 test_task_runner_
->RunPendingTasks();
730 EXPECT_THAT(run_order
, ElementsAre(1, 2));
732 // The second task runs the remaining two posted tasks.
733 EXPECT_EQ(test_task_runner_
->NumPendingTasks(), 1u);
734 test_task_runner_
->RunPendingTasks();
735 EXPECT_THAT(run_order
, ElementsAre(1, 2, 3, 4));
738 TEST_F(TaskQueueManagerTest
, AutoPumpAfterWakeup
) {
739 Initialize(2u, SelectorType::Explicit
);
740 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP
);
742 std::vector
<int> run_order
;
743 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
744 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
746 selector_
->AppendQueueToService(1);
747 selector_
->AppendQueueToService(0);
748 selector_
->AppendQueueToService(0);
750 runners
[0]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
751 test_task_runner_
->RunUntilIdle();
752 EXPECT_TRUE(run_order
.empty()); // Shouldn't run - no other task to wake TQM.
754 runners
[0]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
755 test_task_runner_
->RunUntilIdle();
756 EXPECT_TRUE(run_order
.empty()); // Still shouldn't wake TQM.
758 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
));
759 test_task_runner_
->RunUntilIdle();
760 // Executing a task on an auto pumped queue should wake the TQM.
761 EXPECT_THAT(run_order
, ElementsAre(3, 1, 2));
764 TEST_F(TaskQueueManagerTest
, AutoPumpAfterWakeupWhenAlreadyAwake
) {
765 Initialize(2u, SelectorType::Explicit
);
766 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP
);
768 std::vector
<int> run_order
;
769 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
770 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
772 selector_
->AppendQueueToService(1);
773 selector_
->AppendQueueToService(0);
775 runners
[0]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
776 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
777 test_task_runner_
->RunUntilIdle();
778 EXPECT_THAT(run_order
, ElementsAre(2, 1)); // TQM was already awake.
781 TEST_F(TaskQueueManagerTest
,
782 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue
) {
783 Initialize(2u, SelectorType::Explicit
);
784 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP
);
785 manager_
->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL
);
787 std::vector
<int> run_order
;
788 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
789 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
791 selector_
->AppendQueueToService(1);
792 selector_
->AppendQueueToService(0);
794 runners
[0]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
795 test_task_runner_
->RunUntilIdle();
796 EXPECT_TRUE(run_order
.empty()); // Shouldn't run - no other task to wake TQM.
798 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
799 test_task_runner_
->RunUntilIdle();
800 // This still shouldn't wake TQM as manual queue was not pumped.
801 EXPECT_TRUE(run_order
.empty());
803 manager_
->PumpQueue(1);
804 test_task_runner_
->RunUntilIdle();
805 // Executing a task on an auto pumped queue should wake the TQM.
806 EXPECT_THAT(run_order
, ElementsAre(2, 1));
809 void TestPostingTask(scoped_refptr
<base::SingleThreadTaskRunner
> task_runner
,
810 base::Closure task
) {
811 task_runner
->PostTask(FROM_HERE
, task
);
814 TEST_F(TaskQueueManagerTest
, AutoPumpAfterWakeupFromTask
) {
815 Initialize(2u, SelectorType::Explicit
);
816 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP
);
818 std::vector
<int> run_order
;
819 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
820 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
822 selector_
->AppendQueueToService(1);
823 selector_
->AppendQueueToService(1);
824 selector_
->AppendQueueToService(0);
826 // Check that a task which posts a task to an auto pump after wakeup queue
827 // doesn't cause the queue to wake up.
828 base::Closure after_wakeup_task
= base::Bind(&TestTask
, 1, &run_order
);
829 runners
[1]->PostTask(
831 base::Bind(&TestPostingTask
, runners
[0], after_wakeup_task
));
832 test_task_runner_
->RunUntilIdle();
833 EXPECT_TRUE(run_order
.empty());
835 // Wake up the queue.
836 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
837 test_task_runner_
->RunUntilIdle();
838 EXPECT_THAT(run_order
, ElementsAre(2, 1));
841 TEST_F(TaskQueueManagerTest
, AutoPumpAfterWakeupFromMultipleTasks
) {
842 Initialize(2u, SelectorType::Explicit
);
843 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP
);
845 std::vector
<int> run_order
;
846 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
847 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
849 selector_
->AppendQueueToService(1);
850 selector_
->AppendQueueToService(1);
851 selector_
->AppendQueueToService(1);
852 selector_
->AppendQueueToService(0);
853 selector_
->AppendQueueToService(0);
855 // Check that a task which posts a task to an auto pump after wakeup queue
856 // doesn't cause the queue to wake up.
857 base::Closure after_wakeup_task_1
= base::Bind(&TestTask
, 1, &run_order
);
858 base::Closure after_wakeup_task_2
= base::Bind(&TestTask
, 2, &run_order
);
859 runners
[1]->PostTask(
861 base::Bind(&TestPostingTask
, runners
[0], after_wakeup_task_1
));
862 runners
[1]->PostTask(
864 base::Bind(&TestPostingTask
, runners
[0], after_wakeup_task_2
));
865 test_task_runner_
->RunUntilIdle();
866 EXPECT_TRUE(run_order
.empty());
868 // Wake up the queue.
869 runners
[1]->PostTask(FROM_HERE
, base::Bind(&TestTask
, 3, &run_order
));
870 test_task_runner_
->RunUntilIdle();
871 EXPECT_THAT(run_order
, ElementsAre(3, 1, 2));
874 TEST_F(TaskQueueManagerTest
, AutoPumpAfterWakeupBecomesQuiescent
) {
875 Initialize(2u, SelectorType::Explicit
);
876 manager_
->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP
);
879 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
880 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
882 selector_
->AppendQueueToService(1);
883 selector_
->AppendQueueToService(0);
884 selector_
->AppendQueueToService(0);
885 // Append extra service queue '0' entries to the selector otherwise test will
886 // finish even if the RePostingTestTask woke each other up.
887 selector_
->AppendQueueToService(0);
888 selector_
->AppendQueueToService(0);
890 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
891 // queue they don't wake each other and will eventually stop when no other
893 runners
[0]->PostTask(FROM_HERE
,
894 base::Bind(&RePostingTestTask
, runners
[0], &run_count
));
895 runners
[0]->PostTask(FROM_HERE
,
896 base::Bind(&RePostingTestTask
, runners
[0], &run_count
));
897 runners
[1]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
898 test_task_runner_
->RunUntilIdle();
899 // The reposting tasks posted to the after wakeup queue shouldn't have woken
901 EXPECT_EQ(2, run_count
);
904 class MockTaskObserver
: public base::MessageLoop::TaskObserver
{
906 MOCK_METHOD1(DidProcessTask
, void(const base::PendingTask
& task
));
907 MOCK_METHOD1(WillProcessTask
, void(const base::PendingTask
& task
));
910 TEST_F(TaskQueueManagerTest
, TaskObserverAdding
) {
911 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
912 MockTaskObserver observer
;
914 manager_
->SetWorkBatchSize(2);
915 manager_
->AddTaskObserver(&observer
);
917 std::vector
<int> run_order
;
918 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
919 manager_
->TaskRunnerForQueue(0);
921 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
922 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 2, &run_order
));
924 // Two pairs of callbacks for the tasks above plus another one for the
925 // DoWork() posted by the task queue manager.
926 EXPECT_CALL(observer
, WillProcessTask(_
)).Times(3);
927 EXPECT_CALL(observer
, DidProcessTask(_
)).Times(3);
928 message_loop_
->RunUntilIdle();
931 TEST_F(TaskQueueManagerTest
, TaskObserverRemoving
) {
932 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
933 MockTaskObserver observer
;
934 manager_
->SetWorkBatchSize(2);
935 manager_
->AddTaskObserver(&observer
);
936 manager_
->RemoveTaskObserver(&observer
);
938 std::vector
<int> run_order
;
939 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
940 manager_
->TaskRunnerForQueue(0);
942 runner
->PostTask(FROM_HERE
, base::Bind(&TestTask
, 1, &run_order
));
944 EXPECT_CALL(observer
, WillProcessTask(_
)).Times(0);
945 EXPECT_CALL(observer
, DidProcessTask(_
)).Times(0);
947 message_loop_
->RunUntilIdle();
950 void RemoveObserverTask(TaskQueueManager
* manager
,
951 base::MessageLoop::TaskObserver
* observer
) {
952 manager
->RemoveTaskObserver(observer
);
955 TEST_F(TaskQueueManagerTest
, TaskObserverRemovingInsideTask
) {
956 InitializeWithRealMessageLoop(1u, SelectorType::Automatic
);
957 MockTaskObserver observer
;
958 manager_
->SetWorkBatchSize(3);
959 manager_
->AddTaskObserver(&observer
);
961 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
962 manager_
->TaskRunnerForQueue(0);
963 runner
->PostTask(FROM_HERE
,
964 base::Bind(&RemoveObserverTask
, manager_
.get(), &observer
));
966 EXPECT_CALL(observer
, WillProcessTask(_
)).Times(1);
967 EXPECT_CALL(observer
, DidProcessTask(_
)).Times(0);
968 message_loop_
->RunUntilIdle();
971 TEST_F(TaskQueueManagerTest
, ThreadCheckAfterTermination
) {
972 Initialize(1u, SelectorType::Automatic
);
973 scoped_refptr
<base::SingleThreadTaskRunner
> runner
=
974 manager_
->TaskRunnerForQueue(0);
975 EXPECT_TRUE(runner
->RunsTasksOnCurrentThread());
977 EXPECT_TRUE(runner
->RunsTasksOnCurrentThread());
980 TEST_F(TaskQueueManagerTest
, NextPendingDelayedTaskRunTime
) {
981 scoped_refptr
<cc::TestNowSource
> clock(cc::TestNowSource::Create());
982 Initialize(2u, SelectorType::Explicit
);
983 manager_
->SetTimeSourceForTesting(clock
);
985 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[2] = {
986 manager_
->TaskRunnerForQueue(0), manager_
->TaskRunnerForQueue(1)};
988 // With no delayed tasks.
989 EXPECT_TRUE(manager_
->NextPendingDelayedTaskRunTime().is_null());
991 // With a non-delayed task.
992 runners
[0]->PostTask(FROM_HERE
, base::Bind(&NopTask
));
993 EXPECT_TRUE(manager_
->NextPendingDelayedTaskRunTime().is_null());
995 // With a delayed task.
996 base::TimeDelta expected_delay
= base::TimeDelta::FromMilliseconds(50);
997 runners
[0]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
), expected_delay
);
998 EXPECT_EQ(clock
->Now() + expected_delay
,
999 manager_
->NextPendingDelayedTaskRunTime());
1001 // With another delayed task in the same queue with a longer delay.
1002 runners
[0]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
),
1003 base::TimeDelta::FromMilliseconds(100));
1004 EXPECT_EQ(clock
->Now() + expected_delay
,
1005 manager_
->NextPendingDelayedTaskRunTime());
1007 // With another delayed task in the same queue with a shorter delay.
1008 expected_delay
= base::TimeDelta::FromMilliseconds(20);
1009 runners
[0]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
), expected_delay
);
1010 EXPECT_EQ(clock
->Now() + expected_delay
,
1011 manager_
->NextPendingDelayedTaskRunTime());
1013 // With another delayed task in a different queue with a shorter delay.
1014 expected_delay
= base::TimeDelta::FromMilliseconds(10);
1015 runners
[1]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
), expected_delay
);
1016 EXPECT_EQ(clock
->Now() + expected_delay
,
1017 manager_
->NextPendingDelayedTaskRunTime());
1019 // Test it updates as time progresses
1020 clock
->AdvanceNow(expected_delay
);
1021 EXPECT_EQ(clock
->Now(), manager_
->NextPendingDelayedTaskRunTime());
1024 TEST_F(TaskQueueManagerTest
, NextPendingDelayedTaskRunTime_MultipleQueues
) {
1025 Initialize(3u, SelectorType::Automatic
);
1027 scoped_refptr
<base::SingleThreadTaskRunner
> runners
[3] = {
1028 manager_
->TaskRunnerForQueue(0),
1029 manager_
->TaskRunnerForQueue(1),
1030 manager_
->TaskRunnerForQueue(2)};
1032 base::TimeDelta delay1
= base::TimeDelta::FromMilliseconds(50);
1033 base::TimeDelta delay2
= base::TimeDelta::FromMilliseconds(5);
1034 base::TimeDelta delay3
= base::TimeDelta::FromMilliseconds(10);
1035 runners
[0]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
), delay1
);
1036 runners
[1]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
), delay2
);
1037 runners
[2]->PostDelayedTask(FROM_HERE
, base::Bind(&NopTask
), delay3
);
1039 EXPECT_EQ(now_src_
->Now() + delay2
,
1040 manager_
->NextPendingDelayedTaskRunTime());
1044 } // namespace content