OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "cc/output/begin_frame_args.h" | 8 #include "cc/output/begin_frame_args.h" |
9 #include "cc/test/ordered_simple_task_runner.h" | 9 #include "cc/test/ordered_simple_task_runner.h" |
| 10 #include "cc/test/test_now_source.h" |
10 #include "content/child/scheduler/nestable_task_runner_for_test.h" | 11 #include "content/child/scheduler/nestable_task_runner_for_test.h" |
11 #include "content/child/scheduler/scheduler_message_loop_delegate.h" | 12 #include "content/child/scheduler/scheduler_message_loop_delegate.h" |
| 13 #include "content/test/test_time_source.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
14 | 16 |
15 namespace content { | 17 namespace content { |
16 | 18 |
17 namespace { | 19 namespace { |
18 class FakeInputEvent : public blink::WebInputEvent { | 20 class FakeInputEvent : public blink::WebInputEvent { |
19 public: | 21 public: |
20 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) | 22 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) |
21 : WebInputEvent(sizeof(FakeInputEvent)) { | 23 : WebInputEvent(sizeof(FakeInputEvent)) { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 : clock_(cc::TestNowSource::Create(5000)), | 131 : clock_(cc::TestNowSource::Create(5000)), |
130 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), | 132 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), |
131 nestable_task_runner_( | 133 nestable_task_runner_( |
132 NestableTaskRunnerForTest::Create(mock_task_runner_)), | 134 NestableTaskRunnerForTest::Create(mock_task_runner_)), |
133 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), | 135 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
134 default_task_runner_(scheduler_->DefaultTaskRunner()), | 136 default_task_runner_(scheduler_->DefaultTaskRunner()), |
135 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 137 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
136 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 138 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
137 idle_task_runner_(scheduler_->IdleTaskRunner()), | 139 idle_task_runner_(scheduler_->IdleTaskRunner()), |
138 timer_task_runner_(scheduler_->TimerTaskRunner()) { | 140 timer_task_runner_(scheduler_->TimerTaskRunner()) { |
139 scheduler_->SetTimeSourceForTesting(clock_); | 141 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 142 make_scoped_ptr(new TestTimeSource(clock_))); |
| 143 scheduler_->GetSchedulerHelperForTesting() |
| 144 ->GetTaskQueueManagerForTesting() |
| 145 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
140 } | 146 } |
141 | 147 |
142 RendererSchedulerImplTest(base::MessageLoop* message_loop) | 148 RendererSchedulerImplTest(base::MessageLoop* message_loop) |
143 : clock_(cc::TestNowSource::Create(5000)), | 149 : clock_(cc::TestNowSource::Create(5000)), |
144 message_loop_(message_loop), | 150 message_loop_(message_loop), |
145 nestable_task_runner_( | 151 nestable_task_runner_( |
146 SchedulerMessageLoopDelegate::Create(message_loop)), | 152 SchedulerMessageLoopDelegate::Create(message_loop)), |
147 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), | 153 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
148 default_task_runner_(scheduler_->DefaultTaskRunner()), | 154 default_task_runner_(scheduler_->DefaultTaskRunner()), |
149 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 155 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
150 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 156 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
151 idle_task_runner_(scheduler_->IdleTaskRunner()), | 157 idle_task_runner_(scheduler_->IdleTaskRunner()), |
152 timer_task_runner_(scheduler_->TimerTaskRunner()) { | 158 timer_task_runner_(scheduler_->TimerTaskRunner()) { |
153 scheduler_->SetTimeSourceForTesting(clock_); | 159 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 160 make_scoped_ptr(new TestTimeSource(clock_))); |
| 161 scheduler_->GetSchedulerHelperForTesting() |
| 162 ->GetTaskQueueManagerForTesting() |
| 163 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
154 } | 164 } |
155 ~RendererSchedulerImplTest() override {} | 165 ~RendererSchedulerImplTest() override {} |
156 | 166 |
157 void TearDown() override { | 167 void TearDown() override { |
158 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); | 168 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
159 if (mock_task_runner_.get()) { | 169 if (mock_task_runner_.get()) { |
160 // Check that all tests stop posting tasks. | 170 // Check that all tests stop posting tasks. |
161 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 171 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
162 while (mock_task_runner_->RunUntilIdle()) { | 172 while (mock_task_runner_->RunUntilIdle()) { |
163 } | 173 } |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 | 957 |
948 RunUntilIdle(); | 958 RunUntilIdle(); |
949 | 959 |
950 EXPECT_EQ(1, mock_scheduler->update_policy_count_); | 960 EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
951 } | 961 } |
952 | 962 |
953 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { | 963 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { |
954 RendererSchedulerImplForTest* mock_scheduler = | 964 RendererSchedulerImplForTest* mock_scheduler = |
955 new RendererSchedulerImplForTest(nestable_task_runner_); | 965 new RendererSchedulerImplForTest(nestable_task_runner_); |
956 scheduler_.reset(mock_scheduler); | 966 scheduler_.reset(mock_scheduler); |
957 scheduler_->SetTimeSourceForTesting(clock_); | 967 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 968 make_scoped_ptr(new TestTimeSource(clock_))); |
| 969 scheduler_->GetSchedulerHelperForTesting() |
| 970 ->GetTaskQueueManagerForTesting() |
| 971 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
958 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 972 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
959 | 973 |
960 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 974 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
961 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 975 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
962 | 976 |
963 RunUntilIdle(); | 977 RunUntilIdle(); |
964 | 978 |
965 // We expect both the urgent and the delayed updates to run. | 979 // We expect both the urgent and the delayed updates to run. |
966 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 980 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
967 } | 981 } |
968 | 982 |
969 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { | 983 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { |
970 RendererSchedulerImplForTest* mock_scheduler = | 984 RendererSchedulerImplForTest* mock_scheduler = |
971 new RendererSchedulerImplForTest(nestable_task_runner_); | 985 new RendererSchedulerImplForTest(nestable_task_runner_); |
972 scheduler_.reset(mock_scheduler); | 986 scheduler_.reset(mock_scheduler); |
973 scheduler_->SetTimeSourceForTesting(clock_); | 987 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 988 make_scoped_ptr(new TestTimeSource(clock_))); |
| 989 scheduler_->GetSchedulerHelperForTesting() |
| 990 ->GetTaskQueueManagerForTesting() |
| 991 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
974 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 992 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
975 | 993 |
976 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 994 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
977 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 995 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
978 | 996 |
979 RunUntilIdle(); | 997 RunUntilIdle(); |
980 | 998 |
981 // We expect both the urgent and the delayed updates to run. | 999 // We expect both the urgent and the delayed updates to run. |
982 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1000 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
983 } | 1001 } |
984 | 1002 |
985 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { | 1003 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { |
986 RendererSchedulerImplForTest* mock_scheduler = | 1004 RendererSchedulerImplForTest* mock_scheduler = |
987 new RendererSchedulerImplForTest(nestable_task_runner_); | 1005 new RendererSchedulerImplForTest(nestable_task_runner_); |
988 scheduler_.reset(mock_scheduler); | 1006 scheduler_.reset(mock_scheduler); |
989 scheduler_->SetTimeSourceForTesting(clock_); | 1007 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 1008 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1009 scheduler_->GetSchedulerHelperForTesting() |
| 1010 ->GetTaskQueueManagerForTesting() |
| 1011 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
990 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1012 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
991 | 1013 |
992 scheduler_->DidReceiveInputEventOnCompositorThread( | 1014 scheduler_->DidReceiveInputEventOnCompositorThread( |
993 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1015 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
994 | 1016 |
995 RunUntilIdle(); | 1017 RunUntilIdle(); |
996 | 1018 |
997 // We expect an urgent policy update followed by a delayed one 100ms later. | 1019 // We expect an urgent policy update followed by a delayed one 100ms later. |
998 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1020 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
999 } | 1021 } |
1000 | 1022 |
1001 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { | 1023 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { |
1002 RendererSchedulerImplForTest* mock_scheduler = | 1024 RendererSchedulerImplForTest* mock_scheduler = |
1003 new RendererSchedulerImplForTest(nestable_task_runner_); | 1025 new RendererSchedulerImplForTest(nestable_task_runner_); |
1004 scheduler_.reset(mock_scheduler); | 1026 scheduler_.reset(mock_scheduler); |
1005 scheduler_->SetTimeSourceForTesting(clock_); | 1027 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 1028 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1029 scheduler_->GetSchedulerHelperForTesting() |
| 1030 ->GetTaskQueueManagerForTesting() |
| 1031 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
1006 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1032 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
1007 | 1033 |
1008 scheduler_->DidReceiveInputEventOnCompositorThread( | 1034 scheduler_->DidReceiveInputEventOnCompositorThread( |
1009 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1035 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
1010 scheduler_->DidReceiveInputEventOnCompositorThread( | 1036 scheduler_->DidReceiveInputEventOnCompositorThread( |
1011 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1037 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
1012 | 1038 |
1013 RunUntilIdle(); | 1039 RunUntilIdle(); |
1014 | 1040 |
1015 // We expect an urgent policy update followed by a delayed one 100ms later. | 1041 // We expect an urgent policy update followed by a delayed one 100ms later. |
1016 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1042 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
1017 } | 1043 } |
1018 | 1044 |
1019 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { | 1045 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { |
1020 RendererSchedulerImplForTest* mock_scheduler = | 1046 RendererSchedulerImplForTest* mock_scheduler = |
1021 new RendererSchedulerImplForTest(nestable_task_runner_); | 1047 new RendererSchedulerImplForTest(nestable_task_runner_); |
1022 scheduler_.reset(mock_scheduler); | 1048 scheduler_.reset(mock_scheduler); |
1023 scheduler_->SetTimeSourceForTesting(clock_); | 1049 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 1050 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1051 scheduler_->GetSchedulerHelperForTesting() |
| 1052 ->GetTaskQueueManagerForTesting() |
| 1053 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
1024 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1054 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
1025 | 1055 |
1026 scheduler_->DidReceiveInputEventOnCompositorThread( | 1056 scheduler_->DidReceiveInputEventOnCompositorThread( |
1027 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1057 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
1028 scheduler_->DidReceiveInputEventOnCompositorThread( | 1058 scheduler_->DidReceiveInputEventOnCompositorThread( |
1029 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1059 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
1030 | 1060 |
1031 // We expect the first call to IsHighPriorityWorkAnticipated to be called | 1061 // We expect the first call to IsHighPriorityWorkAnticipated to be called |
1032 // after recieving an input event (but before the UpdateTask was processed) to | 1062 // after recieving an input event (but before the UpdateTask was processed) to |
1033 // call UpdatePolicy. | 1063 // call UpdatePolicy. |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1388 RunUntilIdle(); | 1418 RunUntilIdle(); |
1389 EXPECT_TRUE(run_order.empty()); | 1419 EXPECT_TRUE(run_order.empty()); |
1390 | 1420 |
1391 scheduler_->ResumeTimerQueue(); | 1421 scheduler_->ResumeTimerQueue(); |
1392 RunUntilIdle(); | 1422 RunUntilIdle(); |
1393 EXPECT_THAT(run_order, | 1423 EXPECT_THAT(run_order, |
1394 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 1424 testing::ElementsAre(std::string("T1"), std::string("T2"))); |
1395 } | 1425 } |
1396 | 1426 |
1397 } // namespace content | 1427 } // namespace content |
OLD | NEW |