webrtc/api/test/time_controller.h
Sebastian Jansson 6ce033a863 Moves ownership of time controller into NetworkEmulationManager.
This makes it easier to maintain consistency between real time
and simulated time modes.

The RealTimeController is updated to use an explicit main thread,
this ensures that pending destruction tasks are run as the network
emulator goes out of scope.

Bug: webrtc:11255
Change-Id: Ie73ab778c78a68d7c58c0f857f14a8d8ac027c67
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166164
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30342}
2020-01-22 11:12:27 +00:00

83 lines
3.2 KiB
C++

/*
* Copyright 2019 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef API_TEST_TIME_CONTROLLER_H_
#define API_TEST_TIME_CONTROLLER_H_
#include <functional>
#include <memory>
#include <string>
#include "api/task_queue/task_queue_factory.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "modules/utility/include/process_thread.h"
#include "rtc_base/synchronization/yield_policy.h"
#include "rtc_base/thread.h"
#include "system_wrappers/include/clock.h"
namespace webrtc {
// Interface for controlling time progress. This allows us to execute test code
// in either real time or simulated time by using different implementation of
// this interface.
class TimeController {
public:
virtual ~TimeController() = default;
// Provides a clock instance that follows implementation defined time
// progress.
virtual Clock* GetClock() = 0;
// The returned factory will created task queues that runs in implementation
// defined time domain.
virtual TaskQueueFactory* GetTaskQueueFactory() = 0;
// Creates a process thread.
virtual std::unique_ptr<ProcessThread> CreateProcessThread(
const char* thread_name) = 0;
// Creates an rtc::Thread instance. If |socket_server| is nullptr, a default
// noop socket server is created.
virtual std::unique_ptr<rtc::Thread> CreateThread(
const std::string& name,
std::unique_ptr<rtc::SocketServer> socket_server = nullptr) = 0;
// Creates an rtc::Thread instance that ensure that it's set as the current
// thread.
virtual rtc::Thread* GetMainThread() = 0;
// Allow task queues and process threads created by this instance to execute
// for the given |duration|.
virtual void AdvanceTime(TimeDelta duration) = 0;
// Waits until done() == true, polling done() in small time intervals.
bool Wait(const std::function<bool()>& done,
TimeDelta max_duration = TimeDelta::seconds(5));
};
// Interface for telling time, scheduling an event to fire at a particular time,
// and waiting for time to pass.
class ControlledAlarmClock {
public:
virtual ~ControlledAlarmClock() = default;
// Gets a clock that tells the alarm clock's notion of time.
virtual Clock* GetClock() = 0;
// Schedules the alarm to fire at |deadline|.
// An alarm clock only supports one deadline. Calls to |ScheduleAlarmAt| with
// an earlier deadline will reset the alarm to fire earlier.Calls to
// |ScheduleAlarmAt| with a later deadline are ignored. Returns true if the
// deadline changed, false otherwise.
virtual bool ScheduleAlarmAt(Timestamp deadline) = 0;
// Sets the callback that should be run when the alarm fires.
virtual void SetCallback(std::function<void()> callback) = 0;
// Waits for |duration| to pass, according to the alarm clock.
virtual void Sleep(TimeDelta duration) = 0;
};
} // namespace webrtc
#endif // API_TEST_TIME_CONTROLLER_H_