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

Unified Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc

Issue 2276353002: Remove after wakeup logic and replace PumpTask with Fences (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Slight simplification Created 4 years, 3 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: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
index 3fb8247cd5557b92abfadb46d9ee503370fc7e56..b8d18c42ef451d713ec8544ffa654125901e3634 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
@@ -104,6 +104,10 @@ class TaskQueueManagerTest : public testing::Test {
runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue")));
}
+ void UpdateWorkQueues(LazyNow lazy_now) {
+ manager_->UpdateWorkQueues(lazy_now);
+ }
+
std::unique_ptr<base::MessageLoop> message_loop_;
std::unique_ptr<base::SimpleTestTickClock> now_src_;
scoped_refptr<TaskQueueManagerDelegateForTest> main_task_runner_;
@@ -431,9 +435,9 @@ TEST_F(TaskQueueManagerTest, PendingDelayedTasksRemovedOnShutdown) {
EXPECT_EQ(2, TestObject::destructor_count_);
}
-TEST_F(TaskQueueManagerTest, ManualPumping) {
+TEST_F(TaskQueueManagerTest, InsertAndRemoveFence) {
Initialize(1u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
+ runners_[0]->InsertFence();
std::vector<EnqueueOrder> run_order;
// Posting a task when pumping is disabled doesn't result in work getting
@@ -444,26 +448,8 @@ TEST_F(TaskQueueManagerTest, ManualPumping) {
// However polling still works.
EXPECT_TRUE(runners_[0]->HasPendingImmediateWork());
- // After pumping the task runs normally.
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
- EXPECT_TRUE(test_task_runner_->HasPendingTasks());
- test_task_runner_->RunUntilIdle();
- EXPECT_THAT(run_order, ElementsAre(1));
-}
-
-TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
- Initialize(1u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
-
- std::vector<EnqueueOrder> run_order;
- // Posting a task when pumping is disabled doesn't result in work getting
- // posted.
- runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
- EXPECT_FALSE(test_task_runner_->HasPendingTasks());
-
- // When pumping is enabled the task runs normally.
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
+ // After removing the fence the task runs normally.
+ runners_[0]->RemoveFence();
EXPECT_TRUE(test_task_runner_->HasPendingTasks());
test_task_runner_->RunUntilIdle();
EXPECT_THAT(run_order, ElementsAre(1));
@@ -499,55 +485,51 @@ TEST_F(TaskQueueManagerTest, DenyRunning_AfterPosting) {
EXPECT_THAT(run_order, ElementsAre(1));
}
-TEST_F(TaskQueueManagerTest, DenyRunning_ManuallyPumpedTransitionsToAuto) {
+TEST_F(TaskQueueManagerTest, DenyRunning_AfterRemovingFence) {
Initialize(1u);
std::vector<EnqueueOrder> run_order;
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
+ runners_[0]->InsertFence();
runners_[0]->SetQueueEnabled(false);
runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
test_task_runner_->RunUntilIdle();
EXPECT_TRUE(run_order.empty());
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
+ runners_[0]->RemoveFence();
runners_[0]->SetQueueEnabled(true);
test_task_runner_->RunUntilIdle();
EXPECT_THAT(run_order, ElementsAre(1));
}
-TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
+TEST_F(TaskQueueManagerTest, RemovingFenceWithDelayedTask) {
Initialize(1u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
+ runners_[0]->InsertFence();
std::vector<EnqueueOrder> run_order;
- // Posting a delayed task when pumping will apply the delay, but won't cause
+ // Posting a delayed task when fenced will apply the delay, but won't cause
// work to executed afterwards.
base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
delay);
- // After pumping but before the delay period has expired, task does not run.
- LazyNow lazy_now1(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now1, true);
- test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
+ // The task does not run even though it's delay is up.
+ test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
EXPECT_TRUE(run_order.empty());
- // Once the delay has expired, pumping causes the task to run.
- now_src_->Advance(base::TimeDelta::FromMilliseconds(5));
- LazyNow lazy_now2(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now2, true);
+ // Removing the fence causes the task to run.
+ runners_[0]->RemoveFence();
EXPECT_TRUE(test_task_runner_->HasPendingTasks());
test_task_runner_->RunPendingTasks();
EXPECT_THAT(run_order, ElementsAre(1));
}
-TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
+TEST_F(TaskQueueManagerTest, RemovingFenceWithMultipleDelayedTasks) {
Initialize(1u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
+ runners_[0]->InsertFence();
std::vector<EnqueueOrder> run_order;
- // Posting a delayed task when pumping will apply the delay, but won't cause
+ // Posting a delayed task when fenced will apply the delay, but won't cause
// work to executed afterwards.
base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
@@ -563,16 +545,15 @@ TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
test_task_runner_->RunUntilIdle();
EXPECT_TRUE(run_order.empty());
- // Once the delay has expired, pumping causes the task to run.
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
+ // Removing the fence causes the ready tasks to run.
+ runners_[0]->RemoveFence();
test_task_runner_->RunUntilIdle();
EXPECT_THAT(run_order, ElementsAre(1, 2));
}
-TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
+TEST_F(TaskQueueManagerTest, InsertFencePreventsDelayedTasksFromRunning) {
Initialize(1u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
+ runners_[0]->InsertFence();
std::vector<EnqueueOrder> run_order;
base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
@@ -583,20 +564,80 @@ TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
EXPECT_TRUE(run_order.empty());
}
-TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
+TEST_F(TaskQueueManagerTest, MultipleFences) {
+ Initialize(1u);
+
+ std::vector<EnqueueOrder> run_order;
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
+ runners_[0]->InsertFence();
+
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
+ test_task_runner_->RunUntilIdle();
+ EXPECT_THAT(run_order, ElementsAre(1, 2));
+
+ runners_[0]->InsertFence();
+ test_task_runner_->RunUntilIdle();
+ EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
+}
+
+TEST_F(TaskQueueManagerTest, InsertFenceThenImmediatlyRemoveDoesNotBlock) {
+ Initialize(1u);
+ runners_[0]->InsertFence();
+ runners_[0]->RemoveFence();
+
+ std::vector<EnqueueOrder> run_order;
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
+
+ test_task_runner_->RunUntilIdle();
+ EXPECT_THAT(run_order, ElementsAre(1, 2));
+}
+
+TEST_F(TaskQueueManagerTest, InsertFencePostThenRemoveDoesNotBlock) {
+ Initialize(1u);
+ runners_[0]->InsertFence();
+
+ std::vector<EnqueueOrder> run_order;
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
+ runners_[0]->RemoveFence();
+
+ test_task_runner_->RunUntilIdle();
+ EXPECT_THAT(run_order, ElementsAre(1, 2));
+}
+
+TEST_F(TaskQueueManagerTest, MultipleFencesWithInitiallyEmptyQueue) {
Initialize(1u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
+ runners_[0]->InsertFence();
std::vector<EnqueueOrder> run_order;
- // Posting two tasks and pumping twice should result in two tasks in the work
- // queue.
- LazyNow lazy_now(now_src_.get());
runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
- runners_[0]->PumpQueue(&lazy_now, true);
+ runners_[0]->InsertFence();
runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
- runners_[0]->PumpQueue(&lazy_now, true);
+ test_task_runner_->RunUntilIdle();
+ EXPECT_THAT(run_order, ElementsAre(1));
+}
+
+TEST_F(TaskQueueManagerTest, BlockedByFence) {
+ Initialize(1u);
+ EXPECT_FALSE(runners_[0]->BlockedByFence());
+
+ runners_[0]->InsertFence();
+ EXPECT_TRUE(runners_[0]->BlockedByFence());
+
+ runners_[0]->RemoveFence();
+ EXPECT_FALSE(runners_[0]->BlockedByFence());
- EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size());
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
+ runners_[0]->InsertFence();
+ EXPECT_FALSE(runners_[0]->BlockedByFence());
+
+ test_task_runner_->RunUntilIdle();
+ EXPECT_TRUE(runners_[0]->BlockedByFence());
+
+ runners_[0]->RemoveFence();
+ EXPECT_FALSE(runners_[0]->BlockedByFence());
}
void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
@@ -715,150 +756,6 @@ TEST_F(TaskQueueManagerTest, WorkBatching) {
EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
}
-TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
- Initialize(2u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
-
- std::vector<EnqueueOrder> run_order;
- runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
- test_task_runner_->RunUntilIdle();
- EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
-
- runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
- test_task_runner_->RunUntilIdle();
- EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM.
-
- runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
- test_task_runner_->RunUntilIdle();
- // Executing a task on an auto pumped queue should wake the TQM.
- EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
-}
-
-TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) {
- Initialize(2u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
-
- std::vector<EnqueueOrder> 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(2, 1)); // TQM was already awake.
-}
-
-TEST_F(TaskQueueManagerTest,
- AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) {
- Initialize(2u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
- runners_[1]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
-
- std::vector<EnqueueOrder> run_order;
- runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
- test_task_runner_->RunUntilIdle();
- EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
-
- runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
- test_task_runner_->RunUntilIdle();
- // This still shouldn't wake TQM as manual queue was not pumped.
- EXPECT_TRUE(run_order.empty());
-
- LazyNow lazy_now(now_src_.get());
- runners_[1]->PumpQueue(&lazy_now, true);
- test_task_runner_->RunUntilIdle();
- // Executing a task on an auto pumped queue should wake the TQM.
- 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);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
-
- std::vector<EnqueueOrder> run_order;
- // 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);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
-
- std::vector<EnqueueOrder> run_order;
- // 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));
-}
-
-TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
- Initialize(2u);
- runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
-
- int run_count = 0;
- // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
- // queue they don't wake each other and will eventually stop 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(&NopTask));
- 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);
-}
-
-TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWithDontWakeQueue) {
- Initialize(1u);
-
- scoped_refptr<internal::TaskQueueImpl> queue0 = manager_->NewTaskQueue(
- TaskQueue::Spec("test_queue 0")
- .SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP));
- scoped_refptr<internal::TaskQueueImpl> queue1 = manager_->NewTaskQueue(
- TaskQueue::Spec("test_queue 0")
- .SetWakeupPolicy(TaskQueue::WakeupPolicy::DONT_WAKE_OTHER_QUEUES));
- scoped_refptr<internal::TaskQueueImpl> queue2 = runners_[0];
-
- std::vector<EnqueueOrder> run_order;
- queue0->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
- queue1->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
- test_task_runner_->RunUntilIdle();
- // Executing a DONT_WAKE_OTHER_QUEUES queue shouldn't wake the autopump after
- // wakeup queue.
- EXPECT_THAT(run_order, ElementsAre(2));
-
- queue2->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
- test_task_runner_->RunUntilIdle();
- // Executing a CAN_WAKE_OTHER_QUEUES queue should wake the autopump after
- // wakeup queue.
- EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
-}
-
class MockTaskObserver : public base::MessageLoop::TaskObserver {
public:
MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
@@ -1077,80 +974,36 @@ TEST_F(TaskQueueManagerTest, GetAndClearSystemIsQuiescentBit) {
}
TEST_F(TaskQueueManagerTest, HasPendingImmediateWork) {
- Initialize(2u);
- internal::TaskQueueImpl* queue0 = runners_[0].get();
- internal::TaskQueueImpl* queue1 = runners_[1].get();
- queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
- queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
-
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue1->HasPendingImmediateWork());
+ Initialize(1u);
- queue0->PostTask(FROM_HERE, base::Bind(NullTask));
- queue1->PostTask(FROM_HERE, base::Bind(NullTask));
- EXPECT_TRUE(queue0->HasPendingImmediateWork());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
+ EXPECT_FALSE(runners_[0]->HasPendingImmediateWork());
+ runners_[0]->PostTask(FROM_HERE, base::Bind(NullTask));
+ EXPECT_TRUE(runners_[0]->HasPendingImmediateWork());
test_task_runner_->RunUntilIdle();
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
+ EXPECT_FALSE(runners_[0]->HasPendingImmediateWork());
+}
- LazyNow lazy_now(now_src_.get());
- queue1->PumpQueue(&lazy_now, true);
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
+TEST_F(TaskQueueManagerTest, HasPendingImmediateWork_DelayedTasks) {
+ Initialize(1u);
- test_task_runner_->RunUntilIdle();
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue1->HasPendingImmediateWork());
-}
+ EXPECT_FALSE(runners_[0]->HasPendingImmediateWork());
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(NullTask),
+ base::TimeDelta::FromMilliseconds(12));
+ EXPECT_FALSE(runners_[0]->HasPendingImmediateWork());
-TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) {
- Initialize(2u);
- internal::TaskQueueImpl* queue0 = runners_[0].get();
- internal::TaskQueueImpl* queue1 = runners_[1].get();
- queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO);
- queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL);
-
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue0->NeedsPumping());
- EXPECT_FALSE(queue1->HasPendingImmediateWork());
- EXPECT_FALSE(queue1->NeedsPumping());
-
- queue0->PostTask(FROM_HERE, base::Bind(NullTask));
- queue0->PostTask(FROM_HERE, base::Bind(NullTask));
- queue1->PostTask(FROM_HERE, base::Bind(NullTask));
- EXPECT_TRUE(queue0->HasPendingImmediateWork());
- EXPECT_TRUE(queue0->NeedsPumping());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
- EXPECT_TRUE(queue1->NeedsPumping());
-
- test_task_runner_->SetRunTaskLimit(1);
- test_task_runner_->RunPendingTasks();
- EXPECT_TRUE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue0->NeedsPumping());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
- EXPECT_TRUE(queue1->NeedsPumping());
+ // Move time forwards until just before the delayed task should run.
+ now_src_->Advance(base::TimeDelta::FromMilliseconds(10));
+ UpdateWorkQueues(LazyNow(now_src_.get()));
+ EXPECT_FALSE(runners_[0]->HasPendingImmediateWork());
- test_task_runner_->ClearRunTaskLimit();
- test_task_runner_->RunUntilIdle();
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue0->NeedsPumping());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
- EXPECT_TRUE(queue1->NeedsPumping());
-
- LazyNow lazy_now(now_src_.get());
- queue1->PumpQueue(&lazy_now, true);
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue0->NeedsPumping());
- EXPECT_TRUE(queue1->HasPendingImmediateWork());
- EXPECT_FALSE(queue1->NeedsPumping());
+ // Force the delayed task onto the work queue.
+ now_src_->Advance(base::TimeDelta::FromMilliseconds(2));
+ UpdateWorkQueues(LazyNow(now_src_.get()));
+ EXPECT_TRUE(runners_[0]->HasPendingImmediateWork());
test_task_runner_->RunUntilIdle();
- EXPECT_FALSE(queue0->HasPendingImmediateWork());
- EXPECT_FALSE(queue0->NeedsPumping());
- EXPECT_FALSE(queue1->HasPendingImmediateWork());
- EXPECT_FALSE(queue1->NeedsPumping());
+ EXPECT_FALSE(runners_[0]->HasPendingImmediateWork());
}
void ExpensiveTestTask(int value,
@@ -1401,35 +1254,6 @@ TEST_F(TaskQueueManagerTest, UnregisterTaskQueue_InTasks) {
ASSERT_THAT(run_order, ElementsAre(1));
}
-void PostTestTasksFromNestedMessageLoop(
- base::MessageLoop* message_loop,
- scoped_refptr<base::SingleThreadTaskRunner> main_runner,
- scoped_refptr<base::SingleThreadTaskRunner> wake_up_runner,
- std::vector<EnqueueOrder>* run_order) {
- base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
- main_runner->PostNonNestableTask(FROM_HERE,
- base::Bind(&TestTask, 1, run_order));
- // The following should never get executed.
- wake_up_runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, run_order));
- base::RunLoop().RunUntilIdle();
-}
-
-TEST_F(TaskQueueManagerTest, DeferredNonNestableTaskDoesNotTriggerWakeUp) {
- // This test checks that running (i.e., deferring) a non-nestable task in a
- // nested run loop does not trigger the pumping of an on-wakeup queue.
- InitializeWithRealMessageLoop(2u);
- runners_[1]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP);
-
- std::vector<EnqueueOrder> run_order;
- runners_[0]->PostTask(
- FROM_HERE,
- base::Bind(&PostTestTasksFromNestedMessageLoop, message_loop_.get(),
- runners_[0], runners_[1], base::Unretained(&run_order)));
-
- base::RunLoop().RunUntilIdle();
- ASSERT_THAT(run_order, ElementsAre(1));
-}
-
namespace {
class MockObserver : public TaskQueueManager::Observer {
@@ -1468,6 +1292,11 @@ TEST_F(TaskQueueManagerTest, OnTriedToExecuteBlockedTask) {
task_queue->SetQueueEnabled(false);
task_queue->PostTask(FROM_HERE, base::Bind(&NopTask));
+ // Trick |task_queue| into posting a DoWork. By default PostTask with a
+ // disabled queue won't post a DoWork until we enable the queue.
+ task_queue->SetQueueEnabled(true);
+ task_queue->SetQueueEnabled(false);
+
EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(1);
test_task_runner_->RunPendingTasks();
@@ -1994,8 +1823,7 @@ TEST_F(TaskQueueManagerTest, PostCancellableTask_AndCancel_OnWorkQueue) {
EXPECT_TRUE(handle);
// Force the task onto the work queue.
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
+ UpdateWorkQueues(LazyNow(now_src_.get()));
EXPECT_TRUE(runners_[0]->IsTaskPending(handle));
EXPECT_TRUE(runners_[0]->CancelTask(handle));
@@ -2019,8 +1847,7 @@ TEST_F(TaskQueueManagerTest, PostThreeTasks_AndCancelOne_OnWorkQueue) {
FROM_HERE, base::Bind(&TestTask, 3, &run_order), base::TimeDelta());
// Force the tasks onto the work queue.
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
+ UpdateWorkQueues(LazyNow(now_src_.get()));
EXPECT_TRUE(runners_[0]->IsTaskPending(handle));
EXPECT_TRUE(runners_[0]->CancelTask(handle));
@@ -2044,10 +1871,7 @@ TEST_F(TaskQueueManagerTest, PostThreeTasksOnDifferentQueues_AndCancelOne) {
FROM_HERE, base::Bind(&TestTask, 3, &run_order), base::TimeDelta());
// Force the tasks onto the work queues.
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
- runners_[1]->PumpQueue(&lazy_now, true);
- runners_[2]->PumpQueue(&lazy_now, true);
+ UpdateWorkQueues(LazyNow(now_src_.get()));
EXPECT_TRUE(runners_[1]->IsTaskPending(handle));
EXPECT_TRUE(runners_[1]->CancelTask(handle));
@@ -2225,8 +2049,7 @@ TEST_F(TaskQueueManagerTest, PostDelayedCancellableTask_AndCancel_OnWorkQueue) {
// Force the task onto the work queue.
now_src_->Advance(base::TimeDelta::FromMilliseconds(10));
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
+ UpdateWorkQueues(LazyNow(now_src_.get()));
EXPECT_TRUE(runners_[0]->IsTaskPending(handle));
EXPECT_TRUE(runners_[0]->CancelTask(handle));
@@ -2254,8 +2077,7 @@ TEST_F(TaskQueueManagerTest, PostThreeDelayedTasks_AndCancelOne_OnWorkQueue) {
// Force the tasks onto the work queue.
now_src_->Advance(base::TimeDelta::FromMilliseconds(10));
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
+ UpdateWorkQueues(LazyNow(now_src_.get()));
EXPECT_TRUE(runners_[0]->IsTaskPending(handle));
EXPECT_TRUE(runners_[0]->CancelTask(handle));
@@ -2282,8 +2104,7 @@ TEST_F(TaskQueueManagerTest, BulkPostingDelayedTasks_AndCancelOnWorkQueue) {
// Force the tasks onto the work queue.
now_src_->Advance(base::TimeDelta::FromMilliseconds(2000));
- LazyNow lazy_now(now_src_.get());
- runners_[0]->PumpQueue(&lazy_now, true);
+ UpdateWorkQueues(LazyNow(now_src_.get()));
// Cancel three timers.
EXPECT_TRUE(runners_[0]->CancelTask(handles[123]));

Powered by Google App Engine
This is Rietveld 408576698