// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TEST_RUN_UNTIL_H_ #define BASE_TEST_RUN_UNTIL_H_ #include "base/functional/function_ref.h" namespace base::test { // Waits until `condition` evaluates to `true`, by evaluating `condition` // whenever the current thread becomes idle. // // Note: "something" (e.g. a task) must wake the current thread once the // condition is true. As such testing global conditions which won't wake the // current thread is flaky. // // Returns true if `condition` became true, or false if a timeout happens. // // Example usage: // // ChangeColorAsyncTo(object_under_tests, Color::Red); // // // Waits until the color is red, or aborts the tests otherwise. // ASSERT_TRUE(RunUntil([&](){ // return object_under_test.Color() == Color::Red; // })) << "Timeout waiting for the color to turn red"; // // // When we come here `Color()` is guaranteed to be `Color::Red`. // // TODO (crbug.com/376085325): Implement timeout handling for MOCK_TIME to // manage unmet conditions. [[nodiscard]] bool RunUntil(base::FunctionRef condition); } // namespace base::test #endif // BASE_TEST_RUN_UNTIL_H_