// Copyright 2019 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. #ifndef PLATFORM_TEST_FAKE_TASK_RUNNER_H_ #define PLATFORM_TEST_FAKE_TASK_RUNNER_H_ #include #include #include "platform/api/task_runner.h" #include "platform/api/time.h" #include "platform/test/fake_clock.h" namespace openscreen { // Usage: // // #include ".../gtest.h" // // class FooTest : public testing::Test { // public: // FakeClock* clock() { return &clock_; } // FakeTaskRunner* task_runner() { return &task_runner_; } // // private: // FakeClock clock_{Clock::now()}; // FakeTaskRunner task_runner_{&clock_}; // }; // // TEST_F(FooTest, RunsTask) { // Foo foo(task_runner()); // foo.DoSomethingToPostATask(); // task_runner()->RunTasksUntilIdle(); // // Alternatively: clock()->Advance(std::chrono::seconds(0)); // } // // TEST_F(FooTest, RunsDelayedTask) { // Foo foo(task_runner()); // foo.DoSomethingInOneSecond(); // Schedules 1-second delayed task. // clock()->Advance(std::chrono::seconds(3)); // Delayed Task runs here! // } class FakeTaskRunner : public TaskRunner { public: using Task = TaskRunner::Task; explicit FakeTaskRunner(FakeClock* clock); ~FakeTaskRunner() override; // Runs all ready-to-run tasks. void RunTasksUntilIdle(); // TaskRunner implementation. void PostPackagedTask(Task task) override; void PostPackagedTaskWithDelay(Task task, Clock::duration delay) override; bool IsRunningOnTaskRunner() override; int ready_task_count() const { return ready_to_run_tasks_.size(); } int delayed_task_count() const { return delayed_tasks_.size(); } // Returns the time at which the next task is scheduled to run, or // Clock::time_point::max() if there is none scheduled. Clock::time_point GetResumeTime() const; private: FakeClock* const clock_; std::vector ready_to_run_tasks_; std::multimap delayed_tasks_; }; } // namespace openscreen #endif // PLATFORM_TEST_FAKE_TASK_RUNNER_H_