1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/test/test_simple_task_runner.h"
6
7#include "base/logging.h"
8
9namespace base {
10
11TestSimpleTaskRunner::TestSimpleTaskRunner() {}
12
13TestSimpleTaskRunner::~TestSimpleTaskRunner() {
14  DCHECK(thread_checker_.CalledOnValidThread());
15}
16
17bool TestSimpleTaskRunner::PostDelayedTask(
18    const tracked_objects::Location& from_here,
19    const Closure& task,
20    TimeDelta delay) {
21  DCHECK(thread_checker_.CalledOnValidThread());
22  pending_tasks_.push_back(
23      TestPendingTask(from_here, task, TimeTicks(), delay,
24                      TestPendingTask::NESTABLE));
25  return true;
26}
27
28bool TestSimpleTaskRunner::PostNonNestableDelayedTask(
29    const tracked_objects::Location& from_here,
30    const Closure& task,
31    TimeDelta delay) {
32  DCHECK(thread_checker_.CalledOnValidThread());
33  pending_tasks_.push_back(
34      TestPendingTask(from_here, task, TimeTicks(), delay,
35                      TestPendingTask::NON_NESTABLE));
36  return true;
37}
38
39bool TestSimpleTaskRunner::RunsTasksOnCurrentThread() const {
40  DCHECK(thread_checker_.CalledOnValidThread());
41  return true;
42}
43
44const std::deque<TestPendingTask>&
45TestSimpleTaskRunner::GetPendingTasks() const {
46  DCHECK(thread_checker_.CalledOnValidThread());
47  return pending_tasks_;
48}
49
50bool TestSimpleTaskRunner::HasPendingTask() const {
51  DCHECK(thread_checker_.CalledOnValidThread());
52  return !pending_tasks_.empty();
53}
54
55base::TimeDelta TestSimpleTaskRunner::NextPendingTaskDelay() const {
56  DCHECK(thread_checker_.CalledOnValidThread());
57  return pending_tasks_.front().GetTimeToRun() - base::TimeTicks();
58}
59
60void TestSimpleTaskRunner::ClearPendingTasks() {
61  DCHECK(thread_checker_.CalledOnValidThread());
62  pending_tasks_.clear();
63}
64
65void TestSimpleTaskRunner::RunPendingTasks() {
66  DCHECK(thread_checker_.CalledOnValidThread());
67  // Swap with a local variable to avoid re-entrancy problems.
68  std::deque<TestPendingTask> tasks_to_run;
69  tasks_to_run.swap(pending_tasks_);
70  for (std::deque<TestPendingTask>::iterator it = tasks_to_run.begin();
71       it != tasks_to_run.end(); ++it) {
72    it->task.Run();
73  }
74}
75
76void TestSimpleTaskRunner::RunUntilIdle() {
77  while (!pending_tasks_.empty()) {
78    RunPendingTasks();
79  }
80}
81
82}  // namespace base
83