| 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 |