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

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

Issue 970473004: [content] Add support for Non nestable idle tasks the the RendererScheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix contentperftests Created 5 years, 9 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/renderer_scheduler_impl_unittest.cc
diff --git a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
index 5b42d97ec787a080b1e198f42ac6db6ba7531ce8..1d8f9c3a03b0c423ad95f1f14af83e8809bb31db 100644
--- a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
+++ b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
@@ -7,6 +7,8 @@
#include "base/callback.h"
#include "cc/output/begin_frame_args.h"
#include "cc/test/ordered_simple_task_runner.h"
+#include "content/renderer/scheduler/nestable_task_runner_for_test.h"
+#include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -47,7 +49,22 @@ class RendererSchedulerImplTest : public testing::Test {
RendererSchedulerImplTest()
: clock_(cc::TestNowSource::Create(5000)),
mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)),
- scheduler_(new RendererSchedulerImpl(mock_task_runner_)),
+ nestable_task_runner_(
+ NestableTaskRunnerForTest::Create(mock_task_runner_)),
+ scheduler_(new RendererSchedulerImpl(nestable_task_runner_)),
+ default_task_runner_(scheduler_->DefaultTaskRunner()),
+ compositor_task_runner_(scheduler_->CompositorTaskRunner()),
+ loading_task_runner_(scheduler_->LoadingTaskRunner()),
+ idle_task_runner_(scheduler_->IdleTaskRunner()) {
+ scheduler_->SetTimeSourceForTesting(clock_);
+ }
+
+ RendererSchedulerImplTest(base::MessageLoop* message_loop)
+ : clock_(cc::TestNowSource::Create(5000)),
+ message_loop_(message_loop),
+ nestable_task_runner_(
+ RendererSchedulerMessageLoopDelegate::Create(message_loop)),
+ scheduler_(new RendererSchedulerImpl(nestable_task_runner_)),
default_task_runner_(scheduler_->DefaultTaskRunner()),
compositor_task_runner_(scheduler_->CompositorTaskRunner()),
loading_task_runner_(scheduler_->LoadingTaskRunner()),
@@ -57,13 +74,25 @@ class RendererSchedulerImplTest : public testing::Test {
~RendererSchedulerImplTest() override {}
void TearDown() override {
- // Check that all tests stop posting tasks.
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
- while (RunUntilIdle()) {
+ DCHECK(!mock_task_runner_.get() || !message_loop_.get());
+ if (mock_task_runner_.get()) {
+ // Check that all tests stop posting tasks.
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ while (mock_task_runner_->RunUntilIdle()) {
+ }
+ } else {
+ message_loop_->RunUntilIdle();
}
}
- bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); }
+ void RunUntilIdle() {
+ // Only one of mock_task_runner_ or message_loop_ should be set.
+ DCHECK(!mock_task_runner_.get() || !message_loop_.get());
+ if (mock_task_runner_.get())
+ mock_task_runner_->RunUntilIdle();
+ else
+ message_loop_->RunUntilIdle();
+ }
void DoMainFrame() {
scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
@@ -130,8 +159,11 @@ class RendererSchedulerImplTest : public testing::Test {
}
scoped_refptr<cc::TestNowSource> clock_;
+ // Only one of mock_task_runner_ or message_loop_ will be set.
scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
+ scoped_ptr<base::MessageLoop> message_loop_;
+ scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
scoped_ptr<RendererSchedulerImpl> scheduler_;
scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
@@ -867,7 +899,7 @@ TEST_F(RendererSchedulerImplTest, InputArrivesAfterBeginFrame) {
class RendererSchedulerImplForTest : public RendererSchedulerImpl {
public:
RendererSchedulerImplForTest(
- scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
+ scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner)
: RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {}
void UpdatePolicyLocked() override {
@@ -880,7 +912,7 @@ class RendererSchedulerImplForTest : public RendererSchedulerImpl {
TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
RendererSchedulerImplForTest* mock_scheduler =
- new RendererSchedulerImplForTest(mock_task_runner_);
+ new RendererSchedulerImplForTest(nestable_task_runner_);
scheduler_.reset(mock_scheduler);
EnsureUrgentPolicyUpdatePostedOnMainThread();
@@ -895,7 +927,7 @@ TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
RendererSchedulerImplForTest* mock_scheduler =
- new RendererSchedulerImplForTest(mock_task_runner_);
+ new RendererSchedulerImplForTest(nestable_task_runner_);
scheduler_.reset(mock_scheduler);
scheduler_->SetTimeSourceForTesting(clock_);
mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
@@ -911,7 +943,7 @@ TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
RendererSchedulerImplForTest* mock_scheduler =
- new RendererSchedulerImplForTest(mock_task_runner_);
+ new RendererSchedulerImplForTest(nestable_task_runner_);
scheduler_.reset(mock_scheduler);
scheduler_->SetTimeSourceForTesting(clock_);
mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
@@ -927,7 +959,7 @@ TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
RendererSchedulerImplForTest* mock_scheduler =
- new RendererSchedulerImplForTest(mock_task_runner_);
+ new RendererSchedulerImplForTest(nestable_task_runner_);
scheduler_.reset(mock_scheduler);
scheduler_->SetTimeSourceForTesting(clock_);
mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
@@ -943,7 +975,7 @@ TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
RendererSchedulerImplForTest* mock_scheduler =
- new RendererSchedulerImplForTest(mock_task_runner_);
+ new RendererSchedulerImplForTest(nestable_task_runner_);
scheduler_.reset(mock_scheduler);
scheduler_->SetTimeSourceForTesting(clock_);
mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
@@ -961,7 +993,7 @@ TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
RendererSchedulerImplForTest* mock_scheduler =
- new RendererSchedulerImplForTest(mock_task_runner_);
+ new RendererSchedulerImplForTest(nestable_task_runner_);
scheduler_.reset(mock_scheduler);
scheduler_->SetTimeSourceForTesting(clock_);
mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
@@ -994,4 +1026,64 @@ TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
EXPECT_EQ(3, mock_scheduler->update_policy_count_);
}
+class RendererSchedulerImplWithMessageLoopTest
+ : public RendererSchedulerImplTest {
+ public:
+ RendererSchedulerImplWithMessageLoopTest()
+ : RendererSchedulerImplTest(new base::MessageLoop()) {}
+ ~RendererSchedulerImplWithMessageLoopTest() override {}
+
+ void PostFromNestedRunloop(std::vector<
+ std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) {
+ base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get());
+ for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) {
+ if (pair.second) {
+ idle_task_runner_->PostIdleTask(FROM_HERE, pair.first);
+ } else {
+ idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first);
+ }
+ }
+ EnableIdleTasks();
+ message_loop_->RunUntilIdle();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest);
+};
+
+TEST_F(RendererSchedulerImplWithMessageLoopTest,
+ NonNestableIdleTaskDoesntExecuteInNestedLoop) {
+ std::vector<std::string> order;
+ idle_task_runner_->PostIdleTask(
+ FROM_HERE,
+ base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1")));
+ idle_task_runner_->PostIdleTask(
+ FROM_HERE,
+ base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2")));
+
+ std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>
+ tasks_to_post_from_nested_loop;
+ tasks_to_post_from_nested_loop.push_back(std::make_pair(
+ base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")),
+ false));
+ tasks_to_post_from_nested_loop.push_back(std::make_pair(
+ base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true));
+ tasks_to_post_from_nested_loop.push_back(std::make_pair(
+ base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true));
+
+ default_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop,
+ base::Unretained(this),
+ base::Unretained(&tasks_to_post_from_nested_loop)));
+
+ EnableIdleTasks();
+ RunUntilIdle();
+ // Note we expect task 3 to run last because it's non-nestable.
+ EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"),
+ std::string("4"), std::string("5"),
+ std::string("3")));
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698