From b4186dfae34cb45636d5cbe08bfe94c5eb46ead1 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 14:06:05 +0100 Subject: [PATCH] Cover radio settings recovery across core restarts --- tools/chatgui/tests/test_radio_panel.cpp | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tools/chatgui/tests/test_radio_panel.cpp b/tools/chatgui/tests/test_radio_panel.cpp index 7ad56ba6..b837c42d 100644 --- a/tools/chatgui/tests/test_radio_panel.cpp +++ b/tools/chatgui/tests/test_radio_panel.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include extern "C" { #include "utun_instance.h" @@ -340,6 +341,39 @@ int main(int argc, char** argv) { instance.ua = nullptr; REQUIRE(u_get_allocated_count() == allocated); qInfo("radio panel: pending settings request freed on core shutdown PASS"); + + // Повторная загрузка после отмены старой задачи должна поставить запрос в новое ядро. + debug_set_category_level(DEBUG_CATEGORY_RADIO, DEBUG_LEVEL_DEBUG); + instance.ua = uasync_create(); + REQUIRE(instance.ua && chat_setting_set(&instance, "radio_vad_threshold", "75") == 0); + engine->loadSettings(configPath); + REQUIRE(engine->settingsBusy() && !engine->settingsReady() && instance.ua->posted_tasks_head); + await([&] { return engine->settingsReady() && !engine->settingsBusy(); }); + REQUIRE(engine->setting("radio_vad_threshold") == 75); + uasync_destroy(instance.ua, 0); instance.ua = nullptr; + REQUIRE(u_get_allocated_count() == allocated); + qInfo("radio panel: settings reload after cancelled core request PASS"); + + // Старый uasync уже закончил чтение, но GUI completion ждёт доставки при запуске нового ядра. + instance.ua = uasync_create(); + REQUIRE(instance.ua && chat_setting_set(&instance, "radio_vad_threshold", "20") == 0); + engine->loadSettings(configPath); + uasync_poll(instance.ua, 0); + REQUIRE(engine->settingsBusy() && !instance.ua->posted_tasks_head); + uasync_destroy(instance.ua, 0); instance.ua = nullptr; + instance.ua = uasync_create(); + REQUIRE(instance.ua && chat_setting_set(&instance, "radio_vad_threshold", "80") == 0); + engine->loadSettings(configPath); + REQUIRE(engine->settingsBusy() && !engine->settingsReady() && instance.ua->posted_tasks_head); + QSignalSpy staleSettings(engine, &RadioAudioEngine::stateChanged); + QCoreApplication::sendPostedEvents(engine, QEvent::MetaCall); + REQUIRE(engine->settingsBusy() && !engine->settingsReady() && engine->setting("radio_vad_threshold") == 75); + REQUIRE(staleSettings.isEmpty() && instance.ua->posted_tasks_head); + await([&] { return engine->settingsReady() && !engine->settingsBusy(); }); + REQUIRE(engine->setting("radio_vad_threshold") == 80 && staleSettings.size() == 1); + uasync_destroy(instance.ua, 0); instance.ua = nullptr; + REQUIRE(u_get_allocated_count() == allocated); + qInfo("radio panel: stale GUI settings completion cannot unlock or overwrite restarted core PASS"); qInfo("radio panel: saved settings, channel change, device menus, range validation and config failure PASS"); return 0; }