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" |
11 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
12 | 12 |
13 using testing::ElementsAre; | 13 using testing::ElementsAre; |
| 14 using testing::_; |
14 | 15 |
15 namespace content { | 16 namespace content { |
16 namespace { | 17 namespace { |
17 | 18 |
18 class SelectorForTest : public TaskQueueSelector { | 19 class SelectorForTest : public TaskQueueSelector { |
19 public: | 20 public: |
20 SelectorForTest() {} | 21 SelectorForTest() {} |
21 | 22 |
22 void RegisterWorkQueues( | 23 void RegisterWorkQueues( |
23 const std::vector<const base::TaskQueue*>& work_queues) override { | 24 const std::vector<const base::TaskQueue*>& work_queues) override { |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 // the work batch is interrupted by the pending delayed task. | 576 // the work batch is interrupted by the pending delayed task. |
576 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); | 577 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u); |
577 test_task_runner_->RunPendingTasks(); | 578 test_task_runner_->RunPendingTasks(); |
578 EXPECT_THAT(run_order, ElementsAre(2)); | 579 EXPECT_THAT(run_order, ElementsAre(2)); |
579 | 580 |
580 // Running all remaining tasks should execute both pending tasks. | 581 // Running all remaining tasks should execute both pending tasks. |
581 test_task_runner_->RunUntilIdle(); | 582 test_task_runner_->RunUntilIdle(); |
582 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); | 583 EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); |
583 } | 584 } |
584 | 585 |
| 586 class MockTaskObserver : public base::MessageLoop::TaskObserver { |
| 587 public: |
| 588 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); |
| 589 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); |
| 590 }; |
| 591 |
| 592 TEST_F(TaskQueueManagerTest, TaskObserverAdding) { |
| 593 InitializeWithRealMessageLoop(1u); |
| 594 MockTaskObserver observer; |
| 595 |
| 596 manager_->SetWorkBatchSize(2); |
| 597 manager_->AddTaskObserver(&observer); |
| 598 |
| 599 std::vector<int> run_order; |
| 600 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 601 manager_->TaskRunnerForQueue(0); |
| 602 |
| 603 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 604 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 605 |
| 606 selector_->AppendQueueToService(0); |
| 607 selector_->AppendQueueToService(0); |
| 608 |
| 609 // Two pairs of callbacks for the tasks above plus another one for the |
| 610 // DoWork() posted by the task queue manager. |
| 611 EXPECT_CALL(observer, WillProcessTask(_)).Times(3); |
| 612 EXPECT_CALL(observer, DidProcessTask(_)).Times(3); |
| 613 message_loop_->RunUntilIdle(); |
| 614 } |
| 615 |
| 616 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) { |
| 617 InitializeWithRealMessageLoop(1u); |
| 618 MockTaskObserver observer; |
| 619 manager_->SetWorkBatchSize(2); |
| 620 manager_->AddTaskObserver(&observer); |
| 621 manager_->RemoveTaskObserver(&observer); |
| 622 |
| 623 std::vector<int> run_order; |
| 624 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 625 manager_->TaskRunnerForQueue(0); |
| 626 |
| 627 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 628 |
| 629 EXPECT_CALL(observer, WillProcessTask(_)).Times(0); |
| 630 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
| 631 |
| 632 selector_->AppendQueueToService(0); |
| 633 message_loop_->RunUntilIdle(); |
| 634 } |
| 635 |
| 636 void RemoveObserverTask(TaskQueueManager* manager, |
| 637 base::MessageLoop::TaskObserver* observer) { |
| 638 manager->RemoveTaskObserver(observer); |
| 639 } |
| 640 |
| 641 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) { |
| 642 InitializeWithRealMessageLoop(1u); |
| 643 MockTaskObserver observer; |
| 644 manager_->SetWorkBatchSize(3); |
| 645 manager_->AddTaskObserver(&observer); |
| 646 |
| 647 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 648 manager_->TaskRunnerForQueue(0); |
| 649 runner->PostTask(FROM_HERE, |
| 650 base::Bind(&RemoveObserverTask, manager_.get(), &observer)); |
| 651 |
| 652 selector_->AppendQueueToService(0); |
| 653 |
| 654 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); |
| 655 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
| 656 message_loop_->RunUntilIdle(); |
| 657 } |
| 658 |
585 } // namespace | 659 } // namespace |
586 } // namespace content | 660 } // namespace content |
OLD | NEW |