|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  | // | 
|  | // Common utilities for Quic tests | 
|  |  | 
|  | #ifndef NET_QUIC_TEST_TASK_RUNNER_H_ | 
|  | #define NET_QUIC_TEST_TASK_RUNNER_H_ | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/callback.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/sequenced_task_runner.h" | 
|  | #include "base/task_runner.h" | 
|  | #include "base/test/test_pending_task.h" | 
|  | #include "net/third_party/quic/core/quic_time.h" | 
|  |  | 
|  | namespace quic { | 
|  | class MockClock; | 
|  | }  // namespace quic | 
|  | namespace net { | 
|  |  | 
|  | namespace test { | 
|  |  | 
|  | typedef base::TestPendingTask PostedTask; | 
|  |  | 
|  | class TestTaskRunner : public base::SequencedTaskRunner { | 
|  | public: | 
|  | explicit TestTaskRunner(quic::MockClock* clock); | 
|  |  | 
|  | // base::TaskRunner implementation. | 
|  | bool PostDelayedTask(const base::Location& from_here, | 
|  | base::OnceClosure task, | 
|  | base::TimeDelta delay) override; | 
|  | bool PostNonNestableDelayedTask(const base::Location& from_here, | 
|  | base::OnceClosure task, | 
|  | base::TimeDelta delay) override; | 
|  |  | 
|  | bool RunsTasksInCurrentSequence() const override; | 
|  |  | 
|  | const std::vector<PostedTask>& GetPostedTasks() const; | 
|  |  | 
|  | // Returns the delay for next task to run. If there is no pending task, | 
|  | // return QuicTime::Delta::Infinite(). | 
|  | quic::QuicTime::Delta NextPendingTaskDelay(); | 
|  |  | 
|  | // Finds the next task to run, advances the time to the correct time | 
|  | // and then runs the task. | 
|  | void RunNextTask(); | 
|  |  | 
|  | // Fast forwards virtual time by |delta|, causing all tasks with a remaining | 
|  | // delay less than or equal to |delta| to be executed. |delta| must be | 
|  | // non-negative. | 
|  | void FastForwardBy(quic::QuicTime::Delta delta); | 
|  |  | 
|  | // While there are posted tasks, finds the next task to run, advances the | 
|  | // time to the correct time and then runs the task. | 
|  | void RunUntilIdle(); | 
|  |  | 
|  | protected: | 
|  | ~TestTaskRunner() override; | 
|  |  | 
|  | private: | 
|  | std::vector<PostedTask>::iterator FindNextTask(); | 
|  |  | 
|  | quic::MockClock* const clock_; | 
|  | std::vector<PostedTask> tasks_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(TestTaskRunner); | 
|  | }; | 
|  |  | 
|  | }  // namespace test | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_QUIC_TEST_TASK_RUNNER_H_ |