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

Side by Side 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: Forgot to change the friend declaration 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
« no previous file with comments | « content/renderer/scheduler/renderer_scheduler_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "testing/gmock/include/gmock/gmock.h" 10 #include "testing/gmock/include/gmock/gmock.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), 49 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)),
50 scheduler_(new RendererSchedulerImpl(mock_task_runner_)), 50 scheduler_(new RendererSchedulerImpl(mock_task_runner_)),
51 default_task_runner_(scheduler_->DefaultTaskRunner()), 51 default_task_runner_(scheduler_->DefaultTaskRunner()),
52 compositor_task_runner_(scheduler_->CompositorTaskRunner()), 52 compositor_task_runner_(scheduler_->CompositorTaskRunner()),
53 loading_task_runner_(scheduler_->LoadingTaskRunner()), 53 loading_task_runner_(scheduler_->LoadingTaskRunner()),
54 idle_task_runner_(scheduler_->IdleTaskRunner()) { 54 idle_task_runner_(scheduler_->IdleTaskRunner()) {
55 scheduler_->SetTimeSourceForTesting(clock_); 55 scheduler_->SetTimeSourceForTesting(clock_);
56 } 56 }
57 ~RendererSchedulerImplTest() override {} 57 ~RendererSchedulerImplTest() override {}
58 58
59 void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); } 59 void TearDown() override {
60 // Check that all tests stop posting tasks.
61 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
62 while (RunUntilIdle()) {
63 }
64 }
65
66 bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); }
60 67
61 void DoMainFrame() { 68 void DoMainFrame() {
62 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( 69 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
63 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), 70 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(),
64 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); 71 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL));
65 scheduler_->DidCommitFrameToCompositor(); 72 scheduler_->DidCommitFrameToCompositor();
66 } 73 }
67 74
68 void EnableIdleTasks() { DoMainFrame(); } 75 void EnableIdleTasks() { DoMainFrame(); }
69 76
70 Policy CurrentPolicy() { return scheduler_->current_policy_; } 77 Policy CurrentPolicy() { return scheduler_->current_policy_; }
71 78
79 void EnsureUrgentPolicyUpdatePostedOnMainThread() {
80 base::AutoLock lock(scheduler_->incoming_signals_lock_);
81 scheduler_->EnsureUrgentPolicyUpdatePostedOnMainThread(FROM_HERE);
82 }
83
84 void ScheduleDelayedPolicyUpdate(base::TimeDelta delay) {
85 scheduler_->delayed_update_policy_runner_.SetDeadline(FROM_HERE, delay,
86 clock_->Now());
87 }
88
72 // Helper for posting several tasks of specific types. |task_descriptor| is a 89 // Helper for posting several tasks of specific types. |task_descriptor| is a
73 // string with space delimited task identifiers. The first letter of each 90 // string with space delimited task identifiers. The first letter of each
74 // task identifier specifies the task type: 91 // task identifier specifies the task type:
75 // - 'D': Default task 92 // - 'D': Default task
76 // - 'C': Compositor task 93 // - 'C': Compositor task
77 // - 'L': Loading task 94 // - 'L': Loading task
78 // - 'I': Idle task 95 // - 'I': Idle task
79 void PostTestTasks(std::vector<std::string>* run_order, 96 void PostTestTasks(std::vector<std::string>* run_order,
80 const std::string& task_descriptor) { 97 const std::string& task_descriptor) {
81 std::istringstream stream(task_descriptor); 98 std::istringstream stream(task_descriptor);
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 RunUntilIdle(); 857 RunUntilIdle();
841 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); 858 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy());
842 859
843 // Process the input event with a new BeginMainFrame. 860 // Process the input event with a new BeginMainFrame.
844 DoMainFrame(); 861 DoMainFrame();
845 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); 862 clock_->AdvanceNow(2 * priority_escalation_after_input_duration());
846 RunUntilIdle(); 863 RunUntilIdle();
847 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); 864 EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
848 } 865 }
849 866
867 class RendererSchedulerImplForTest : public RendererSchedulerImpl {
868 public:
869 RendererSchedulerImplForTest(
870 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
871 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {}
872
873 void UpdatePolicyLocked() override {
874 update_policy_count_++;
875 RendererSchedulerImpl::UpdatePolicyLocked();
876 }
877
878 int update_policy_count_;
879 };
880
881 TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
882 RendererSchedulerImplForTest* mock_scheduler =
883 new RendererSchedulerImplForTest(mock_task_runner_);
884 scheduler_.reset(mock_scheduler);
885
886 EnsureUrgentPolicyUpdatePostedOnMainThread();
887 EnsureUrgentPolicyUpdatePostedOnMainThread();
888 EnsureUrgentPolicyUpdatePostedOnMainThread();
889 EnsureUrgentPolicyUpdatePostedOnMainThread();
890
891 RunUntilIdle();
892
893 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
894 }
895
896 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
897 RendererSchedulerImplForTest* mock_scheduler =
898 new RendererSchedulerImplForTest(mock_task_runner_);
899 scheduler_.reset(mock_scheduler);
900 scheduler_->SetTimeSourceForTesting(clock_);
901 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
902
903 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1));
904 EnsureUrgentPolicyUpdatePostedOnMainThread();
905
906 RunUntilIdle();
907
908 // We expect both the urgent and the delayed updates to run.
909 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
910 }
911
912 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
913 RendererSchedulerImplForTest* mock_scheduler =
914 new RendererSchedulerImplForTest(mock_task_runner_);
915 scheduler_.reset(mock_scheduler);
916 scheduler_->SetTimeSourceForTesting(clock_);
917 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
918
919 EnsureUrgentPolicyUpdatePostedOnMainThread();
920 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1));
921
922 RunUntilIdle();
923
924 // We expect both the urgent and the delayed updates to run.
925 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
926 }
927
928 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
929 RendererSchedulerImplForTest* mock_scheduler =
930 new RendererSchedulerImplForTest(mock_task_runner_);
931 scheduler_.reset(mock_scheduler);
932 scheduler_->SetTimeSourceForTesting(clock_);
933 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
934
935 scheduler_->DidReceiveInputEventOnCompositorThread(
936 FakeInputEvent(blink::WebInputEvent::TouchStart));
937
938 RunUntilIdle();
939
940 // We expect an urgent policy update followed by a delayed one 100ms later.
941 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
942 }
943
944 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
945 RendererSchedulerImplForTest* mock_scheduler =
946 new RendererSchedulerImplForTest(mock_task_runner_);
947 scheduler_.reset(mock_scheduler);
948 scheduler_->SetTimeSourceForTesting(clock_);
949 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
950
951 scheduler_->DidReceiveInputEventOnCompositorThread(
952 FakeInputEvent(blink::WebInputEvent::TouchStart));
953 scheduler_->DidReceiveInputEventOnCompositorThread(
954 FakeInputEvent(blink::WebInputEvent::TouchMove));
955
956 RunUntilIdle();
957
958 // We expect an urgent policy update followed by a delayed one 100ms later.
959 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
960 }
961
962 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
963 RendererSchedulerImplForTest* mock_scheduler =
964 new RendererSchedulerImplForTest(mock_task_runner_);
965 scheduler_.reset(mock_scheduler);
966 scheduler_->SetTimeSourceForTesting(clock_);
967 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
968
969 scheduler_->DidReceiveInputEventOnCompositorThread(
970 FakeInputEvent(blink::WebInputEvent::TouchStart));
971 scheduler_->DidReceiveInputEventOnCompositorThread(
972 FakeInputEvent(blink::WebInputEvent::TouchMove));
973
974 // We expect the first call to IsHighPriorityWorkAnticipated to be called
975 // after recieving an input event (but before the UpdateTask was processed) to
976 // call UpdatePolicy.
977 EXPECT_EQ(0, mock_scheduler->update_policy_count_);
978 scheduler_->IsHighPriorityWorkAnticipated();
979 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
980 // Subsequent calls should not call UpdatePolicy.
981 scheduler_->IsHighPriorityWorkAnticipated();
982 scheduler_->IsHighPriorityWorkAnticipated();
983 scheduler_->IsHighPriorityWorkAnticipated();
984 scheduler_->ShouldYieldForHighPriorityWork();
985 scheduler_->ShouldYieldForHighPriorityWork();
986 scheduler_->ShouldYieldForHighPriorityWork();
987 scheduler_->ShouldYieldForHighPriorityWork();
988
989 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
990
991 RunUntilIdle();
992 // We expect both the urgent and the delayed updates to run in addition to the
993 // earlier updated cause by IsHighPriorityWorkAnticipated.
994 EXPECT_EQ(3, mock_scheduler->update_policy_count_);
995 }
996
850 } // namespace content 997 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/scheduler/renderer_scheduler_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698