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 9 namespace base { 10 11 TestSimpleTaskRunner::TestSimpleTaskRunner() {} 12 13 TestSimpleTaskRunner::~TestSimpleTaskRunner() { 14 DCHECK(thread_checker_.CalledOnValidThread()); 15 } 16 17 bool 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 28 bool 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 39 bool TestSimpleTaskRunner::RunsTasksOnCurrentThread() const { 40 DCHECK(thread_checker_.CalledOnValidThread()); 41 return true; 42 } 43 44 const std::deque<TestPendingTask>& 45 TestSimpleTaskRunner::GetPendingTasks() const { 46 DCHECK(thread_checker_.CalledOnValidThread()); 47 return pending_tasks_; 48 } 49 50 bool TestSimpleTaskRunner::HasPendingTask() const { 51 DCHECK(thread_checker_.CalledOnValidThread()); 52 return !pending_tasks_.empty(); 53 } 54 55 base::TimeDelta TestSimpleTaskRunner::NextPendingTaskDelay() const { 56 DCHECK(thread_checker_.CalledOnValidThread()); 57 return pending_tasks_.front().GetTimeToRun() - base::TimeTicks(); 58 } 59 60 void TestSimpleTaskRunner::ClearPendingTasks() { 61 DCHECK(thread_checker_.CalledOnValidThread()); 62 pending_tasks_.clear(); 63 } 64 65 void 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 76 void TestSimpleTaskRunner::RunUntilIdle() { 77 while (!pending_tasks_.empty()) { 78 RunPendingTasks(); 79 } 80 } 81 82 } // namespace base 83