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

Side by Side Diff: cc/resources/worker_pool_unittest.cc

Issue 73923003: Shared Raster Worker Threads (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change file mode + nit Created 6 years, 11 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "cc/resources/worker_pool.h" 5 #include "cc/resources/worker_pool.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "cc/base/completion_event.h" 9 #include "cc/base/completion_event.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 11
12 namespace cc { 12 namespace cc {
13 13
14 namespace { 14 namespace {
15 15
16 const int kWorkerPoolCount = 3;
17
16 class FakeWorkerPoolTaskImpl : public internal::WorkerPoolTask { 18 class FakeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
17 public: 19 public:
18 FakeWorkerPoolTaskImpl(const base::Closure& callback, 20 FakeWorkerPoolTaskImpl(const base::Closure& callback,
19 const base::Closure& reply) 21 const base::Closure& reply)
20 : callback_(callback), 22 : callback_(callback),
21 reply_(reply) { 23 reply_(reply) {
22 } 24 }
23 25
24 // Overridden from internal::WorkerPoolTask: 26 // Overridden from internal::WorkerPoolTask:
25 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { 27 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
(...skipping 27 matching lines...) Expand all
53 dependent_count(dependent_count), 55 dependent_count(dependent_count),
54 priority(priority) { 56 priority(priority) {
55 } 57 }
56 58
57 base::Closure callback; 59 base::Closure callback;
58 base::Closure reply; 60 base::Closure reply;
59 base::Closure dependent; 61 base::Closure dependent;
60 unsigned dependent_count; 62 unsigned dependent_count;
61 unsigned priority; 63 unsigned priority;
62 }; 64 };
63 FakeWorkerPool() : WorkerPool(1, "test") {} 65 FakeWorkerPool() : WorkerPool() {}
64 virtual ~FakeWorkerPool() {} 66 virtual ~FakeWorkerPool() {}
65 67
66 static scoped_ptr<FakeWorkerPool> Create() { 68 static scoped_ptr<FakeWorkerPool> Create() {
67 return make_scoped_ptr(new FakeWorkerPool); 69 return make_scoped_ptr(new FakeWorkerPool);
68 } 70 }
69 71
70 void ScheduleTasks(const std::vector<Task>& tasks) { 72 void ScheduleTasks(const std::vector<Task>& tasks) {
71 TaskVector new_tasks; 73 TaskVector new_tasks;
72 TaskVector new_dependents; 74 TaskVector new_dependents;
73 TaskGraph new_graph; 75 TaskGraph new_graph;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 DISALLOW_COPY_AND_ASSIGN(FakeWorkerPool); 139 DISALLOW_COPY_AND_ASSIGN(FakeWorkerPool);
138 }; 140 };
139 141
140 class WorkerPoolTest : public testing::Test { 142 class WorkerPoolTest : public testing::Test {
141 public: 143 public:
142 WorkerPoolTest() {} 144 WorkerPoolTest() {}
143 virtual ~WorkerPoolTest() {} 145 virtual ~WorkerPoolTest() {}
144 146
145 // Overridden from testing::Test: 147 // Overridden from testing::Test:
146 virtual void SetUp() OVERRIDE { 148 virtual void SetUp() OVERRIDE {
147 worker_pool_ = FakeWorkerPool::Create(); 149 for (int i = 0; i < kWorkerPoolCount; ++i)
150 worker_pools_[i] = FakeWorkerPool::Create();
148 } 151 }
149 virtual void TearDown() OVERRIDE { 152 virtual void TearDown() OVERRIDE {
150 worker_pool_->Shutdown(); 153 for (int i = 0; i < kWorkerPoolCount; ++i) {
151 worker_pool_->CheckForCompletedTasks(); 154 worker_pools_[i]->Shutdown();
152 } 155 worker_pools_[i]->CheckForCompletedTasks();
153 156 }
154 void ResetIds() { 157 }
155 run_task_ids_.clear(); 158
156 on_task_completed_ids_.clear(); 159 void ResetAllIdsforWorkerPool(int worker_pool_index) {
157 } 160 run_task_ids_[worker_pool_index].clear();
158 161 on_task_completed_ids_[worker_pool_index].clear();
159 void RunAllTasks() { 162 }
160 worker_pool_->WaitForTasksToComplete(); 163
161 worker_pool_->CheckForCompletedTasks(); 164 void RunAllTasksforWorkerPool(int worker_pool_index) {
162 } 165 worker_pools_[worker_pool_index]->WaitForTasksToComplete();
163 166 worker_pools_[worker_pool_index]->CheckForCompletedTasks();
164 FakeWorkerPool* worker_pool() { 167 }
165 return worker_pool_.get(); 168
166 } 169 FakeWorkerPool* worker_pool(int worker_pool_index) {
167 170 return worker_pools_[worker_pool_index].get();
168 void RunTask(unsigned id) { 171 }
169 run_task_ids_.push_back(id); 172
170 } 173 void RunTask(int worker_pool_index, unsigned id) {
171 174 run_task_ids_[worker_pool_index].push_back(id);
172 void OnTaskCompleted(unsigned id) { 175 }
173 on_task_completed_ids_.push_back(id); 176
174 } 177 void OnTaskCompleted(int worker_pool_index, unsigned id) {
175 178 on_task_completed_ids_[worker_pool_index].push_back(id);
176 const std::vector<unsigned>& run_task_ids() { 179 }
177 return run_task_ids_; 180
178 } 181 const std::vector<unsigned>& run_task_ids(int worker_pool_index) {
179 182 return run_task_ids_[worker_pool_index];
180 const std::vector<unsigned>& on_task_completed_ids() { 183 }
181 return on_task_completed_ids_; 184
185 const std::vector<unsigned>& on_task_completed_ids(int worker_pool_index) {
186 return on_task_completed_ids_[worker_pool_index];
182 } 187 }
183 188
184 private: 189 private:
185 scoped_ptr<FakeWorkerPool> worker_pool_; 190 scoped_ptr<FakeWorkerPool> worker_pools_[kWorkerPoolCount];
186 std::vector<unsigned> run_task_ids_; 191 std::vector<unsigned> run_task_ids_[kWorkerPoolCount];
187 std::vector<unsigned> on_task_completed_ids_; 192 std::vector<unsigned> on_task_completed_ids_[kWorkerPoolCount];
188 }; 193 };
189 194
190 TEST_F(WorkerPoolTest, Basic) { 195 TEST_F(WorkerPoolTest, Basic) {
191 EXPECT_EQ(0u, run_task_ids().size()); 196 for (int i = 0; i < kWorkerPoolCount; ++i) {
192 EXPECT_EQ(0u, on_task_completed_ids().size()); 197 EXPECT_EQ(0u, run_task_ids(i).size());
193 198 EXPECT_EQ(0u, on_task_completed_ids(i).size());
194 worker_pool()->ScheduleTasks( 199
195 std::vector<FakeWorkerPool::Task>( 200 worker_pool(i)->ScheduleTasks(
196 1, 201 std::vector<FakeWorkerPool::Task>(
197 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 202 1,
198 base::Unretained(this), 203 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
199 0u), 204 base::Unretained(this),
200 base::Bind(&WorkerPoolTest::OnTaskCompleted, 205 i,
201 base::Unretained(this), 206 0u),
202 0u), 207 base::Bind(&WorkerPoolTest::OnTaskCompleted,
203 base::Closure(), 208 base::Unretained(this),
204 1u, 209 i,
205 0u))); 210 0u),
206 RunAllTasks(); 211 base::Closure(),
207 212 1u,
208 EXPECT_EQ(1u, run_task_ids().size()); 213 0u)));
209 EXPECT_EQ(1u, on_task_completed_ids().size()); 214 }
210 215
211 worker_pool()->ScheduleTasks( 216 for (int i = 0; i < kWorkerPoolCount; ++i) {
212 std::vector<FakeWorkerPool::Task>( 217 RunAllTasksforWorkerPool(i);
213 1, 218
214 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 219 EXPECT_EQ(1u, run_task_ids(i).size());
215 base::Unretained(this), 220 EXPECT_EQ(1u, on_task_completed_ids(i).size());
216 0u), 221 }
217 base::Bind(&WorkerPoolTest::OnTaskCompleted, 222
218 base::Unretained(this), 223 for (int i = 0; i < kWorkerPoolCount; ++i) {
219 0u), 224 worker_pool(i)->ScheduleTasks(
220 base::Bind(&WorkerPoolTest::RunTask, 225 std::vector<FakeWorkerPool::Task>(
221 base::Unretained(this), 226 1,
222 0u), 227 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
223 1u, 228 base::Unretained(this),
224 0u))); 229 i,
225 RunAllTasks(); 230 0u),
226 231 base::Bind(&WorkerPoolTest::OnTaskCompleted,
227 EXPECT_EQ(3u, run_task_ids().size()); 232 base::Unretained(this),
228 EXPECT_EQ(2u, on_task_completed_ids().size()); 233 i,
229 234 0u),
230 worker_pool()->ScheduleTasks( 235 base::Bind(&WorkerPoolTest::RunTask,
231 std::vector<FakeWorkerPool::Task>( 236 base::Unretained(this),
232 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 237 i,
233 base::Unretained(this), 238 0u),
234 0u), 239 1u,
235 base::Bind(&WorkerPoolTest::OnTaskCompleted, 240 0u)));
236 base::Unretained(this), 241 }
237 0u), 242
238 base::Bind(&WorkerPoolTest::RunTask, 243 for (int i = 0; i < kWorkerPoolCount; ++i) {
239 base::Unretained(this), 244 RunAllTasksforWorkerPool(i);
240 0u), 245
241 2u, 246 EXPECT_EQ(3u, run_task_ids(i).size());
242 0u))); 247 EXPECT_EQ(2u, on_task_completed_ids(i).size());
243 RunAllTasks(); 248 }
244 249
245 EXPECT_EQ(6u, run_task_ids().size()); 250 for (int i = 0; i < kWorkerPoolCount; ++i) {
246 EXPECT_EQ(3u, on_task_completed_ids().size()); 251 worker_pool(i)->ScheduleTasks(
252 std::vector<FakeWorkerPool::Task>(
253 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
254 base::Unretained(this),
255 i,
256 0u),
257 base::Bind(&WorkerPoolTest::OnTaskCompleted,
258 base::Unretained(this),
259 i,
260 0u),
261 base::Bind(&WorkerPoolTest::RunTask,
262 base::Unretained(this),
263 i,
264 0u),
265 2u,
266 0u)));
267 }
268
269 for (int i = 0; i < kWorkerPoolCount; ++i) {
270 RunAllTasksforWorkerPool(i);
271
272 EXPECT_EQ(6u, run_task_ids(i).size());
273 EXPECT_EQ(3u, on_task_completed_ids(i).size());
274 }
247 } 275 }
248 276
249 TEST_F(WorkerPoolTest, Dependencies) { 277 TEST_F(WorkerPoolTest, Dependencies) {
250 worker_pool()->ScheduleTasks( 278 for (int i = 0; i < kWorkerPoolCount; ++i) {
251 std::vector<FakeWorkerPool::Task>( 279 worker_pool(i)->ScheduleTasks(
252 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 280 std::vector<FakeWorkerPool::Task>(
253 base::Unretained(this), 281 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
254 0u), 282 base::Unretained(this),
255 base::Bind(&WorkerPoolTest::OnTaskCompleted, 283 i,
256 base::Unretained(this), 284 0u),
257 0u), 285 base::Bind(&WorkerPoolTest::OnTaskCompleted,
258 base::Bind(&WorkerPoolTest::RunTask, 286 base::Unretained(this),
259 base::Unretained(this), 287 i,
260 1u), 288 0u),
261 1u, 289 base::Bind(&WorkerPoolTest::RunTask,
262 0u))); 290 base::Unretained(this),
263 RunAllTasks(); 291 i,
264 292 1u),
265 // Check if task ran before dependent. 293 1u,
266 ASSERT_EQ(2u, run_task_ids().size()); 294 0u)));
267 EXPECT_EQ(0u, run_task_ids()[0]); 295 }
268 EXPECT_EQ(1u, run_task_ids()[1]); 296
269 ASSERT_EQ(1u, on_task_completed_ids().size()); 297 for (int i = 0; i < kWorkerPoolCount; ++i) {
270 EXPECT_EQ(0u, on_task_completed_ids()[0]); 298 RunAllTasksforWorkerPool(i);
271 299
272 worker_pool()->ScheduleTasks( 300 // Check if task ran before dependent.
273 std::vector<FakeWorkerPool::Task>( 301 ASSERT_EQ(2u, run_task_ids(i).size());
274 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 302 EXPECT_EQ(0u, run_task_ids(i)[0]);
275 base::Unretained(this), 303 EXPECT_EQ(1u, run_task_ids(i)[1]);
276 2u), 304 ASSERT_EQ(1u, on_task_completed_ids(i).size());
277 base::Bind(&WorkerPoolTest::OnTaskCompleted, 305 EXPECT_EQ(0u, on_task_completed_ids(i)[0]);
278 base::Unretained(this), 306 }
279 2u), 307
280 base::Bind(&WorkerPoolTest::RunTask, 308 for (int i = 0; i < kWorkerPoolCount; ++i) {
281 base::Unretained(this), 309 worker_pool(i)->ScheduleTasks(
282 3u), 310 std::vector<FakeWorkerPool::Task>(
283 2u, 311 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
284 0u))); 312 base::Unretained(this),
285 RunAllTasks(); 313 i,
286 314 2u),
287 // Task should only run once. 315 base::Bind(&WorkerPoolTest::OnTaskCompleted,
288 ASSERT_EQ(5u, run_task_ids().size()); 316 base::Unretained(this),
289 EXPECT_EQ(2u, run_task_ids()[2]); 317 i,
290 EXPECT_EQ(3u, run_task_ids()[3]); 318 2u),
291 EXPECT_EQ(3u, run_task_ids()[4]); 319 base::Bind(&WorkerPoolTest::RunTask,
292 ASSERT_EQ(2u, on_task_completed_ids().size()); 320 base::Unretained(this),
293 EXPECT_EQ(2u, on_task_completed_ids()[1]); 321 i,
322 3u),
323 2u,
324 0u)));
325 }
326
327 for (int i = 0; i < kWorkerPoolCount; ++i) {
328 RunAllTasksforWorkerPool(i);
329
330 // Task should only run once.
331 ASSERT_EQ(5u, run_task_ids(i).size());
332 EXPECT_EQ(2u, run_task_ids(i)[2]);
333 EXPECT_EQ(3u, run_task_ids(i)[3]);
334 EXPECT_EQ(3u, run_task_ids(i)[4]);
335 ASSERT_EQ(2u, on_task_completed_ids(i).size());
336 EXPECT_EQ(2u, on_task_completed_ids(i)[1]);
337 }
294 } 338 }
295 339
296 TEST_F(WorkerPoolTest, Priority) { 340 TEST_F(WorkerPoolTest, Priority) {
297 { 341 for (int i = 0; i < kWorkerPoolCount; ++i) {
298 FakeWorkerPool::Task tasks[] = { 342 FakeWorkerPool::Task tasks[] = {
299 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 343 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
300 base::Unretained(this), 344 base::Unretained(this),
345 i,
301 0u), 346 0u),
302 base::Bind(&WorkerPoolTest::OnTaskCompleted, 347 base::Bind(&WorkerPoolTest::OnTaskCompleted,
303 base::Unretained(this), 348 base::Unretained(this),
349 i,
304 0u), 350 0u),
305 base::Bind(&WorkerPoolTest::RunTask, 351 base::Bind(&WorkerPoolTest::RunTask,
306 base::Unretained(this), 352 base::Unretained(this),
353 i,
307 2u), 354 2u),
308 1u, 355 1u,
309 1u), // Priority 1 356 1u), // Priority 1
310 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 357 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
311 base::Unretained(this), 358 base::Unretained(this),
359 i,
312 1u), 360 1u),
313 base::Bind(&WorkerPoolTest::OnTaskCompleted, 361 base::Bind(&WorkerPoolTest::OnTaskCompleted,
314 base::Unretained(this), 362 base::Unretained(this),
363 i,
315 1u), 364 1u),
316 base::Bind(&WorkerPoolTest::RunTask, 365 base::Bind(&WorkerPoolTest::RunTask,
317 base::Unretained(this), 366 base::Unretained(this),
367 i,
318 3u), 368 3u),
319 1u, 369 1u,
320 0u) // Priority 0 370 0u) // Priority 0
321 }; 371 };
322 worker_pool()->ScheduleTasks( 372 worker_pool(i)->ScheduleTasks(
323 std::vector<FakeWorkerPool::Task>(tasks, tasks + arraysize(tasks))); 373 std::vector<FakeWorkerPool::Task>(tasks, tasks + arraysize(tasks)));
324 } 374 }
325 RunAllTasks(); 375
326 376 for (int i = 0; i < kWorkerPoolCount; ++i) {
327 // Check if tasks ran in order of priority. 377 RunAllTasksforWorkerPool(i);
328 ASSERT_EQ(4u, run_task_ids().size()); 378
329 EXPECT_EQ(1u, run_task_ids()[0]); 379 // Check if tasks ran in order of priority.
330 EXPECT_EQ(3u, run_task_ids()[1]); 380 ASSERT_EQ(4u, run_task_ids(i).size());
331 EXPECT_EQ(0u, run_task_ids()[2]); 381 EXPECT_EQ(1u, run_task_ids(i)[0]);
332 EXPECT_EQ(2u, run_task_ids()[3]); 382 EXPECT_EQ(3u, run_task_ids(i)[1]);
333 ASSERT_EQ(2u, on_task_completed_ids().size()); 383 EXPECT_EQ(0u, run_task_ids(i)[2]);
334 EXPECT_EQ(1u, on_task_completed_ids()[0]); 384 EXPECT_EQ(2u, run_task_ids(i)[3]);
335 EXPECT_EQ(0u, on_task_completed_ids()[1]); 385 ASSERT_EQ(2u, on_task_completed_ids(i).size());
336 386 EXPECT_EQ(1u, on_task_completed_ids(i)[0]);
337 ResetIds(); 387 EXPECT_EQ(0u, on_task_completed_ids(i)[1]);
338 { 388 }
389
390 for (int i = 0; i < kWorkerPoolCount; ++i)
391 ResetAllIdsforWorkerPool(i);
392
393 for (int i = 0; i < kWorkerPoolCount; ++i) {
339 std::vector<FakeWorkerPool::Task> tasks; 394 std::vector<FakeWorkerPool::Task> tasks;
340 tasks.push_back( 395 tasks.push_back(
341 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 396 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
342 base::Unretained(this), 397 base::Unretained(this),
398 i,
343 0u), 399 0u),
344 base::Bind(&WorkerPoolTest::OnTaskCompleted, 400 base::Bind(&WorkerPoolTest::OnTaskCompleted,
345 base::Unretained(this), 401 base::Unretained(this),
402 i,
346 0u), 403 0u),
347 base::Bind(&WorkerPoolTest::RunTask, 404 base::Bind(&WorkerPoolTest::RunTask,
348 base::Unretained(this), 405 base::Unretained(this),
406 i,
349 3u), 407 3u),
350 1u, // 1 dependent 408 1u, // 1 dependent
351 1u)); // Priority 1 409 1u)); // Priority 1
352 tasks.push_back( 410 tasks.push_back(
353 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 411 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
354 base::Unretained(this), 412 base::Unretained(this),
413 i,
355 1u), 414 1u),
356 base::Bind(&WorkerPoolTest::OnTaskCompleted, 415 base::Bind(&WorkerPoolTest::OnTaskCompleted,
357 base::Unretained(this), 416 base::Unretained(this),
417 i,
358 1u), 418 1u),
359 base::Bind(&WorkerPoolTest::RunTask, 419 base::Bind(&WorkerPoolTest::RunTask,
360 base::Unretained(this), 420 base::Unretained(this),
421 i,
361 4u), 422 4u),
362 2u, // 2 dependents 423 2u, // 2 dependents
363 1u)); // Priority 1 424 1u)); // Priority 1
364 tasks.push_back( 425 tasks.push_back(
365 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, 426 FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask,
366 base::Unretained(this), 427 base::Unretained(this),
428 i,
367 2u), 429 2u),
368 base::Bind(&WorkerPoolTest::OnTaskCompleted, 430 base::Bind(&WorkerPoolTest::OnTaskCompleted,
369 base::Unretained(this), 431 base::Unretained(this),
432 i,
370 2u), 433 2u),
371 base::Bind(&WorkerPoolTest::RunTask, 434 base::Bind(&WorkerPoolTest::RunTask,
372 base::Unretained(this), 435 base::Unretained(this),
436 i,
373 5u), 437 5u),
374 1u, // 1 dependent 438 1u, // 1 dependent
375 0u)); // Priority 0 439 0u)); // Priority 0
376 worker_pool()->ScheduleTasks(tasks); 440 worker_pool(i)->ScheduleTasks(tasks);
377 } 441 }
378 RunAllTasks(); 442
379 443 for (int i = 0; i < kWorkerPoolCount; ++i) {
380 // Check if tasks ran in order of priority and that task with more 444 RunAllTasksforWorkerPool(i);
381 // dependents ran first when priority is the same. 445
382 ASSERT_LE(3u, run_task_ids().size()); 446 // Check if tasks ran in order of priority and that task with more
383 EXPECT_EQ(2u, run_task_ids()[0]); 447 // dependents ran first when priority is the same.
384 EXPECT_EQ(5u, run_task_ids()[1]); 448 ASSERT_LE(3u, run_task_ids(i).size());
385 EXPECT_EQ(1u, run_task_ids()[2]); 449 EXPECT_EQ(2u, run_task_ids(i)[0]);
386 ASSERT_EQ(3u, on_task_completed_ids().size()); 450 EXPECT_EQ(5u, run_task_ids(i)[1]);
387 EXPECT_EQ(2u, on_task_completed_ids()[0]); 451 EXPECT_EQ(1u, run_task_ids(i)[2]);
388 EXPECT_EQ(1u, on_task_completed_ids()[1]); 452 ASSERT_EQ(3u, on_task_completed_ids(i).size());
389 EXPECT_EQ(0u, on_task_completed_ids()[2]); 453 EXPECT_EQ(2u, on_task_completed_ids(i)[0]);
454 EXPECT_EQ(1u, on_task_completed_ids(i)[1]);
455 EXPECT_EQ(0u, on_task_completed_ids(i)[2]);
456 }
390 } 457 }
391 458
392 } // namespace 459 } // namespace
393 460
394 } // namespace cc 461 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698