diff --git a/tools/chatgui/tests/test_radio_panel.cpp b/tools/chatgui/tests/test_radio_panel.cpp index ffaef7f7..3df49b4a 100644 --- a/tools/chatgui/tests/test_radio_panel.cpp +++ b/tools/chatgui/tests/test_radio_panel.cpp @@ -26,6 +26,7 @@ extern "C" { static UTUN_INSTANCE instance{}; static std::atomic probability{0}; static bool detectorAvailable = true; +static bool failCapture; static int begins, ends, packets, inputs, outputs; extern "C" UTUN_INSTANCE* gui_bridge_get_inst() { return &instance; } @@ -46,6 +47,7 @@ extern "C" ma_result __wrap_ma_context_init(const ma_backend*, ma_uint32, const } extern "C" ma_result __wrap_ma_device_start(ma_device* device) { if (device->type == ma_device_type_capture) ++inputs; else ++outputs; + if (failCapture && device->type == ma_device_type_capture) return MA_ERROR; return __real_ma_device_start(device); } @@ -163,6 +165,19 @@ int main(int argc, char** argv) { await([&]() { return engine->vadAvailable(); }); REQUIRE(engine->groupId() == 8 && vad->isChecked()); engine->stop(); + failCapture = true; + REQUIRE(engine->start(9) == 0); + REQUIRE(!engine->captureAvailable() && vad->isEnabled() && !ptt->isEnabled()); + vad->click(); + await([&]() { return !engine->settingsBusy() && !engine->vadEnabled(); }); + REQUIRE(!engine->captureAvailable()); + failCapture = false; + await([&]() { return engine->captureAvailable(); }); + vad->click(); + await([&]() { return !engine->settingsBusy() && engine->vadAvailable(); }); + REQUIRE(vad->isChecked() && ptt->isEnabled()); + qInfo("radio panel: unavailable microphone permits VAD settings; capture recovery restores controls PASS"); + engine->stop(); engine->loadSettings(directory.filePath("missing.cfg")); await([&]() { return !engine->settingsBusy(); }); REQUIRE(!engine->applySettings({{"radio_vad_enabled", 0}}) && engine->vadEnabled() && !engine->settingsError().isEmpty()); @@ -170,7 +185,12 @@ int main(int argc, char** argv) { REQUIRE(QMetaObject::invokeMethod(button->menu(), "aboutToShow", Qt::DirectConnection)); REQUIRE(!button->menu()->actions().isEmpty()); } - panel.grab().save("/tmp/desktop-radio-panel.png"); + engine->loadSettings(configPath); + await([&]() { return !engine->settingsBusy(); }); + REQUIRE(engine->start(10) == 0 && engine->vadAvailable()); + pump(100); + REQUIRE(panel.grab().save("/tmp/desktop-radio-panel.png")); + engine->stop(); radio_audio_destroy(&instance); uasync_destroy(instance.ua, 0); instance.ua = nullptr;