blob: e60d28044c5bfb71b9ab6733f793301f8f55ed58 [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
Ryan Hamiltona3ee93a72018-08-01 22:03:085#include "net/quic/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
Ryan Hamilton56b10c5d2018-05-11 13:40:1610#include "net/third_party/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
Ryan Hamilton85d4d6672018-08-06 18:51:2816namespace {
17
18base::TimeTicks NowInTicks(const quic::MockClock& clock) {
19 base::TimeTicks ticks;
20 return ticks + base::TimeDelta::FromMicroseconds(
21 (clock.Now() - quic::QuicTime::Zero()).ToMicroseconds());
22}
23
24} // namespace
25
Ryan Hamilton8d9ee76e2018-05-29 23:52:5226TestTaskRunner::TestTaskRunner(quic::MockClock* clock) : clock_(clock) {}
[email protected]1d197ef52012-11-07 20:41:2927
rjshaded5ced072015-12-18 19:26:0228TestTaskRunner::~TestTaskRunner() {}
[email protected]1d197ef52012-11-07 20:41:2929
Brett Wilson9c361992017-09-12 06:05:2130bool TestTaskRunner::PostDelayedTask(const base::Location& from_here,
tzik6e427842017-04-05 10:13:2131 base::OnceClosure task,
[email protected]a8582b12012-12-19 22:18:2932 base::TimeDelta delay) {
33 EXPECT_GE(delay, base::TimeDelta());
Ryan Hamilton85d4d6672018-08-06 18:51:2834 tasks_.push_back(PostedTask(from_here, std::move(task), NowInTicks(*clock_),
tzik070c8ffb2017-03-29 05:28:1235 delay, base::TestPendingTask::NESTABLE));
[email protected]a8582b12012-12-19 22:18:2936 return false;
37}
38
Zhongyi Shi8fff75b2017-11-19 21:36:3639bool TestTaskRunner::PostNonNestableDelayedTask(const base::Location& from_here,
40 base::OnceClosure task,
41 base::TimeDelta delay) {
42 return PostDelayedTask(from_here, std::move(task), delay);
43}
44
peary23322df62017-05-09 03:55:4845bool TestTaskRunner::RunsTasksInCurrentSequence() const {
[email protected]1d197ef52012-11-07 20:41:2946 return true;
47}
48
[email protected]a8582b12012-12-19 22:18:2949const std::vector<PostedTask>& TestTaskRunner::GetPostedTasks() const {
50 return tasks_;
[email protected]1d197ef52012-11-07 20:41:2951}
52
53void TestTaskRunner::RunNextTask() {
[email protected]1d197ef52012-11-07 20:41:2954 std::vector<PostedTask>::iterator next = FindNextTask();
55 DCHECK(next != tasks_.end());
Ryan Hamilton8d9ee76e2018-05-29 23:52:5256 clock_->AdvanceTime(quic::QuicTime::Delta::FromMicroseconds(
Ryan Hamilton85d4d6672018-08-06 18:51:2857 (next->GetTimeToRun() - NowInTicks(*clock_)).InMicroseconds()));
tzika6f0007a2017-01-27 04:01:1158 PostedTask task = std::move(*next);
[email protected]1d197ef52012-11-07 20:41:2959 tasks_.erase(next);
tzika6f0007a2017-01-27 04:01:1160 std::move(task.task).Run();
[email protected]a8582b12012-12-19 22:18:2961}
62
rch9ecde09b2017-04-08 00:18:2363void TestTaskRunner::RunUntilIdle() {
64 while (!tasks_.empty())
65 RunNextTask();
66}
[email protected]a8582b12012-12-19 22:18:2967namespace {
68
69struct ShouldRunBeforeLessThan {
70 bool operator()(const PostedTask& task1, const PostedTask& task2) const {
71 return task1.ShouldRunBefore(task2);
72 }
73};
74
75} // namespace
76
77std::vector<PostedTask>::iterator TestTaskRunner::FindNextTask() {
rjshaded5ced072015-12-18 19:26:0278 return std::min_element(tasks_.begin(), tasks_.end(),
79 ShouldRunBeforeLessThan());
[email protected]1d197ef52012-11-07 20:41:2980}
81
82} // namespace test
[email protected]1d197ef52012-11-07 20:41:2983} // namespace net