12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_simple_task_runner.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestSimpleTaskRunner::TestSimpleTaskRunner() {}
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestSimpleTaskRunner::~TestSimpleTaskRunner() {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestSimpleTaskRunner::PostDelayedTask(
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Closure& task,
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TimeDelta delay) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_tasks_.push_back(
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestPendingTask(from_here, task, TimeTicks(), delay,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      TestPendingTask::NESTABLE));
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestSimpleTaskRunner::PostNonNestableDelayedTask(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const tracked_objects::Location& from_here,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Closure& task,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TimeDelta delay) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_tasks_.push_back(
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestPendingTask(from_here, task, TimeTicks(), delay,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      TestPendingTask::NON_NESTABLE));
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestSimpleTaskRunner::RunsTasksOnCurrentThread() const {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::deque<TestPendingTask>&
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestSimpleTaskRunner::GetPendingTasks() const {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return pending_tasks_;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool TestSimpleTaskRunner::HasPendingTask() const {
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return !pending_tasks_.empty();
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::TimeDelta TestSimpleTaskRunner::NextPendingTaskDelay() const {
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return pending_tasks_.front().GetTimeToRun() - base::TimeTicks();
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestSimpleTaskRunner::ClearPendingTasks() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_tasks_.clear();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestSimpleTaskRunner::RunPendingTasks() {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Swap with a local variable to avoid re-entrancy problems.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::deque<TestPendingTask> tasks_to_run;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tasks_to_run.swap(pending_tasks_);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::deque<TestPendingTask>::iterator it = tasks_to_run.begin();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != tasks_to_run.end(); ++it) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    it->task.Run();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestSimpleTaskRunner::RunUntilIdle() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!pending_tasks_.empty()) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunPendingTasks();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
83