webrtc/api/test/time_controller.h
Danil Chapovalov dcc2321e12 In test wait functions prevent advancing time when unnecessary
Often wait condition can be met by running pending tasks from other
thread and tasks queues without advancing time.

while changing TimeController::Wait, relax condition parameter to use
view type as function doesn't need to be copied or moved to another
context.

Bug: None
Change-Id: Iaf814dd6e35050becefbbb455a1ef9b46244e89d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/415500
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45892}
2025-10-10 02:02:49 -07:00

66 lines
2.5 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 <memory>
#include <string>
#include "api/function_view.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/units/time_delta.h"
#include "rtc_base/socket_server.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;
// Simple helper to create an owned factory that can be used as a parameter
// for PeerConnectionFactory. Note that this might depend on the underlying
// time controller and therfore must be destroyed before the time controller
// is destroyed.
std::unique_ptr<TaskQueueFactory> CreateTaskQueueFactory();
// Creates an Thread instance. If `socket_server` is nullptr, a
// default noop socket server is created. Returned thread is not null and
// started.
virtual std::unique_ptr<Thread> CreateThread(
const std::string& name,
std::unique_ptr<SocketServer> socket_server = nullptr) = 0;
// Creates an Thread instance that ensure that it's set as the current
// thread.
virtual 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 condition() == true, polling condition() in small time
// intervals.
// Returns true if condition() was evaluated to true before `max_duration`
// elapsed and false otherwise.
bool Wait(FunctionView<bool()> condition,
TimeDelta max_duration = TimeDelta::Seconds(5));
};
} // namespace webrtc
#endif // API_TEST_TIME_CONTROLLER_H_