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

Side by Side Diff: content/renderer/scheduler/task_queue_manager_unittest.cc

Issue 966813003: [content]: Ensure TaskQueueManager AFTER_WAKEUP autopump policy wakes only on newer tasks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review Comments Created 5 years, 9 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
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/scheduler/task_queue_manager.h" 5 #include "content/renderer/scheduler/task_queue_manager.h"
6 6
7 #include "base/test/test_simple_task_runner.h" 7 #include "base/test/test_simple_task_runner.h"
8 #include "base/threading/thread.h" 8 #include "base/threading/thread.h"
9 #include "cc/test/test_now_source.h" 9 #include "cc/test/test_now_source.h"
10 #include "content/renderer/scheduler/task_queue_selector.h" 10 #include "content/renderer/scheduler/task_queue_selector.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); 51 DISALLOW_COPY_AND_ASSIGN(SelectorForTest);
52 }; 52 };
53 53
54 class TaskQueueManagerTest : public testing::Test { 54 class TaskQueueManagerTest : public testing::Test {
55 protected: 55 protected:
56 void Initialize(size_t num_queues) { 56 void Initialize(size_t num_queues) {
57 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); 57 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner());
58 selector_ = make_scoped_ptr(new SelectorForTest); 58 selector_ = make_scoped_ptr(new SelectorForTest);
59 manager_ = make_scoped_ptr( 59 manager_ = make_scoped_ptr(
60 new TaskQueueManager(num_queues, test_task_runner_, selector_.get())); 60 new TaskQueueManager(num_queues, test_task_runner_, selector_.get()));
61 EXPECT_EQ(num_queues, selector_->work_queues().size());
61 } 62 }
62 63
63 void InitializeWithRealMessageLoop(size_t num_queues) { 64 void InitializeWithRealMessageLoop(size_t num_queues) {
64 message_loop_.reset(new base::MessageLoop()); 65 message_loop_.reset(new base::MessageLoop());
65 selector_ = make_scoped_ptr(new SelectorForTest); 66 selector_ = make_scoped_ptr(new SelectorForTest);
66 manager_ = make_scoped_ptr(new TaskQueueManager( 67 manager_ = make_scoped_ptr(new TaskQueueManager(
67 num_queues, message_loop_->task_runner(), selector_.get())); 68 num_queues, message_loop_->task_runner(), selector_.get()));
69 EXPECT_EQ(num_queues, selector_->work_queues().size());
68 } 70 }
69 71
70 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; 72 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_;
71 scoped_ptr<SelectorForTest> selector_; 73 scoped_ptr<SelectorForTest> selector_;
72 scoped_ptr<TaskQueueManager> manager_; 74 scoped_ptr<TaskQueueManager> manager_;
73 scoped_ptr<base::MessageLoop> message_loop_; 75 scoped_ptr<base::MessageLoop> message_loop_;
74 }; 76 };
75 77
76 void PostFromNestedRunloop(base::MessageLoop* message_loop, 78 void PostFromNestedRunloop(base::MessageLoop* message_loop,
77 base::SingleThreadTaskRunner* runner, 79 base::SingleThreadTaskRunner* runner,
78 std::vector<std::pair<base::Closure, bool>>* tasks) { 80 std::vector<std::pair<base::Closure, bool>>* tasks) {
79 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); 81 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
80 for (std::pair<base::Closure, bool>& pair : *tasks) { 82 for (std::pair<base::Closure, bool>& pair : *tasks) {
81 if (pair.second) { 83 if (pair.second) {
82 runner->PostTask(FROM_HERE, pair.first); 84 runner->PostTask(FROM_HERE, pair.first);
83 } else { 85 } else {
84 runner->PostNonNestableTask(FROM_HERE, pair.first); 86 runner->PostNonNestableTask(FROM_HERE, pair.first);
85 } 87 }
86 } 88 }
87 message_loop->RunUntilIdle(); 89 message_loop->RunUntilIdle();
88 } 90 }
89 91
90 void TestTask(int value, std::vector<int>* out_result) { 92 void TestTask(int value, std::vector<int>* out_result) {
91 out_result->push_back(value); 93 out_result->push_back(value);
92 } 94 }
93 95
94 TEST_F(TaskQueueManagerTest, SingleQueuePosting) { 96 TEST_F(TaskQueueManagerTest, SingleQueuePosting) {
95 Initialize(1u); 97 Initialize(1u);
96 EXPECT_EQ(1u, selector_->work_queues().size());
97 98
98 std::vector<int> run_order; 99 std::vector<int> run_order;
99 scoped_refptr<base::SingleThreadTaskRunner> runner = 100 scoped_refptr<base::SingleThreadTaskRunner> runner =
100 manager_->TaskRunnerForQueue(0); 101 manager_->TaskRunnerForQueue(0);
101 102
102 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 103 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
103 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 104 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
104 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 105 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
105 106
106 selector_->AppendQueueToService(0); 107 selector_->AppendQueueToService(0);
107 selector_->AppendQueueToService(0); 108 selector_->AppendQueueToService(0);
108 selector_->AppendQueueToService(0); 109 selector_->AppendQueueToService(0);
109 110
110 test_task_runner_->RunUntilIdle(); 111 test_task_runner_->RunUntilIdle();
111 EXPECT_THAT(run_order, ElementsAre(1, 2, 3)); 112 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
112 } 113 }
113 114
114 TEST_F(TaskQueueManagerTest, MultiQueuePosting) { 115 TEST_F(TaskQueueManagerTest, MultiQueuePosting) {
115 Initialize(3u); 116 Initialize(3u);
116 EXPECT_EQ(3u, selector_->work_queues().size());
117 117
118 std::vector<int> run_order; 118 std::vector<int> run_order;
119 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = { 119 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
120 manager_->TaskRunnerForQueue(0), 120 manager_->TaskRunnerForQueue(0),
121 manager_->TaskRunnerForQueue(1), 121 manager_->TaskRunnerForQueue(1),
122 manager_->TaskRunnerForQueue(2)}; 122 manager_->TaskRunnerForQueue(2)};
123 123
124 selector_->AppendQueueToService(0); 124 selector_->AppendQueueToService(0);
125 selector_->AppendQueueToService(1); 125 selector_->AppendQueueToService(1);
126 selector_->AppendQueueToService(2); 126 selector_->AppendQueueToService(2);
127 selector_->AppendQueueToService(0); 127 selector_->AppendQueueToService(0);
128 selector_->AppendQueueToService(1); 128 selector_->AppendQueueToService(1);
129 selector_->AppendQueueToService(2); 129 selector_->AppendQueueToService(2);
130 130
131 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 131 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
132 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 132 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
133 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 133 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
134 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 134 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
135 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); 135 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
136 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); 136 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order));
137 137
138 test_task_runner_->RunUntilIdle(); 138 test_task_runner_->RunUntilIdle();
139 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6)); 139 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6));
140 } 140 }
141 141
142 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) { 142 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
143 InitializeWithRealMessageLoop(1u); 143 InitializeWithRealMessageLoop(1u);
144 EXPECT_EQ(1u, selector_->work_queues().size());
145 144
146 std::vector<int> run_order; 145 std::vector<int> run_order;
147 scoped_refptr<base::SingleThreadTaskRunner> runner = 146 scoped_refptr<base::SingleThreadTaskRunner> runner =
148 manager_->TaskRunnerForQueue(0); 147 manager_->TaskRunnerForQueue(0);
149 148
150 selector_->AppendQueueToService(0); 149 selector_->AppendQueueToService(0);
151 150
152 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 151 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
153 152
154 message_loop_->RunUntilIdle(); 153 message_loop_->RunUntilIdle();
155 EXPECT_THAT(run_order, ElementsAre(1)); 154 EXPECT_THAT(run_order, ElementsAre(1));
156 } 155 }
157 156
158 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) { 157 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) {
159 InitializeWithRealMessageLoop(1u); 158 InitializeWithRealMessageLoop(1u);
160 EXPECT_EQ(1u, selector_->work_queues().size());
161 159
162 std::vector<int> run_order; 160 std::vector<int> run_order;
163 scoped_refptr<base::SingleThreadTaskRunner> runner = 161 scoped_refptr<base::SingleThreadTaskRunner> runner =
164 manager_->TaskRunnerForQueue(0); 162 manager_->TaskRunnerForQueue(0);
165 163
166 selector_->AppendQueueToService(0); 164 selector_->AppendQueueToService(0);
167 selector_->AppendQueueToService(0); 165 selector_->AppendQueueToService(0);
168 selector_->AppendQueueToService(0); 166 selector_->AppendQueueToService(0);
169 selector_->AppendQueueToService(0); 167 selector_->AppendQueueToService(0);
170 selector_->AppendQueueToService(0); 168 selector_->AppendQueueToService(0);
171 169
172 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 170 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
173 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 171 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
174 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 172 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
175 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 173 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
176 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); 174 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
177 175
178 message_loop_->RunUntilIdle(); 176 message_loop_->RunUntilIdle();
179 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5)); 177 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5));
180 } 178 }
181 179
182 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) { 180 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) {
183 InitializeWithRealMessageLoop(1u); 181 InitializeWithRealMessageLoop(1u);
184 EXPECT_EQ(1u, selector_->work_queues().size());
185 182
186 std::vector<int> run_order; 183 std::vector<int> run_order;
187 scoped_refptr<base::SingleThreadTaskRunner> runner = 184 scoped_refptr<base::SingleThreadTaskRunner> runner =
188 manager_->TaskRunnerForQueue(0); 185 manager_->TaskRunnerForQueue(0);
189 186
190 selector_->AppendQueueToService(0); 187 selector_->AppendQueueToService(0);
191 selector_->AppendQueueToService(0); 188 selector_->AppendQueueToService(0);
192 selector_->AppendQueueToService(0); 189 selector_->AppendQueueToService(0);
193 selector_->AppendQueueToService(0); 190 selector_->AppendQueueToService(0);
194 selector_->AppendQueueToService(0); 191 selector_->AppendQueueToService(0);
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 std::vector<int>* out_result) { 392 std::vector<int>* out_result) {
396 out_result->push_back(countdown); 393 out_result->push_back(countdown);
397 if (--countdown) { 394 if (--countdown) {
398 runner->PostTask(FROM_HERE, 395 runner->PostTask(FROM_HERE,
399 Bind(&ReentrantTestTask, runner, countdown, out_result)); 396 Bind(&ReentrantTestTask, runner, countdown, out_result));
400 } 397 }
401 } 398 }
402 399
403 TEST_F(TaskQueueManagerTest, ReentrantPosting) { 400 TEST_F(TaskQueueManagerTest, ReentrantPosting) {
404 Initialize(1u); 401 Initialize(1u);
405 EXPECT_EQ(1u, selector_->work_queues().size());
406 402
407 std::vector<int> run_order; 403 std::vector<int> run_order;
408 scoped_refptr<base::SingleThreadTaskRunner> runner = 404 scoped_refptr<base::SingleThreadTaskRunner> runner =
409 manager_->TaskRunnerForQueue(0); 405 manager_->TaskRunnerForQueue(0);
410 406
411 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order)); 407 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order));
412 408
413 selector_->AppendQueueToService(0); 409 selector_->AppendQueueToService(0);
414 selector_->AppendQueueToService(0); 410 selector_->AppendQueueToService(0);
415 selector_->AppendQueueToService(0); 411 selector_->AppendQueueToService(0);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 thread.Start(); 446 thread.Start();
451 thread.message_loop()->PostTask( 447 thread.message_loop()->PostTask(
452 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); 448 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order));
453 thread.Stop(); 449 thread.Stop();
454 450
455 selector_->AppendQueueToService(0); 451 selector_->AppendQueueToService(0);
456 message_loop_->RunUntilIdle(); 452 message_loop_->RunUntilIdle();
457 EXPECT_THAT(run_order, ElementsAre(1)); 453 EXPECT_THAT(run_order, ElementsAre(1));
458 } 454 }
459 455
460 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner) { 456 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
457 int* run_count) {
458 (*run_count)++;
461 runner->PostTask( 459 runner->PostTask(
462 FROM_HERE, Bind(&RePostingTestTask, base::Unretained(runner.get()))); 460 FROM_HERE,
461 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count));
463 } 462 }
464 463
465 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { 464 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
466 Initialize(1u); 465 Initialize(1u);
467
468 scoped_refptr<base::SingleThreadTaskRunner> runner = 466 scoped_refptr<base::SingleThreadTaskRunner> runner =
469 manager_->TaskRunnerForQueue(0); 467 manager_->TaskRunnerForQueue(0);
470 468
471 runner->PostTask(FROM_HERE, base::Bind(&RePostingTestTask, runner)); 469 int run_count = 0;
470 runner->PostTask(FROM_HERE,
471 base::Bind(&RePostingTestTask, runner, &run_count));
472 472
473 selector_->AppendQueueToService(0); 473 selector_->AppendQueueToService(0);
474 selector_->AppendQueueToService(0); 474 selector_->AppendQueueToService(0);
475 selector_->AppendQueueToService(0); 475 selector_->AppendQueueToService(0);
476 476
477 test_task_runner_->RunPendingTasks(); 477 test_task_runner_->RunPendingTasks();
478 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there 478 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
479 // will be two tasks here. 479 // will be two tasks here.
480 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); 480 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size());
481 EXPECT_EQ(1, run_count);
481 } 482 }
482 483
483 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { 484 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
484 InitializeWithRealMessageLoop(1u); 485 InitializeWithRealMessageLoop(1u);
485 486
486 selector_->AppendQueueToService(0); 487 selector_->AppendQueueToService(0);
487 selector_->AppendQueueToService(0); 488 selector_->AppendQueueToService(0);
488 selector_->AppendQueueToService(0); 489 selector_->AppendQueueToService(0);
489 selector_->AppendQueueToService(0); 490 selector_->AppendQueueToService(0);
490 491
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 // the work batch is interrupted by the pending delayed task. 577 // the work batch is interrupted by the pending delayed task.
577 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); 578 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
578 test_task_runner_->RunPendingTasks(); 579 test_task_runner_->RunPendingTasks();
579 EXPECT_THAT(run_order, ElementsAre(2)); 580 EXPECT_THAT(run_order, ElementsAre(2));
580 581
581 // Running all remaining tasks should execute both pending tasks. 582 // Running all remaining tasks should execute both pending tasks.
582 test_task_runner_->RunUntilIdle(); 583 test_task_runner_->RunUntilIdle();
583 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); 584 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
584 } 585 }
585 586
586 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeup) { 587 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
587 Initialize(2u); 588 Initialize(2u);
588 EXPECT_EQ(2u, selector_->work_queues().size());
589 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 589 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
590 590
591 std::vector<int> run_order; 591 std::vector<int> run_order;
592 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 592 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
593 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 593 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
594 594
595 selector_->AppendQueueToService(1); 595 selector_->AppendQueueToService(1);
596 selector_->AppendQueueToService(0); 596 selector_->AppendQueueToService(0);
597 selector_->AppendQueueToService(0); 597 selector_->AppendQueueToService(0);
598 598
599 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 599 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
600 test_task_runner_->RunUntilIdle(); 600 test_task_runner_->RunUntilIdle();
601 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. 601 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
602 602
603 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 603 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
604 test_task_runner_->RunUntilIdle(); 604 test_task_runner_->RunUntilIdle();
605 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM. 605 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM.
606 606
607 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 607 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
608 test_task_runner_->RunUntilIdle(); 608 test_task_runner_->RunUntilIdle();
609 // Executing a task on an auto pumped queue should wake the TQM. 609 // Executing a task on an auto pumped queue should wake the TQM.
610 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); 610 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
611 } 611 }
612 612
613 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupWhenAlreadyAwake) { 613 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) {
614 Initialize(2u); 614 Initialize(2u);
615 EXPECT_EQ(2u, selector_->work_queues().size());
616 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 615 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
617 616
618 std::vector<int> run_order; 617 std::vector<int> run_order;
619 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 618 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
620 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 619 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
621 620
622 selector_->AppendQueueToService(1); 621 selector_->AppendQueueToService(1);
623 selector_->AppendQueueToService(0); 622 selector_->AppendQueueToService(0);
624 623
625 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 624 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
626 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 625 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
627 test_task_runner_->RunUntilIdle(); 626 test_task_runner_->RunUntilIdle();
628 EXPECT_THAT(run_order, ElementsAre(1, 2)); // TQM was already awake. 627 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake.
629 } 628 }
630 629
631 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupTriggeredByManuallyPumpedQueue) { 630 TEST_F(TaskQueueManagerTest,
631 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) {
632 Initialize(2u); 632 Initialize(2u);
633 EXPECT_EQ(2u, selector_->work_queues().size());
634 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 633 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
635 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL); 634 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL);
636 635
637 std::vector<int> run_order; 636 std::vector<int> run_order;
638 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 637 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
639 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 638 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
640 639
641 selector_->AppendQueueToService(1); 640 selector_->AppendQueueToService(1);
642 selector_->AppendQueueToService(0); 641 selector_->AppendQueueToService(0);
643 642
644 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 643 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
645 test_task_runner_->RunUntilIdle(); 644 test_task_runner_->RunUntilIdle();
646 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. 645 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
647 646
648 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 647 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
649 test_task_runner_->RunUntilIdle(); 648 test_task_runner_->RunUntilIdle();
650 // This still shouldn't wake TQM as manual queue was not pumped. 649 // This still shouldn't wake TQM as manual queue was not pumped.
651 EXPECT_TRUE(run_order.empty()); 650 EXPECT_TRUE(run_order.empty());
652 651
653 manager_->PumpQueue(1); 652 manager_->PumpQueue(1);
654 test_task_runner_->RunUntilIdle(); 653 test_task_runner_->RunUntilIdle();
655 // Executing a task on an auto pumped queue should wake the TQM. 654 // Executing a task on an auto pumped queue should wake the TQM.
656 EXPECT_THAT(run_order, ElementsAre(2, 1)); 655 EXPECT_THAT(run_order, ElementsAre(2, 1));
657 } 656 }
658 657
658 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
659 base::Closure task) {
660 task_runner->PostTask(FROM_HERE, task);
661 }
662
663 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) {
664 Initialize(2u);
665 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
666
667 std::vector<int> run_order;
668 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
669 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
670
671 selector_->AppendQueueToService(1);
672 selector_->AppendQueueToService(1);
673 selector_->AppendQueueToService(0);
674
675 // Check that a task which posts a task to an auto pump after wakeup queue
676 // doesn't cause the queue to wake up.
677 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order);
678 runners[1]->PostTask(
679 FROM_HERE,
680 base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
681 test_task_runner_->RunUntilIdle();
682 EXPECT_TRUE(run_order.empty());
683
684 // Wake up the queue.
685 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
686 test_task_runner_->RunUntilIdle();
687 EXPECT_THAT(run_order, ElementsAre(2, 1));
688 }
689
690 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) {
691 Initialize(2u);
692 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
693
694 std::vector<int> run_order;
695 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
696 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
697
698 selector_->AppendQueueToService(1);
699 selector_->AppendQueueToService(1);
700 selector_->AppendQueueToService(1);
701 selector_->AppendQueueToService(0);
702 selector_->AppendQueueToService(0);
703
704 // Check that a task which posts a task to an auto pump after wakeup queue
705 // doesn't cause the queue to wake up.
706 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order);
707 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order);
708 runners[1]->PostTask(
709 FROM_HERE,
710 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1));
711 runners[1]->PostTask(
712 FROM_HERE,
713 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
714 test_task_runner_->RunUntilIdle();
715 EXPECT_TRUE(run_order.empty());
716
717 // Wake up the queue.
718 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
719 test_task_runner_->RunUntilIdle();
720 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
721 }
722
723 void NullTestTask() {
724 }
725
726 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
727 Initialize(2u);
728 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
729
730 int run_count = 0;
731 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
732 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
733
734 selector_->AppendQueueToService(1);
735 selector_->AppendQueueToService(0);
736 selector_->AppendQueueToService(0);
737 // Append extra service queue '0' entries to the selector otherwise test will
738 // finish even if the RePostingTestTask woke each other up.
739 selector_->AppendQueueToService(0);
740 selector_->AppendQueueToService(0);
741
742 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
743 // queue they don't wake each other and will eventually stop when no other
744 // tasks execute.
745 runners[0]->PostTask(FROM_HERE,
746 base::Bind(&RePostingTestTask, runners[0], &run_count));
747 runners[0]->PostTask(FROM_HERE,
748 base::Bind(&RePostingTestTask, runners[0], &run_count));
749 runners[1]->PostTask(FROM_HERE, base::Bind(&NullTestTask));
750 test_task_runner_->RunUntilIdle();
751 // The reposting tasks posted to the after wakeup queue shouldn't have woken
752 // each other up.
753 EXPECT_EQ(2, run_count);
754 }
755
659 class MockTaskObserver : public base::MessageLoop::TaskObserver { 756 class MockTaskObserver : public base::MessageLoop::TaskObserver {
660 public: 757 public:
661 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); 758 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
662 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); 759 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
663 }; 760 };
664 761
665 TEST_F(TaskQueueManagerTest, TaskObserverAdding) { 762 TEST_F(TaskQueueManagerTest, TaskObserverAdding) {
666 InitializeWithRealMessageLoop(1u); 763 InitializeWithRealMessageLoop(1u);
667 MockTaskObserver observer; 764 MockTaskObserver observer;
668 765
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 selector_->AppendQueueToService(0); 822 selector_->AppendQueueToService(0);
726 823
727 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); 824 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
728 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); 825 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
729 message_loop_->RunUntilIdle(); 826 message_loop_->RunUntilIdle();
730 } 827 }
731 828
732 } // namespace 829 } // namespace
733 } // namespace content 830 } // namespace content
734 831
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698