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

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: Refactored 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..8c8e02211c450f6cd6c8f0480461bf4b3484b4c4 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.
+ while (RunUntilIdle()) {
+ clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
Sami 2015/03/11 16:58:25 Thanks for adding this. By the way, would SetAutoA
alex clarke (OOO till 29th) 2015/03/12 13:41:32 Seems so.
+ }
+ }
+
+ bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); }
void DoMainFrame() {
scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
@@ -69,6 +76,11 @@ class RendererSchedulerImplTest : public testing::Test {
Policy CurrentPolicy() { return scheduler_->current_policy_; }
+ void ScheduleUrgentPolicyUpdate() {
+ base::AutoLock lock(scheduler_->incoming_signals_lock_);
+ scheduler_->ScheduleUrgentPolicyUpdate(FROM_HERE);
+ }
+
// 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 +859,99 @@ 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 {
Sami 2015/03/11 16:58:25 The way we have to reach into the internals to tes
alex clarke (OOO till 29th) 2015/03/12 13:41:32 I think we should pick one style and stick to it.
+ update_policy_count_++;
+ RendererSchedulerImpl::UpdatePolicyLocked();
+ }
+
+ int update_policy_count_;
+};
+
+TEST_F(RendererSchedulerImplTest, OnlyOnePendingNonDelayedUpdatePolicy) {
+ MockRendererSchedulerImpl* mock_scheduler =
+ new MockRendererSchedulerImpl(mock_task_runner_);
+ scheduler_.reset(mock_scheduler);
+
+ ScheduleUrgentPolicyUpdate();
+ ScheduleUrgentPolicyUpdate();
+ ScheduleUrgentPolicyUpdate();
+ ScheduleUrgentPolicyUpdate();
+
+ RunUntilIdle();
+
+ EXPECT_EQ(1, 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_);
Sami 2015/03/11 16:58:25 Could you add a comment saying which two updates t
alex clarke (OOO till 29th) 2015/03/12 13:41:32 Done.
+}
+
+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.
+ scheduler_->IsHighPriorityWorkAnticipated();
+ scheduler_->IsHighPriorityWorkAnticipated();
+ scheduler_->IsHighPriorityWorkAnticipated();
+ scheduler_->ShouldYieldForHighPriorityWork();
+ scheduler_->ShouldYieldForHighPriorityWork();
+ scheduler_->ShouldYieldForHighPriorityWork();
+ scheduler_->ShouldYieldForHighPriorityWork();
+
+ EXPECT_EQ(1, mock_scheduler->update_policy_count_);
+
+ // There should be only two UpdatePolicy tasks posted.
+ RunUntilIdle();
+ EXPECT_EQ(3, mock_scheduler->update_policy_count_);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698