xref: /aosp_15_r20/external/cronet/base/test/ios/wait_util.mm (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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