Cover radio settings recovery across core restarts

This commit is contained in:
evgeny committed 2026-10-27 14:06:05 +01:00
1 parent 5c2ba74e3e
commit b4186dfae3
1 file changed
+34
+34
View File
@@ -14,6 +14,7 @@
#include <QFile>
#include <QElapsedTimer>
#include <QTest>
#include <QSignalSpy>
#include <atomic>
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;
}