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