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

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: Remove unintended changes. 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 scheduler_(new RendererSchedulerImpl(
53 NestableTaskRunnerForTest::Create(mock_task_runner_))),
51 default_task_runner_(scheduler_->DefaultTaskRunner()), 54 default_task_runner_(scheduler_->DefaultTaskRunner()),
52 compositor_task_runner_(scheduler_->CompositorTaskRunner()), 55 compositor_task_runner_(scheduler_->CompositorTaskRunner()),
53 loading_task_runner_(scheduler_->LoadingTaskRunner()), 56 loading_task_runner_(scheduler_->LoadingTaskRunner()),
57 idle_task_runner_(scheduler_->IdleTaskRunner()) {
58 scheduler_->SetTimeSourceForTesting(clock_);
59 }
60
61 RendererSchedulerImplTest(base::MessageLoop* message_loop)
62 : clock_(cc::TestNowSource::Create(5000)),
63 message_loop_(message_loop),
64 scheduler_(new RendererSchedulerImpl(
65 RendererSchedulerMessageLoopDelegate::Create(message_loop))),
66 default_task_runner_(scheduler_->DefaultTaskRunner()),
67 compositor_task_runner_(scheduler_->CompositorTaskRunner()),
68 loading_task_runner_(scheduler_->LoadingTaskRunner()),
54 idle_task_runner_(scheduler_->IdleTaskRunner()) { 69 idle_task_runner_(scheduler_->IdleTaskRunner()) {
55 scheduler_->SetTimeSourceForTesting(clock_); 70 scheduler_->SetTimeSourceForTesting(clock_);
56 } 71 }
57 ~RendererSchedulerImplTest() override {} 72 ~RendererSchedulerImplTest() override {}
58 73
59 void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); } 74 void RunUntilIdle() {
75 // Only one of mock_task_runner_ or message_loop_ should be set.
76 DCHECK(!mock_task_runner_.get() || !message_loop_.get());
Sami 2015/03/12 18:53:11 Missed a golden opportunity to use ^ :)
rmcilroy 2015/03/13 10:56:53 Ahh the seldom used bitwise XOR operator. I think
77 if (mock_task_runner_.get())
78 mock_task_runner_->RunUntilIdle();
79 else
80 message_loop_->RunUntilIdle();
81 }
60 82
61 void DoMainFrame() { 83 void DoMainFrame() {
62 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( 84 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
63 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), 85 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(),
64 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); 86 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL));
65 scheduler_->DidCommitFrameToCompositor(); 87 scheduler_->DidCommitFrameToCompositor();
66 } 88 }
67 89
68 void EnableIdleTasks() { DoMainFrame(); } 90 void EnableIdleTasks() { DoMainFrame(); }
69 91
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 } 128 }
107 } 129 }
108 130
109 protected: 131 protected:
110 static base::TimeDelta priority_escalation_after_input_duration() { 132 static base::TimeDelta priority_escalation_after_input_duration() {
111 return base::TimeDelta::FromMilliseconds( 133 return base::TimeDelta::FromMilliseconds(
112 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); 134 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis);
113 } 135 }
114 136
115 scoped_refptr<cc::TestNowSource> clock_; 137 scoped_refptr<cc::TestNowSource> clock_;
138 // Only one of mock_task_runner_ or message_loop_ will be set.
116 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; 139 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
140 scoped_ptr<base::MessageLoop> message_loop_;
117 141
118 scoped_ptr<RendererSchedulerImpl> scheduler_; 142 scoped_ptr<RendererSchedulerImpl> scheduler_;
119 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; 143 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
120 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; 144 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
121 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_; 145 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_;
122 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; 146 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
123 147
124 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); 148 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest);
125 }; 149 };
126 150
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 RunUntilIdle(); 864 RunUntilIdle();
841 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); 865 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy());
842 866
843 // Process the input event with a new BeginMainFrame. 867 // Process the input event with a new BeginMainFrame.
844 DoMainFrame(); 868 DoMainFrame();
845 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); 869 clock_->AdvanceNow(2 * priority_escalation_after_input_duration());
846 RunUntilIdle(); 870 RunUntilIdle();
847 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); 871 EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
848 } 872 }
849 873
874 class RendererSchedulerImplWithMessageLoopTest
875 : public RendererSchedulerImplTest {
876 public:
877 RendererSchedulerImplWithMessageLoopTest()
878 : RendererSchedulerImplTest(new base::MessageLoop()) {}
879 ~RendererSchedulerImplWithMessageLoopTest() override {}
880
881 void PostFromNestedRunloop(std::vector<
882 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) {
883 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get());
884 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) {
885 if (pair.second) {
886 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first);
887 } else {
888 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first);
889 }
890 }
891 EnableIdleTasks();
892 message_loop_->RunUntilIdle();
893 }
894
895 private:
896 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest);
897 };
898
899 TEST_F(RendererSchedulerImplWithMessageLoopTest,
900 NonNestableIdleTaskDoesntExecuteInNestedLoop) {
901 std::vector<std::string> order;
902 idle_task_runner_->PostIdleTask(
903 FROM_HERE,
904 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1")));
905 idle_task_runner_->PostIdleTask(
906 FROM_HERE,
907 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2")));
908
909 std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>
910 tasks_to_post_from_nested_loop;
911 tasks_to_post_from_nested_loop.push_back(std::make_pair(
912 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")),
913 false));
914 tasks_to_post_from_nested_loop.push_back(std::make_pair(
915 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true));
916 tasks_to_post_from_nested_loop.push_back(std::make_pair(
917 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true));
918
919 default_task_runner_->PostTask(
920 FROM_HERE,
921 base::Bind(
922 &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop,
923 base::Unretained(this),
924 base::Unretained(&tasks_to_post_from_nested_loop)));
925
926 EnableIdleTasks();
927 RunUntilIdle();
928 // Note we expect task 3 to run last because it's non-nestable.
929 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"),
930 std::string("4"), std::string("5"),
931 std::string("3")));
932 }
933
850 } // namespace content 934 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698