Chromium Code Reviews| 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 |