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

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: Tweak 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 "testing/gmock/include/gmock/gmock.h" 10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 12
13 using testing::_;
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)) {
20 type = event_type; 22 type = event_type;
21 } 23 }
22 24
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 idle_task_runner_->PostIdleTask( 101 idle_task_runner_->PostIdleTask(
100 FROM_HERE, 102 FROM_HERE,
101 base::Bind(&AppendToVectorIdleTestTask, run_order, task)); 103 base::Bind(&AppendToVectorIdleTestTask, run_order, task));
102 break; 104 break;
103 default: 105 default:
104 NOTREACHED(); 106 NOTREACHED();
105 } 107 }
106 } 108 }
107 } 109 }
108 110
111 void PostUpdatePolicyOnControlRunner(base::TimeDelta delay) {
112 base::AutoLock lock(scheduler_->incoming_signals_lock_);
113 scheduler_->PostUpdatePolicyOnControlRunnerLocked(delay);
114 }
115
109 protected: 116 protected:
110 static base::TimeDelta priority_escalation_after_input_duration() { 117 static base::TimeDelta priority_escalation_after_input_duration() {
111 return base::TimeDelta::FromMilliseconds( 118 return base::TimeDelta::FromMilliseconds(
112 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); 119 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis);
113 } 120 }
114 121
115 scoped_refptr<cc::TestNowSource> clock_; 122 scoped_refptr<cc::TestNowSource> clock_;
116 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; 123 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
117 124
118 scoped_ptr<RendererSchedulerImpl> scheduler_; 125 scoped_ptr<RendererSchedulerImpl> scheduler_;
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 RunUntilIdle(); 847 RunUntilIdle();
841 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); 848 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy());
842 849
843 // Process the input event with a new BeginMainFrame. 850 // Process the input event with a new BeginMainFrame.
844 DoMainFrame(); 851 DoMainFrame();
845 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); 852 clock_->AdvanceNow(2 * priority_escalation_after_input_duration());
846 RunUntilIdle(); 853 RunUntilIdle();
847 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); 854 EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
848 } 855 }
849 856
857 class MockRendererSchedulerImpl : public RendererSchedulerImpl {
858 public:
859 MockRendererSchedulerImpl(
860 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
861 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {}
862
863 void UpdatePolicy(bool clear_pending_non_delayed_update_policy) override {
864 update_policy_count_++;
865 RendererSchedulerImpl::UpdatePolicy(
866 clear_pending_non_delayed_update_policy);
867 }
868
869 int update_policy_count_;
870 };
871
872 TEST_F(RendererSchedulerImplTest, OnlyOnePendingNonDelayedUpdatePolicy) {
873 MockRendererSchedulerImpl* mock_scheduler =
874 new MockRendererSchedulerImpl(mock_task_runner_);
875 scheduler_.reset(mock_scheduler);
876
877 PostUpdatePolicyOnControlRunner(base::TimeDelta());
Sami 2015/03/10 16:19:38 Do we know what triggered the bug in the first pla
alex clarke (OOO till 29th) 2015/03/11 10:59:05 Anything that calls MaybeUpdatePolicy can potentia
878 PostUpdatePolicyOnControlRunner(base::TimeDelta());
879 PostUpdatePolicyOnControlRunner(base::TimeDelta());
880 PostUpdatePolicyOnControlRunner(base::TimeDelta());
881
882 RunUntilIdle();
883
884 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
885 }
886
887 TEST_F(RendererSchedulerImplTest, OnlyOnePendingDelayedUpdatePolicy) {
888 MockRendererSchedulerImpl* mock_scheduler =
889 new MockRendererSchedulerImpl(mock_task_runner_);
890 scheduler_.reset(mock_scheduler);
891 scheduler_->SetTimeSourceForTesting(clock_);
892 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
893
894 PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(1));
895 PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(10));
896 PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(100));
897 PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(1000));
898
899 RunUntilIdle();
900
901 EXPECT_EQ(1, mock_scheduler->update_policy_count_);
902 }
903
904 TEST_F(RendererSchedulerImplTest,
905 OnePendingDelayedAndOneNonDelayedUpdatePolicy) {
906 MockRendererSchedulerImpl* mock_scheduler =
907 new MockRendererSchedulerImpl(mock_task_runner_);
908 scheduler_.reset(mock_scheduler);
909 scheduler_->SetTimeSourceForTesting(clock_);
910 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
911
912 PostUpdatePolicyOnControlRunner(base::TimeDelta());
913 PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(1));
Sami 2015/03/10 16:19:38 Could you also try this the other way around to ma
alex clarke (OOO till 29th) 2015/03/11 10:59:05 It's now hard to test this directly. If you're ke
914
915 RunUntilIdle();
916
917 EXPECT_EQ(2, mock_scheduler->update_policy_count_);
918 }
919
850 } // namespace content 920 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698