1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/quic/test_tools/test_task_runner.h" 6 7#include <algorithm> 8 9#include "net/quic/test_tools/mock_clock.h" 10#include "testing/gtest/include/gtest/gtest.h" 11 12namespace net { 13namespace test { 14 15TestTaskRunner::TestTaskRunner(MockClock* clock) 16 : clock_(clock) { 17} 18 19TestTaskRunner::~TestTaskRunner() { 20} 21 22bool TestTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here, 23 const base::Closure& task, 24 base::TimeDelta delay) { 25 EXPECT_GE(delay, base::TimeDelta()); 26 tasks_.push_back( 27 PostedTask(from_here, task, clock_->NowInTicks(), delay, 28 base::TestPendingTask::NESTABLE)); 29 return false; 30} 31 32bool TestTaskRunner::RunsTasksOnCurrentThread() const { 33 return true; 34} 35 36const std::vector<PostedTask>& TestTaskRunner::GetPostedTasks() const { 37 return tasks_; 38} 39 40void TestTaskRunner::RunNextTask() { 41 // Find the next task to run, advance the time to the correct time 42 // and then run the task. 43 std::vector<PostedTask>::iterator next = FindNextTask(); 44 DCHECK(next != tasks_.end()); 45 clock_->AdvanceTime(QuicTime::Delta::FromMicroseconds( 46 (next->GetTimeToRun() - clock_->NowInTicks()).InMicroseconds())); 47 PostedTask task = *next; 48 tasks_.erase(next); 49 task.task.Run(); 50} 51 52namespace { 53 54struct ShouldRunBeforeLessThan { 55 bool operator()(const PostedTask& task1, const PostedTask& task2) const { 56 return task1.ShouldRunBefore(task2); 57 } 58}; 59 60} // namespace 61 62std::vector<PostedTask>::iterator TestTaskRunner::FindNextTask() { 63 return std::min_element( 64 tasks_.begin(), tasks_.end(), ShouldRunBeforeLessThan()); 65} 66 67} // namespace test 68} // namespace net 69