| // 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_ |