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

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

Issue 994833003: Prevent multiple pending UpdatePolicy tasks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change for Ross 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 4a97a0454749f11708d1fdb98d7f81e2202a5354..3cd3d3d488202c01035b430400cd1589985fb26d 100644
--- a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
+++ b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
@@ -56,7 +56,14 @@ class RendererSchedulerImplTest : public testing::Test {
}
~RendererSchedulerImplTest() override {}
- void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); }
+ void TearDown() override {
+ // Check that all tests stop posting tasks.
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ while (RunUntilIdle())
+ ;
+ }
+
+ bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); }
void DoMainFrame() {
scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
@@ -69,6 +76,16 @@ class RendererSchedulerImplTest : public testing::Test {
Policy CurrentPolicy() { return scheduler_->current_policy_; }
+ void EnsureUgentPolicyUpdatePostedOnMainThread() {
+ base::AutoLock lock(scheduler_->incoming_signals_lock_);
+ scheduler_->EnsureUgentPolicyUpdatePostedOnMainThread(FROM_HERE);
+ }
+
+ void ScheduleDelayedPolicyUpdate(base::TimeDelta delay) {
+ scheduler_->delayed_update_policy_runner_.SetDeadline(FROM_HERE, delay,
+ clock_->Now());
+ }
+
// Helper for posting several tasks of specific types. |task_descriptor| is a
// string with space delimited task identifiers. The first letter of each
// task identifier specifies the task type:
@@ -847,4 +864,132 @@ TEST_F(RendererSchedulerImplTest, InputArrivesAfterBeginFrame) {
EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
}
+class MockRendererSchedulerImpl : public RendererSchedulerImpl {
+ public:
+ MockRendererSchedulerImpl(
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
+ : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {}
+
+ void UpdatePolicyLocked() override {
+ update_policy_count_++;
+ RendererSchedulerImpl::UpdatePolicyLocked();
+ }
+
+ int update_policy_count_;
+};
+
+TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+
+ EnsureUgentPolicyUpdatePostedOnMainThread();
+ EnsureUgentPolicyUpdatePostedOnMainThread();
+ EnsureUgentPolicyUpdatePostedOnMainThread();
+ EnsureUgentPolicyUpdatePostedOnMainThread();
+
+ RunUntilIdle();
+
+ EXPECT_EQ(1, mock_scheduler->update_policy_count_);
+}
+
+TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+ scheduler_->SetTimeSourceForTesting(clock_);
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+
+ ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1));
+ EnsureUgentPolicyUpdatePostedOnMainThread();
+
+ RunUntilIdle();
+
+ // We expect both the urgent and the delayed updates to run.
+ EXPECT_EQ(2, mock_scheduler->update_policy_count_);
+}
+
+TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+ scheduler_->SetTimeSourceForTesting(clock_);
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+
+ EnsureUgentPolicyUpdatePostedOnMainThread();
+ ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1));
+
+ RunUntilIdle();
+
+ // We expect both the urgent and the delayed updates to run.
+ EXPECT_EQ(2, mock_scheduler->update_policy_count_);
+}
+
+TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+ scheduler_->SetTimeSourceForTesting(clock_);
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+
+ scheduler_->DidReceiveInputEventOnCompositorThread(
+ FakeInputEvent(blink::WebInputEvent::TouchStart));
+
+ RunUntilIdle();
+
+ EXPECT_EQ(2, mock_scheduler->update_policy_count_);
+}
+
+TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+ scheduler_->SetTimeSourceForTesting(clock_);
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+
+ scheduler_->DidReceiveInputEventOnCompositorThread(
+ FakeInputEvent(blink::WebInputEvent::TouchStart));
+ scheduler_->DidReceiveInputEventOnCompositorThread(
+ FakeInputEvent(blink::WebInputEvent::TouchMove));
+
+ RunUntilIdle();
+
+ EXPECT_EQ(2, mock_scheduler->update_policy_count_);
+}
+
+TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+ scheduler_->SetTimeSourceForTesting(clock_);
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+
+ scheduler_->DidReceiveInputEventOnCompositorThread(
+ FakeInputEvent(blink::WebInputEvent::TouchStart));
+ scheduler_->DidReceiveInputEventOnCompositorThread(
+ FakeInputEvent(blink::WebInputEvent::TouchMove));
+
+ // We expect the first call to IsHighPriorityWorkAnticipated to be called
+ // after recieving an input event (but before the UpdateTask was processed) to
+ // call UpdatePolicy.
+ EXPECT_EQ(0, mock_scheduler->update_policy_count_);
+ scheduler_->IsHighPriorityWorkAnticipated();
+ EXPECT_EQ(1, mock_scheduler->update_policy_count_);
+ // Subsequent calls should not call UpdateTask.
Sami 2015/03/12 18:15:22 nit: UpdatePolicy
alex clarke (OOO till 29th) 2015/03/12 18:24:08 Done.
+ scheduler_->IsHighPriorityWorkAnticipated();
+ scheduler_->IsHighPriorityWorkAnticipated();
+ scheduler_->IsHighPriorityWorkAnticipated();
+ scheduler_->ShouldYieldForHighPriorityWork();
+ scheduler_->ShouldYieldForHighPriorityWork();
+ scheduler_->ShouldYieldForHighPriorityWork();
+ scheduler_->ShouldYieldForHighPriorityWork();
+
+ EXPECT_EQ(1, mock_scheduler->update_policy_count_);
+
+ RunUntilIdle();
+ // We expect both the urgent and the delayed updates to run in addition to the
+ // earlier updated cause by IsHighPriorityWorkAnticipated.
+ EXPECT_EQ(3, mock_scheduler->update_policy_count_);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698