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