blob: e4bf48f34a3f31dee5205990cfbc1e3a81b53462 [file] [log] [blame]
[email protected]1d197ef52012-11-07 20:41:291// 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
rch1e369362017-04-03 19:44:515#include "net/quic/chromium/test_task_runner.h"
[email protected]1d197ef52012-11-07 20:41:296
[email protected]a8582b12012-12-19 22:18:297#include <algorithm>
tzik070c8ffb2017-03-29 05:28:128#include <utility>
[email protected]1d197ef52012-11-07 20:41:299
[email protected]1d197ef52012-11-07 20:41:2910#include "net/quic/test_tools/mock_clock.h"
[email protected]1d197ef52012-11-07 20:41:2911#include "testing/gtest/include/gtest/gtest.h"
12
13namespace net {
[email protected]1d197ef52012-11-07 20:41:2914namespace test {
15
rjshaded5ced072015-12-18 19:26:0216TestTaskRunner::TestTaskRunner(MockClock* clock) : clock_(clock) {}
[email protected]1d197ef52012-11-07 20:41:2917
rjshaded5ced072015-12-18 19:26:0218TestTaskRunner::~TestTaskRunner() {}
[email protected]1d197ef52012-11-07 20:41:2919
Brett Wilson9c361992017-09-12 06:05:2120bool TestTaskRunner::PostDelayedTask(const base::Location& from_here,
tzik6e427842017-04-05 10:13:2121 base::OnceClosure task,
[email protected]a8582b12012-12-19 22:18:2922 base::TimeDelta delay) {
23 EXPECT_GE(delay, base::TimeDelta());
tzik070c8ffb2017-03-29 05:28:1224 tasks_.push_back(PostedTask(from_here, std::move(task), clock_->NowInTicks(),
25 delay, base::TestPendingTask::NESTABLE));
[email protected]a8582b12012-12-19 22:18:2926 return false;
27}
28
peary23322df62017-05-09 03:55:4829bool TestTaskRunner::RunsTasksInCurrentSequence() const {
[email protected]1d197ef52012-11-07 20:41:2930 return true;
31}
32
[email protected]a8582b12012-12-19 22:18:2933const std::vector<PostedTask>& TestTaskRunner::GetPostedTasks() const {
34 return tasks_;
[email protected]1d197ef52012-11-07 20:41:2935}
36
37void TestTaskRunner::RunNextTask() {
[email protected]1d197ef52012-11-07 20:41:2938 std::vector<PostedTask>::iterator next = FindNextTask();
39 DCHECK(next != tasks_.end());
[email protected]2a960e02012-11-11 14:48:1040 clock_->AdvanceTime(QuicTime::Delta::FromMicroseconds(
[email protected]a8582b12012-12-19 22:18:2941 (next->GetTimeToRun() - clock_->NowInTicks()).InMicroseconds()));
tzika6f0007a2017-01-27 04:01:1142 PostedTask task = std::move(*next);
[email protected]1d197ef52012-11-07 20:41:2943 tasks_.erase(next);
tzika6f0007a2017-01-27 04:01:1144 std::move(task.task).Run();
[email protected]a8582b12012-12-19 22:18:2945}
46
rch9ecde09b2017-04-08 00:18:2347void TestTaskRunner::RunUntilIdle() {
48 while (!tasks_.empty())
49 RunNextTask();
50}
[email protected]a8582b12012-12-19 22:18:2951namespace {
52
53struct ShouldRunBeforeLessThan {
54 bool operator()(const PostedTask& task1, const PostedTask& task2) const {
55 return task1.ShouldRunBefore(task2);
56 }
57};
58
59} // namespace
60
61std::vector<PostedTask>::iterator TestTaskRunner::FindNextTask() {
rjshaded5ced072015-12-18 19:26:0262 return std::min_element(tasks_.begin(), tasks_.end(),
63 ShouldRunBeforeLessThan());
[email protected]1d197ef52012-11-07 20:41:2964}
65
66} // namespace test
[email protected]1d197ef52012-11-07 20:41:2967} // namespace net