Index: components/scheduler/base/task_queue_manager_unittest.cc |
diff --git a/components/scheduler/base/task_queue_manager_unittest.cc b/components/scheduler/base/task_queue_manager_unittest.cc |
index e9920807895caa77fb09a65d11c257e65c3054d0..b0cfdb199b5799a76547d6c29ec296b1f3dedf2a 100644 |
--- a/components/scheduler/base/task_queue_manager_unittest.cc |
+++ b/components/scheduler/base/task_queue_manager_unittest.cc |
@@ -1740,4 +1740,81 @@ TEST_F(TaskQueueManagerTest, |
EXPECT_LT(ratio, 0.1); |
} |
+TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_NoTaskRunning) { |
+ Initialize(1u); |
+ |
+ EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
+} |
+ |
+namespace { |
+void CurrentlyExecutingTaskQueueTestTask(TaskQueueManager* task_queue_manager, |
+ std::vector<TaskQueue*>* task_sources) { |
+ task_sources->push_back(task_queue_manager->currently_executing_task_queue()); |
+} |
+} |
+ |
+TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_TaskRunning) { |
+ Initialize(2u); |
+ |
+ internal::TaskQueueImpl* queue0 = runners_[0].get(); |
+ internal::TaskQueueImpl* queue1 = runners_[1].get(); |
+ |
+ std::vector<TaskQueue*> task_sources; |
+ queue0->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
+ manager_.get(), &task_sources)); |
+ queue1->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
+ manager_.get(), &task_sources)); |
+ test_task_runner_->RunUntilIdle(); |
+ |
+ EXPECT_THAT(task_sources, ElementsAre(queue0, queue1)); |
+ EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
+} |
+ |
+namespace { |
+void RunloopCurrentlyExecutingTaskQueueTestTask( |
+ base::MessageLoop* message_loop, |
+ TaskQueueManager* task_queue_manager, |
+ std::vector<TaskQueue*>* task_sources, |
+ std::vector<std::pair<base::Closure, TaskQueue*>>* tasks) { |
+ base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); |
+ task_sources->push_back(task_queue_manager->currently_executing_task_queue()); |
+ |
+ for (std::pair<base::Closure, TaskQueue*>& pair : *tasks) { |
+ pair.second->PostTask(FROM_HERE, pair.first); |
+ } |
+ |
+ message_loop->RunUntilIdle(); |
+ task_sources->push_back(task_queue_manager->currently_executing_task_queue()); |
+} |
+} |
+ |
+TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_NestedLoop) { |
+ InitializeWithRealMessageLoop(3u); |
+ |
+ TaskQueue* queue0 = runners_[0].get(); |
+ TaskQueue* queue1 = runners_[1].get(); |
+ TaskQueue* queue2 = runners_[2].get(); |
+ |
+ std::vector<TaskQueue*> task_sources; |
+ std::vector<std::pair<base::Closure, TaskQueue*>> |
+ tasks_to_post_from_nested_loop; |
+ tasks_to_post_from_nested_loop.push_back( |
+ std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
+ manager_.get(), &task_sources), |
+ queue1)); |
+ tasks_to_post_from_nested_loop.push_back( |
+ std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
+ manager_.get(), &task_sources), |
+ queue2)); |
+ |
+ queue0->PostTask( |
+ FROM_HERE, base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, |
+ message_loop_.get(), manager_.get(), &task_sources, |
+ &tasks_to_post_from_nested_loop)); |
+ |
+ message_loop_->RunUntilIdle(); |
+ EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); |
+ EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
+} |
+ |
} // namespace scheduler |