xref: /aosp_15_r20/external/cronet/base/test/spin_wait.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 // This file provides a macro ONLY for use in testing.
6*6777b538SAndroid Build Coastguard Worker // DO NOT USE IN PRODUCTION CODE.  There are much better ways to wait.
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker // This code is very helpful in testing multi-threaded code, without depending
9*6777b538SAndroid Build Coastguard Worker // on almost any primitives.  This is especially helpful if you are testing
10*6777b538SAndroid Build Coastguard Worker // those primitive multi-threaded constructs.
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker // We provide a simple one argument spin wait (for 1 second), and a generic
13*6777b538SAndroid Build Coastguard Worker // spin wait (for longer periods of time).
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TEST_SPIN_WAIT_H_
16*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_SPIN_WAIT_H_
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker // Provide a macro that will wait no longer than 1 second for an asynchronous
22*6777b538SAndroid Build Coastguard Worker // change is the value of an expression.
23*6777b538SAndroid Build Coastguard Worker // A typical use would be:
24*6777b538SAndroid Build Coastguard Worker //
25*6777b538SAndroid Build Coastguard Worker //   SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(0 == f(x));
26*6777b538SAndroid Build Coastguard Worker //
27*6777b538SAndroid Build Coastguard Worker // The expression will be evaluated repeatedly until it is true, or until
28*6777b538SAndroid Build Coastguard Worker // the time (1 second) expires.
29*6777b538SAndroid Build Coastguard Worker // Since tests generally have a 5 second watch dog timer, this spin loop is
30*6777b538SAndroid Build Coastguard Worker // typically used to get the padding needed on a given test platform to assure
31*6777b538SAndroid Build Coastguard Worker // that the test passes, even if load varies, and external events vary.
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker #define SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(expression) \
34*6777b538SAndroid Build Coastguard Worker   SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(base::Seconds(1), (expression))
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker #define SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(delta, expression)                    \
37*6777b538SAndroid Build Coastguard Worker   do {                                                                         \
38*6777b538SAndroid Build Coastguard Worker     base::TimeTicks spin_wait_start = base::TimeTicks::Now();                  \
39*6777b538SAndroid Build Coastguard Worker     const base::TimeDelta kSpinWaitTimeout = delta;                            \
40*6777b538SAndroid Build Coastguard Worker     while (!(expression)) {                                                    \
41*6777b538SAndroid Build Coastguard Worker       if (kSpinWaitTimeout < base::TimeTicks::Now() - spin_wait_start) {       \
42*6777b538SAndroid Build Coastguard Worker         EXPECT_LE((base::TimeTicks::Now() - spin_wait_start).InMilliseconds(), \
43*6777b538SAndroid Build Coastguard Worker                   kSpinWaitTimeout.InMilliseconds())                           \
44*6777b538SAndroid Build Coastguard Worker             << "Timed out";                                                    \
45*6777b538SAndroid Build Coastguard Worker         break;                                                                 \
46*6777b538SAndroid Build Coastguard Worker       }                                                                        \
47*6777b538SAndroid Build Coastguard Worker       base::PlatformThread::Sleep(base::Milliseconds(50));                     \
48*6777b538SAndroid Build Coastguard Worker     }                                                                          \
49*6777b538SAndroid Build Coastguard Worker   } while (0)
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TEST_SPIN_WAIT_H_
52