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