| 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 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 Loading... |
| 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_ |
| OLD | NEW |