| 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..8ca6b53aef5d5c61611fc412775820ba3bd843a6 100644
|
| --- a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
|
| +++ b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
|
| @@ -56,7 +56,13 @@ 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 +75,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, clock_->Now() + 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 +863,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.
|
| + 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
|
|
|