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

Side by Side Diff: content/renderer/scheduler/renderer_scheduler_impl_unittest.cc

Issue 970473004: [content] Add support for Non nestable idle tasks the the RendererScheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix contentperftests 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 unified diff | Download patch
OLDNEW
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 "content/renderer/scheduler/nestable_task_runner_for_test.h"
11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h"
10 #include "testing/gmock/include/gmock/gmock.h" 12 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
12 14
13 namespace content { 15 namespace content {
14 16
15 namespace { 17 namespace {
16 class FakeInputEvent : public blink::WebInputEvent { 18 class FakeInputEvent : public blink::WebInputEvent {
17 public: 19 public:
18 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) 20 explicit FakeInputEvent(blink::WebInputEvent::Type event_type)
19 : WebInputEvent(sizeof(FakeInputEvent)) { 21 : WebInputEvent(sizeof(FakeInputEvent)) {
(...skipping 20 matching lines...) Expand all
40 42
41 }; // namespace 43 }; // namespace
42 44
43 class RendererSchedulerImplTest : public testing::Test { 45 class RendererSchedulerImplTest : public testing::Test {
44 public: 46 public:
45 using Policy = RendererSchedulerImpl::Policy; 47 using Policy = RendererSchedulerImpl::Policy;
46 48
47 RendererSchedulerImplTest() 49 RendererSchedulerImplTest()
48 : clock_(cc::TestNowSource::Create(5000)), 50 : clock_(cc::TestNowSource::Create(5000)),
49 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), 51 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)),
50 scheduler_(new RendererSchedulerImpl(mock_task_runner_)), 52 nestable_task_runner_(
53 NestableTaskRunnerForTest::Create(mock_task_runner_)),
54 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)),
51 default_task_runner_(scheduler_->DefaultTaskRunner()), 55 default_task_runner_(scheduler_->DefaultTaskRunner()),
52 compositor_task_runner_(scheduler_->CompositorTaskRunner()), 56 compositor_task_runner_(scheduler_->CompositorTaskRunner()),
53 loading_task_runner_(scheduler_->LoadingTaskRunner()), 57 loading_task_runner_(scheduler_->LoadingTaskRunner()),
58 idle_task_runner_(scheduler_->IdleTaskRunner()) {
59 scheduler_->SetTimeSourceForTesting(clock_);
60 }
61
62 RendererSchedulerImplTest(base::MessageLoop* message_loop)
63 : clock_(cc::TestNowSource::Create(5000)),
64 message_loop_(message_loop),
65 nestable_task_runner_(
66 RendererSchedulerMessageLoopDelegate::Create(message_loop)),
67 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)),
68 default_task_runner_(scheduler_->DefaultTaskRunner()),
69 compositor_task_runner_(scheduler_->CompositorTaskRunner()),
70 loading_task_runner_(scheduler_->LoadingTaskRunner()),
54 idle_task_runner_(scheduler_->IdleTaskRunner()) { 71 idle_task_runner_(scheduler_->IdleTaskRunner()) {
55 scheduler_->SetTimeSourceForTesting(clock_); 72 scheduler_->SetTimeSourceForTesting(clock_);
56 } 73 }
57 ~RendererSchedulerImplTest() override {} 74 ~RendererSchedulerImplTest() override {}
58 75
59 void TearDown() override { 76 void TearDown() override {
60 // Check that all tests stop posting tasks. 77 DCHECK(!mock_task_runner_.get() || !message_loop_.get());
61 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 78 if (mock_task_runner_.get()) {
62 while (RunUntilIdle()) { 79 // Check that all tests stop posting tasks.
80 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
81 while (mock_task_runner_->RunUntilIdle()) {
82 }
83 } else {
84 message_loop_->RunUntilIdle();
63 } 85 }
64 } 86 }
65 87
66 bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); } 88 void RunUntilIdle() {
89 // Only one of mock_task_runner_ or message_loop_ should be set.
90 DCHECK(!mock_task_runner_.get() || !message_loop_.get());
91 if (mock_task_runner_.get())
92 mock_task_runner_->RunUntilIdle();
93 else
94 message_loop_->RunUntilIdle();
95 }
67 96
68 void DoMainFrame() { 97 void DoMainFrame() {
69 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( 98 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
70 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), 99 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(),
71 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); 100 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL));
72 scheduler_->DidCommitFrameToCompositor(); 101 scheduler_->DidCommitFrameToCompositor();
73 } 102 }
74 103
75 void EnableIdleTasks() { DoMainFrame(); } 104 void EnableIdleTasks() { DoMainFrame(); }
76 105
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 } 152 }
124 } 153 }
125 154
126 protected: 155 protected:
127 static base::TimeDelta priority_escalation_after_input_duration() { 156 static base::TimeDelta priority_escalation_after_input_duration() {
128 return base::TimeDelta::FromMilliseconds( 157 return base::TimeDelta::FromMilliseconds(
129 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); 158 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis);
130 } 159 }
131 160
132 scoped_refptr<cc::TestNowSource> clock_; 161 scoped_refptr<cc::TestNowSource> clock_;
162 // Only one of mock_task_runner_ or message_loop_ will be set.
133 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; 163 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
164 scoped_ptr<base::MessageLoop> message_loop_;
134 165
166 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
135 scoped_ptr<RendererSchedulerImpl> scheduler_; 167 scoped_ptr<RendererSchedulerImpl> scheduler_;
136 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; 168 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
137 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; 169 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
138 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_; 170 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_;
139 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; 171 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
140 172
141 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); 173 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest);
142 }; 174 };
143 175
144 void NullTask() { 176 void NullTask() {
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 // Process the input event with a new BeginMainFrame. 892 // Process the input event with a new BeginMainFrame.
861 DoMainFrame(); 893 DoMainFrame();
862 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); 894 clock_->AdvanceNow(2 * priority_escalation_after_input_duration());
863 RunUntilIdle(); 895 RunUntilIdle();
864 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); 896 EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
865 } 897 }
866 898
867 class RendererSchedulerImplForTest : public RendererSchedulerImpl { 899 class RendererSchedulerImplForTest : public RendererSchedulerImpl {
868 public: 900 public:
869 RendererSchedulerImplForTest( 901 RendererSchedulerImplForTest(
870 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) 902 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner)
871 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {} 903 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {}
872 904
873 void UpdatePolicyLocked() override { 905 void UpdatePolicyLocked() override {
874 update_policy_count_++; 906 update_policy_count_++;
875 RendererSchedulerImpl::UpdatePolicyLocked(); 907 RendererSchedulerImpl::UpdatePolicyLocked();
876 } 908 }
877 909
878 int update_policy_count_; 910 int update_policy_count_;
879 }; 911 };
880 912
881 TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) { 913 TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
882 RendererSchedulerImplForTest* mock_scheduler = 914 RendererSchedulerImplForTest* mock_scheduler =
883 new RendererSchedulerImplForTest(mock_task_runner_); 915 new RendererSchedulerImplForTest(nestable_task_runner_);
884 scheduler_.reset(mock_scheduler); 916 scheduler_.reset(mock_scheduler);
885 917
886 EnsureUrgentPolicyUpdatePostedOnMainThread(); 918 EnsureUrgentPolicyUpdatePostedOnMainThread();
887 EnsureUrgentPolicyUpdatePostedOnMainThread(); 919 EnsureUrgentPolicyUpdatePostedOnMainThread();
888 EnsureUrgentPolicyUpdatePostedOnMainThread(); 920 EnsureUrgentPolicyUpdatePostedOnMainThread();
889 EnsureUrgentPolicyUpdatePostedOnMainThread(); 921 EnsureUrgentPolicyUpdatePostedOnMainThread();
890 922
891 RunUntilIdle(); 923 RunUntilIdle();
892 924
893 EXPECT_EQ(1, mock_scheduler->update_policy_count_); 925 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
894 } 926 }
895 927
896 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { 928 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
897 RendererSchedulerImplForTest* mock_scheduler = 929 RendererSchedulerImplForTest* mock_scheduler =
898 new RendererSchedulerImplForTest(mock_task_runner_); 930 new RendererSchedulerImplForTest(nestable_task_runner_);
899 scheduler_.reset(mock_scheduler); 931 scheduler_.reset(mock_scheduler);
900 scheduler_->SetTimeSourceForTesting(clock_); 932 scheduler_->SetTimeSourceForTesting(clock_);
901 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 933 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
902 934
903 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); 935 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1));
904 EnsureUrgentPolicyUpdatePostedOnMainThread(); 936 EnsureUrgentPolicyUpdatePostedOnMainThread();
905 937
906 RunUntilIdle(); 938 RunUntilIdle();
907 939
908 // We expect both the urgent and the delayed updates to run. 940 // We expect both the urgent and the delayed updates to run.
909 EXPECT_EQ(2, mock_scheduler->update_policy_count_); 941 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
910 } 942 }
911 943
912 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { 944 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
913 RendererSchedulerImplForTest* mock_scheduler = 945 RendererSchedulerImplForTest* mock_scheduler =
914 new RendererSchedulerImplForTest(mock_task_runner_); 946 new RendererSchedulerImplForTest(nestable_task_runner_);
915 scheduler_.reset(mock_scheduler); 947 scheduler_.reset(mock_scheduler);
916 scheduler_->SetTimeSourceForTesting(clock_); 948 scheduler_->SetTimeSourceForTesting(clock_);
917 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 949 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
918 950
919 EnsureUrgentPolicyUpdatePostedOnMainThread(); 951 EnsureUrgentPolicyUpdatePostedOnMainThread();
920 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); 952 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1));
921 953
922 RunUntilIdle(); 954 RunUntilIdle();
923 955
924 // We expect both the urgent and the delayed updates to run. 956 // We expect both the urgent and the delayed updates to run.
925 EXPECT_EQ(2, mock_scheduler->update_policy_count_); 957 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
926 } 958 }
927 959
928 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { 960 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
929 RendererSchedulerImplForTest* mock_scheduler = 961 RendererSchedulerImplForTest* mock_scheduler =
930 new RendererSchedulerImplForTest(mock_task_runner_); 962 new RendererSchedulerImplForTest(nestable_task_runner_);
931 scheduler_.reset(mock_scheduler); 963 scheduler_.reset(mock_scheduler);
932 scheduler_->SetTimeSourceForTesting(clock_); 964 scheduler_->SetTimeSourceForTesting(clock_);
933 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 965 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
934 966
935 scheduler_->DidReceiveInputEventOnCompositorThread( 967 scheduler_->DidReceiveInputEventOnCompositorThread(
936 FakeInputEvent(blink::WebInputEvent::TouchStart)); 968 FakeInputEvent(blink::WebInputEvent::TouchStart));
937 969
938 RunUntilIdle(); 970 RunUntilIdle();
939 971
940 // We expect an urgent policy update followed by a delayed one 100ms later. 972 // We expect an urgent policy update followed by a delayed one 100ms later.
941 EXPECT_EQ(2, mock_scheduler->update_policy_count_); 973 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
942 } 974 }
943 975
944 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { 976 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
945 RendererSchedulerImplForTest* mock_scheduler = 977 RendererSchedulerImplForTest* mock_scheduler =
946 new RendererSchedulerImplForTest(mock_task_runner_); 978 new RendererSchedulerImplForTest(nestable_task_runner_);
947 scheduler_.reset(mock_scheduler); 979 scheduler_.reset(mock_scheduler);
948 scheduler_->SetTimeSourceForTesting(clock_); 980 scheduler_->SetTimeSourceForTesting(clock_);
949 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 981 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
950 982
951 scheduler_->DidReceiveInputEventOnCompositorThread( 983 scheduler_->DidReceiveInputEventOnCompositorThread(
952 FakeInputEvent(blink::WebInputEvent::TouchStart)); 984 FakeInputEvent(blink::WebInputEvent::TouchStart));
953 scheduler_->DidReceiveInputEventOnCompositorThread( 985 scheduler_->DidReceiveInputEventOnCompositorThread(
954 FakeInputEvent(blink::WebInputEvent::TouchMove)); 986 FakeInputEvent(blink::WebInputEvent::TouchMove));
955 987
956 RunUntilIdle(); 988 RunUntilIdle();
957 989
958 // We expect an urgent policy update followed by a delayed one 100ms later. 990 // We expect an urgent policy update followed by a delayed one 100ms later.
959 EXPECT_EQ(2, mock_scheduler->update_policy_count_); 991 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
960 } 992 }
961 993
962 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { 994 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
963 RendererSchedulerImplForTest* mock_scheduler = 995 RendererSchedulerImplForTest* mock_scheduler =
964 new RendererSchedulerImplForTest(mock_task_runner_); 996 new RendererSchedulerImplForTest(nestable_task_runner_);
965 scheduler_.reset(mock_scheduler); 997 scheduler_.reset(mock_scheduler);
966 scheduler_->SetTimeSourceForTesting(clock_); 998 scheduler_->SetTimeSourceForTesting(clock_);
967 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); 999 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
968 1000
969 scheduler_->DidReceiveInputEventOnCompositorThread( 1001 scheduler_->DidReceiveInputEventOnCompositorThread(
970 FakeInputEvent(blink::WebInputEvent::TouchStart)); 1002 FakeInputEvent(blink::WebInputEvent::TouchStart));
971 scheduler_->DidReceiveInputEventOnCompositorThread( 1003 scheduler_->DidReceiveInputEventOnCompositorThread(
972 FakeInputEvent(blink::WebInputEvent::TouchMove)); 1004 FakeInputEvent(blink::WebInputEvent::TouchMove));
973 1005
974 // We expect the first call to IsHighPriorityWorkAnticipated to be called 1006 // We expect the first call to IsHighPriorityWorkAnticipated to be called
(...skipping 12 matching lines...) Expand all
987 scheduler_->ShouldYieldForHighPriorityWork(); 1019 scheduler_->ShouldYieldForHighPriorityWork();
988 1020
989 EXPECT_EQ(1, mock_scheduler->update_policy_count_); 1021 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
990 1022
991 RunUntilIdle(); 1023 RunUntilIdle();
992 // We expect both the urgent and the delayed updates to run in addition to the 1024 // We expect both the urgent and the delayed updates to run in addition to the
993 // earlier updated cause by IsHighPriorityWorkAnticipated. 1025 // earlier updated cause by IsHighPriorityWorkAnticipated.
994 EXPECT_EQ(3, mock_scheduler->update_policy_count_); 1026 EXPECT_EQ(3, mock_scheduler->update_policy_count_);
995 } 1027 }
996 1028
1029 class RendererSchedulerImplWithMessageLoopTest
1030 : public RendererSchedulerImplTest {
1031 public:
1032 RendererSchedulerImplWithMessageLoopTest()
1033 : RendererSchedulerImplTest(new base::MessageLoop()) {}
1034 ~RendererSchedulerImplWithMessageLoopTest() override {}
1035
1036 void PostFromNestedRunloop(std::vector<
1037 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) {
1038 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get());
1039 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) {
1040 if (pair.second) {
1041 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first);
1042 } else {
1043 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first);
1044 }
1045 }
1046 EnableIdleTasks();
1047 message_loop_->RunUntilIdle();
1048 }
1049
1050 private:
1051 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest);
1052 };
1053
1054 TEST_F(RendererSchedulerImplWithMessageLoopTest,
1055 NonNestableIdleTaskDoesntExecuteInNestedLoop) {
1056 std::vector<std::string> order;
1057 idle_task_runner_->PostIdleTask(
1058 FROM_HERE,
1059 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1")));
1060 idle_task_runner_->PostIdleTask(
1061 FROM_HERE,
1062 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2")));
1063
1064 std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>
1065 tasks_to_post_from_nested_loop;
1066 tasks_to_post_from_nested_loop.push_back(std::make_pair(
1067 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")),
1068 false));
1069 tasks_to_post_from_nested_loop.push_back(std::make_pair(
1070 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true));
1071 tasks_to_post_from_nested_loop.push_back(std::make_pair(
1072 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true));
1073
1074 default_task_runner_->PostTask(
1075 FROM_HERE,
1076 base::Bind(
1077 &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop,
1078 base::Unretained(this),
1079 base::Unretained(&tasks_to_post_from_nested_loop)));
1080
1081 EnableIdleTasks();
1082 RunUntilIdle();
1083 // Note we expect task 3 to run last because it's non-nestable.
1084 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"),
1085 std::string("4"), std::string("5"),
1086 std::string("3")));
1087 }
1088
997 } // namespace content 1089 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698