using ClockVariant = std::variant<std::monostate,
SimulatedClock*,
FakeClock*,
ThreadProcessingFakeClock*,
TimeController*>;
struct WaitUntilSettings { // The maximum time to wait for the condition to be met.
TimeDelta timeout = TimeDelta::Seconds(5); // The interval between polling the condition.
TimeDelta polling_interval = TimeDelta::Millis(1); // The clock to use for timing.
ClockVariant clock = std::monostate(); // Name of the result to be used in the error message.
std::string result_name = "result";
};
// Runs a function `fn`, until it returns true, or timeout from `settings`. // Calls `fn` at least once. Returns true when `fn` return true, returns false // after timeout if `fn` always returned false. // // Example: // // EXPECT_TRUE(WaitUntil([&] { return client.IsConnected(); });
[[nodiscard]] bool WaitUntil(FunctionView<bool()> fn,
WaitUntilSettings settings = {});
// Runs a function `fn`, which returns a result, until `matcher` matches the // result. // // The function is called repeatedly until the result matches the matcher or the // timeout is reached. If the matcher matches the result, the result is // returned. Otherwise, an error is returned. // // Example: // // int counter = 0; // RTCErrorOr<int> result = WaitUntil([&] { return ++counter; }, Eq(3)) // EXPECT_THAT(result, IsOkAndHolds(3)); template <typename Fn>
[[nodiscard]] RTCErrorOr<std::invoke_result_t<Fn>> WaitUntil( const Fn& fn,
::testing::Matcher<std::invoke_result_t<Fn>> matcher,
WaitUntilSettings settings = {}) { // Wrap `result` into optional to support types that are not default // constructable.
std::optional<std::invoke_result_t<Fn>> result; bool ok = WaitUntil(
[&] { // `emplace` instead of assigning to support return types that do not // have an assign operator.
result.emplace(fn()); return ::testing::Value(*result, matcher);
},
settings);
// WaitUntil promise to call `fn` at least once and thus `result` is // populated.
RTC_CHECK(result.has_value()); if (ok) { return *std::move(result);
}
// A utility class that binds WaitUntilSettings to WaitUntil methods. class Waiter {
public: explicit Waiter(WaitUntilSettings settings)
: settings_(std::move(settings)) {}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.