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

Side by Side Diff: components/scheduler/child/scheduler_helper_unittest.cc

Issue 2118903002: scheduler: Move the Blink scheduler into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Another GYP fix Created 4 years, 5 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/scheduler/child/scheduler_helper.h"
6
7 #include "base/callback.h"
8 #include "base/macros.h"
9 #include "base/memory/ptr_util.h"
10 #include "base/test/simple_test_tick_clock.h"
11 #include "cc/test/ordered_simple_task_runner.h"
12 #include "components/scheduler/base/task_queue.h"
13 #include "components/scheduler/base/test_time_source.h"
14 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using testing::_;
19 using testing::AnyNumber;
20 using testing::Invoke;
21 using testing::Return;
22
23 namespace scheduler {
24
25 namespace {
26 void AppendToVectorTestTask(std::vector<std::string>* vector,
27 std::string value) {
28 vector->push_back(value);
29 }
30
31 void AppendToVectorReentrantTask(base::SingleThreadTaskRunner* task_runner,
32 std::vector<int>* vector,
33 int* reentrant_count,
34 int max_reentrant_count) {
35 vector->push_back((*reentrant_count)++);
36 if (*reentrant_count < max_reentrant_count) {
37 task_runner->PostTask(
38 FROM_HERE,
39 base::Bind(AppendToVectorReentrantTask, base::Unretained(task_runner),
40 vector, reentrant_count, max_reentrant_count));
41 }
42 }
43
44 }; // namespace
45
46 class SchedulerHelperTest : public testing::Test {
47 public:
48 SchedulerHelperTest()
49 : clock_(new base::SimpleTestTickClock()),
50 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_.get(), false)),
51 main_task_runner_(SchedulerTqmDelegateForTest::Create(
52 mock_task_runner_,
53 base::WrapUnique(new TestTimeSource(clock_.get())))),
54 scheduler_helper_(new SchedulerHelper(
55 main_task_runner_,
56 "test.scheduler",
57 TRACE_DISABLED_BY_DEFAULT("test.scheduler"),
58 TRACE_DISABLED_BY_DEFAULT("test.scheduler.dbg"))),
59 default_task_runner_(scheduler_helper_->DefaultTaskRunner()) {
60 clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
61 }
62
63 ~SchedulerHelperTest() override {}
64
65 void TearDown() override {
66 // Check that all tests stop posting tasks.
67 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
68 while (mock_task_runner_->RunUntilIdle()) {
69 }
70 }
71
72 void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); }
73
74 template <typename E>
75 static void CallForEachEnumValue(E first,
76 E last,
77 const char* (*function)(E)) {
78 for (E val = first; val < last;
79 val = static_cast<E>(static_cast<int>(val) + 1)) {
80 (*function)(val);
81 }
82 }
83
84 protected:
85 std::unique_ptr<base::SimpleTestTickClock> clock_;
86 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
87
88 scoped_refptr<SchedulerTqmDelegateForTest> main_task_runner_;
89 std::unique_ptr<SchedulerHelper> scheduler_helper_;
90 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
91
92 DISALLOW_COPY_AND_ASSIGN(SchedulerHelperTest);
93 };
94
95 TEST_F(SchedulerHelperTest, TestPostDefaultTask) {
96 std::vector<std::string> run_order;
97 default_task_runner_->PostTask(
98 FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D1"));
99 default_task_runner_->PostTask(
100 FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D2"));
101 default_task_runner_->PostTask(
102 FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D3"));
103 default_task_runner_->PostTask(
104 FROM_HERE, base::Bind(&AppendToVectorTestTask, &run_order, "D4"));
105
106 RunUntilIdle();
107 EXPECT_THAT(run_order,
108 testing::ElementsAre(std::string("D1"), std::string("D2"),
109 std::string("D3"), std::string("D4")));
110 }
111
112 TEST_F(SchedulerHelperTest, TestRentrantTask) {
113 int count = 0;
114 std::vector<int> run_order;
115 default_task_runner_->PostTask(
116 FROM_HERE, base::Bind(AppendToVectorReentrantTask,
117 base::RetainedRef(default_task_runner_), &run_order,
118 &count, 5));
119 RunUntilIdle();
120
121 EXPECT_THAT(run_order, testing::ElementsAre(0, 1, 2, 3, 4));
122 }
123
124 TEST_F(SchedulerHelperTest, IsShutdown) {
125 EXPECT_FALSE(scheduler_helper_->IsShutdown());
126
127 scheduler_helper_->Shutdown();
128 EXPECT_TRUE(scheduler_helper_->IsShutdown());
129 }
130
131 TEST_F(SchedulerHelperTest, DefaultTaskRunnerRegistration) {
132 EXPECT_EQ(main_task_runner_->default_task_runner(),
133 scheduler_helper_->DefaultTaskRunner());
134 scheduler_helper_->Shutdown();
135 EXPECT_EQ(nullptr, main_task_runner_->default_task_runner());
136 }
137
138 namespace {
139 class MockTaskObserver : public base::MessageLoop::TaskObserver {
140 public:
141 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
142 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
143 };
144
145 void NopTask() {}
146 } // namespace
147
148 TEST_F(SchedulerHelperTest, ObserversNotifiedFor_DefaultTaskRunner) {
149 MockTaskObserver observer;
150 scheduler_helper_->AddTaskObserver(&observer);
151
152 scheduler_helper_->DefaultTaskRunner()->PostTask(FROM_HERE,
153 base::Bind(&NopTask));
154
155 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
156 EXPECT_CALL(observer, DidProcessTask(_)).Times(1);
157 RunUntilIdle();
158 }
159
160 TEST_F(SchedulerHelperTest, ObserversNotNotifiedFor_ControlTaskRunner) {
161 MockTaskObserver observer;
162 scheduler_helper_->AddTaskObserver(&observer);
163
164 scheduler_helper_->ControlTaskRunner()->PostTask(FROM_HERE,
165 base::Bind(&NopTask));
166
167 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
168 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
169 RunUntilIdle();
170 }
171
172 TEST_F(SchedulerHelperTest,
173 ObserversNotNotifiedFor_ControlAfterWakeUpTaskRunner) {
174 MockTaskObserver observer;
175 scheduler_helper_->AddTaskObserver(&observer);
176
177 scheduler_helper_->ControlAfterWakeUpTaskRunner()->PostTask(
178 FROM_HERE, base::Bind(&NopTask));
179
180 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
181 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
182 scheduler_helper_->ControlAfterWakeUpTaskRunner()->PumpQueue(true);
183 RunUntilIdle();
184 }
185
186 namespace {
187
188 class MockObserver : public SchedulerHelper::Observer {
189 public:
190 MOCK_METHOD1(OnUnregisterTaskQueue,
191 void(const scoped_refptr<TaskQueue>& queue));
192 MOCK_METHOD2(OnTriedToExecuteBlockedTask,
193 void(const TaskQueue& queue, const base::PendingTask& task));
194 };
195
196 } // namespace
197
198 TEST_F(SchedulerHelperTest, OnUnregisterTaskQueue) {
199 MockObserver observer;
200 scheduler_helper_->SetObserver(&observer);
201
202 scoped_refptr<TaskQueue> task_queue =
203 scheduler_helper_->NewTaskQueue(TaskQueue::Spec("test_queue"));
204
205 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1);
206 task_queue->UnregisterTaskQueue();
207
208 scheduler_helper_->SetObserver(nullptr);
209 }
210
211 TEST_F(SchedulerHelperTest, OnTriedToExecuteBlockedTask) {
212 MockObserver observer;
213 scheduler_helper_->SetObserver(&observer);
214
215 scoped_refptr<TaskQueue> task_queue = scheduler_helper_->NewTaskQueue(
216 TaskQueue::Spec("test_queue").SetShouldReportWhenExecutionBlocked(true));
217 task_queue->SetQueueEnabled(false);
218 task_queue->PostTask(FROM_HERE, base::Bind(&NopTask));
219
220 EXPECT_CALL(observer, OnTriedToExecuteBlockedTask(_, _)).Times(1);
221 RunUntilIdle();
222
223 scheduler_helper_->SetObserver(nullptr);
224 }
225
226 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698