OLD | NEW |
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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null()); | 278 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null()); |
279 | 279 |
280 // Let the task run normally. | 280 // Let the task run normally. |
281 selector_->AppendQueueToService(0); | 281 selector_->AppendQueueToService(0); |
282 test_task_runner_->RunUntilIdle(); | 282 test_task_runner_->RunUntilIdle(); |
283 EXPECT_THAT(run_order, ElementsAre(1)); | 283 EXPECT_THAT(run_order, ElementsAre(1)); |
284 } | 284 } |
285 | 285 |
286 TEST_F(TaskQueueManagerTest, ManualPumping) { | 286 TEST_F(TaskQueueManagerTest, ManualPumping) { |
287 Initialize(1u); | 287 Initialize(1u); |
288 manager_->SetPumpPolicy(0, TaskQueueManager::MANUAL_PUMP_POLICY); | 288 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
289 | 289 |
290 std::vector<int> run_order; | 290 std::vector<int> run_order; |
291 scoped_refptr<base::SingleThreadTaskRunner> runner = | 291 scoped_refptr<base::SingleThreadTaskRunner> runner = |
292 manager_->TaskRunnerForQueue(0); | 292 manager_->TaskRunnerForQueue(0); |
293 | 293 |
294 // Posting a task when pumping is disabled doesn't result in work getting | 294 // Posting a task when pumping is disabled doesn't result in work getting |
295 // posted. | 295 // posted. |
296 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 296 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
297 EXPECT_FALSE(test_task_runner_->HasPendingTask()); | 297 EXPECT_FALSE(test_task_runner_->HasPendingTask()); |
298 | 298 |
299 // However polling still works. | 299 // However polling still works. |
300 EXPECT_FALSE(manager_->IsQueueEmpty(0)); | 300 EXPECT_FALSE(manager_->IsQueueEmpty(0)); |
301 | 301 |
302 // After pumping the task runs normally. | 302 // After pumping the task runs normally. |
303 manager_->PumpQueue(0); | 303 manager_->PumpQueue(0); |
304 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 304 EXPECT_TRUE(test_task_runner_->HasPendingTask()); |
305 selector_->AppendQueueToService(0); | 305 selector_->AppendQueueToService(0); |
306 test_task_runner_->RunUntilIdle(); | 306 test_task_runner_->RunUntilIdle(); |
307 EXPECT_THAT(run_order, ElementsAre(1)); | 307 EXPECT_THAT(run_order, ElementsAre(1)); |
308 } | 308 } |
309 | 309 |
310 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { | 310 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { |
311 Initialize(1u); | 311 Initialize(1u); |
312 manager_->SetPumpPolicy(0, TaskQueueManager::MANUAL_PUMP_POLICY); | 312 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
313 | 313 |
314 std::vector<int> run_order; | 314 std::vector<int> run_order; |
315 scoped_refptr<base::SingleThreadTaskRunner> runner = | 315 scoped_refptr<base::SingleThreadTaskRunner> runner = |
316 manager_->TaskRunnerForQueue(0); | 316 manager_->TaskRunnerForQueue(0); |
317 | 317 |
318 // Posting a task when pumping is disabled doesn't result in work getting | 318 // Posting a task when pumping is disabled doesn't result in work getting |
319 // posted. | 319 // posted. |
320 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 320 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
321 EXPECT_FALSE(test_task_runner_->HasPendingTask()); | 321 EXPECT_FALSE(test_task_runner_->HasPendingTask()); |
322 | 322 |
323 // When pumping is enabled the task runs normally. | 323 // When pumping is enabled the task runs normally. |
324 manager_->SetPumpPolicy(0, TaskQueueManager::AUTO_PUMP_POLICY); | 324 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); |
325 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 325 EXPECT_TRUE(test_task_runner_->HasPendingTask()); |
326 selector_->AppendQueueToService(0); | 326 selector_->AppendQueueToService(0); |
327 test_task_runner_->RunUntilIdle(); | 327 test_task_runner_->RunUntilIdle(); |
328 EXPECT_THAT(run_order, ElementsAre(1)); | 328 EXPECT_THAT(run_order, ElementsAre(1)); |
329 } | 329 } |
330 | 330 |
331 TEST_F(TaskQueueManagerTest, DenyRunning) { | 331 TEST_F(TaskQueueManagerTest, DenyRunning) { |
332 Initialize(1u); | 332 Initialize(1u); |
333 | 333 |
334 std::vector<int> run_order; | 334 std::vector<int> run_order; |
335 scoped_refptr<base::SingleThreadTaskRunner> runner = | 335 scoped_refptr<base::SingleThreadTaskRunner> runner = |
336 manager_->TaskRunnerForQueue(0); | 336 manager_->TaskRunnerForQueue(0); |
337 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 337 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
338 | 338 |
339 // Since we haven't appended a work queue to be selected, the task doesn't | 339 // Since we haven't appended a work queue to be selected, the task doesn't |
340 // run. | 340 // run. |
341 test_task_runner_->RunUntilIdle(); | 341 test_task_runner_->RunUntilIdle(); |
342 EXPECT_TRUE(run_order.empty()); | 342 EXPECT_TRUE(run_order.empty()); |
343 | 343 |
344 // Pumping the queue again with a selected work queue runs the task. | 344 // Pumping the queue again with a selected work queue runs the task. |
345 manager_->PumpQueue(0); | 345 manager_->PumpQueue(0); |
346 selector_->AppendQueueToService(0); | 346 selector_->AppendQueueToService(0); |
347 test_task_runner_->RunUntilIdle(); | 347 test_task_runner_->RunUntilIdle(); |
348 EXPECT_THAT(run_order, ElementsAre(1)); | 348 EXPECT_THAT(run_order, ElementsAre(1)); |
349 } | 349 } |
350 | 350 |
351 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { | 351 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { |
352 Initialize(1u); | 352 Initialize(1u); |
353 manager_->SetPumpPolicy(0, TaskQueueManager::MANUAL_PUMP_POLICY); | 353 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
354 | 354 |
355 std::vector<int> run_order; | 355 std::vector<int> run_order; |
356 scoped_refptr<base::SingleThreadTaskRunner> runner = | 356 scoped_refptr<base::SingleThreadTaskRunner> runner = |
357 manager_->TaskRunnerForQueue(0); | 357 manager_->TaskRunnerForQueue(0); |
358 | 358 |
359 // Posting a delayed task when pumping will apply the delay, but won't cause | 359 // Posting a delayed task when pumping will apply the delay, but won't cause |
360 // work to executed afterwards. | 360 // work to executed afterwards. |
361 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 361 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
362 runner->PostDelayedTask( | 362 runner->PostDelayedTask( |
363 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); | 363 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); |
364 test_task_runner_->RunUntilIdle(); | 364 test_task_runner_->RunUntilIdle(); |
365 EXPECT_TRUE(run_order.empty()); | 365 EXPECT_TRUE(run_order.empty()); |
366 | 366 |
367 // After pumping the task runs normally. | 367 // After pumping the task runs normally. |
368 manager_->PumpQueue(0); | 368 manager_->PumpQueue(0); |
369 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 369 EXPECT_TRUE(test_task_runner_->HasPendingTask()); |
370 selector_->AppendQueueToService(0); | 370 selector_->AppendQueueToService(0); |
371 test_task_runner_->RunUntilIdle(); | 371 test_task_runner_->RunUntilIdle(); |
372 EXPECT_THAT(run_order, ElementsAre(1)); | 372 EXPECT_THAT(run_order, ElementsAre(1)); |
373 } | 373 } |
374 | 374 |
375 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { | 375 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { |
376 Initialize(1u); | 376 Initialize(1u); |
377 manager_->SetPumpPolicy(0, TaskQueueManager::MANUAL_PUMP_POLICY); | 377 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
378 | 378 |
379 std::vector<int> run_order; | 379 std::vector<int> run_order; |
380 scoped_refptr<base::SingleThreadTaskRunner> runner = | 380 scoped_refptr<base::SingleThreadTaskRunner> runner = |
381 manager_->TaskRunnerForQueue(0); | 381 manager_->TaskRunnerForQueue(0); |
382 | 382 |
383 // Posting two tasks and pumping twice should result in two tasks in the work | 383 // Posting two tasks and pumping twice should result in two tasks in the work |
384 // queue. | 384 // queue. |
385 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 385 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
386 manager_->PumpQueue(0); | 386 manager_->PumpQueue(0); |
387 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 387 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 EXPECT_THAT(run_order, ElementsAre(2)); | 579 EXPECT_THAT(run_order, ElementsAre(2)); |
580 | 580 |
581 // Running all remaining tasks should execute both pending tasks. | 581 // Running all remaining tasks should execute both pending tasks. |
582 test_task_runner_->RunUntilIdle(); | 582 test_task_runner_->RunUntilIdle(); |
583 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); | 583 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); |
584 } | 584 } |
585 | 585 |
586 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeup) { | 586 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeup) { |
587 Initialize(2u); | 587 Initialize(2u); |
588 EXPECT_EQ(2u, selector_->work_queues().size()); | 588 EXPECT_EQ(2u, selector_->work_queues().size()); |
589 manager_->SetPumpPolicy(0, TaskQueueManager::AUTO_PUMP_AFTER_WAKEUP_POLICY); | 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, AutoPumpOnWakeupWhenAlreadyAwake) { |
614 Initialize(2u); | 614 Initialize(2u); |
615 EXPECT_EQ(2u, selector_->work_queues().size()); | 615 EXPECT_EQ(2u, selector_->work_queues().size()); |
616 manager_->SetPumpPolicy(0, TaskQueueManager::AUTO_PUMP_AFTER_WAKEUP_POLICY); | 616 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
617 | 617 |
618 std::vector<int> run_order; | 618 std::vector<int> run_order; |
619 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 619 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
620 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 620 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
621 | 621 |
622 selector_->AppendQueueToService(1); | 622 selector_->AppendQueueToService(1); |
623 selector_->AppendQueueToService(0); | 623 selector_->AppendQueueToService(0); |
624 | 624 |
625 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 625 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
626 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 626 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
627 test_task_runner_->RunUntilIdle(); | 627 test_task_runner_->RunUntilIdle(); |
628 EXPECT_THAT(run_order, ElementsAre(1, 2)); // TQM was already awake. | 628 EXPECT_THAT(run_order, ElementsAre(1, 2)); // TQM was already awake. |
629 } | 629 } |
630 | 630 |
631 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupTriggeredByManuallyPumpedQueue) { | 631 TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupTriggeredByManuallyPumpedQueue) { |
632 Initialize(2u); | 632 Initialize(2u); |
633 EXPECT_EQ(2u, selector_->work_queues().size()); | 633 EXPECT_EQ(2u, selector_->work_queues().size()); |
634 manager_->SetPumpPolicy(0, TaskQueueManager::AUTO_PUMP_AFTER_WAKEUP_POLICY); | 634 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
635 manager_->SetPumpPolicy(1, TaskQueueManager::MANUAL_PUMP_POLICY); | 635 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL); |
636 | 636 |
637 std::vector<int> run_order; | 637 std::vector<int> run_order; |
638 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 638 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
639 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 639 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
640 | 640 |
641 selector_->AppendQueueToService(1); | 641 selector_->AppendQueueToService(1); |
642 selector_->AppendQueueToService(0); | 642 selector_->AppendQueueToService(0); |
643 | 643 |
644 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 644 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
645 test_task_runner_->RunUntilIdle(); | 645 test_task_runner_->RunUntilIdle(); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 selector_->AppendQueueToService(0); | 725 selector_->AppendQueueToService(0); |
726 | 726 |
727 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); | 727 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); |
728 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); | 728 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
729 message_loop_->RunUntilIdle(); | 729 message_loop_->RunUntilIdle(); |
730 } | 730 } |
731 | 731 |
732 } // namespace | 732 } // namespace |
733 } // namespace content | 733 } // namespace content |
734 | 734 |
OLD | NEW |