@@ -27,6 +27,8 @@ import com.android.keyattestation.verifier.testing.TestUtils.readCertList
2727import com.android.keyattestation.verifier.testing.TestUtils.readJson
2828import com.android.keyattestation.verifier.testing.TestUtils.trueChecker
2929import com.google.common.truth.Truth.assertThat
30+ import com.google.common.util.concurrent.Futures
31+ import com.google.common.util.concurrent.ListenableFuture
3032import com.google.protobuf.ByteString
3133import com.google.protobuf.kotlin.toByteString
3234import com.google.testing.junit.testparameterinjector.TestParameter
@@ -36,14 +38,29 @@ import java.security.cert.TrustAnchor
3638import java.time.Instant
3739import java.time.LocalDate
3840import java.time.ZoneOffset
41+ import java.util.concurrent.Executors
42+ import java.util.concurrent.TimeUnit
3943import kotlin.test.assertIs
44+ import kotlinx.coroutines.guava.await
45+ import kotlinx.coroutines.runBlocking
4046import org.junit.Test
4147import org.junit.runner.RunWith
4248
4349/* * Unit tests for [Verifier]. */
4450@RunWith(TestParameterInjector ::class )
4551class VerifierTest {
4652 private val verifier = Verifier ({ prodAnchors }, { setOf<String >() }, { Instant .now() })
53+ private val delayedAlwaysTrueChecker =
54+ object : ChallengeChecker {
55+ override fun checkChallenge (challenge : ByteString ): ListenableFuture <Boolean > {
56+ return Futures .scheduleAsync(
57+ { Futures .immediateFuture(true ) },
58+ 5 ,
59+ TimeUnit .SECONDS ,
60+ Executors .newSingleThreadScheduledExecutor(),
61+ )
62+ }
63+ }
4764
4865 @Test
4966 fun verify_validChain_returnsSuccess (@TestParameter testCase : TestCase ) {
@@ -74,16 +91,16 @@ class VerifierTest {
7491 }
7592
7693 @Test
77- fun verify_validChainUsingGeneratedTrustAnchors_returnsSuccess () {
94+ fun verifyAsync_validChainUsingGeneratedTrustAnchors_returnsSuccess (): Unit = runBlocking {
7895 val verifier = Verifier (GoogleTrustAnchors , { setOf<String >() }, { Instant .now() })
7996 val chain = readCertList(" blueline/sdk28/TEE_EC_NONE.pem" )
80- assertIs<VerificationResult .Success >(verifier.verify( chain))
97+ assertIs<VerificationResult .Success >(verifier.verifyAsync( this , chain).await( ))
8198 }
8299
83100 @Test
84- fun verify_validChain_returnsDeviceIdentity () {
101+ fun verifyAsync_validChain_returnsDeviceIdentity () = runBlocking {
85102 val chain = readCertList(" blueline/sdk28/TEE_RSA_BASE+IMEI.pem" )
86- val result = assertIs<VerificationResult .Success >(verifier.verify( chain))
103+ val result = assertIs<VerificationResult .Success >(verifier.verifyAsync( this , chain).await( ))
87104 assertThat(result.attestedDeviceIds)
88105 .isEqualTo(
89106 DeviceIdentity (
@@ -100,55 +117,63 @@ class VerifierTest {
100117 }
101118
102119 @Test
103- fun verify_challengeCheckerReturnsTrue_returnsSuccess () {
120+ fun verifyAsync_challengeCheckerReturnsTrue_returnsSuccess (): Unit = runBlocking {
104121 val chain = readCertList(" blueline/sdk28/TEE_EC_NONE.pem" )
105122
106- assertIs<VerificationResult .Success >(verifier.verify( chain, trueChecker))
123+ assertIs<VerificationResult .Success >(verifier.verifyAsync( this , chain, trueChecker).await( ))
107124 }
108125
109126 @Test
110- fun verify_challengeCheckerReturnsFalse_returnsChallengeMismatch () {
127+ fun verifyAsync_challengeCheckerReturnsFalse_returnsChallengeMismatch (): Unit = runBlocking {
111128 val chain = readCertList(" blueline/sdk28/TEE_EC_NONE.pem" )
112129
113- assertIs<VerificationResult .ChallengeMismatch >(verifier.verify(chain, falseChecker))
130+ assertIs<VerificationResult .ChallengeMismatch >(
131+ verifier.verifyAsync(this , chain, falseChecker).await()
132+ )
114133 }
115134
116135 @Test
117- fun verify_unexpectedRootKey_returnsPathValidationFailure () {
136+ fun verifyAsync_unexpectedRootKey_returnsPathValidationFailure () = runBlocking {
118137 val result =
119138 assertIs<VerificationResult .PathValidationFailure >(
120- verifier.verify(
121- CertLists .wrongTrustAnchor,
122- ChallengeMatcher (ByteString .copyFromUtf8(" challenge" )),
123- )
139+ verifier
140+ .verifyAsync(
141+ this ,
142+ CertLists .wrongTrustAnchor,
143+ ChallengeMatcher (ByteString .copyFromUtf8(" challenge" )),
144+ )
145+ .await()
124146 )
125147 assertThat(result.cause.reason).isEqualTo(PKIXReason .NO_TRUST_ANCHOR )
126148 }
127149
128150 @Test
129- fun verify_failure_inputChainLogged () {
151+ fun verifyAsync_failure_inputChainLogged () = runBlocking {
130152 val logHook = FakeLogHook ()
131153 assertIs<VerificationResult .PathValidationFailure >(
132- verifier.verify(
133- CertLists .wrongTrustAnchor,
134- ChallengeMatcher (ByteString .copyFromUtf8(" challenge" )),
135- logHook,
136- )
154+ verifier
155+ .verifyAsync(
156+ this ,
157+ CertLists .wrongTrustAnchor,
158+ ChallengeMatcher (ByteString .copyFromUtf8(" challenge" )),
159+ logHook,
160+ )
161+ .await()
137162 )
138163 assertThat(logHook.inputChain)
139164 .isEqualTo(CertLists .wrongTrustAnchor.map { it.encoded.toByteString() })
140165 }
141166
142167 @Test
143- fun verify_success_keyDescriptionLogged () {
168+ fun verifyAsync_success_keyDescriptionLogged () = runBlocking {
144169 val logHook = FakeLogHook ()
145170 val chain = readCertList(" blueline/sdk28/TEE_EC_NONE.pem" )
146- assertIs<VerificationResult .Success >(verifier.verify( chain, log = logHook))
171+ assertIs<VerificationResult .Success >(verifier.verifyAsync( this , chain, log = logHook).await( ))
147172 assertThat(logHook.keyDescription).isEqualTo(chain[0 ].keyDescription())
148173 }
149174
150175 @Test
151- fun verify_malformedPatchLevel_logsInfo () {
176+ fun verifyAsync_malformedPatchLevel_logsInfo () = runBlocking {
152177 val verifierWithTestRoot =
153178 Verifier (
154179 { setOf (TrustAnchor (Certs .root, null )) },
@@ -157,8 +182,17 @@ class VerifierTest {
157182 )
158183 val logHook = FakeLogHook ()
159184 assertIs<VerificationResult .Success >(
160- verifierWithTestRoot.verify( CertLists .invalidBootPatchLevel, log = logHook)
185+ verifierWithTestRoot.verifyAsync( this , CertLists .invalidBootPatchLevel, log = logHook).await( )
161186 )
162187 assertThat(logHook.infoMessages).isNotEmpty()
163188 }
189+
190+ @Test
191+ fun verifyAsync_longDelay_successfullyAwaitsChallengeCheck (): Unit = runBlocking {
192+ val chain = readCertList(" blueline/sdk28/TEE_EC_NONE.pem" )
193+
194+ assertIs<VerificationResult .Success >(
195+ verifier.verifyAsync(this , chain, delayedAlwaysTrueChecker).await()
196+ )
197+ }
164198}
0 commit comments