Index: content/renderer/scheduler/task_queue_manager_unittest.cc |
diff --git a/content/renderer/scheduler/task_queue_manager_unittest.cc b/content/renderer/scheduler/task_queue_manager_unittest.cc |
index 5c4e4eb8bc11a8c737c5e8216ba72b302b18879f..96257b6f6849f60cc4c4a16f5cd4a8e74003fd1f 100644 |
--- a/content/renderer/scheduler/task_queue_manager_unittest.cc |
+++ b/content/renderer/scheduler/task_queue_manager_unittest.cc |
@@ -457,18 +457,22 @@ TEST_F(TaskQueueManagerTest, PostFromThread) { |
EXPECT_THAT(run_order, ElementsAre(1)); |
} |
-void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner) { |
+void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
+ int* run_count) { |
+ (*run_count)++; |
runner->PostTask( |
- FROM_HERE, Bind(&RePostingTestTask, base::Unretained(runner.get()))); |
+ FROM_HERE, |
+ Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count)); |
} |
TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { |
Initialize(1u); |
- |
scoped_refptr<base::SingleThreadTaskRunner> runner = |
manager_->TaskRunnerForQueue(0); |
- runner->PostTask(FROM_HERE, base::Bind(&RePostingTestTask, runner)); |
+ int run_count = 0; |
+ runner->PostTask(FROM_HERE, |
+ base::Bind(&RePostingTestTask, runner, &run_count)); |
selector_->AppendQueueToService(0); |
selector_->AppendQueueToService(0); |
@@ -478,6 +482,7 @@ TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { |
// NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there |
// will be two tasks here. |
EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); |
+ EXPECT_EQ(1, run_count); |
Sami
2015/03/02 12:28:56
Not sure why you made this more strict? Seems like
rmcilroy
2015/03/02 15:34:51
I added the run_count arg to RePostingTestTask for
Sami
2015/03/02 15:55:58
Ah, makes sense, thanks.
rmcilroy
2015/03/02 16:47:52
Acknowledged.
|
} |
TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { |
@@ -583,7 +588,7 @@ TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) { |
EXPECT_THAT(run_order, ElementsAre(2, 3, 1)); |
} |
-TEST_F(TaskQueueManagerTest, AutoPumpOnWakeup) { |
+TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { |
Initialize(2u); |
EXPECT_EQ(2u, selector_->work_queues().size()); |
manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
@@ -610,7 +615,7 @@ TEST_F(TaskQueueManagerTest, AutoPumpOnWakeup) { |
EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); |
} |
-TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupWhenAlreadyAwake) { |
+TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) { |
Initialize(2u); |
EXPECT_EQ(2u, selector_->work_queues().size()); |
manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
@@ -622,13 +627,14 @@ TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupWhenAlreadyAwake) { |
selector_->AppendQueueToService(1); |
selector_->AppendQueueToService(0); |
- runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
- runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
+ runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
+ runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
test_task_runner_->RunUntilIdle(); |
- EXPECT_THAT(run_order, ElementsAre(1, 2)); // TQM was already awake. |
+ EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake. |
} |
-TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupTriggeredByManuallyPumpedQueue) { |
+TEST_F(TaskQueueManagerTest, |
+ AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) { |
Initialize(2u); |
EXPECT_EQ(2u, selector_->work_queues().size()); |
manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
@@ -656,6 +662,107 @@ TEST_F(TaskQueueManagerTest, AutoPumpOnWakeupTriggeredByManuallyPumpedQueue) { |
EXPECT_THAT(run_order, ElementsAre(2, 1)); |
} |
+void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
+ base::Closure task) { |
+ task_runner->PostTask(FROM_HERE, task); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) { |
+ Initialize(2u); |
+ EXPECT_EQ(2u, selector_->work_queues().size()); |
Sami
2015/03/02 12:28:56
nit: These EXPECT_EQs here are a bit redundant. We
rmcilroy
2015/03/02 15:34:51
Done.
|
+ manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
+ |
+ std::vector<int> run_order; |
+ scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
+ manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
+ |
+ selector_->AppendQueueToService(1); |
+ selector_->AppendQueueToService(1); |
+ selector_->AppendQueueToService(0); |
+ |
+ // Check that a task which posts a task to an auto pump after wakeup queue |
+ // doesn't cause the queue to wake up. |
+ base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); |
+ runners[1]->PostTask( |
+ FROM_HERE, |
+ base::Bind(&TestPostingTask, runners[0], after_wakeup_task)); |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(run_order.empty()); |
+ |
+ // Wake up the queue. |
+ runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(2, 1)); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { |
+ Initialize(2u); |
+ EXPECT_EQ(2u, selector_->work_queues().size()); |
+ manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
+ |
+ std::vector<int> run_order; |
+ scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
+ manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
+ |
+ selector_->AppendQueueToService(1); |
+ selector_->AppendQueueToService(1); |
+ selector_->AppendQueueToService(1); |
+ selector_->AppendQueueToService(0); |
+ selector_->AppendQueueToService(0); |
+ |
+ // Check that a task which posts a task to an auto pump after wakeup queue |
+ // doesn't cause the queue to wake up. |
+ base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order); |
+ base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order); |
+ runners[1]->PostTask( |
+ FROM_HERE, |
+ base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1)); |
+ runners[1]->PostTask( |
+ FROM_HERE, |
+ base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(run_order.empty()); |
+ |
+ // Wake up the queue. |
+ runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); |
+} |
+ |
+void NullTestTask() { |
+} |
+ |
+TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { |
+ Initialize(2u); |
+ EXPECT_EQ(2u, selector_->work_queues().size()); |
+ manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
+ |
+ int run_count = 0; |
+ scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
+ manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
+ |
+ selector_->AppendQueueToService(1); |
+ selector_->AppendQueueToService(0); |
+ selector_->AppendQueueToService(0); |
+ // Append extra service queue '0' entries to the selector otherwise test will |
+ // finish even if the RePostingTestTask woke each other up. |
+ selector_->AppendQueueToService(0); |
+ selector_->AppendQueueToService(0); |
+ |
+ // Check that if multiple task reposts themselves onto a auto pump after |
Sami
2015/03/02 12:28:56
s/a/an/
rmcilroy
2015/03/02 15:34:51
Done.
|
+ // wakeup queue they don't wake each other and eventually stops running when |
+ // no other tasks execute |
+ runners[0]->PostTask(FROM_HERE, |
+ base::Bind(&RePostingTestTask, runners[0], &run_count)); |
+ runners[0]->PostTask(FROM_HERE, |
+ base::Bind(&RePostingTestTask, runners[0], &run_count)); |
+ runners[1]->PostTask(FROM_HERE, base::Bind(&NullTestTask)); |
+ test_task_runner_->RunUntilIdle(); |
+ // The reposting tasks posted to the after wakeup queue shouldn't have woken |
+ // each other up. |
+ EXPECT_EQ(2, run_count); |
+} |
+ |
class MockTaskObserver : public base::MessageLoop::TaskObserver { |
public: |
MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); |