1// Copyright 2014 The Chromium Authors 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import "base/test/ios/wait_util.h" 6 7#import <Foundation/Foundation.h> 8 9#include "base/check.h" 10#include "base/run_loop.h" 11#include "base/test/test_timeouts.h" 12#include "base/timer/elapsed_timer.h" 13 14namespace base::test::ios { 15 16bool WaitUntilConditionOrTimeout(TimeDelta timeout, 17 bool run_message_loop, 18 ConditionBlock condition) { 19 NSDate* deadline = [NSDate dateWithTimeIntervalSinceNow:timeout.InSecondsF()]; 20 bool success = condition(); 21 while (!success && [[NSDate date] compare:deadline] != NSOrderedDescending) { 22 base::test::ios::SpinRunLoopWithMaxDelay(kSpinDelaySeconds); 23 if (run_message_loop) { 24 RunLoop().RunUntilIdle(); 25 } 26 success = condition(); 27 } 28 return success; 29} 30 31bool WaitUntilConditionOrTimeout(TimeDelta timeout, ConditionBlock condition) { 32 return WaitUntilConditionOrTimeout(timeout, false, condition); 33} 34 35void SpinRunLoopWithMaxDelay(TimeDelta max_delay) { 36 NSDate* before_date = 37 [NSDate dateWithTimeIntervalSinceNow:max_delay.InSecondsF()]; 38 [NSRunLoop.currentRunLoop runMode:NSDefaultRunLoopMode 39 beforeDate:before_date]; 40} 41 42void SpinRunLoopWithMinDelay(TimeDelta min_delay) { 43 ElapsedTimer timer; 44 while (timer.Elapsed() < min_delay) { 45 SpinRunLoopWithMaxDelay(Milliseconds(10)); 46 } 47} 48 49} // namespace base::test::ios 50