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