1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.trust.test.lib
18 
19 import android.util.Log
20 import com.google.common.truth.Truth.assertWithMessage
21 
22 private const val TAG = "TrustTestUtils"
23 
24 /**
25  * Waits for [conditionFunction] to be true with a failed assertion if it is not after [maxWait]
26  * ms.
27  *
28  * The condition function can perform additional logic (for example, logging or attempting to make
29  * the condition become true).
30  *
31  * @param conditionFunction function which takes the attempt count & returns whether the condition
32  *                          is met
33  */
34 internal fun wait(
35     description: String? = null,
36     maxWait: Long = 30000L,
37     rate: Long = 50L,
38     conditionFunction: (count: Int) -> Boolean
39 ) {
40     var waited = 0L
41     var count = 0
42     while (!conditionFunction.invoke(count)) {
43         assertWithMessage("Condition exceeded maximum wait time of $maxWait ms: $description")
44             .that(waited <= maxWait)
45             .isTrue()
46         waited += rate
47         count++
48         Log.i(TAG, "Waiting for $description ($waited/$maxWait) #$count")
49         Thread.sleep(rate)
50     }
51 }
52