// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "base/test/ios/wait_util.h" #import #include "base/check.h" #include "base/run_loop.h" #include "base/test/test_timeouts.h" #include "base/timer/elapsed_timer.h" namespace base::test::ios { bool WaitUntilConditionOrTimeout(TimeDelta timeout, bool run_message_loop, ConditionBlock condition) { NSDate* deadline = [NSDate dateWithTimeIntervalSinceNow:timeout.InSecondsF()]; bool success = condition(); while (!success && [[NSDate date] compare:deadline] != NSOrderedDescending) { base::test::ios::SpinRunLoopWithMaxDelay(kSpinDelaySeconds); if (run_message_loop) { RunLoop().RunUntilIdle(); } success = condition(); } return success; } bool WaitUntilConditionOrTimeout(TimeDelta timeout, ConditionBlock condition) { return WaitUntilConditionOrTimeout(timeout, false, condition); } void SpinRunLoopWithMaxDelay(TimeDelta max_delay) { NSDate* before_date = [NSDate dateWithTimeIntervalSinceNow:max_delay.InSecondsF()]; [NSRunLoop.currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:before_date]; } void SpinRunLoopWithMinDelay(TimeDelta min_delay) { ElapsedTimer timer; while (timer.Elapsed() < min_delay) { SpinRunLoopWithMaxDelay(Milliseconds(10)); } } } // namespace base::test::ios