// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/test/task_runner_test_template.h"

namespace base {

namespace test {

TaskTracker::TaskTracker() : task_runs_(0), task_runs_cv_(&lock_) {}

TaskTracker::~TaskTracker() = default;

Closure TaskTracker::WrapTask(const Closure& task, int i) {
  return Bind(&TaskTracker::RunTask, this, task, i);
}

void TaskTracker::RunTask(const Closure& task, int i) {
  AutoLock lock(lock_);
  if (!task.is_null()) {
    task.Run();
  }
  ++task_run_counts_[i];
  ++task_runs_;
  task_runs_cv_.Signal();
}

std::map<int, int> TaskTracker::GetTaskRunCounts() const {
  AutoLock lock(lock_);
  return task_run_counts_;
}

void TaskTracker::WaitForCompletedTasks(int count) {
  AutoLock lock(lock_);
  while (task_runs_ < count)
    task_runs_cv_.Wait();
}

void ExpectRunsTasksInCurrentSequence(bool expected_value,
                                      TaskRunner* task_runner) {
  EXPECT_EQ(expected_value, task_runner->RunsTasksInCurrentSequence());
}

}  // namespace test

}  // namespace base
