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