Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Unified Diff: content/renderer/scheduler/task_queue_manager_unittest.cc

Issue 966813003: [content]: Ensure TaskQueueManager AFTER_WAKEUP autopump policy wakes only on newer tasks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Sami's comments Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..b979dfefb7da4ce43081445fc833166d1970592b 100644
--- a/content/renderer/scheduler/task_queue_manager_unittest.cc
+++ b/content/renderer/scheduler/task_queue_manager_unittest.cc
@@ -58,6 +58,7 @@ class TaskQueueManagerTest : public testing::Test {
selector_ = make_scoped_ptr(new SelectorForTest);
manager_ = make_scoped_ptr(
new TaskQueueManager(num_queues, test_task_runner_, selector_.get()));
+ EXPECT_EQ(num_queues, selector_->work_queues().size());
Sami 2015/03/02 14:48:47 Thanks!
rmcilroy 2015/03/02 15:34:52 Acknowledged.
}
void InitializeWithRealMessageLoop(size_t num_queues) {
@@ -65,6 +66,7 @@ class TaskQueueManagerTest : public testing::Test {
selector_ = make_scoped_ptr(new SelectorForTest);
manager_ = make_scoped_ptr(new TaskQueueManager(
num_queues, message_loop_->task_runner(), selector_.get()));
+ EXPECT_EQ(num_queues, selector_->work_queues().size());
}
scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_;
@@ -93,7 +95,6 @@ void TestTask(int value, std::vector<int>* out_result) {
TEST_F(TaskQueueManagerTest, SingleQueuePosting) {
Initialize(1u);
- EXPECT_EQ(1u, selector_->work_queues().size());
std::vector<int> run_order;
scoped_refptr<base::SingleThreadTaskRunner> runner =
@@ -113,7 +114,6 @@ TEST_F(TaskQueueManagerTest, SingleQueuePosting) {
TEST_F(TaskQueueManagerTest, MultiQueuePosting) {
Initialize(3u);
- EXPECT_EQ(3u, selector_->work_queues().size());
std::vector<int> run_order;
scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
@@ -141,7 +141,6 @@ TEST_F(TaskQueueManagerTest, MultiQueuePosting) {
TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
InitializeWithRealMessageLoop(1u);
- EXPECT_EQ(1u, selector_->work_queues().size());
std::vector<int> run_order;
scoped_refptr<base::SingleThreadTaskRunner> runner =
@@ -157,7 +156,6 @@ TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) {
InitializeWithRealMessageLoop(1u);
- EXPECT_EQ(1u, selector_->work_queues().size());
std::vector<int> run_order;
scoped_refptr<base::SingleThreadTaskRunner> runner =
@@ -181,7 +179,6 @@ TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) {
TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) {
InitializeWithRealMessageLoop(1u);
- EXPECT_EQ(1u, selector_->work_queues().size());
std::vector<int> run_order;
scoped_refptr<base::SingleThreadTaskRunner> runner =
@@ -402,7 +399,6 @@ void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
TEST_F(TaskQueueManagerTest, ReentrantPosting) {
Initialize(1u);
- EXPECT_EQ(1u, selector_->work_queues().size());
std::vector<int> run_order;
scoped_refptr<base::SingleThreadTaskRunner> runner =
@@ -457,18 +453,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 +478,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);
}
TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
@@ -583,9 +584,8 @@ 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);
std::vector<int> run_order;
@@ -610,9 +610,8 @@ 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);
std::vector<int> run_order;
@@ -622,15 +621,15 @@ 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);
manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL);
@@ -656,6 +655,104 @@ 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);
+ 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);
+ 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);
+ 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 an auto pump after
picksi 2015/03/02 14:30:06 nits: 'tasks repost' 'pump-after-wakeup' 'eventual
rmcilroy 2015/03/02 15:34:52 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));

Powered by Google App Engine
This is Rietveld 408576698