1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
base / test / ios / wait_util.mm [blame]
// 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 <Foundation/Foundation.h>
#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