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

Side by Side Diff: cc/test/task_graph_runner_test_template.h

Issue 1489233003: TaskGraphRunner Group support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor
Patch Set: rebase Created 5 years 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #ifndef CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_ 5 #ifndef CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_
6 #define CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_ 6 #define CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_
7 7
8 #include "cc/raster/task_graph_runner.h" 8 #include "cc/raster/task_graph_runner.h"
9 9
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/synchronization/lock.h" 14 #include "base/synchronization/lock.h"
15 #include "base/threading/simple_thread.h" 15 #include "base/threading/simple_thread.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 namespace cc { 18 namespace cc {
19 19
20 class TaskGraphRunnerTestBase { 20 class TaskGraphRunnerTestBase {
21 public: 21 public:
22 struct TaskInfo { 22 struct TaskInfo {
23 TaskInfo(int namespace_index, 23 TaskInfo(int namespace_index,
24 unsigned id, 24 unsigned id,
25 unsigned dependent_id, 25 unsigned dependent_id,
26 unsigned dependent_count, 26 unsigned dependent_count,
27 unsigned group,
27 unsigned priority) 28 unsigned priority)
28 : namespace_index(namespace_index), 29 : namespace_index(namespace_index),
29 id(id), 30 id(id),
30 dependent_id(dependent_id), 31 dependent_id(dependent_id),
31 dependent_count(dependent_count), 32 dependent_count(dependent_count),
33 group(group),
32 priority(priority) {} 34 priority(priority) {}
33 35
34 int namespace_index; 36 int namespace_index;
35 unsigned id; 37 unsigned id;
36 unsigned dependent_id; 38 unsigned dependent_id;
37 unsigned dependent_count; 39 unsigned dependent_count;
40 unsigned group;
38 unsigned priority; 41 unsigned priority;
39 }; 42 };
40 43
41 TaskGraphRunnerTestBase() {} 44 TaskGraphRunnerTestBase() {}
42 45
43 void SetTaskGraphRunner(TaskGraphRunner* task_graph_runner); 46 void SetTaskGraphRunner(TaskGraphRunner* task_graph_runner);
44 void ResetIds(int namespace_index); 47 void ResetIds(int namespace_index);
45 void RunAllTasks(int namespace_index); 48 void RunAllTasks(int namespace_index);
46 void RunTaskOnWorkerThread(int namespace_index, unsigned id); 49 void RunTaskOnWorkerThread(int namespace_index, unsigned id);
47 void OnTaskCompleted(int namespace_index, unsigned id); 50 void OnTaskCompleted(int namespace_index, unsigned id);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 TYPED_TEST_CASE_P(TaskGraphRunnerTest); 122 TYPED_TEST_CASE_P(TaskGraphRunnerTest);
120 123
121 TYPED_TEST_P(TaskGraphRunnerTest, Basic) { 124 TYPED_TEST_P(TaskGraphRunnerTest, Basic) {
122 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; 125 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount;
123 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; 126 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo;
124 127
125 for (int i = 0; i < kNamespaceCount; ++i) { 128 for (int i = 0; i < kNamespaceCount; ++i) {
126 EXPECT_EQ(0u, this->run_task_ids(i).size()); 129 EXPECT_EQ(0u, this->run_task_ids(i).size());
127 EXPECT_EQ(0u, this->on_task_completed_ids(i).size()); 130 EXPECT_EQ(0u, this->on_task_completed_ids(i).size());
128 131
129 this->ScheduleTasks(i, 132 this->ScheduleTasks(
130 std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 0u, 0u))); 133 i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 0u, 0u, 0u)));
131 } 134 }
132 135
133 for (int i = 0; i < kNamespaceCount; ++i) { 136 for (int i = 0; i < kNamespaceCount; ++i) {
134 this->RunAllTasks(i); 137 this->RunAllTasks(i);
135 138
136 EXPECT_EQ(1u, this->run_task_ids(i).size()); 139 EXPECT_EQ(1u, this->run_task_ids(i).size());
137 EXPECT_EQ(1u, this->on_task_completed_ids(i).size()); 140 EXPECT_EQ(1u, this->on_task_completed_ids(i).size());
138 } 141 }
139 142
140 for (int i = 0; i < kNamespaceCount; ++i) 143 for (int i = 0; i < kNamespaceCount; ++i)
141 this->ScheduleTasks(i, 144 this->ScheduleTasks(
142 std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 1u, 0u))); 145 i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 1u, 0u, 0u)));
143 146
144 for (int i = 0; i < kNamespaceCount; ++i) { 147 for (int i = 0; i < kNamespaceCount; ++i) {
145 this->RunAllTasks(i); 148 this->RunAllTasks(i);
146 149
147 EXPECT_EQ(3u, this->run_task_ids(i).size()); 150 EXPECT_EQ(3u, this->run_task_ids(i).size());
148 EXPECT_EQ(2u, this->on_task_completed_ids(i).size()); 151 EXPECT_EQ(2u, this->on_task_completed_ids(i).size());
149 } 152 }
150 153
151 for (int i = 0; i < kNamespaceCount; ++i) 154 for (int i = 0; i < kNamespaceCount; ++i)
152 this->ScheduleTasks(i, 155 this->ScheduleTasks(
153 std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 2u, 0u))); 156 i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 2u, 0u, 0u)));
154 157
155 for (int i = 0; i < kNamespaceCount; ++i) { 158 for (int i = 0; i < kNamespaceCount; ++i) {
156 this->RunAllTasks(i); 159 this->RunAllTasks(i);
157 160
158 EXPECT_EQ(6u, this->run_task_ids(i).size()); 161 EXPECT_EQ(6u, this->run_task_ids(i).size());
159 EXPECT_EQ(3u, this->on_task_completed_ids(i).size()); 162 EXPECT_EQ(3u, this->on_task_completed_ids(i).size());
160 } 163 }
161 } 164 }
162 165
163 TYPED_TEST_P(TaskGraphRunnerTest, Dependencies) { 166 TYPED_TEST_P(TaskGraphRunnerTest, Dependencies) {
164 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; 167 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount;
165 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; 168 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo;
166 169
167 for (int i = 0; i < kNamespaceCount; ++i) { 170 for (int i = 0; i < kNamespaceCount; ++i) {
168 this->ScheduleTasks(i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 1u, 171 this->ScheduleTasks(i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 1u,
169 1u, // 1 dependent 172 1u, // 1 dependent
170 0u))); 173 0u, 0u)));
171 } 174 }
172 175
173 for (int i = 0; i < kNamespaceCount; ++i) { 176 for (int i = 0; i < kNamespaceCount; ++i) {
174 this->RunAllTasks(i); 177 this->RunAllTasks(i);
175 178
176 // Check if task ran before dependent. 179 // Check if task ran before dependent.
177 ASSERT_EQ(2u, this->run_task_ids(i).size()); 180 ASSERT_EQ(2u, this->run_task_ids(i).size());
178 EXPECT_EQ(0u, this->run_task_ids(i)[0]); 181 EXPECT_EQ(0u, this->run_task_ids(i)[0]);
179 EXPECT_EQ(1u, this->run_task_ids(i)[1]); 182 EXPECT_EQ(1u, this->run_task_ids(i)[1]);
180 ASSERT_EQ(1u, this->on_task_completed_ids(i).size()); 183 ASSERT_EQ(1u, this->on_task_completed_ids(i).size());
181 EXPECT_EQ(0u, this->on_task_completed_ids(i)[0]); 184 EXPECT_EQ(0u, this->on_task_completed_ids(i)[0]);
182 } 185 }
183 186
184 for (int i = 0; i < kNamespaceCount; ++i) { 187 for (int i = 0; i < kNamespaceCount; ++i) {
185 this->ScheduleTasks(i, 188 this->ScheduleTasks(i,
186 std::vector<TaskInfo>(1, TaskInfo(i, 2u, 3u, 189 std::vector<TaskInfo>(1, TaskInfo(i, 2u, 3u,
187 2u, // 2 dependents 190 2u, // 2 dependents
188 0u))); 191 0u, 0u)));
189 } 192 }
190 193
191 for (int i = 0; i < kNamespaceCount; ++i) { 194 for (int i = 0; i < kNamespaceCount; ++i) {
192 this->RunAllTasks(i); 195 this->RunAllTasks(i);
193 196
194 // Task should only run once. 197 // Task should only run once.
195 ASSERT_EQ(5u, this->run_task_ids(i).size()); 198 ASSERT_EQ(5u, this->run_task_ids(i).size());
196 EXPECT_EQ(2u, this->run_task_ids(i)[2]); 199 EXPECT_EQ(2u, this->run_task_ids(i)[2]);
197 EXPECT_EQ(3u, this->run_task_ids(i)[3]); 200 EXPECT_EQ(3u, this->run_task_ids(i)[3]);
198 EXPECT_EQ(3u, this->run_task_ids(i)[4]); 201 EXPECT_EQ(3u, this->run_task_ids(i)[4]);
199 ASSERT_EQ(2u, this->on_task_completed_ids(i).size()); 202 ASSERT_EQ(2u, this->on_task_completed_ids(i).size());
200 EXPECT_EQ(2u, this->on_task_completed_ids(i)[1]); 203 EXPECT_EQ(2u, this->on_task_completed_ids(i)[1]);
201 } 204 }
202 } 205 }
203 206
204 REGISTER_TYPED_TEST_CASE_P(TaskGraphRunnerTest, Basic, Dependencies); 207 TYPED_TEST_P(TaskGraphRunnerTest, Groups) {
208 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount;
209 const unsigned kGroupCount = 3;
210 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo;
211
212 for (int i = 0; i < kNamespaceCount; ++i) {
213 EXPECT_EQ(0u, this->run_task_ids(i).size());
214 EXPECT_EQ(0u, this->on_task_completed_ids(i).size());
215 std::vector<TaskInfo> tasks;
216 for (unsigned j = 0; j < kGroupCount; ++j) {
217 tasks.emplace_back(i, 0u, 0u, 0u, j, 0u);
218 }
219 this->ScheduleTasks(i, tasks);
220 }
221
222 for (int i = 0; i < kNamespaceCount; ++i) {
223 this->RunAllTasks(i);
224
225 EXPECT_EQ(kGroupCount, this->run_task_ids(i).size());
226 EXPECT_EQ(kGroupCount, this->on_task_completed_ids(i).size());
227 }
228
229 for (int i = 0; i < kNamespaceCount; ++i) {
230 std::vector<TaskInfo> tasks;
231 for (unsigned j = 0; j < kGroupCount; ++j) {
232 tasks.emplace_back(i, 0u, 0u, 1u, j, 0u);
233 }
234 this->ScheduleTasks(i, tasks);
235 }
236
237 for (int i = 0; i < kNamespaceCount; ++i) {
238 this->RunAllTasks(i);
239
240 EXPECT_EQ(kGroupCount * 3u, this->run_task_ids(i).size());
241 EXPECT_EQ(kGroupCount * 2u, this->on_task_completed_ids(i).size());
242 }
243
244 for (int i = 0; i < kNamespaceCount; ++i) {
245 std::vector<TaskInfo> tasks;
246 for (unsigned j = 0; j < kGroupCount; ++j) {
247 tasks.emplace_back(i, 0u, 0u, 2u, j, 0u);
248 }
249 this->ScheduleTasks(i, tasks);
250 }
251
252 for (int i = 0; i < kNamespaceCount; ++i) {
253 this->RunAllTasks(i);
254
255 EXPECT_EQ(kGroupCount * 6u, this->run_task_ids(i).size());
256 EXPECT_EQ(kGroupCount * 3u, this->on_task_completed_ids(i).size());
257 }
258 }
259
260 REGISTER_TYPED_TEST_CASE_P(TaskGraphRunnerTest, Basic, Dependencies, Groups);
205 261
206 template <typename TaskRunnerTestDelegate> 262 template <typename TaskRunnerTestDelegate>
207 using SingleThreadTaskGraphRunnerTest = 263 using SingleThreadTaskGraphRunnerTest =
208 TaskGraphRunnerTest<TaskRunnerTestDelegate>; 264 TaskGraphRunnerTest<TaskRunnerTestDelegate>;
209 265
210 TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest); 266 TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest);
211 267
212 TYPED_TEST_P(SingleThreadTaskGraphRunnerTest, Priority) { 268 TYPED_TEST_P(SingleThreadTaskGraphRunnerTest, Priority) {
213 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; 269 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount;
214 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; 270 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo;
215 271
216 for (int i = 0; i < kNamespaceCount; ++i) { 272 for (int i = 0; i < kNamespaceCount; ++i) {
217 TaskInfo tasks[] = { 273 TaskInfo tasks[] = {
218 TaskInfo(i, 0u, 2u, 1u, 1u), // Priority 1 274 TaskInfo(i, 0u, 2u, 1u, 0u, 1u), // Priority 1
219 TaskInfo(i, 1u, 3u, 1u, 0u) // Priority 0 275 TaskInfo(i, 1u, 3u, 1u, 0u, 0u) // Priority 0
220 }; 276 };
221 this->ScheduleTasks(i, 277 this->ScheduleTasks(i,
222 std::vector<TaskInfo>(tasks, tasks + arraysize(tasks))); 278 std::vector<TaskInfo>(tasks, tasks + arraysize(tasks)));
223 } 279 }
224 280
225 for (int i = 0; i < kNamespaceCount; ++i) { 281 for (int i = 0; i < kNamespaceCount; ++i) {
226 this->RunAllTasks(i); 282 this->RunAllTasks(i);
227 283
228 // Check if tasks ran in order of priority. 284 // Check if tasks ran in order of priority.
229 ASSERT_EQ(4u, this->run_task_ids(i).size()); 285 ASSERT_EQ(4u, this->run_task_ids(i).size());
230 EXPECT_EQ(1u, this->run_task_ids(i)[0]); 286 EXPECT_EQ(1u, this->run_task_ids(i)[0]);
231 EXPECT_EQ(3u, this->run_task_ids(i)[1]); 287 EXPECT_EQ(3u, this->run_task_ids(i)[1]);
232 EXPECT_EQ(0u, this->run_task_ids(i)[2]); 288 EXPECT_EQ(0u, this->run_task_ids(i)[2]);
233 EXPECT_EQ(2u, this->run_task_ids(i)[3]); 289 EXPECT_EQ(2u, this->run_task_ids(i)[3]);
234 ASSERT_EQ(2u, this->on_task_completed_ids(i).size()); 290 ASSERT_EQ(2u, this->on_task_completed_ids(i).size());
235 EXPECT_EQ(1u, this->on_task_completed_ids(i)[0]); 291 EXPECT_EQ(1u, this->on_task_completed_ids(i)[0]);
236 EXPECT_EQ(0u, this->on_task_completed_ids(i)[1]); 292 EXPECT_EQ(0u, this->on_task_completed_ids(i)[1]);
237 } 293 }
238 } 294 }
239 295
240 REGISTER_TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest, Priority); 296 REGISTER_TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest, Priority);
241 297
242 } // namespace cc 298 } // namespace cc
243 299
244 #endif // CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_ 300 #endif // CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698