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