diff options
Diffstat (limited to 'content/renderer/scheduler/task_queue_manager_unittest.cc')
-rw-r--r-- | content/renderer/scheduler/task_queue_manager_unittest.cc | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/content/renderer/scheduler/task_queue_manager_unittest.cc b/content/renderer/scheduler/task_queue_manager_unittest.cc index ef5bd53..21c7525 100644 --- a/content/renderer/scheduler/task_queue_manager_unittest.cc +++ b/content/renderer/scheduler/task_queue_manager_unittest.cc @@ -11,6 +11,7 @@ #include "testing/gmock/include/gmock/gmock.h" using testing::ElementsAre; +using testing::_; namespace content { namespace { @@ -655,6 +656,79 @@ TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupTriggeredByManuallyPumpedQueue) { EXPECT_THAT(run_order, ElementsAre(2, 1)); } +class MockTaskObserver : public base::MessageLoop::TaskObserver { + public: + MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); + MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); +}; + +TEST_F(TaskQueueManagerTest, TaskObserverAdding) { + InitializeWithRealMessageLoop(1u); + MockTaskObserver observer; + + manager_->SetWorkBatchSize(2); + manager_->AddTaskObserver(&observer); + + std::vector<int> run_order; + scoped_refptr<base::SingleThreadTaskRunner> runner = + manager_->TaskRunnerForQueue(0); + + runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); + runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); + + selector_->AppendQueueToService(0); + selector_->AppendQueueToService(0); + + // Two pairs of callbacks for the tasks above plus another one for the + // DoWork() posted by the task queue manager. + EXPECT_CALL(observer, WillProcessTask(_)).Times(3); + EXPECT_CALL(observer, DidProcessTask(_)).Times(3); + message_loop_->RunUntilIdle(); +} + +TEST_F(TaskQueueManagerTest, TaskObserverRemoving) { + InitializeWithRealMessageLoop(1u); + MockTaskObserver observer; + manager_->SetWorkBatchSize(2); + manager_->AddTaskObserver(&observer); + manager_->RemoveTaskObserver(&observer); + + std::vector<int> run_order; + scoped_refptr<base::SingleThreadTaskRunner> runner = + manager_->TaskRunnerForQueue(0); + + runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); + + EXPECT_CALL(observer, WillProcessTask(_)).Times(0); + EXPECT_CALL(observer, DidProcessTask(_)).Times(0); + + selector_->AppendQueueToService(0); + message_loop_->RunUntilIdle(); +} + +void RemoveObserverTask(TaskQueueManager* manager, + base::MessageLoop::TaskObserver* observer) { + manager->RemoveTaskObserver(observer); +} + +TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) { + InitializeWithRealMessageLoop(1u); + MockTaskObserver observer; + manager_->SetWorkBatchSize(3); + manager_->AddTaskObserver(&observer); + + scoped_refptr<base::SingleThreadTaskRunner> runner = + manager_->TaskRunnerForQueue(0); + runner->PostTask(FROM_HERE, + base::Bind(&RemoveObserverTask, manager_.get(), &observer)); + + selector_->AppendQueueToService(0); + + EXPECT_CALL(observer, WillProcessTask(_)).Times(1); + EXPECT_CALL(observer, DidProcessTask(_)).Times(0); + message_loop_->RunUntilIdle(); +} + } // namespace } // namespace content |