From 94b5d44fe7a94229b7e1b0f5695a25fa1b1cc2d2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 23:06:10 +0100 Subject: [PATCH] Check call audio main ownership and the late Telecom handoff --- .../utun/chat/data/CallAudioLifecycleTest.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CallAudioLifecycleTest.kt b/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CallAudioLifecycleTest.kt index 9646f133..bc0c0a7c 100644 --- a/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CallAudioLifecycleTest.kt +++ b/tools/chatgui-android/router-tests/src/test/kotlin/com/utun/chat/data/CallAudioLifecycleTest.kt @@ -205,4 +205,23 @@ class CallAudioLifecycleTest { assertTrue(diagnostic("record stop failed")); assertTrue(diagnostic("track pause failed")) assertEquals(1, stops()) } + + @Test fun zeroCallIdCannotAcquireResourcesAndBackgroundStopCannotReleaseThem() { + assertThrows(IllegalArgumentException::class.java) { engine.start(0) } + assertTrue(NativeLib.callAudioCommands.isEmpty()); assertTrue(diagnostic("zero call id")) + start() + var failure: Exception? = null + Thread { try { engine.stop() } catch (e: Exception) { failure = e } }.apply { start(); join() } + assertTrue(failure is IllegalStateException); assertTrue(engine.isActive()); assertEquals(0, stops()) + assertFalse(AudioRecord.created.single().released); assertTrue(diagnostic("stop outside main")) + } + + @Test fun lateTelecomOwnershipPreventsRestoringTheFallbackModeDuringStop() { + start() + engine.bindTelecom(UtunConnection()) + manager.mode = AudioManager.MODE_IN_COMMUNICATION + engine.stop() + assertEquals(AudioManager.MODE_IN_COMMUNICATION, manager.mode) + assertEquals(false, field("modeOwned")); assertEquals(1, stops()) + } }