From c7356d2a5b86af9b4da8e3edcaf04dc9e4c42873 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 10:21:05 +0100 Subject: [PATCH] Wait for asynchronous voice cleanup acknowledgement in lifecycle regression test --- doc/service_lifecycle.md | 1 + .../test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/doc/service_lifecycle.md b/doc/service_lifecycle.md index 980e83ed..97f5584b 100644 --- a/doc/service_lifecycle.md +++ b/doc/service_lifecycle.md @@ -103,6 +103,7 @@ JNI init регистрирует callbacks/recorder; SQLite открывает через JNI, предварительное создание `chats.db` в init не требуется. `NativeLib.stop/destroy` снимает media-владельцев на main и ждёт native worker на IO. `HeadlessService` передаёт остановку в общий `CoreShutdown`, который переживает onDestroy; новый Service ждёт его до init. +Отказ stop повторяется автоматически с backoff 250 мс..30 с, без нового Service/request. Отмена одного ожидающего Service не отменяет очистку. Диагностика worker не считает живые ресурсы frontend утечками: recorder освобождается bridge после остановки ядра. diff --git a/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt b/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt index ab7dbbdf..bb5fabcc 100644 --- a/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt +++ b/tools/chatgui-android/capture-tests/src/test/kotlin/com/utun/chat/data/AudioRecorderManagerTest.kt @@ -102,6 +102,7 @@ class AudioRecorderManagerTest { assertEquals(1, NativeLib.cancels.get()); diagnostic("release") device.failures = emptySet() manager.cancelRecording() + manager.requestClose().get(2, TimeUnit.SECONDS) assertTrue("cleanup lost the unreleased device", device.released) assertEquals(1, NativeLib.cancels.get()) }