From fc1e5abf880685d600241a7ca7634a3556ce1909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acharn=C3=A9?= Date: Sun, 2 Aug 2026 18:47:41 +0700 Subject: [PATCH 1/2] test(android): make lifecycle contention deterministic --- .../com/databreeze/android/AndroidRuntimeLifecycleTest.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/android/app/src/test/java/com/databreeze/android/AndroidRuntimeLifecycleTest.kt b/apps/android/app/src/test/java/com/databreeze/android/AndroidRuntimeLifecycleTest.kt index ba6b3ae7..050cbd1a 100644 --- a/apps/android/app/src/test/java/com/databreeze/android/AndroidRuntimeLifecycleTest.kt +++ b/apps/android/app/src/test/java/com/databreeze/android/AndroidRuntimeLifecycleTest.kt @@ -13,6 +13,7 @@ import java.util.Collections import java.util.concurrent.CountDownLatch import javax.crypto.SecretKey import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking @@ -46,7 +47,10 @@ class AndroidRuntimeLifecycleTest { val signIn = async(Dispatchers.Default) { runtime.signIn(scope, "device-key") } keyStarted.await() - val signOut = async(Dispatchers.Default) { runtime.signOut(scope, "device-key") } + val signOut = async( + context = Dispatchers.Default, + start = CoroutineStart.UNDISPATCHED, + ) { runtime.signOut(scope, "device-key") } assertNull(withTimeoutOrNull(200) { revokeCalled.await() }) assertEquals(listOf("key-create"), events.toList()) From a413386c0c7ccf0c4f85d652187b87afd5171e13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acharn=C3=A9?= Date: Sun, 2 Aug 2026 18:47:42 +0700 Subject: [PATCH 2/2] docs(operations): record test determinism review --- docs/operations/code-review-14-disposition.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/operations/code-review-14-disposition.md b/docs/operations/code-review-14-disposition.md index 11393a4d..d4a66255 100644 --- a/docs/operations/code-review-14-disposition.md +++ b/docs/operations/code-review-14-disposition.md @@ -54,3 +54,10 @@ was requested). It identified one valid lifecycle race: sign-in and sign-out cou between device-key initialization and revocation. `AndroidRuntime` now serializes the complete sign-in/sign-out lifecycle per `AccountWorkspaceScope`, and a blocking JVM test proves sign-out cannot revoke, cancel, or delete the key until sign-in has completed. + +## Automatic incremental review after PR #17 synchronization + +GitHub automatically refreshed the existing review after PR #17 merged into `dev` (no new review +was requested). It identified a valid test determinism issue: the lifecycle test now starts +sign-out with `CoroutineStart.UNDISPATCHED` after key creation has blocked, guaranteeing that the +test actually contends on the per-scope mutex before releasing sign-in.