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)#ifndef BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <deque>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/single_thread_task_runner.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_pending_task.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_checker.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class TimeDelta;
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TestSimpleTaskRunner is a simple TaskRunner implementation that can
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be used for testing.  It implements SingleThreadTaskRunner as that
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// interface implements SequencedTaskRunner, which in turn implements
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TaskRunner, so TestSimpleTaskRunner can be passed in to a function
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that accepts any *TaskRunner object.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TestSimpleTaskRunner has the following properties which make it simple:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   - It is non-thread safe; all member functions must be called on
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     the same thread.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   - Tasks are simply stored in a queue in FIFO order, ignoring delay
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     and nestability.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   - Tasks aren't guaranteed to be destroyed immediately after
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     they're run.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// However, TestSimpleTaskRunner allows for reentrancy, in that it
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// handles the running of tasks that in turn call back into itself
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (e.g., to post more tasks).
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If you need more complicated properties, consider using this class
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as a template for writing a test TaskRunner implementation using
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TestPendingTask.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note that, like any TaskRunner, TestSimpleTaskRunner is
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ref-counted.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestSimpleTaskRunner : public SingleThreadTaskRunner {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestSimpleTaskRunner();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SingleThreadTaskRunner implementation.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const Closure& task,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               TimeDelta delay) OVERRIDE;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PostNonNestableDelayedTask(
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const tracked_objects::Location& from_here,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const Closure& task,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TimeDelta delay) OVERRIDE;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::deque<TestPendingTask>& GetPendingTasks() const;
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool HasPendingTask() const;
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeDelta NextPendingTaskDelay() const;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears the queue of pending tasks without running them.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ClearPendingTasks();
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Runs each current pending task in order and clears the queue.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Any tasks posted by the tasks are not run.
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void RunPendingTasks();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Runs pending tasks until the queue is empty.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunUntilIdle();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestSimpleTaskRunner();
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::deque<TestPendingTask> pending_tasks_;
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ThreadChecker thread_checker_;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestSimpleTaskRunner);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_
87