OLD | NEW |
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 category, | |
28 unsigned priority) | 27 unsigned priority) |
29 : namespace_index(namespace_index), | 28 : namespace_index(namespace_index), |
30 id(id), | 29 id(id), |
31 dependent_id(dependent_id), | 30 dependent_id(dependent_id), |
32 dependent_count(dependent_count), | 31 dependent_count(dependent_count), |
33 category(category), | |
34 priority(priority) {} | 32 priority(priority) {} |
35 | 33 |
36 int namespace_index; | 34 int namespace_index; |
37 unsigned id; | 35 unsigned id; |
38 unsigned dependent_id; | 36 unsigned dependent_id; |
39 unsigned dependent_count; | 37 unsigned dependent_count; |
40 unsigned category; | |
41 unsigned priority; | 38 unsigned priority; |
42 }; | 39 }; |
43 | 40 |
44 TaskGraphRunnerTestBase() {} | 41 TaskGraphRunnerTestBase() {} |
45 | 42 |
46 void SetTaskGraphRunner(TaskGraphRunner* task_graph_runner); | 43 void SetTaskGraphRunner(TaskGraphRunner* task_graph_runner); |
47 void ResetIds(int namespace_index); | 44 void ResetIds(int namespace_index); |
48 void RunAllTasks(int namespace_index); | 45 void RunAllTasks(int namespace_index); |
49 void RunTaskOnWorkerThread(int namespace_index, unsigned id); | 46 void RunTaskOnWorkerThread(int namespace_index, unsigned id); |
50 void OnTaskCompleted(int namespace_index, unsigned id); | 47 void OnTaskCompleted(int namespace_index, unsigned id); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 TYPED_TEST_CASE_P(TaskGraphRunnerTest); | 119 TYPED_TEST_CASE_P(TaskGraphRunnerTest); |
123 | 120 |
124 TYPED_TEST_P(TaskGraphRunnerTest, Basic) { | 121 TYPED_TEST_P(TaskGraphRunnerTest, Basic) { |
125 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; | 122 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; |
126 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; | 123 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; |
127 | 124 |
128 for (int i = 0; i < kNamespaceCount; ++i) { | 125 for (int i = 0; i < kNamespaceCount; ++i) { |
129 EXPECT_EQ(0u, this->run_task_ids(i).size()); | 126 EXPECT_EQ(0u, this->run_task_ids(i).size()); |
130 EXPECT_EQ(0u, this->on_task_completed_ids(i).size()); | 127 EXPECT_EQ(0u, this->on_task_completed_ids(i).size()); |
131 | 128 |
132 this->ScheduleTasks( | 129 this->ScheduleTasks(i, |
133 i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 0u, 0u, 0u))); | 130 std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 0u, 0u))); |
134 } | 131 } |
135 | 132 |
136 for (int i = 0; i < kNamespaceCount; ++i) { | 133 for (int i = 0; i < kNamespaceCount; ++i) { |
137 this->RunAllTasks(i); | 134 this->RunAllTasks(i); |
138 | 135 |
139 EXPECT_EQ(1u, this->run_task_ids(i).size()); | 136 EXPECT_EQ(1u, this->run_task_ids(i).size()); |
140 EXPECT_EQ(1u, this->on_task_completed_ids(i).size()); | 137 EXPECT_EQ(1u, this->on_task_completed_ids(i).size()); |
141 } | 138 } |
142 | 139 |
143 for (int i = 0; i < kNamespaceCount; ++i) | 140 for (int i = 0; i < kNamespaceCount; ++i) |
144 this->ScheduleTasks( | 141 this->ScheduleTasks(i, |
145 i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 1u, 0u, 0u))); | 142 std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 1u, 0u))); |
146 | 143 |
147 for (int i = 0; i < kNamespaceCount; ++i) { | 144 for (int i = 0; i < kNamespaceCount; ++i) { |
148 this->RunAllTasks(i); | 145 this->RunAllTasks(i); |
149 | 146 |
150 EXPECT_EQ(3u, this->run_task_ids(i).size()); | 147 EXPECT_EQ(3u, this->run_task_ids(i).size()); |
151 EXPECT_EQ(2u, this->on_task_completed_ids(i).size()); | 148 EXPECT_EQ(2u, this->on_task_completed_ids(i).size()); |
152 } | 149 } |
153 | 150 |
154 for (int i = 0; i < kNamespaceCount; ++i) | 151 for (int i = 0; i < kNamespaceCount; ++i) |
155 this->ScheduleTasks( | 152 this->ScheduleTasks(i, |
156 i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 2u, 0u, 0u))); | 153 std::vector<TaskInfo>(1, TaskInfo(i, 0u, 0u, 2u, 0u))); |
157 | 154 |
158 for (int i = 0; i < kNamespaceCount; ++i) { | 155 for (int i = 0; i < kNamespaceCount; ++i) { |
159 this->RunAllTasks(i); | 156 this->RunAllTasks(i); |
160 | 157 |
161 EXPECT_EQ(6u, this->run_task_ids(i).size()); | 158 EXPECT_EQ(6u, this->run_task_ids(i).size()); |
162 EXPECT_EQ(3u, this->on_task_completed_ids(i).size()); | 159 EXPECT_EQ(3u, this->on_task_completed_ids(i).size()); |
163 } | 160 } |
164 } | 161 } |
165 | 162 |
166 TYPED_TEST_P(TaskGraphRunnerTest, Dependencies) { | 163 TYPED_TEST_P(TaskGraphRunnerTest, Dependencies) { |
167 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; | 164 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; |
168 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; | 165 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; |
169 | 166 |
170 for (int i = 0; i < kNamespaceCount; ++i) { | 167 for (int i = 0; i < kNamespaceCount; ++i) { |
171 this->ScheduleTasks(i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 1u, | 168 this->ScheduleTasks(i, std::vector<TaskInfo>(1, TaskInfo(i, 0u, 1u, |
172 1u, // 1 dependent | 169 1u, // 1 dependent |
173 0u, 0u))); | 170 0u))); |
174 } | 171 } |
175 | 172 |
176 for (int i = 0; i < kNamespaceCount; ++i) { | 173 for (int i = 0; i < kNamespaceCount; ++i) { |
177 this->RunAllTasks(i); | 174 this->RunAllTasks(i); |
178 | 175 |
179 // Check if task ran before dependent. | 176 // Check if task ran before dependent. |
180 ASSERT_EQ(2u, this->run_task_ids(i).size()); | 177 ASSERT_EQ(2u, this->run_task_ids(i).size()); |
181 EXPECT_EQ(0u, this->run_task_ids(i)[0]); | 178 EXPECT_EQ(0u, this->run_task_ids(i)[0]); |
182 EXPECT_EQ(1u, this->run_task_ids(i)[1]); | 179 EXPECT_EQ(1u, this->run_task_ids(i)[1]); |
183 ASSERT_EQ(1u, this->on_task_completed_ids(i).size()); | 180 ASSERT_EQ(1u, this->on_task_completed_ids(i).size()); |
184 EXPECT_EQ(0u, this->on_task_completed_ids(i)[0]); | 181 EXPECT_EQ(0u, this->on_task_completed_ids(i)[0]); |
185 } | 182 } |
186 | 183 |
187 for (int i = 0; i < kNamespaceCount; ++i) { | 184 for (int i = 0; i < kNamespaceCount; ++i) { |
188 this->ScheduleTasks(i, | 185 this->ScheduleTasks(i, |
189 std::vector<TaskInfo>(1, TaskInfo(i, 2u, 3u, | 186 std::vector<TaskInfo>(1, TaskInfo(i, 2u, 3u, |
190 2u, // 2 dependents | 187 2u, // 2 dependents |
191 0u, 0u))); | 188 0u))); |
192 } | 189 } |
193 | 190 |
194 for (int i = 0; i < kNamespaceCount; ++i) { | 191 for (int i = 0; i < kNamespaceCount; ++i) { |
195 this->RunAllTasks(i); | 192 this->RunAllTasks(i); |
196 | 193 |
197 // Task should only run once. | 194 // Task should only run once. |
198 ASSERT_EQ(5u, this->run_task_ids(i).size()); | 195 ASSERT_EQ(5u, this->run_task_ids(i).size()); |
199 EXPECT_EQ(2u, this->run_task_ids(i)[2]); | 196 EXPECT_EQ(2u, this->run_task_ids(i)[2]); |
200 EXPECT_EQ(3u, this->run_task_ids(i)[3]); | 197 EXPECT_EQ(3u, this->run_task_ids(i)[3]); |
201 EXPECT_EQ(3u, this->run_task_ids(i)[4]); | 198 EXPECT_EQ(3u, this->run_task_ids(i)[4]); |
202 ASSERT_EQ(2u, this->on_task_completed_ids(i).size()); | 199 ASSERT_EQ(2u, this->on_task_completed_ids(i).size()); |
203 EXPECT_EQ(2u, this->on_task_completed_ids(i)[1]); | 200 EXPECT_EQ(2u, this->on_task_completed_ids(i)[1]); |
204 } | 201 } |
205 } | 202 } |
206 | 203 |
207 TYPED_TEST_P(TaskGraphRunnerTest, Categorys) { | 204 REGISTER_TYPED_TEST_CASE_P(TaskGraphRunnerTest, Basic, Dependencies); |
208 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; | |
209 const unsigned kCategoryCount = 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 < kCategoryCount; ++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(kCategoryCount, this->run_task_ids(i).size()); | |
226 EXPECT_EQ(kCategoryCount, 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 < kCategoryCount; ++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(kCategoryCount * 3u, this->run_task_ids(i).size()); | |
241 EXPECT_EQ(kCategoryCount * 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 < kCategoryCount; ++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(kCategoryCount * 6u, this->run_task_ids(i).size()); | |
256 EXPECT_EQ(kCategoryCount * 3u, this->on_task_completed_ids(i).size()); | |
257 } | |
258 } | |
259 | |
260 REGISTER_TYPED_TEST_CASE_P(TaskGraphRunnerTest, Basic, Dependencies, Categorys); | |
261 | 205 |
262 template <typename TaskRunnerTestDelegate> | 206 template <typename TaskRunnerTestDelegate> |
263 using SingleThreadTaskGraphRunnerTest = | 207 using SingleThreadTaskGraphRunnerTest = |
264 TaskGraphRunnerTest<TaskRunnerTestDelegate>; | 208 TaskGraphRunnerTest<TaskRunnerTestDelegate>; |
265 | 209 |
266 TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest); | 210 TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest); |
267 | 211 |
268 TYPED_TEST_P(SingleThreadTaskGraphRunnerTest, Priority) { | 212 TYPED_TEST_P(SingleThreadTaskGraphRunnerTest, Priority) { |
269 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; | 213 const int kNamespaceCount = TaskGraphRunnerTestBase::kNamespaceCount; |
270 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; | 214 using TaskInfo = TaskGraphRunnerTestBase::TaskInfo; |
271 | 215 |
272 for (int i = 0; i < kNamespaceCount; ++i) { | 216 for (int i = 0; i < kNamespaceCount; ++i) { |
273 TaskInfo tasks[] = { | 217 TaskInfo tasks[] = { |
274 TaskInfo(i, 0u, 2u, 1u, 0u, 1u), // Priority 1 | 218 TaskInfo(i, 0u, 2u, 1u, 1u), // Priority 1 |
275 TaskInfo(i, 1u, 3u, 1u, 0u, 0u) // Priority 0 | 219 TaskInfo(i, 1u, 3u, 1u, 0u) // Priority 0 |
276 }; | 220 }; |
277 this->ScheduleTasks(i, | 221 this->ScheduleTasks(i, |
278 std::vector<TaskInfo>(tasks, tasks + arraysize(tasks))); | 222 std::vector<TaskInfo>(tasks, tasks + arraysize(tasks))); |
279 } | 223 } |
280 | 224 |
281 for (int i = 0; i < kNamespaceCount; ++i) { | 225 for (int i = 0; i < kNamespaceCount; ++i) { |
282 this->RunAllTasks(i); | 226 this->RunAllTasks(i); |
283 | 227 |
284 // Check if tasks ran in order of priority. | 228 // Check if tasks ran in order of priority. |
285 ASSERT_EQ(4u, this->run_task_ids(i).size()); | 229 ASSERT_EQ(4u, this->run_task_ids(i).size()); |
286 EXPECT_EQ(1u, this->run_task_ids(i)[0]); | 230 EXPECT_EQ(1u, this->run_task_ids(i)[0]); |
287 EXPECT_EQ(3u, this->run_task_ids(i)[1]); | 231 EXPECT_EQ(3u, this->run_task_ids(i)[1]); |
288 EXPECT_EQ(0u, this->run_task_ids(i)[2]); | 232 EXPECT_EQ(0u, this->run_task_ids(i)[2]); |
289 EXPECT_EQ(2u, this->run_task_ids(i)[3]); | 233 EXPECT_EQ(2u, this->run_task_ids(i)[3]); |
290 ASSERT_EQ(2u, this->on_task_completed_ids(i).size()); | 234 ASSERT_EQ(2u, this->on_task_completed_ids(i).size()); |
291 EXPECT_EQ(1u, this->on_task_completed_ids(i)[0]); | 235 EXPECT_EQ(1u, this->on_task_completed_ids(i)[0]); |
292 EXPECT_EQ(0u, this->on_task_completed_ids(i)[1]); | 236 EXPECT_EQ(0u, this->on_task_completed_ids(i)[1]); |
293 } | 237 } |
294 } | 238 } |
295 | 239 |
296 REGISTER_TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest, Priority); | 240 REGISTER_TYPED_TEST_CASE_P(SingleThreadTaskGraphRunnerTest, Priority); |
297 | 241 |
298 } // namespace cc | 242 } // namespace cc |
299 | 243 |
300 #endif // CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_ | 244 #endif // CC_TEST_TASK_GRAPH_RUNNER_TEST_TEMPLATE_H_ |
OLD | NEW |