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 f1d9dc4c0683607d143c26f543099a0994211817..251ac56523ae93077f53192525332fa6f95d4c9c 100644 |
--- a/components/scheduler/base/task_queue_manager_unittest.cc |
+++ b/components/scheduler/base/task_queue_manager_unittest.cc |
@@ -216,12 +216,12 @@ |
Initialize(1u); |
std::vector<int> run_order; |
- EXPECT_FALSE(runners_[0]->HasPendingImmediateTask()); |
- runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
- EXPECT_TRUE(runners_[0]->HasPendingImmediateTask()); |
- |
- test_task_runner_->RunUntilIdle(); |
- EXPECT_FALSE(runners_[0]->HasPendingImmediateTask()); |
+ EXPECT_TRUE(runners_[0]->IsQueueEmpty()); |
+ runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
+ EXPECT_FALSE(runners_[0]->IsQueueEmpty()); |
+ |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(runners_[0]->IsQueueEmpty()); |
} |
TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { |
@@ -232,8 +232,7 @@ |
runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
delay); |
EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); |
- EXPECT_EQ(TaskQueue::QueueState::NO_IMMEDIATE_WORK, |
- runners_[0]->GetQueueState()); |
+ EXPECT_TRUE(runners_[0]->IsQueueEmpty()); |
EXPECT_TRUE(run_order.empty()); |
// The task doesn't run before the delay has completed. |
@@ -243,7 +242,6 @@ |
// After the delay has completed, the task runs normally. |
test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); |
EXPECT_THAT(run_order, ElementsAre(1)); |
- EXPECT_EQ(TaskQueue::QueueState::EMPTY, runners_[0]->GetQueueState()); |
} |
bool MessageLoopTaskCounter(size_t* count) { |
@@ -377,7 +375,7 @@ |
EXPECT_FALSE(test_task_runner_->HasPendingTasks()); |
// However polling still works. |
- EXPECT_TRUE(runners_[0]->HasPendingImmediateTask()); |
+ EXPECT_FALSE(runners_[0]->IsQueueEmpty()); |
// After pumping the task runs normally. |
runners_[0]->PumpQueue(); |
@@ -1005,32 +1003,32 @@ |
EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit()); |
} |
-TEST_F(TaskQueueManagerTest, HasPendingImmediateTask) { |
+TEST_F(TaskQueueManagerTest, IsQueueEmpty) { |
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->HasPendingImmediateTask()); |
- EXPECT_FALSE(queue1->HasPendingImmediateTask()); |
+ EXPECT_TRUE(queue0->IsQueueEmpty()); |
+ EXPECT_TRUE(queue1->IsQueueEmpty()); |
queue0->PostTask(FROM_HERE, base::Bind(NullTask)); |
queue1->PostTask(FROM_HERE, base::Bind(NullTask)); |
- EXPECT_TRUE(queue0->HasPendingImmediateTask()); |
- EXPECT_TRUE(queue1->HasPendingImmediateTask()); |
- |
- test_task_runner_->RunUntilIdle(); |
- EXPECT_FALSE(queue0->HasPendingImmediateTask()); |
- EXPECT_TRUE(queue1->HasPendingImmediateTask()); |
+ EXPECT_FALSE(queue0->IsQueueEmpty()); |
+ EXPECT_FALSE(queue1->IsQueueEmpty()); |
+ |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(queue0->IsQueueEmpty()); |
+ EXPECT_FALSE(queue1->IsQueueEmpty()); |
queue1->PumpQueue(); |
- EXPECT_FALSE(queue0->HasPendingImmediateTask()); |
- EXPECT_TRUE(queue1->HasPendingImmediateTask()); |
- |
- test_task_runner_->RunUntilIdle(); |
- EXPECT_FALSE(queue0->HasPendingImmediateTask()); |
- EXPECT_FALSE(queue1->HasPendingImmediateTask()); |
+ EXPECT_TRUE(queue0->IsQueueEmpty()); |
+ EXPECT_FALSE(queue1->IsQueueEmpty()); |
+ |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(queue0->IsQueueEmpty()); |
+ EXPECT_TRUE(queue1->IsQueueEmpty()); |
} |
TEST_F(TaskQueueManagerTest, GetQueueState) { |
@@ -1102,6 +1100,33 @@ |
test_task_runner_->RunUntilIdle(); |
EXPECT_THAT(run_order, ElementsAre(2, 1)); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, DelayedTaskWithAbsoluteRunTime) { |
+ Initialize(1u); |
+ |
+ // One task in the past, two with the exact same run time and one in the |
+ // future. |
+ base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
+ base::TimeTicks runTime1 = now_src_->NowTicks() - delay; |
+ base::TimeTicks runTime2 = now_src_->NowTicks(); |
+ base::TimeTicks runTime3 = now_src_->NowTicks(); |
+ base::TimeTicks runTime4 = now_src_->NowTicks() + delay; |
+ |
+ std::vector<int> run_order; |
+ runners_[0]->PostDelayedTaskAt( |
+ FROM_HERE, base::Bind(&TestTask, 1, &run_order), runTime1); |
+ runners_[0]->PostDelayedTaskAt( |
+ FROM_HERE, base::Bind(&TestTask, 2, &run_order), runTime2); |
+ runners_[0]->PostDelayedTaskAt( |
+ FROM_HERE, base::Bind(&TestTask, 3, &run_order), runTime3); |
+ runners_[0]->PostDelayedTaskAt( |
+ FROM_HERE, base::Bind(&TestTask, 4, &run_order), runTime4); |
+ |
+ now_src_->Advance(2 * delay); |
+ test_task_runner_->RunUntilIdle(); |
+ |
+ EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); |
} |
void CheckIsNested(bool* is_nested) { |
@@ -1296,6 +1321,20 @@ |
task_queue->UnregisterTaskQueue(); |
manager_->SetObserver(nullptr); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, ScheduleDelayedWorkIsNotReEntrant) { |
+ Initialize(1u); |
+ |
+ // Post two tasks into the past. The second one used to trigger a deadlock |
+ // because it tried to re-entrantly wake the first task in the same queue. |
+ runners_[0]->PostDelayedTaskAt( |
+ FROM_HERE, base::Bind(&NullTask), |
+ base::TimeTicks() + base::TimeDelta::FromMicroseconds(100)); |
+ runners_[0]->PostDelayedTaskAt( |
+ FROM_HERE, base::Bind(&NullTask), |
+ base::TimeTicks() + base::TimeDelta::FromMicroseconds(200)); |
+ test_task_runner_->RunUntilIdle(); |
} |
void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) { |
@@ -1348,14 +1387,12 @@ |
Initialize(2u); |
base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
- scoped_ptr<VirtualTimeDomain> domain_a( |
- new VirtualTimeDomain(nullptr, start_time)); |
- scoped_ptr<VirtualTimeDomain> domain_b( |
- new VirtualTimeDomain(nullptr, start_time)); |
- manager_->RegisterTimeDomain(domain_a.get()); |
- manager_->RegisterTimeDomain(domain_b.get()); |
- runners_[0]->SetTimeDomain(domain_a.get()); |
- runners_[1]->SetTimeDomain(domain_b.get()); |
+ scoped_refptr<VirtualTimeDomain> domain_a(new VirtualTimeDomain(start_time)); |
+ scoped_refptr<VirtualTimeDomain> domain_b(new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(domain_a); |
+ manager_->RegisterTimeDomain(domain_b); |
+ runners_[0]->SetTimeDomain(domain_a); |
+ runners_[1]->SetTimeDomain(domain_b); |
std::vector<int> run_order; |
runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
@@ -1382,18 +1419,17 @@ |
test_task_runner_->RunUntilIdle(); |
EXPECT_THAT(run_order, ElementsAre(4, 5, 6, 1, 2, 3)); |
- manager_->UnregisterTimeDomain(domain_a.get()); |
- manager_->UnregisterTimeDomain(domain_b.get()); |
+ manager_->UnregisterTimeDomain(domain_a); |
+ manager_->UnregisterTimeDomain(domain_b); |
} |
TEST_F(TaskQueueManagerTest, TimeDomainMigration) { |
Initialize(1u); |
base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
- scoped_ptr<VirtualTimeDomain> domain_a( |
- new VirtualTimeDomain(nullptr, start_time)); |
- manager_->RegisterTimeDomain(domain_a.get()); |
- runners_[0]->SetTimeDomain(domain_a.get()); |
+ scoped_refptr<VirtualTimeDomain> domain_a(new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(domain_a); |
+ runners_[0]->SetTimeDomain(domain_a); |
std::vector<int> run_order; |
runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
@@ -1409,18 +1445,17 @@ |
test_task_runner_->RunUntilIdle(); |
EXPECT_THAT(run_order, ElementsAre(1, 2)); |
- scoped_ptr<VirtualTimeDomain> domain_b( |
- new VirtualTimeDomain(nullptr, start_time)); |
- manager_->RegisterTimeDomain(domain_b.get()); |
- runners_[0]->SetTimeDomain(domain_b.get()); |
+ scoped_refptr<VirtualTimeDomain> domain_b(new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(domain_b); |
+ runners_[0]->SetTimeDomain(domain_b); |
domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
test_task_runner_->RunUntilIdle(); |
EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); |
- manager_->UnregisterTimeDomain(domain_a.get()); |
- manager_->UnregisterTimeDomain(domain_b.get()); |
+ manager_->UnregisterTimeDomain(domain_a); |
+ manager_->UnregisterTimeDomain(domain_b); |
} |
namespace { |