From f94106693451c0acba76c2a2c6a58a33d6dc4c7d Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 20:11:15 +0100 Subject: [PATCH] Cover rejected activity commands at the native queue boundary --- .../utun/chat/data/RouterHostEnvironment.kt | 5 ++++- .../chat/data/CoreActivityLifecycleTest.kt | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt index 9b44573b..a22b5a1c 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt @@ -34,13 +34,16 @@ object NativeLib { val activityRequests = mutableListOf() var activityAttempts = 0 var failActivityRequest = false + var acceptActivityRequest = true fun notifyNetworkActive() { networkNotifications.incrementAndGet() } fun isReady(): Boolean = ready fun updateSockets(config: String): Boolean { socketUpdates.add(config); return acceptSocketUpdate } - fun setActive(active: Boolean) { + fun setActive(active: Boolean): Boolean { activityAttempts++ check(!failActivityRequest) { "activity request unavailable" } + if (!acceptActivityRequest) return false activityRequests.add(active) + return true } } diff --git a/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CoreActivityLifecycleTest.kt b/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CoreActivityLifecycleTest.kt index 0b1ef62e..8d16fb19 100644 --- a/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CoreActivityLifecycleTest.kt +++ b/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CoreActivityLifecycleTest.kt @@ -15,11 +15,17 @@ class CoreActivityLifecycleTest { NativeLib.activityAttempts = 0 NativeLib.activityRequests.clear() NativeLib.failActivityRequest = false + NativeLib.acceptActivityRequest = true NativeLib.ready = true LogManager.entries.clear() } - @After fun release() { clearOwners(); NativeLib.failActivityRequest = false; NativeLib.ready = true } + @After fun release() { + clearOwners() + NativeLib.failActivityRequest = false + NativeLib.acceptActivityRequest = true + NativeLib.ready = true + } private fun clearOwners() { NativeLib.ready = false @@ -119,6 +125,16 @@ class CoreActivityLifecycleTest { } } + @Test fun rejectedNativePostDoesNotSuppressRetry() { + NativeLib.acceptActivityRequest = false + CoreActivity.visible(true) + assertTrue(NativeLib.activityRequests.isEmpty()) + NativeLib.acceptActivityRequest = true + CoreActivity.sync() + assertEquals(2, NativeLib.activityAttempts) + assertEquals(listOf(true), NativeLib.activityRequests) + } + @Test fun resetRejectsBackgroundCallerWithoutInvalidatingCache() { CoreActivity.sync() assertTrue(offMain { CoreActivity.reset() } is IllegalStateException)