15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/task_runner_test_template.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TaskTracker::TaskTracker() : task_runs_(0), task_runs_cv_(&lock_) {}
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TaskTracker::~TaskTracker() {}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure TaskTracker::WrapTask(const Closure& task, int i) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Bind(&TaskTracker::RunTask, this, task, i);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskTracker::RunTask(const Closure& task, int i) {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutoLock lock(lock_);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!task.is_null()) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task.Run();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++task_run_counts_[i];
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++task_runs_;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  task_runs_cv_.Signal();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::map<int, int> TaskTracker::GetTaskRunCounts() const {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutoLock lock(lock_);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return task_run_counts_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TaskTracker::WaitForCompletedTasks(int count) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutoLock lock(lock_);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (task_runs_ < count)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    task_runs_cv_.Wait();
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectRunsTasksOnCurrentThread(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool expected_value,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<TaskRunner>& task_runner) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_value, task_runner->RunsTasksOnCurrentThread());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
49