| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_ | 
 | #define BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_ | 
 |  | 
 | #include "base/callback.h" | 
 | #include "base/compiler_specific.h" | 
 | #include "base/containers/circular_deque.h" | 
 | #include "base/macros.h" | 
 | #include "base/single_thread_task_runner.h" | 
 | #include "base/synchronization/lock.h" | 
 | #include "base/test/test_pending_task.h" | 
 | #include "base/threading/platform_thread.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | class TimeDelta; | 
 |  | 
 | // TestSimpleTaskRunner is a simple TaskRunner implementation that can | 
 | // be used for testing.  It implements SingleThreadTaskRunner as that | 
 | // interface implements SequencedTaskRunner, which in turn implements | 
 | // TaskRunner, so TestSimpleTaskRunner can be passed in to a function | 
 | // that accepts any *TaskRunner object. | 
 | // | 
 | // TestSimpleTaskRunner has the following properties which make it simple: | 
 | // | 
 | //   - Tasks are simply stored in a queue in FIFO order, ignoring delay | 
 | //     and nestability. | 
 | //   - Tasks aren't guaranteed to be destroyed immediately after | 
 | //     they're run. | 
 | // | 
 | // However, TestSimpleTaskRunner allows for reentrancy, in that it | 
 | // handles the running of tasks that in turn call back into itself | 
 | // (e.g., to post more tasks). | 
 | // | 
 | // Note that, like any TaskRunner, TestSimpleTaskRunner is | 
 | // ref-counted. | 
 | class TestSimpleTaskRunner : public SingleThreadTaskRunner { | 
 |  public: | 
 |   TestSimpleTaskRunner(); | 
 |  | 
 |   // SingleThreadTaskRunner implementation. | 
 |   bool PostDelayedTask(const Location& from_here, | 
 |                        OnceClosure task, | 
 |                        TimeDelta delay) override; | 
 |   bool PostNonNestableDelayedTask(const Location& from_here, | 
 |                                   OnceClosure task, | 
 |                                   TimeDelta delay) override; | 
 |  | 
 |   bool RunsTasksInCurrentSequence() const override; | 
 |  | 
 |   base::circular_deque<TestPendingTask> TakePendingTasks(); | 
 |   size_t NumPendingTasks() const; | 
 |   bool HasPendingTask() const; | 
 |   base::TimeDelta NextPendingTaskDelay() const; | 
 |   base::TimeDelta FinalPendingTaskDelay() const; | 
 |  | 
 |   // Clears the queue of pending tasks without running them. | 
 |   void ClearPendingTasks(); | 
 |  | 
 |   // Runs each current pending task in order and clears the queue. Tasks posted | 
 |   // by the tasks that run within this call do not run within this call. Can | 
 |   // only be called on the thread that created this TestSimpleTaskRunner. | 
 |   void RunPendingTasks(); | 
 |  | 
 |   // Runs pending tasks until the queue is empty. Can only be called on the | 
 |   // thread that created this TestSimpleTaskRunner. | 
 |   void RunUntilIdle(); | 
 |  | 
 |  protected: | 
 |   ~TestSimpleTaskRunner() override; | 
 |  | 
 |  private: | 
 |   // Thread on which this was instantiated. | 
 |   const PlatformThreadRef thread_ref_ = PlatformThread::CurrentRef(); | 
 |  | 
 |   // Synchronizes access to |pending_tasks_|. | 
 |   mutable Lock lock_; | 
 |  | 
 |   base::circular_deque<TestPendingTask> pending_tasks_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(TestSimpleTaskRunner); | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_ |