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 */
waitnull34 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(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
53 /**
54 * Ensures that [conditionFunction] is true with a failed assertion if it is not within [window]
55 * ms.
56 *
57 * The condition function can perform additional logic (for example, logging or attempting to make
58 * the condition become true).
59 *
60 * @param conditionFunction function which takes the attempt count & returns whether the condition
61 * is met
62 */
ensurenull63 internal fun ensure(
64 description: String? = null,
65 window: Long = 30000L,
66 rate: Long = 50L,
67 conditionFunction: (count: Int) -> Boolean
68 ) {
69 var waited = 0L
70 var count = 0
71 while (waited <= window) {
72 assertWithMessage("Condition failed within $window ms: $description").that(
73 conditionFunction(
74 count
75 )
76 ).isTrue()
77 waited += rate
78 count++
79 Log.i(TAG, "Ensuring $description ($waited/$window) #$count")
80 Thread.sleep(rate)
81 }
82 }
83