• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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