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