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

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

Issue 1008693004: Handle delayed tasks more natively in the scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Work around problem with non-auto pump queues and delayed tasks 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
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"
8 #include "base/threading/thread.h" 7 #include "base/threading/thread.h"
8 #include "cc/test/ordered_simple_task_runner.h"
9 #include "cc/test/test_now_source.h" 9 #include "cc/test/test_now_source.h"
10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" 10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h"
11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" 11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h"
12 #include "content/renderer/scheduler/task_queue_selector.h" 12 #include "content/renderer/scheduler/task_queue_selector.h"
13 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 14
15 using testing::ElementsAre; 15 using testing::ElementsAre;
16 using testing::_; 16 using testing::_;
17 17
18 namespace content { 18 namespace content {
(...skipping 30 matching lines...) Expand all
49 private: 49 private:
50 std::deque<size_t> queues_to_service_; 50 std::deque<size_t> queues_to_service_;
51 std::vector<const base::TaskQueue*> work_queues_; 51 std::vector<const base::TaskQueue*> work_queues_;
52 52
53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); 53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest);
54 }; 54 };
55 55
56 class TaskQueueManagerTest : public testing::Test { 56 class TaskQueueManagerTest : public testing::Test {
57 protected: 57 protected:
58 void Initialize(size_t num_queues) { 58 void Initialize(size_t num_queues) {
59 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); 59 now_src_ = cc::TestNowSource::Create(1000);
60 test_task_runner_ =
61 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
60 selector_ = make_scoped_ptr(new SelectorForTest); 62 selector_ = make_scoped_ptr(new SelectorForTest);
61 manager_ = make_scoped_ptr(new TaskQueueManager( 63 manager_ = make_scoped_ptr(new TaskQueueManager(
62 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), 64 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()),
63 selector_.get())); 65 selector_.get()));
66 manager_->SetTimeSourceForTesting(now_src_);
67
64 EXPECT_EQ(num_queues, selector_->work_queues().size()); 68 EXPECT_EQ(num_queues, selector_->work_queues().size());
65 } 69 }
66 70
67 void InitializeWithRealMessageLoop(size_t num_queues) { 71 void InitializeWithRealMessageLoop(size_t num_queues) {
68 message_loop_.reset(new base::MessageLoop()); 72 message_loop_.reset(new base::MessageLoop());
69 selector_ = make_scoped_ptr(new SelectorForTest); 73 selector_ = make_scoped_ptr(new SelectorForTest);
70 manager_ = make_scoped_ptr(new TaskQueueManager( 74 manager_ = make_scoped_ptr(new TaskQueueManager(
71 num_queues, 75 num_queues,
72 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), 76 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()),
73 selector_.get())); 77 selector_.get()));
74 EXPECT_EQ(num_queues, selector_->work_queues().size()); 78 EXPECT_EQ(num_queues, selector_->work_queues().size());
75 } 79 }
76 80
77 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; 81 scoped_refptr<cc::TestNowSource> now_src_;
82 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
78 scoped_ptr<SelectorForTest> selector_; 83 scoped_ptr<SelectorForTest> selector_;
79 scoped_ptr<TaskQueueManager> manager_; 84 scoped_ptr<TaskQueueManager> manager_;
80 scoped_ptr<base::MessageLoop> message_loop_; 85 scoped_ptr<base::MessageLoop> message_loop_;
81 }; 86 };
82 87
83 void PostFromNestedRunloop(base::MessageLoop* message_loop, 88 void PostFromNestedRunloop(base::MessageLoop* message_loop,
84 base::SingleThreadTaskRunner* runner, 89 base::SingleThreadTaskRunner* runner,
85 std::vector<std::pair<base::Closure, bool>>* tasks) { 90 std::vector<std::pair<base::Closure, bool>>* tasks) {
86 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); 91 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
87 for (std::pair<base::Closure, bool>& pair : *tasks) { 92 for (std::pair<base::Closure, bool>& pair : *tasks) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 142 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
138 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 143 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
139 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 144 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
140 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); 145 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
141 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); 146 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order));
142 147
143 test_task_runner_->RunUntilIdle(); 148 test_task_runner_->RunUntilIdle();
144 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6)); 149 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6));
145 } 150 }
146 151
152 void NopTask() {
153 }
154
155 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) {
156 Initialize(3u);
157
158 scoped_refptr<cc::TestNowSource> now_src = cc::TestNowSource::Create(1000);
159 manager_->SetTimeSourceForTesting(now_src);
160
161 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
162 manager_->TaskRunnerForQueue(0),
163 manager_->TaskRunnerForQueue(1),
164 manager_->TaskRunnerForQueue(2)};
165
166 selector_->AppendQueueToService(0);
167 selector_->AppendQueueToService(1);
168 selector_->AppendQueueToService(2);
169 selector_->AppendQueueToService(0);
170 selector_->AppendQueueToService(1);
171 selector_->AppendQueueToService(2);
172
173 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
174 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
175 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
176 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
177 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
178 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
179
180 test_task_runner_->RunUntilIdle();
181
182 EXPECT_EQ(0, now_src->NumNowCalls());
183 }
184
147 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) { 185 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
148 InitializeWithRealMessageLoop(1u); 186 InitializeWithRealMessageLoop(1u);
149 187
150 std::vector<int> run_order; 188 std::vector<int> run_order;
151 scoped_refptr<base::SingleThreadTaskRunner> runner = 189 scoped_refptr<base::SingleThreadTaskRunner> runner =
152 manager_->TaskRunnerForQueue(0); 190 manager_->TaskRunnerForQueue(0);
153 191
154 selector_->AppendQueueToService(0); 192 selector_->AppendQueueToService(0);
155 193
156 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 194 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 276
239 std::vector<int> run_order; 277 std::vector<int> run_order;
240 scoped_refptr<base::SingleThreadTaskRunner> runner = 278 scoped_refptr<base::SingleThreadTaskRunner> runner =
241 manager_->TaskRunnerForQueue(0); 279 manager_->TaskRunnerForQueue(0);
242 280
243 selector_->AppendQueueToService(0); 281 selector_->AppendQueueToService(0);
244 282
245 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 283 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
246 runner->PostDelayedTask( 284 runner->PostDelayedTask(
247 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 285 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
248 EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay()); 286 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
249 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 287 EXPECT_TRUE(manager_->IsQueueEmpty(0));
250 EXPECT_TRUE(run_order.empty()); 288 EXPECT_TRUE(run_order.empty());
251 289
252 // The task is inserted to the incoming queue only after the delay. 290 // The task doesn't run before the delay has completed.
253 test_task_runner_->RunPendingTasks(); 291 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
254 EXPECT_FALSE(manager_->IsQueueEmpty(0));
255 EXPECT_TRUE(run_order.empty()); 292 EXPECT_TRUE(run_order.empty());
256 293
257 // After the delay the task runs normally. 294 // After the delay has completed, the task runs normally.
258 selector_->AppendQueueToService(0); 295 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
259 test_task_runner_->RunUntilIdle();
260 EXPECT_THAT(run_order, ElementsAre(1)); 296 EXPECT_THAT(run_order, ElementsAre(1));
261 } 297 }
262 298
263 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) { 299 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks) {
264 Initialize(1u); 300 Initialize(1u);
265 301
266 std::vector<int> run_order; 302 std::vector<int> run_order;
267 scoped_refptr<base::SingleThreadTaskRunner> runner = 303 scoped_refptr<base::SingleThreadTaskRunner> runner =
268 manager_->TaskRunnerForQueue(0); 304 manager_->TaskRunnerForQueue(0);
269 305
270 selector_->AppendQueueToService(0); 306 selector_->AppendQueueToService(0);
307 selector_->AppendQueueToService(0);
308 selector_->AppendQueueToService(0);
309
310 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
311 base::TimeDelta::FromMilliseconds(10));
312
313 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
314 base::TimeDelta::FromMilliseconds(8));
315
316 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
317 base::TimeDelta::FromMilliseconds(5));
318
319 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
320 test_task_runner_->DelayToNextTaskTime());
321
322 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
323 EXPECT_THAT(run_order, ElementsAre(3));
324 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
325 test_task_runner_->DelayToNextTaskTime());
326
327 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
328 EXPECT_THAT(run_order, ElementsAre(3, 2));
329 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
330 test_task_runner_->DelayToNextTaskTime());
331
332 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
333 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
334 }
335
336 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesUnderlyingDelayedTasks) {
337 Initialize(1u);
338
339 std::vector<int> run_order;
340 scoped_refptr<base::SingleThreadTaskRunner> runner =
341 manager_->TaskRunnerForQueue(0);
271 342
272 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 343 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
273 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 344 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
274 delay); 345 delay);
275 test_task_runner_->RunPendingTasks(); 346 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
347 delay);
348 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
349 delay);
276 350
277 // Reload the work queue so we see the next pending task. It should no longer 351 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
278 // be marked as delayed. 352 }
279 manager_->PumpQueue(0);
280 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
281 353
282 // Let the task run normally. 354 class TestObject {
283 selector_->AppendQueueToService(0); 355 public:
284 test_task_runner_->RunUntilIdle(); 356 ~TestObject() { destructor_count_++; }
285 EXPECT_THAT(run_order, ElementsAre(1)); 357
358 void Run() { FAIL() << "TestObject::Run should not be called"; }
359
360 static int destructor_count_;
361 };
362
363 int TestObject::destructor_count_ = 0;
364
365 TEST_F(TaskQueueManagerTest, PendingDelayedTasksRemovedOnShutdown) {
366 Initialize(1u);
367
368 TestObject::destructor_count_ = 0;
369
370 scoped_refptr<base::SingleThreadTaskRunner> runner =
371 manager_->TaskRunnerForQueue(0);
372
373 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
374 runner->PostDelayedTask(
375 FROM_HERE, base::Bind(&TestObject::Run, base::Owned(new TestObject())),
376 delay);
377
378 manager_.reset();
379
380 EXPECT_EQ(1, TestObject::destructor_count_);
286 } 381 }
287 382
288 TEST_F(TaskQueueManagerTest, ManualPumping) { 383 TEST_F(TaskQueueManagerTest, ManualPumping) {
289 Initialize(1u); 384 Initialize(1u);
290 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 385 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
291 386
292 std::vector<int> run_order; 387 std::vector<int> run_order;
293 scoped_refptr<base::SingleThreadTaskRunner> runner = 388 scoped_refptr<base::SingleThreadTaskRunner> runner =
294 manager_->TaskRunnerForQueue(0); 389 manager_->TaskRunnerForQueue(0);
295 390
296 // Posting a task when pumping is disabled doesn't result in work getting 391 // Posting a task when pumping is disabled doesn't result in work getting
297 // posted. 392 // posted.
298 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 393 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
299 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 394 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
300 395
301 // However polling still works. 396 // However polling still works.
302 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 397 EXPECT_FALSE(manager_->IsQueueEmpty(0));
303 398
304 // After pumping the task runs normally. 399 // After pumping the task runs normally.
305 manager_->PumpQueue(0); 400 manager_->PumpQueue(0);
306 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 401 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
307 selector_->AppendQueueToService(0); 402 selector_->AppendQueueToService(0);
308 test_task_runner_->RunUntilIdle(); 403 test_task_runner_->RunUntilIdle();
309 EXPECT_THAT(run_order, ElementsAre(1)); 404 EXPECT_THAT(run_order, ElementsAre(1));
310 } 405 }
311 406
312 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 407 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
313 Initialize(1u); 408 Initialize(1u);
314 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 409 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
315 410
316 std::vector<int> run_order; 411 std::vector<int> run_order;
317 scoped_refptr<base::SingleThreadTaskRunner> runner = 412 scoped_refptr<base::SingleThreadTaskRunner> runner =
318 manager_->TaskRunnerForQueue(0); 413 manager_->TaskRunnerForQueue(0);
319 414
320 // Posting a task when pumping is disabled doesn't result in work getting 415 // Posting a task when pumping is disabled doesn't result in work getting
321 // posted. 416 // posted.
322 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 417 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
323 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 418 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
324 419
325 // When pumping is enabled the task runs normally. 420 // When pumping is enabled the task runs normally.
326 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); 421 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
327 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 422 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
328 selector_->AppendQueueToService(0); 423 selector_->AppendQueueToService(0);
329 test_task_runner_->RunUntilIdle(); 424 test_task_runner_->RunUntilIdle();
330 EXPECT_THAT(run_order, ElementsAre(1)); 425 EXPECT_THAT(run_order, ElementsAre(1));
331 } 426 }
332 427
333 TEST_F(TaskQueueManagerTest, DenyRunning) { 428 TEST_F(TaskQueueManagerTest, DenyRunning) {
334 Initialize(1u); 429 Initialize(1u);
335 430
336 std::vector<int> run_order; 431 std::vector<int> run_order;
337 scoped_refptr<base::SingleThreadTaskRunner> runner = 432 scoped_refptr<base::SingleThreadTaskRunner> runner =
(...skipping 12 matching lines...) Expand all
350 EXPECT_THAT(run_order, ElementsAre(1)); 445 EXPECT_THAT(run_order, ElementsAre(1));
351 } 446 }
352 447
353 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { 448 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
354 Initialize(1u); 449 Initialize(1u);
355 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 450 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
356 451
357 std::vector<int> run_order; 452 std::vector<int> run_order;
358 scoped_refptr<base::SingleThreadTaskRunner> runner = 453 scoped_refptr<base::SingleThreadTaskRunner> runner =
359 manager_->TaskRunnerForQueue(0); 454 manager_->TaskRunnerForQueue(0);
455 selector_->AppendQueueToService(0);
360 456
361 // Posting a delayed task when pumping will apply the delay, but won't cause 457 // Posting a delayed task when pumping will apply the delay, but won't cause
362 // work to executed afterwards. 458 // work to executed afterwards.
363 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 459 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
364 runner->PostDelayedTask( 460 runner->PostDelayedTask(
365 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 461 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
462
463 // After pumping but before the delay period has expired, task does not run.
464 manager_->PumpQueue(0);
465 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
466 EXPECT_TRUE(run_order.empty());
467
468 // Once the delay has expired, pumping causes the task to run.
469 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
470 manager_->PumpQueue(0);
471 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
472 test_task_runner_->RunPendingTasks();
473 EXPECT_THAT(run_order, ElementsAre(1));
474 }
475
476 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
477 Initialize(1u);
478 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
479
480 std::vector<int> run_order;
481 scoped_refptr<base::SingleThreadTaskRunner> runner =
482 manager_->TaskRunnerForQueue(0);
483 selector_->AppendQueueToService(0);
484 selector_->AppendQueueToService(0);
485
486 // Posting a delayed task when pumping will apply the delay, but won't cause
487 // work to executed afterwards.
488 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
489 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
490 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20));
491 runner->PostDelayedTask(
492 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay1);
493 runner->PostDelayedTask(
494 FROM_HERE, base::Bind(&TestTask, 2, &run_order), delay2);
495 runner->PostDelayedTask(
496 FROM_HERE, base::Bind(&TestTask, 3, &run_order), delay3);
497
498 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(15));
366 test_task_runner_->RunUntilIdle(); 499 test_task_runner_->RunUntilIdle();
367 EXPECT_TRUE(run_order.empty()); 500 EXPECT_TRUE(run_order.empty());
368 501
369 // After pumping the task runs normally. 502 // Once the delay has expired, pumping causes the task to run.
370 manager_->PumpQueue(0); 503 manager_->PumpQueue(0);
371 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 504 test_task_runner_->RunUntilIdle();
505 EXPECT_THAT(run_order, ElementsAre(1, 2));
506 }
507
508 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
509 Initialize(1u);
510 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
511
512 std::vector<int> run_order;
513 scoped_refptr<base::SingleThreadTaskRunner> runner =
514 manager_->TaskRunnerForQueue(0);
372 selector_->AppendQueueToService(0); 515 selector_->AppendQueueToService(0);
373 test_task_runner_->RunUntilIdle(); 516
374 EXPECT_THAT(run_order, ElementsAre(1)); 517 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
518 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
519 delay);
520
521 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
522 EXPECT_TRUE(run_order.empty());
375 } 523 }
376 524
377 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 525 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
378 Initialize(1u); 526 Initialize(1u);
379 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 527 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
380 528
381 std::vector<int> run_order; 529 std::vector<int> run_order;
382 scoped_refptr<base::SingleThreadTaskRunner> runner = 530 scoped_refptr<base::SingleThreadTaskRunner> runner =
383 manager_->TaskRunnerForQueue(0); 531 manager_->TaskRunnerForQueue(0);
384 532
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 runner->PostTask(FROM_HERE, 623 runner->PostTask(FROM_HERE,
476 base::Bind(&RePostingTestTask, runner, &run_count)); 624 base::Bind(&RePostingTestTask, runner, &run_count));
477 625
478 selector_->AppendQueueToService(0); 626 selector_->AppendQueueToService(0);
479 selector_->AppendQueueToService(0); 627 selector_->AppendQueueToService(0);
480 selector_->AppendQueueToService(0); 628 selector_->AppendQueueToService(0);
481 629
482 test_task_runner_->RunPendingTasks(); 630 test_task_runner_->RunPendingTasks();
483 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there 631 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
484 // will be two tasks here. 632 // will be two tasks here.
485 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); 633 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
486 EXPECT_EQ(1, run_count); 634 EXPECT_EQ(1, run_count);
487 } 635 }
488 636
489 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { 637 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
490 InitializeWithRealMessageLoop(1u); 638 InitializeWithRealMessageLoop(1u);
491 639
492 selector_->AppendQueueToService(0); 640 selector_->AppendQueueToService(0);
493 selector_->AppendQueueToService(0); 641 selector_->AppendQueueToService(0);
494 selector_->AppendQueueToService(0); 642 selector_->AppendQueueToService(0);
495 selector_->AppendQueueToService(0); 643 selector_->AppendQueueToService(0);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 selector_->AppendQueueToService(0); 675 selector_->AppendQueueToService(0);
528 selector_->AppendQueueToService(0); 676 selector_->AppendQueueToService(0);
529 677
530 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 678 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
531 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 679 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
532 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 680 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
533 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 681 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
534 682
535 // Running one task in the host message loop should cause two posted tasks to 683 // Running one task in the host message loop should cause two posted tasks to
536 // get executed. 684 // get executed.
537 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 685 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
538 test_task_runner_->RunPendingTasks(); 686 test_task_runner_->RunPendingTasks();
539 EXPECT_THAT(run_order, ElementsAre(1, 2)); 687 EXPECT_THAT(run_order, ElementsAre(1, 2));
540 688
541 // The second task runs the remaining two posted tasks. 689 // The second task runs the remaining two posted tasks.
542 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 690 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
543 test_task_runner_->RunPendingTasks(); 691 test_task_runner_->RunPendingTasks();
544 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); 692 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
545 } 693 }
546 694
547 void AdvanceNowTestTask(int value,
548 std::vector<int>* out_result,
549 scoped_refptr<cc::TestNowSource> time_source,
550 base::TimeDelta delta) {
551 TestTask(value, out_result);
552 time_source->AdvanceNow(delta);
553 }
554
555 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
556 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
557 Initialize(1u);
558
559 manager_->SetWorkBatchSize(2);
560 manager_->SetTimeSourceForTesting(clock);
561
562 std::vector<int> run_order;
563 scoped_refptr<base::SingleThreadTaskRunner> runner =
564 manager_->TaskRunnerForQueue(0);
565
566 selector_->AppendQueueToService(0);
567 selector_->AppendQueueToService(0);
568 selector_->AppendQueueToService(0);
569
570 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
571 runner->PostTask(
572 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
573 runner->PostTask(
574 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
575
576 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
577 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
578 delay);
579
580 // At this point we have two posted tasks: one for DoWork and one of the
581 // delayed task. Only the first non-delayed task should get executed because
582 // the work batch is interrupted by the pending delayed task.
583 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
584 test_task_runner_->RunPendingTasks();
585 EXPECT_THAT(run_order, ElementsAre(2));
586
587 // Running all remaining tasks should execute both pending tasks.
588 test_task_runner_->RunUntilIdle();
589 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
590 }
591
592 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { 695 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
593 Initialize(2u); 696 Initialize(2u);
594 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 697 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
595 698
596 std::vector<int> run_order; 699 std::vector<int> run_order;
597 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 700 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
598 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 701 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
599 702
600 selector_->AppendQueueToService(1); 703 selector_->AppendQueueToService(1);
601 selector_->AppendQueueToService(0); 704 selector_->AppendQueueToService(0);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); 821 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
719 test_task_runner_->RunUntilIdle(); 822 test_task_runner_->RunUntilIdle();
720 EXPECT_TRUE(run_order.empty()); 823 EXPECT_TRUE(run_order.empty());
721 824
722 // Wake up the queue. 825 // Wake up the queue.
723 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 826 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
724 test_task_runner_->RunUntilIdle(); 827 test_task_runner_->RunUntilIdle();
725 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); 828 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
726 } 829 }
727 830
728 void NullTestTask() {
729 }
730
731 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { 831 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
732 Initialize(2u); 832 Initialize(2u);
733 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 833 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
734 834
735 int run_count = 0; 835 int run_count = 0;
736 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 836 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
737 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 837 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
738 838
739 selector_->AppendQueueToService(1); 839 selector_->AppendQueueToService(1);
740 selector_->AppendQueueToService(0); 840 selector_->AppendQueueToService(0);
741 selector_->AppendQueueToService(0); 841 selector_->AppendQueueToService(0);
742 // Append extra service queue '0' entries to the selector otherwise test will 842 // Append extra service queue '0' entries to the selector otherwise test will
743 // finish even if the RePostingTestTask woke each other up. 843 // finish even if the RePostingTestTask woke each other up.
744 selector_->AppendQueueToService(0); 844 selector_->AppendQueueToService(0);
745 selector_->AppendQueueToService(0); 845 selector_->AppendQueueToService(0);
746 846
747 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup 847 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
748 // queue they don't wake each other and will eventually stop when no other 848 // queue they don't wake each other and will eventually stop when no other
749 // tasks execute. 849 // tasks execute.
750 runners[0]->PostTask(FROM_HERE, 850 runners[0]->PostTask(FROM_HERE,
751 base::Bind(&RePostingTestTask, runners[0], &run_count)); 851 base::Bind(&RePostingTestTask, runners[0], &run_count));
752 runners[0]->PostTask(FROM_HERE, 852 runners[0]->PostTask(FROM_HERE,
753 base::Bind(&RePostingTestTask, runners[0], &run_count)); 853 base::Bind(&RePostingTestTask, runners[0], &run_count));
754 runners[1]->PostTask(FROM_HERE, base::Bind(&NullTestTask)); 854 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
755 test_task_runner_->RunUntilIdle(); 855 test_task_runner_->RunUntilIdle();
756 // The reposting tasks posted to the after wakeup queue shouldn't have woken 856 // The reposting tasks posted to the after wakeup queue shouldn't have woken
757 // each other up. 857 // each other up.
758 EXPECT_EQ(2, run_count); 858 EXPECT_EQ(2, run_count);
759 } 859 }
760 860
761 class MockTaskObserver : public base::MessageLoop::TaskObserver { 861 class MockTaskObserver : public base::MessageLoop::TaskObserver {
762 public: 862 public:
763 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); 863 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
764 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); 864 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 scoped_refptr<base::SingleThreadTaskRunner> runner = 936 scoped_refptr<base::SingleThreadTaskRunner> runner =
837 manager_->TaskRunnerForQueue(0); 937 manager_->TaskRunnerForQueue(0);
838 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 938 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
839 manager_.reset(); 939 manager_.reset();
840 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 940 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
841 } 941 }
842 942
843 } // namespace 943 } // namespace
844 } // namespace content 944 } // namespace content
845 945
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698