15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/test_task_runner.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/mock_clock.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestTaskRunner::TestTaskRunner(MockClock* clock) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : clock_(clock) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestTaskRunner::~TestTaskRunner() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here, 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& task, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delay) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_GE(delay, base::TimeDelta()); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tasks_.push_back( 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostedTask(from_here, task, clock_->NowInTicks(), delay, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TestPendingTask::NESTABLE)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TestTaskRunner::RunsTasksOnCurrentThread() const { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::vector<PostedTask>& TestTaskRunner::GetPostedTasks() const { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tasks_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTaskRunner::RunNextTask() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the next task to run, advance the time to the correct time 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and then run the task. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PostedTask>::iterator next = FindNextTask(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(next != tasks_.end()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_->AdvanceTime(QuicTime::Delta::FromMicroseconds( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (next->GetTimeToRun() - clock_->NowInTicks()).InMicroseconds())); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostedTask task = *next; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tasks_.erase(next); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task.task.Run(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ShouldRunBeforeLessThan { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator()(const PostedTask& task1, const PostedTask& task2) const { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return task1.ShouldRunBefore(task2); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<PostedTask>::iterator TestTaskRunner::FindNextTask() { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::min_element( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tasks_.begin(), tasks_.end(), ShouldRunBeforeLessThan()); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 69