[Media Router] Add integration tests and e2e tests for media router and presentation...
[chromium-blink-merge.git] / components / scheduler / child / task_queue_manager_unittest.cc
blobd5af6e42f2ce2f3ca97f543e49885827adf9f19c
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 "components/scheduler/child/task_queue_manager.h"
7 #include "base/location.h"
8 #include "base/single_thread_task_runner.h"
9 #include "base/test/simple_test_tick_clock.h"
10 #include "base/threading/thread.h"
11 #include "cc/test/ordered_simple_task_runner.h"
12 #include "components/scheduler/child/nestable_task_runner_for_test.h"
13 #include "components/scheduler/child/scheduler_message_loop_delegate.h"
14 #include "components/scheduler/child/task_queue_selector.h"
15 #include "components/scheduler/child/test_time_source.h"
16 #include "components/scheduler/test/test_always_fail_time_source.h"
17 #include "testing/gmock/include/gmock/gmock.h"
19 using testing::ElementsAre;
20 using testing::_;
22 namespace scheduler {
23 namespace {
25 class SelectorForTest : public TaskQueueSelector {
26 public:
27 ~SelectorForTest() override {}
29 virtual void AppendQueueToService(size_t queue_index) = 0;
31 virtual const std::vector<const base::TaskQueue*>& work_queues() = 0;
33 void AsValueInto(base::trace_event::TracedValue* state) const override {}
36 // Always selects queue 0.
37 class AutomaticSelectorForTest : public SelectorForTest {
38 public:
39 AutomaticSelectorForTest() {}
40 ~AutomaticSelectorForTest() override {}
42 void RegisterWorkQueues(
43 const std::vector<const base::TaskQueue*>& work_queues) override {
44 work_queues_ = work_queues;
47 bool SelectWorkQueueToService(size_t* out_queue_index) override {
48 for (size_t i = 0; i < work_queues_.size(); i++) {
49 if (!work_queues_[i]->empty()) {
50 *out_queue_index = i;
51 return true;
54 return false;
57 void AppendQueueToService(size_t queue_index) override {
58 DCHECK(false) << "Not supported";
61 const std::vector<const base::TaskQueue*>& work_queues() override {
62 return work_queues_;
65 void SetTaskQueueSelectorObserver(Observer* observer) override {}
67 private:
68 std::vector<const base::TaskQueue*> work_queues_;
70 DISALLOW_COPY_AND_ASSIGN(AutomaticSelectorForTest);
73 class ExplicitSelectorForTest : public SelectorForTest {
74 public:
75 ExplicitSelectorForTest() {}
76 ~ExplicitSelectorForTest() override {}
78 void RegisterWorkQueues(
79 const std::vector<const base::TaskQueue*>& work_queues) override {
80 work_queues_ = work_queues;
83 bool SelectWorkQueueToService(size_t* out_queue_index) override {
84 if (queues_to_service_.empty())
85 return false;
86 *out_queue_index = queues_to_service_.front();
87 queues_to_service_.pop_front();
88 return true;
91 void AppendQueueToService(size_t queue_index) override {
92 queues_to_service_.push_back(queue_index);
95 const std::vector<const base::TaskQueue*>& work_queues() override {
96 return work_queues_;
99 void SetTaskQueueSelectorObserver(Observer* observer) override {}
101 private:
102 std::deque<size_t> queues_to_service_;
103 std::vector<const base::TaskQueue*> work_queues_;
105 DISALLOW_COPY_AND_ASSIGN(ExplicitSelectorForTest);
108 } // namespace
110 class TaskQueueManagerTest : public testing::Test {
111 public:
112 void DeleteTaskQueueManager() { manager_.reset(); }
114 protected:
115 enum class SelectorType {
116 Automatic,
117 Explicit,
120 void Initialize(size_t num_queues, SelectorType type) {
121 now_src_.reset(new base::SimpleTestTickClock());
122 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000));
123 test_task_runner_ = make_scoped_refptr(
124 new cc::OrderedSimpleTaskRunner(now_src_.get(), false));
125 selector_ = make_scoped_ptr(createSelectorForTest(type));
126 manager_ = make_scoped_ptr(new TaskQueueManager(
127 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()),
128 selector_.get(), "test.scheduler", "test.scheduler.debug"));
129 manager_->SetTimeSourceForTesting(
130 make_scoped_ptr(new TestTimeSource(now_src_.get())));
132 EXPECT_EQ(num_queues, selector_->work_queues().size());
135 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) {
136 message_loop_.reset(new base::MessageLoop());
137 selector_ = make_scoped_ptr(createSelectorForTest(type));
138 manager_ = make_scoped_ptr(new TaskQueueManager(
139 num_queues, SchedulerMessageLoopDelegate::Create(message_loop_.get()),
140 selector_.get(), "test.scheduler", "test.scheduler.debug"));
141 EXPECT_EQ(num_queues, selector_->work_queues().size());
144 SelectorForTest* createSelectorForTest(SelectorType type) {
145 switch (type) {
146 case SelectorType::Automatic:
147 return new AutomaticSelectorForTest();
149 case SelectorType::Explicit:
150 return new ExplicitSelectorForTest();
153 return nullptr;
156 template <typename E>
157 static void CallForEachEnumValue(E first,
158 E last,
159 const char* (*function)(E)) {
160 for (E val = first; val < last;
161 val = static_cast<E>(static_cast<int>(val) + 1)) {
162 (*function)(val);
166 static void CheckAllPumpPolicyToString() {
167 CallForEachEnumValue<TaskQueueManager::PumpPolicy>(
168 TaskQueueManager::PumpPolicy::FIRST_PUMP_POLICY,
169 TaskQueueManager::PumpPolicy::PUMP_POLICY_COUNT,
170 &TaskQueueManager::PumpPolicyToString);
173 static void CheckAllWakeupPolicyToString() {
174 CallForEachEnumValue<TaskQueueManager::WakeupPolicy>(
175 TaskQueueManager::WakeupPolicy::FIRST_WAKEUP_POLICY,
176 TaskQueueManager::WakeupPolicy::WAKEUP_POLICY_COUNT,
177 &TaskQueueManager::WakeupPolicyToString);
180 scoped_ptr<base::SimpleTestTickClock> now_src_;
181 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
182 scoped_ptr<SelectorForTest> selector_;
183 scoped_ptr<TaskQueueManager> manager_;
184 scoped_ptr<base::MessageLoop> message_loop_;
187 void PostFromNestedRunloop(base::MessageLoop* message_loop,
188 base::SingleThreadTaskRunner* runner,
189 std::vector<std::pair<base::Closure, bool>>* tasks) {
190 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
191 for (std::pair<base::Closure, bool>& pair : *tasks) {
192 if (pair.second) {
193 runner->PostTask(FROM_HERE, pair.first);
194 } else {
195 runner->PostNonNestableTask(FROM_HERE, pair.first);
198 message_loop->RunUntilIdle();
201 void NullTask() {
204 void TestTask(int value, std::vector<int>* out_result) {
205 out_result->push_back(value);
208 TEST_F(TaskQueueManagerTest, SingleQueuePosting) {
209 Initialize(1u, SelectorType::Automatic);
211 std::vector<int> run_order;
212 scoped_refptr<base::SingleThreadTaskRunner> runner =
213 manager_->TaskRunnerForQueue(0);
215 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
216 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
217 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
219 test_task_runner_->RunUntilIdle();
220 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
223 TEST_F(TaskQueueManagerTest, MultiQueuePosting) {
224 Initialize(3u, SelectorType::Explicit);
226 std::vector<int> run_order;
227 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
228 manager_->TaskRunnerForQueue(0),
229 manager_->TaskRunnerForQueue(1),
230 manager_->TaskRunnerForQueue(2)};
232 selector_->AppendQueueToService(0);
233 selector_->AppendQueueToService(1);
234 selector_->AppendQueueToService(2);
235 selector_->AppendQueueToService(0);
236 selector_->AppendQueueToService(1);
237 selector_->AppendQueueToService(2);
239 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
240 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
241 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
242 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
243 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
244 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order));
246 test_task_runner_->RunUntilIdle();
247 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6));
250 void NopTask() {
253 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) {
254 Initialize(3u, SelectorType::Explicit);
256 manager_->SetTimeSourceForTesting(
257 make_scoped_ptr(new TestAlwaysFailTimeSource()));
259 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
260 manager_->TaskRunnerForQueue(0),
261 manager_->TaskRunnerForQueue(1),
262 manager_->TaskRunnerForQueue(2)};
264 selector_->AppendQueueToService(0);
265 selector_->AppendQueueToService(1);
266 selector_->AppendQueueToService(2);
267 selector_->AppendQueueToService(0);
268 selector_->AppendQueueToService(1);
269 selector_->AppendQueueToService(2);
271 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
272 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
273 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
274 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
275 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
276 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
278 test_task_runner_->RunUntilIdle();
281 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
282 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
284 std::vector<int> run_order;
285 scoped_refptr<base::SingleThreadTaskRunner> runner =
286 manager_->TaskRunnerForQueue(0);
288 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
290 message_loop_->RunUntilIdle();
291 EXPECT_THAT(run_order, ElementsAre(1));
294 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) {
295 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
297 std::vector<int> run_order;
298 scoped_refptr<base::SingleThreadTaskRunner> runner =
299 manager_->TaskRunnerForQueue(0);
301 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
302 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
303 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
304 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
305 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
307 message_loop_->RunUntilIdle();
308 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5));
311 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) {
312 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
314 std::vector<int> run_order;
315 scoped_refptr<base::SingleThreadTaskRunner> runner =
316 manager_->TaskRunnerForQueue(0);
318 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
319 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
321 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
322 tasks_to_post_from_nested_loop.push_back(
323 std::make_pair(base::Bind(&TestTask, 3, &run_order), false));
324 tasks_to_post_from_nested_loop.push_back(
325 std::make_pair(base::Bind(&TestTask, 4, &run_order), true));
326 tasks_to_post_from_nested_loop.push_back(
327 std::make_pair(base::Bind(&TestTask, 5, &run_order), true));
329 runner->PostTask(
330 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
331 base::Unretained(&tasks_to_post_from_nested_loop)));
333 message_loop_->RunUntilIdle();
334 // Note we expect task 3 to run last because it's non-nestable.
335 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3));
338 TEST_F(TaskQueueManagerTest, QueuePolling) {
339 Initialize(1u, SelectorType::Automatic);
341 std::vector<int> run_order;
342 scoped_refptr<base::SingleThreadTaskRunner> runner =
343 manager_->TaskRunnerForQueue(0);
345 EXPECT_TRUE(manager_->IsQueueEmpty(0));
346 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
347 EXPECT_FALSE(manager_->IsQueueEmpty(0));
349 test_task_runner_->RunUntilIdle();
350 EXPECT_TRUE(manager_->IsQueueEmpty(0));
353 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) {
354 Initialize(1u, SelectorType::Automatic);
356 std::vector<int> run_order;
357 scoped_refptr<base::SingleThreadTaskRunner> runner =
358 manager_->TaskRunnerForQueue(0);
360 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
361 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
362 delay);
363 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
364 EXPECT_TRUE(manager_->IsQueueEmpty(0));
365 EXPECT_TRUE(run_order.empty());
367 // The task doesn't run before the delay has completed.
368 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
369 EXPECT_TRUE(run_order.empty());
371 // After the delay has completed, the task runs normally.
372 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
373 EXPECT_THAT(run_order, ElementsAre(1));
376 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_DecendingOrder) {
377 Initialize(1u, SelectorType::Automatic);
379 std::vector<int> run_order;
380 scoped_refptr<base::SingleThreadTaskRunner> runner =
381 manager_->TaskRunnerForQueue(0);
383 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
384 base::TimeDelta::FromMilliseconds(10));
386 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
387 base::TimeDelta::FromMilliseconds(8));
389 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
390 base::TimeDelta::FromMilliseconds(5));
392 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
393 test_task_runner_->DelayToNextTaskTime());
395 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
396 EXPECT_THAT(run_order, ElementsAre(3));
397 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
398 test_task_runner_->DelayToNextTaskTime());
400 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
401 EXPECT_THAT(run_order, ElementsAre(3, 2));
402 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
403 test_task_runner_->DelayToNextTaskTime());
405 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
406 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
409 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_AscendingOrder) {
410 Initialize(1u, SelectorType::Automatic);
412 std::vector<int> run_order;
413 scoped_refptr<base::SingleThreadTaskRunner> runner =
414 manager_->TaskRunnerForQueue(0);
416 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
417 base::TimeDelta::FromMilliseconds(1));
419 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
420 base::TimeDelta::FromMilliseconds(5));
422 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
423 base::TimeDelta::FromMilliseconds(10));
425 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1),
426 test_task_runner_->DelayToNextTaskTime());
428 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
429 EXPECT_THAT(run_order, ElementsAre(1));
430 EXPECT_EQ(base::TimeDelta::FromMilliseconds(4),
431 test_task_runner_->DelayToNextTaskTime());
433 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(4));
434 EXPECT_THAT(run_order, ElementsAre(1, 2));
435 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
436 test_task_runner_->DelayToNextTaskTime());
438 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
439 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
442 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesUnderlyingDelayedTasks) {
443 Initialize(1u, SelectorType::Automatic);
445 std::vector<int> run_order;
446 scoped_refptr<base::SingleThreadTaskRunner> runner =
447 manager_->TaskRunnerForQueue(0);
449 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
450 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
451 delay);
452 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
453 delay);
454 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
455 delay);
457 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
460 class TestObject {
461 public:
462 ~TestObject() { destructor_count_++; }
464 void Run() { FAIL() << "TestObject::Run should not be called"; }
466 static int destructor_count_;
469 int TestObject::destructor_count_ = 0;
471 TEST_F(TaskQueueManagerTest, PendingDelayedTasksRemovedOnShutdown) {
472 Initialize(1u, SelectorType::Automatic);
474 TestObject::destructor_count_ = 0;
476 scoped_refptr<base::SingleThreadTaskRunner> runner =
477 manager_->TaskRunnerForQueue(0);
479 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
480 runner->PostDelayedTask(
481 FROM_HERE, base::Bind(&TestObject::Run, base::Owned(new TestObject())),
482 delay);
483 runner->PostTask(FROM_HERE,
484 base::Bind(&TestObject::Run, base::Owned(new TestObject())));
486 manager_.reset();
488 EXPECT_EQ(2, TestObject::destructor_count_);
491 TEST_F(TaskQueueManagerTest, ManualPumping) {
492 Initialize(1u, SelectorType::Automatic);
493 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
495 std::vector<int> run_order;
496 scoped_refptr<base::SingleThreadTaskRunner> runner =
497 manager_->TaskRunnerForQueue(0);
499 // Posting a task when pumping is disabled doesn't result in work getting
500 // posted.
501 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
502 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
504 // However polling still works.
505 EXPECT_FALSE(manager_->IsQueueEmpty(0));
507 // After pumping the task runs normally.
508 manager_->PumpQueue(0);
509 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
510 test_task_runner_->RunUntilIdle();
511 EXPECT_THAT(run_order, ElementsAre(1));
514 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
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 task when pumping is disabled doesn't result in work getting
523 // posted.
524 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
525 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
527 // When pumping is enabled the task runs normally.
528 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
529 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
530 test_task_runner_->RunUntilIdle();
531 EXPECT_THAT(run_order, ElementsAre(1));
534 TEST_F(TaskQueueManagerTest, DenyRunning) {
535 Initialize(1u, SelectorType::Explicit);
537 std::vector<int> run_order;
538 scoped_refptr<base::SingleThreadTaskRunner> runner =
539 manager_->TaskRunnerForQueue(0);
540 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
542 // Since we haven't appended a work queue to be selected, the task doesn't
543 // run.
544 test_task_runner_->RunUntilIdle();
545 EXPECT_TRUE(run_order.empty());
547 // Pumping the queue again with a selected work queue runs the task.
548 manager_->PumpQueue(0);
549 selector_->AppendQueueToService(0);
550 test_task_runner_->RunUntilIdle();
551 EXPECT_THAT(run_order, ElementsAre(1));
554 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
555 Initialize(1u, SelectorType::Automatic);
556 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
558 std::vector<int> run_order;
559 scoped_refptr<base::SingleThreadTaskRunner> runner =
560 manager_->TaskRunnerForQueue(0);
562 // Posting a delayed task when pumping will apply the delay, but won't cause
563 // work to executed afterwards.
564 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
565 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
566 delay);
568 // After pumping but before the delay period has expired, task does not run.
569 manager_->PumpQueue(0);
570 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
571 EXPECT_TRUE(run_order.empty());
573 // Once the delay has expired, pumping causes the task to run.
574 now_src_->Advance(base::TimeDelta::FromMilliseconds(5));
575 manager_->PumpQueue(0);
576 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
577 test_task_runner_->RunPendingTasks();
578 EXPECT_THAT(run_order, ElementsAre(1));
581 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
582 Initialize(1u, SelectorType::Automatic);
583 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
585 std::vector<int> run_order;
586 scoped_refptr<base::SingleThreadTaskRunner> runner =
587 manager_->TaskRunnerForQueue(0);
589 // Posting a delayed task when pumping will apply the delay, but won't cause
590 // work to executed afterwards.
591 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
592 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
593 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20));
594 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
595 delay1);
596 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
597 delay2);
598 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
599 delay3);
601 now_src_->Advance(base::TimeDelta::FromMilliseconds(15));
602 test_task_runner_->RunUntilIdle();
603 EXPECT_TRUE(run_order.empty());
605 // Once the delay has expired, pumping causes the task to run.
606 manager_->PumpQueue(0);
607 test_task_runner_->RunUntilIdle();
608 EXPECT_THAT(run_order, ElementsAre(1, 2));
611 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
612 Initialize(1u, SelectorType::Automatic);
613 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
615 std::vector<int> run_order;
616 scoped_refptr<base::SingleThreadTaskRunner> runner =
617 manager_->TaskRunnerForQueue(0);
619 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
620 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
621 delay);
623 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
624 EXPECT_TRUE(run_order.empty());
627 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
628 Initialize(1u, SelectorType::Automatic);
629 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
631 std::vector<int> run_order;
632 scoped_refptr<base::SingleThreadTaskRunner> runner =
633 manager_->TaskRunnerForQueue(0);
635 // Posting two tasks and pumping twice should result in two tasks in the work
636 // queue.
637 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
638 manager_->PumpQueue(0);
639 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
640 manager_->PumpQueue(0);
642 EXPECT_EQ(2u, selector_->work_queues()[0]->size());
645 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
646 int countdown,
647 std::vector<int>* out_result) {
648 out_result->push_back(countdown);
649 if (--countdown) {
650 runner->PostTask(FROM_HERE,
651 Bind(&ReentrantTestTask, runner, countdown, out_result));
655 TEST_F(TaskQueueManagerTest, ReentrantPosting) {
656 Initialize(1u, SelectorType::Automatic);
658 std::vector<int> run_order;
659 scoped_refptr<base::SingleThreadTaskRunner> runner =
660 manager_->TaskRunnerForQueue(0);
662 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order));
664 test_task_runner_->RunUntilIdle();
665 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
668 TEST_F(TaskQueueManagerTest, NoTasksAfterShutdown) {
669 Initialize(1u, SelectorType::Automatic);
671 std::vector<int> run_order;
672 scoped_refptr<base::SingleThreadTaskRunner> runner =
673 manager_->TaskRunnerForQueue(0);
675 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
676 manager_.reset();
677 selector_.reset();
678 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
680 test_task_runner_->RunUntilIdle();
681 EXPECT_TRUE(run_order.empty());
684 void PostTaskToRunner(scoped_refptr<base::SingleThreadTaskRunner> runner,
685 std::vector<int>* run_order) {
686 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, run_order));
689 TEST_F(TaskQueueManagerTest, PostFromThread) {
690 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
692 std::vector<int> run_order;
693 scoped_refptr<base::SingleThreadTaskRunner> runner =
694 manager_->TaskRunnerForQueue(0);
696 base::Thread thread("TestThread");
697 thread.Start();
698 thread.task_runner()->PostTask(
699 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order));
700 thread.Stop();
702 message_loop_->RunUntilIdle();
703 EXPECT_THAT(run_order, ElementsAre(1));
706 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
707 int* run_count) {
708 (*run_count)++;
709 runner->PostTask(FROM_HERE, Bind(&RePostingTestTask,
710 base::Unretained(runner.get()), run_count));
713 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
714 Initialize(1u, SelectorType::Automatic);
715 scoped_refptr<base::SingleThreadTaskRunner> runner =
716 manager_->TaskRunnerForQueue(0);
718 int run_count = 0;
719 runner->PostTask(FROM_HERE,
720 base::Bind(&RePostingTestTask, runner, &run_count));
722 test_task_runner_->RunPendingTasks();
723 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
724 // will be two tasks here.
725 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
726 EXPECT_EQ(1, run_count);
729 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
730 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
732 std::vector<int> run_order;
733 scoped_refptr<base::SingleThreadTaskRunner> runner =
734 manager_->TaskRunnerForQueue(0);
736 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
737 tasks_to_post_from_nested_loop.push_back(
738 std::make_pair(base::Bind(&TestTask, 1, &run_order), true));
740 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order));
741 runner->PostTask(
742 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
743 base::Unretained(&tasks_to_post_from_nested_loop)));
744 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
746 message_loop_->RunUntilIdle();
748 EXPECT_THAT(run_order, ElementsAre(0, 2, 1));
751 TEST_F(TaskQueueManagerTest, WorkBatching) {
752 Initialize(1u, SelectorType::Automatic);
754 manager_->SetWorkBatchSize(2);
756 std::vector<int> run_order;
757 scoped_refptr<base::SingleThreadTaskRunner> runner =
758 manager_->TaskRunnerForQueue(0);
760 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
761 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
762 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
763 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
765 // Running one task in the host message loop should cause two posted tasks to
766 // get executed.
767 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
768 test_task_runner_->RunPendingTasks();
769 EXPECT_THAT(run_order, ElementsAre(1, 2));
771 // The second task runs the remaining two posted tasks.
772 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
773 test_task_runner_->RunPendingTasks();
774 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
777 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
778 Initialize(2u, SelectorType::Explicit);
779 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
781 std::vector<int> run_order;
782 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
783 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
785 selector_->AppendQueueToService(1);
786 selector_->AppendQueueToService(0);
787 selector_->AppendQueueToService(0);
789 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
790 test_task_runner_->RunUntilIdle();
791 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
793 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
794 test_task_runner_->RunUntilIdle();
795 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM.
797 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
798 test_task_runner_->RunUntilIdle();
799 // Executing a task on an auto pumped queue should wake the TQM.
800 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
803 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) {
804 Initialize(2u, SelectorType::Explicit);
805 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
807 std::vector<int> run_order;
808 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
809 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
811 selector_->AppendQueueToService(1);
812 selector_->AppendQueueToService(0);
814 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
815 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
816 test_task_runner_->RunUntilIdle();
817 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake.
820 TEST_F(TaskQueueManagerTest,
821 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) {
822 Initialize(2u, SelectorType::Explicit);
823 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
824 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL);
826 std::vector<int> run_order;
827 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
828 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
830 selector_->AppendQueueToService(1);
831 selector_->AppendQueueToService(0);
833 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
834 test_task_runner_->RunUntilIdle();
835 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
837 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
838 test_task_runner_->RunUntilIdle();
839 // This still shouldn't wake TQM as manual queue was not pumped.
840 EXPECT_TRUE(run_order.empty());
842 manager_->PumpQueue(1);
843 test_task_runner_->RunUntilIdle();
844 // Executing a task on an auto pumped queue should wake the TQM.
845 EXPECT_THAT(run_order, ElementsAre(2, 1));
848 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
849 base::Closure task) {
850 task_runner->PostTask(FROM_HERE, task);
853 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) {
854 Initialize(2u, SelectorType::Explicit);
855 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
857 std::vector<int> run_order;
858 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
859 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
861 selector_->AppendQueueToService(1);
862 selector_->AppendQueueToService(1);
863 selector_->AppendQueueToService(0);
865 // Check that a task which posts a task to an auto pump after wakeup queue
866 // doesn't cause the queue to wake up.
867 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order);
868 runners[1]->PostTask(
869 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
870 test_task_runner_->RunUntilIdle();
871 EXPECT_TRUE(run_order.empty());
873 // Wake up the queue.
874 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
875 test_task_runner_->RunUntilIdle();
876 EXPECT_THAT(run_order, ElementsAre(2, 1));
879 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) {
880 Initialize(2u, SelectorType::Explicit);
881 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
883 std::vector<int> run_order;
884 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
885 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
887 selector_->AppendQueueToService(1);
888 selector_->AppendQueueToService(1);
889 selector_->AppendQueueToService(1);
890 selector_->AppendQueueToService(0);
891 selector_->AppendQueueToService(0);
893 // Check that a task which posts a task to an auto pump after wakeup queue
894 // doesn't cause the queue to wake up.
895 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order);
896 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order);
897 runners[1]->PostTask(
898 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1));
899 runners[1]->PostTask(
900 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
901 test_task_runner_->RunUntilIdle();
902 EXPECT_TRUE(run_order.empty());
904 // Wake up the queue.
905 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
906 test_task_runner_->RunUntilIdle();
907 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
910 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
911 Initialize(2u, SelectorType::Explicit);
912 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
914 int run_count = 0;
915 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
916 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
918 selector_->AppendQueueToService(1);
919 selector_->AppendQueueToService(0);
920 selector_->AppendQueueToService(0);
921 // Append extra service queue '0' entries to the selector otherwise test will
922 // finish even if the RePostingTestTask woke each other up.
923 selector_->AppendQueueToService(0);
924 selector_->AppendQueueToService(0);
926 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
927 // queue they don't wake each other and will eventually stop when no other
928 // tasks execute.
929 runners[0]->PostTask(FROM_HERE,
930 base::Bind(&RePostingTestTask, runners[0], &run_count));
931 runners[0]->PostTask(FROM_HERE,
932 base::Bind(&RePostingTestTask, runners[0], &run_count));
933 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
934 test_task_runner_->RunUntilIdle();
935 // The reposting tasks posted to the after wakeup queue shouldn't have woken
936 // each other up.
937 EXPECT_EQ(2, run_count);
940 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWithDontWakeQueue) {
941 Initialize(3u, SelectorType::Explicit);
942 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
943 manager_->SetWakeupPolicy(1,
944 TaskQueueManager::WakeupPolicy::DONT_WAKE_OTHER_QUEUES);
946 std::vector<int> run_order;
947 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
948 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1),
949 manager_->TaskRunnerForQueue(2)};
951 selector_->AppendQueueToService(1);
952 selector_->AppendQueueToService(2);
953 selector_->AppendQueueToService(0);
955 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
956 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
957 test_task_runner_->RunUntilIdle();
958 // Executing a DONT_WAKE_OTHER_QUEUES queue shouldn't wake the autopump after
959 // wakeup queue.
960 EXPECT_THAT(run_order, ElementsAre(2));
962 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
963 test_task_runner_->RunUntilIdle();
964 // Executing a CAN_WAKE_OTHER_QUEUES queue should wake the autopump after
965 // wakeup queue.
966 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
969 class MockTaskObserver : public base::MessageLoop::TaskObserver {
970 public:
971 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
972 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
975 TEST_F(TaskQueueManagerTest, TaskObserverAdding) {
976 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
977 MockTaskObserver observer;
979 manager_->SetWorkBatchSize(2);
980 manager_->AddTaskObserver(&observer);
982 std::vector<int> run_order;
983 scoped_refptr<base::SingleThreadTaskRunner> runner =
984 manager_->TaskRunnerForQueue(0);
986 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
987 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
989 // Two pairs of callbacks for the tasks above plus another one for the
990 // DoWork() posted by the task queue manager.
991 EXPECT_CALL(observer, WillProcessTask(_)).Times(3);
992 EXPECT_CALL(observer, DidProcessTask(_)).Times(3);
993 message_loop_->RunUntilIdle();
996 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) {
997 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
998 MockTaskObserver observer;
999 manager_->SetWorkBatchSize(2);
1000 manager_->AddTaskObserver(&observer);
1001 manager_->RemoveTaskObserver(&observer);
1003 std::vector<int> run_order;
1004 scoped_refptr<base::SingleThreadTaskRunner> runner =
1005 manager_->TaskRunnerForQueue(0);
1007 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
1009 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
1010 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
1012 message_loop_->RunUntilIdle();
1015 void RemoveObserverTask(TaskQueueManager* manager,
1016 base::MessageLoop::TaskObserver* observer) {
1017 manager->RemoveTaskObserver(observer);
1020 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) {
1021 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
1022 MockTaskObserver observer;
1023 manager_->SetWorkBatchSize(3);
1024 manager_->AddTaskObserver(&observer);
1026 scoped_refptr<base::SingleThreadTaskRunner> runner =
1027 manager_->TaskRunnerForQueue(0);
1028 runner->PostTask(FROM_HERE,
1029 base::Bind(&RemoveObserverTask, manager_.get(), &observer));
1031 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
1032 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
1033 message_loop_->RunUntilIdle();
1036 TEST_F(TaskQueueManagerTest, ThreadCheckAfterTermination) {
1037 Initialize(1u, SelectorType::Automatic);
1038 scoped_refptr<base::SingleThreadTaskRunner> runner =
1039 manager_->TaskRunnerForQueue(0);
1040 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
1041 manager_.reset();
1042 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
1045 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime) {
1046 scoped_ptr<base::SimpleTestTickClock> clock(new base::SimpleTestTickClock());
1047 clock->Advance(base::TimeDelta::FromMicroseconds(10000));
1048 Initialize(2u, SelectorType::Explicit);
1049 manager_->SetTimeSourceForTesting(
1050 make_scoped_ptr(new TestTimeSource(clock.get())));
1052 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
1053 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
1055 // With no delayed tasks.
1056 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null());
1058 // With a non-delayed task.
1059 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
1060 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null());
1062 // With a delayed task.
1063 base::TimeDelta expected_delay = base::TimeDelta::FromMilliseconds(50);
1064 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
1065 EXPECT_EQ(clock->NowTicks() + expected_delay,
1066 manager_->NextPendingDelayedTaskRunTime());
1068 // With another delayed task in the same queue with a longer delay.
1069 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask),
1070 base::TimeDelta::FromMilliseconds(100));
1071 EXPECT_EQ(clock->NowTicks() + expected_delay,
1072 manager_->NextPendingDelayedTaskRunTime());
1074 // With another delayed task in the same queue with a shorter delay.
1075 expected_delay = base::TimeDelta::FromMilliseconds(20);
1076 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
1077 EXPECT_EQ(clock->NowTicks() + expected_delay,
1078 manager_->NextPendingDelayedTaskRunTime());
1080 // With another delayed task in a different queue with a shorter delay.
1081 expected_delay = base::TimeDelta::FromMilliseconds(10);
1082 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
1083 EXPECT_EQ(clock->NowTicks() + expected_delay,
1084 manager_->NextPendingDelayedTaskRunTime());
1086 // Test it updates as time progresses
1087 clock->Advance(expected_delay);
1088 EXPECT_EQ(clock->NowTicks(), manager_->NextPendingDelayedTaskRunTime());
1091 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime_MultipleQueues) {
1092 Initialize(3u, SelectorType::Automatic);
1094 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
1095 manager_->TaskRunnerForQueue(0),
1096 manager_->TaskRunnerForQueue(1),
1097 manager_->TaskRunnerForQueue(2)};
1099 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(50);
1100 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(5);
1101 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(10);
1102 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1);
1103 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2);
1104 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3);
1106 EXPECT_EQ(now_src_->NowTicks() + delay2,
1107 manager_->NextPendingDelayedTaskRunTime());
1110 TEST_F(TaskQueueManagerTest, DeleteTaskQueueManagerInsideATask) {
1111 Initialize(1u, SelectorType::Automatic);
1113 scoped_refptr<base::SingleThreadTaskRunner> runner =
1114 manager_->TaskRunnerForQueue(0);
1115 runner->PostTask(FROM_HERE,
1116 base::Bind(&TaskQueueManagerTest::DeleteTaskQueueManager,
1117 base::Unretained(this)));
1119 // This should not crash, assuming DoWork detects the TaskQueueManager has
1120 // been deleted.
1121 test_task_runner_->RunUntilIdle();
1124 TEST_F(TaskQueueManagerTest, GetAndClearTaskWasRunBitmap) {
1125 Initialize(3u, SelectorType::Automatic);
1127 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
1128 manager_->TaskRunnerForQueue(0),
1129 manager_->TaskRunnerForQueue(1),
1130 manager_->TaskRunnerForQueue(2)};
1132 EXPECT_EQ(0ul, manager_->GetAndClearTaskWasRunOnQueueBitmap());
1134 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
1135 test_task_runner_->RunUntilIdle();
1136 EXPECT_EQ(1ul << 0, manager_->GetAndClearTaskWasRunOnQueueBitmap());
1138 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
1139 test_task_runner_->RunUntilIdle();
1140 EXPECT_EQ(1ul << 1, manager_->GetAndClearTaskWasRunOnQueueBitmap());
1142 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
1143 test_task_runner_->RunUntilIdle();
1144 EXPECT_EQ(1ul << 2, manager_->GetAndClearTaskWasRunOnQueueBitmap());
1146 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
1147 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
1148 test_task_runner_->RunUntilIdle();
1149 EXPECT_EQ(1ul << 0 | 1ul << 2,
1150 manager_->GetAndClearTaskWasRunOnQueueBitmap());
1151 EXPECT_EQ(0ul, manager_->GetAndClearTaskWasRunOnQueueBitmap());
1154 TEST_F(TaskQueueManagerTest, GetAndClearTaskWasRunBitmap_ManyQueues) {
1155 Initialize(64u, SelectorType::Automatic);
1157 manager_->TaskRunnerForQueue(63)->PostTask(FROM_HERE, base::Bind(&NopTask));
1158 test_task_runner_->RunUntilIdle();
1159 EXPECT_EQ(1ull << 63, manager_->GetAndClearTaskWasRunOnQueueBitmap());
1162 TEST_F(TaskQueueManagerTest, PumpPolicyToString) {
1163 CheckAllPumpPolicyToString();
1166 TEST_F(TaskQueueManagerTest, WakeupPolicyToString) {
1167 CheckAllWakeupPolicyToString();
1170 TEST_F(TaskQueueManagerTest, IsQueueEmpty) {
1171 Initialize(2u, SelectorType::Automatic);
1172 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
1173 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL);
1175 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
1176 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
1178 EXPECT_TRUE(manager_->IsQueueEmpty(0));
1179 EXPECT_TRUE(manager_->IsQueueEmpty(1));
1181 runners[0]->PostTask(FROM_HERE, base::Bind(NullTask));
1182 runners[1]->PostTask(FROM_HERE, base::Bind(NullTask));
1183 EXPECT_FALSE(manager_->IsQueueEmpty(0));
1184 EXPECT_FALSE(manager_->IsQueueEmpty(1));
1186 test_task_runner_->RunUntilIdle();
1187 EXPECT_TRUE(manager_->IsQueueEmpty(0));
1188 EXPECT_FALSE(manager_->IsQueueEmpty(1));
1190 manager_->PumpQueue(1);
1191 EXPECT_TRUE(manager_->IsQueueEmpty(0));
1192 EXPECT_FALSE(manager_->IsQueueEmpty(1));
1194 test_task_runner_->RunUntilIdle();
1195 EXPECT_TRUE(manager_->IsQueueEmpty(0));
1196 EXPECT_TRUE(manager_->IsQueueEmpty(1));
1199 TEST_F(TaskQueueManagerTest, GetQueueState) {
1200 Initialize(2u, SelectorType::Automatic);
1201 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
1202 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL);
1204 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
1205 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
1207 EXPECT_EQ(TaskQueueManager::QueueState::EMPTY, manager_->GetQueueState(0));
1208 EXPECT_EQ(TaskQueueManager::QueueState::EMPTY, manager_->GetQueueState(1));
1210 runners[0]->PostTask(FROM_HERE, base::Bind(NullTask));
1211 runners[0]->PostTask(FROM_HERE, base::Bind(NullTask));
1212 runners[1]->PostTask(FROM_HERE, base::Bind(NullTask));
1213 EXPECT_EQ(TaskQueueManager::QueueState::NEEDS_PUMPING,
1214 manager_->GetQueueState(0));
1215 EXPECT_EQ(TaskQueueManager::QueueState::NEEDS_PUMPING,
1216 manager_->GetQueueState(1));
1218 test_task_runner_->SetRunTaskLimit(1);
1219 test_task_runner_->RunPendingTasks();
1220 EXPECT_EQ(TaskQueueManager::QueueState::HAS_WORK,
1221 manager_->GetQueueState(0));
1222 EXPECT_EQ(TaskQueueManager::QueueState::NEEDS_PUMPING,
1223 manager_->GetQueueState(1));
1225 test_task_runner_->ClearRunTaskLimit();
1226 test_task_runner_->RunUntilIdle();
1227 EXPECT_EQ(TaskQueueManager::QueueState::EMPTY,
1228 manager_->GetQueueState(0));
1229 EXPECT_EQ(TaskQueueManager::QueueState::NEEDS_PUMPING,
1230 manager_->GetQueueState(1));
1232 manager_->PumpQueue(1);
1233 EXPECT_EQ(TaskQueueManager::QueueState::EMPTY,
1234 manager_->GetQueueState(0));
1235 EXPECT_EQ(TaskQueueManager::QueueState::HAS_WORK,
1236 manager_->GetQueueState(1));
1238 test_task_runner_->RunUntilIdle();
1239 EXPECT_EQ(TaskQueueManager::QueueState::EMPTY,
1240 manager_->GetQueueState(0));
1241 EXPECT_EQ(TaskQueueManager::QueueState::EMPTY,
1242 manager_->GetQueueState(1));
1245 } // namespace scheduler