| 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..1572195492af3e7d984564ca074e65ee29f295f5 100644
|
| --- a/content/renderer/scheduler/task_queue_manager_unittest.cc
|
| +++ b/content/renderer/scheduler/task_queue_manager_unittest.cc
|
| @@ -4,8 +4,8 @@
|
|
|
| #include "content/renderer/scheduler/task_queue_manager.h"
|
|
|
| -#include "base/test/test_simple_task_runner.h"
|
| #include "base/threading/thread.h"
|
| +#include "cc/test/ordered_simple_task_runner.h"
|
| #include "cc/test/test_now_source.h"
|
| #include "content/renderer/scheduler/task_queue_selector.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| @@ -54,10 +54,13 @@ class SelectorForTest : public TaskQueueSelector {
|
| class TaskQueueManagerTest : public testing::Test {
|
| protected:
|
| void Initialize(size_t num_queues) {
|
| - test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner());
|
| + now_src_ = cc::TestNowSource::Create(0);
|
| + test_task_runner_ =
|
| + make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
|
| selector_ = make_scoped_ptr(new SelectorForTest);
|
| manager_ = make_scoped_ptr(
|
| new TaskQueueManager(num_queues, test_task_runner_, selector_.get()));
|
| + manager_->SetTimeSourceForTesting(now_src_);
|
| }
|
|
|
| void InitializeWithRealMessageLoop(size_t num_queues) {
|
| @@ -67,7 +70,8 @@ class TaskQueueManagerTest : public testing::Test {
|
| num_queues, message_loop_->task_runner(), selector_.get()));
|
| }
|
|
|
| - scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_;
|
| + scoped_refptr<cc::TestNowSource> now_src_;
|
| + scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
|
| scoped_ptr<SelectorForTest> selector_;
|
| scoped_ptr<TaskQueueManager> manager_;
|
| scoped_ptr<base::MessageLoop> message_loop_;
|
| @@ -243,22 +247,20 @@ TEST_F(TaskQueueManagerTest, DelayedTaskPosting) {
|
| base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
|
| runner->PostDelayedTask(
|
| FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
|
| - EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay());
|
| + EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
|
| EXPECT_TRUE(manager_->IsQueueEmpty(0));
|
| EXPECT_TRUE(run_order.empty());
|
|
|
| - // The task is inserted to the incoming queue only after the delay.
|
| - test_task_runner_->RunPendingTasks();
|
| - EXPECT_FALSE(manager_->IsQueueEmpty(0));
|
| + // The task doesn't run before the delay has completed.
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
|
| EXPECT_TRUE(run_order.empty());
|
|
|
| - // After the delay the task runs normally.
|
| - selector_->AppendQueueToService(0);
|
| - test_task_runner_->RunUntilIdle();
|
| + // After the delay has completed, the task runs normally.
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
|
| EXPECT_THAT(run_order, ElementsAre(1));
|
| }
|
|
|
| -TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) {
|
| +TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks) {
|
| Initialize(1u);
|
|
|
| std::vector<int> run_order;
|
| @@ -266,21 +268,33 @@ TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) {
|
| manager_->TaskRunnerForQueue(0);
|
|
|
| selector_->AppendQueueToService(0);
|
| + selector_->AppendQueueToService(0);
|
| + selector_->AppendQueueToService(0);
|
|
|
| - base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
|
| runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
|
| - delay);
|
| - test_task_runner_->RunPendingTasks();
|
| + base::TimeDelta::FromMilliseconds(10));
|
|
|
| - // Reload the work queue so we see the next pending task. It should no longer
|
| - // be marked as delayed.
|
| - manager_->PumpQueue(0);
|
| - EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
|
| + runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
|
| + base::TimeDelta::FromMilliseconds(8));
|
|
|
| - // Let the task run normally.
|
| - selector_->AppendQueueToService(0);
|
| - test_task_runner_->RunUntilIdle();
|
| - EXPECT_THAT(run_order, ElementsAre(1));
|
| + runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
|
| + base::TimeDelta::FromMilliseconds(5));
|
| +
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
|
| + test_task_runner_->DelayToNextTaskTime());
|
| +
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
|
| + EXPECT_THAT(run_order, ElementsAre(3));
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
|
| + test_task_runner_->DelayToNextTaskTime());
|
| +
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
|
| + EXPECT_THAT(run_order, ElementsAre(3, 2));
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
|
| + test_task_runner_->DelayToNextTaskTime());
|
| +
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
|
| + EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
|
| }
|
|
|
| TEST_F(TaskQueueManagerTest, ManualPumping) {
|
| @@ -294,14 +308,14 @@ TEST_F(TaskQueueManagerTest, ManualPumping) {
|
| // Posting a task when pumping is disabled doesn't result in work getting
|
| // posted.
|
| runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
|
| - EXPECT_FALSE(test_task_runner_->HasPendingTask());
|
| + EXPECT_FALSE(test_task_runner_->HasPendingTasks());
|
|
|
| // However polling still works.
|
| EXPECT_FALSE(manager_->IsQueueEmpty(0));
|
|
|
| // After pumping the task runs normally.
|
| manager_->PumpQueue(0);
|
| - EXPECT_TRUE(test_task_runner_->HasPendingTask());
|
| + EXPECT_TRUE(test_task_runner_->HasPendingTasks());
|
| selector_->AppendQueueToService(0);
|
| test_task_runner_->RunUntilIdle();
|
| EXPECT_THAT(run_order, ElementsAre(1));
|
| @@ -318,11 +332,11 @@ TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
|
| // Posting a task when pumping is disabled doesn't result in work getting
|
| // posted.
|
| runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
|
| - EXPECT_FALSE(test_task_runner_->HasPendingTask());
|
| + EXPECT_FALSE(test_task_runner_->HasPendingTasks());
|
|
|
| // When pumping is enabled the task runs normally.
|
| manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
|
| - EXPECT_TRUE(test_task_runner_->HasPendingTask());
|
| + EXPECT_TRUE(test_task_runner_->HasPendingTasks());
|
| selector_->AppendQueueToService(0);
|
| test_task_runner_->RunUntilIdle();
|
| EXPECT_THAT(run_order, ElementsAre(1));
|
| @@ -355,23 +369,44 @@ TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
|
| std::vector<int> run_order;
|
| scoped_refptr<base::SingleThreadTaskRunner> runner =
|
| manager_->TaskRunnerForQueue(0);
|
| + selector_->AppendQueueToService(0);
|
|
|
| // Posting a delayed task when pumping will apply the delay, but won't cause
|
| // work to executed afterwards.
|
| base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
|
| runner->PostDelayedTask(
|
| FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
|
| - test_task_runner_->RunUntilIdle();
|
| +
|
| + // After pumping but before the delay period has expired, task does not run.
|
| + manager_->PumpQueue(0);
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
|
| EXPECT_TRUE(run_order.empty());
|
|
|
| - // After pumping the task runs normally.
|
| + // Once the delay has expired, pumping causes the task to run.
|
| + now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
|
| manager_->PumpQueue(0);
|
| - EXPECT_TRUE(test_task_runner_->HasPendingTask());
|
| - selector_->AppendQueueToService(0);
|
| - test_task_runner_->RunUntilIdle();
|
| + EXPECT_TRUE(test_task_runner_->HasPendingTasks());
|
| + test_task_runner_->RunPendingTasks();
|
| EXPECT_THAT(run_order, ElementsAre(1));
|
| }
|
|
|
| +TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
|
| + Initialize(1u);
|
| + manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
|
| +
|
| + std::vector<int> run_order;
|
| + scoped_refptr<base::SingleThreadTaskRunner> runner =
|
| + manager_->TaskRunnerForQueue(0);
|
| + selector_->AppendQueueToService(0);
|
| +
|
| + base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
|
| + runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
|
| + delay);
|
| +
|
| + test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
|
| + EXPECT_TRUE(run_order.empty());
|
| +}
|
| +
|
| TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
|
| Initialize(1u);
|
| manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
|
| @@ -477,7 +512,7 @@ TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
|
| test_task_runner_->RunPendingTasks();
|
| // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
|
| // will be two tasks here.
|
| - EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size());
|
| + EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
|
| }
|
|
|
| TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
|
| @@ -528,12 +563,12 @@ TEST_F(TaskQueueManagerTest, WorkBatching) {
|
|
|
| // Running one task in the host message loop should cause two posted tasks to
|
| // get executed.
|
| - EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u);
|
| + EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
|
| test_task_runner_->RunPendingTasks();
|
| EXPECT_THAT(run_order, ElementsAre(1, 2));
|
|
|
| // The second task runs the remaining two posted tasks.
|
| - EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u);
|
| + EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
|
| test_task_runner_->RunPendingTasks();
|
| EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
|
| }
|
| @@ -547,11 +582,9 @@ void AdvanceNowTestTask(int value,
|
| }
|
|
|
| TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
|
| - scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
|
| Initialize(1u);
|
|
|
| manager_->SetWorkBatchSize(2);
|
| - manager_->SetTimeSourceForTesting(clock);
|
|
|
| std::vector<int> run_order;
|
| scoped_refptr<base::SingleThreadTaskRunner> runner =
|
| @@ -562,10 +595,10 @@ TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
|
| selector_->AppendQueueToService(0);
|
|
|
| base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
|
| - runner->PostTask(
|
| - FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
|
| - runner->PostTask(
|
| - FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
|
| + runner->PostTask(FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order,
|
| + now_src_, delta));
|
| + runner->PostTask(FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order,
|
| + now_src_, delta));
|
|
|
| base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
|
| runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
|
| @@ -574,7 +607,7 @@ TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
|
| // At this point we have two posted tasks: one for DoWork and one of the
|
| // delayed task. Only the first non-delayed task should get executed because
|
| // the work batch is interrupted by the pending delayed task.
|
| - EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
|
| + EXPECT_EQ(test_task_runner_->NumPendingTasks(), 2u);
|
| test_task_runner_->RunPendingTasks();
|
| EXPECT_THAT(run_order, ElementsAre(2));
|
|
|
|
|