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

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

Issue 972473004: EXPERIMENTAL, Trying Ross's suggestion (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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..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));
« no previous file with comments | « content/renderer/scheduler/task_queue_manager_perftest.cc ('k') | content/renderer/scheduler/web_scheduler_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698