From 45bc97c25b77e0f67164eea58b9aa3cad581f623 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 16:52:26 +0100 Subject: [PATCH] Model radio startup and main queue delivery failures --- .../src/main/kotlin/android/os/HostOs.kt | 4 ++-- .../com/utun/chat/data/RouterHostEnvironment.kt | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt index 7873045d..8a52a434 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/os/HostOs.kt @@ -32,8 +32,8 @@ class Looper private constructor() { } } class Handler(val looper: Looper) { - companion object { var rejectDelayed = false } - fun post(task: Runnable): Boolean = looper.post(this, task, 0) + companion object { var rejectDelayed = false; var rejectImmediate = false } + fun post(task: Runnable): Boolean = !rejectImmediate && looper.post(this, task, 0) fun postDelayed(task: Runnable, delay: Long): Boolean = !rejectDelayed && looper.post(this, task, delay) fun removeCallbacks(task: Runnable) = looper.remove(this, task) } 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 70aacd02..18957cb0 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 @@ -40,12 +40,18 @@ object NativeLib { @Volatile private var radioGroup = 0L @Volatile private var radioMode = 0 @Volatile private var radioTx = false + var radioFailures = emptySet() fun radioSetActive(group: Long, active: Boolean) { radioCommands.add(RadioCommand("active=$active", group)) } fun radioConfigure(request: Long, settings: RadioAutoSettings): Boolean { radioRequest = request; return settings.valid() } fun radioAudioStart(group: Long, channels: Int): Boolean { + if ("start" in radioFailures) return false radioGroup = group; radioCommands.add(RadioCommand("audio start", group)); return true } - fun radioAudioStop() { radioTx = false; radioCommands.add(RadioCommand("audio stop", radioGroup)) } + fun radioAudioStop() { + radioCommands.add(RadioCommand("audio stop", radioGroup)) + check("stop" !in radioFailures) { "native audio stop failed" } + radioTx = false + } fun radioAudioPull(group: Long, out: ShortArray, playedFrames: Long): Int = 0 fun radioAudioFeed(group: Long, samples: ShortArray): Boolean = group == radioGroup fun radioCaptureStart(group: Long, channels: Int, mode: Int): Boolean { @@ -108,7 +114,11 @@ object NativeLib { /** Управляемая подготовка конфига: тест удерживает реальный worker, считает перекрытия и затем дожидается его завершения. */ class HostConfigProvider { var radioSettings = RadioAutoSettings() - fun getRadioAutoSettings() = radioSettings + var failRadioSettings = false + fun getRadioAutoSettings(): RadioAutoSettings { + check(!failRadioSettings) { "radio settings read failed" } + return radioSettings + } var mediaProfile = MediaAudioProfile.AUTO var failMediaRead = false var failMediaWrite = false