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