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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 test_task_runner_->RunUntilIdle(); | 649 test_task_runner_->RunUntilIdle(); |
649 // This still shouldn't wake TQM as manual queue was not pumped. | 650 // This still shouldn't wake TQM as manual queue was not pumped. |
650 EXPECT_TRUE(run_order.empty()); | 651 EXPECT_TRUE(run_order.empty()); |
651 | 652 |
652 manager_->PumpQueue(1); | 653 manager_->PumpQueue(1); |
653 test_task_runner_->RunUntilIdle(); | 654 test_task_runner_->RunUntilIdle(); |
654 // Executing a task on an auto pumped queue should wake the TQM. | 655 // Executing a task on an auto pumped queue should wake the TQM. |
655 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 656 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
656 } | 657 } |
657 | 658 |
| 659 class MockTaskObserver : public base::MessageLoop::TaskObserver { |
| 660 public: |
| 661 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); |
| 662 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); |
| 663 }; |
| 664 |
| 665 TEST_F(TaskQueueManagerTest, TaskObserverAdding) { |
| 666 InitializeWithRealMessageLoop(1u); |
| 667 MockTaskObserver observer; |
| 668 |
| 669 manager_->SetWorkBatchSize(2); |
| 670 manager_->AddTaskObserver(&observer); |
| 671 |
| 672 std::vector<int> run_order; |
| 673 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 674 manager_->TaskRunnerForQueue(0); |
| 675 |
| 676 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 677 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 678 |
| 679 selector_->AppendQueueToService(0); |
| 680 selector_->AppendQueueToService(0); |
| 681 |
| 682 // Two pairs of callbacks for the tasks above plus another one for the |
| 683 // DoWork() posted by the task queue manager. |
| 684 EXPECT_CALL(observer, WillProcessTask(_)).Times(3); |
| 685 EXPECT_CALL(observer, DidProcessTask(_)).Times(3); |
| 686 message_loop_->RunUntilIdle(); |
| 687 } |
| 688 |
| 689 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) { |
| 690 InitializeWithRealMessageLoop(1u); |
| 691 MockTaskObserver observer; |
| 692 manager_->SetWorkBatchSize(2); |
| 693 manager_->AddTaskObserver(&observer); |
| 694 manager_->RemoveTaskObserver(&observer); |
| 695 |
| 696 std::vector<int> run_order; |
| 697 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 698 manager_->TaskRunnerForQueue(0); |
| 699 |
| 700 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 701 |
| 702 EXPECT_CALL(observer, WillProcessTask(_)).Times(0); |
| 703 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
| 704 |
| 705 selector_->AppendQueueToService(0); |
| 706 message_loop_->RunUntilIdle(); |
| 707 } |
| 708 |
| 709 void RemoveObserverTask(TaskQueueManager* manager, |
| 710 base::MessageLoop::TaskObserver* observer) { |
| 711 manager->RemoveTaskObserver(observer); |
| 712 } |
| 713 |
| 714 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) { |
| 715 InitializeWithRealMessageLoop(1u); |
| 716 MockTaskObserver observer; |
| 717 manager_->SetWorkBatchSize(3); |
| 718 manager_->AddTaskObserver(&observer); |
| 719 |
| 720 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 721 manager_->TaskRunnerForQueue(0); |
| 722 runner->PostTask(FROM_HERE, |
| 723 base::Bind(&RemoveObserverTask, manager_.get(), &observer)); |
| 724 |
| 725 selector_->AppendQueueToService(0); |
| 726 |
| 727 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); |
| 728 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); |
| 729 message_loop_->RunUntilIdle(); |
| 730 } |
| 731 |
658 } // namespace | 732 } // namespace |
659 } // namespace content | 733 } // namespace content |
660 | 734 |
OLD | NEW |