From 65f39b6bae3115d6cd86b1d239de2e2f1653edb6 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 00:54:12 +0100 Subject: [PATCH] Test compressed recording rejection and ordered MainWindow shutdown --- tools/chatgui/tests/test_desktop_commands.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tools/chatgui/tests/test_desktop_commands.cpp b/tools/chatgui/tests/test_desktop_commands.cpp index 8c4437d5..04cbabae 100644 --- a/tools/chatgui/tests/test_desktop_commands.cpp +++ b/tools/chatgui/tests/test_desktop_commands.cpp @@ -2,6 +2,7 @@ * Native trampoline исполняется без подмены; пустой каталог CHAT даёт штатный FINISHED/UNAVAILABLE для START. */ #include "../src/mainwindow.h" #include "../transport/gui_bridge.h" +#include "../transport/utun_node.h" #include "../db/db_manager.h" #include "../src/inputbar.h" #include "../src/messagedelegate.h" @@ -27,6 +28,7 @@ extern "C" { #include "radio/radio_call.h" #include "dm/dm_core.h" #include "media_async/attachment_send.h" +#include "audio_compressor.h" #include "mem.h" #include "debug_config.h" } @@ -263,6 +265,37 @@ private slots: } QCOMPARE(releases.load(), 1); QCOMPARE(QFile::exists(QString::fromUtf8(source)), !temporary); } + void discardUnsubmittedCompressor() { + const auto baseline = u_get_allocated_count(); + auto* request = static_cast(u_calloc(1, sizeof(attachment_send_req))); QVERIFY(request); + request->compressor = audio_compressor_create(); QVERIFY(request->compressor); + const std::vector samples(24000, 0); + QCOMPARE(audio_compressor_push(request->compressor, samples.data(), samples.size()), 0); + attachment_send_discard(request); QCOMPARE(u_get_allocated_count(), baseline); + } + void orderedWindowShutdownPersistsGeometry() { + QTemporaryDir directory; QVERIFY(directory.isValid()); + const QString path = directory.filePath("shutdown.cfg"), log = directory.filePath("shutdown.log"); + QFile config(path); QVERIFY(config.open(QIODevice::WriteOnly)); + const QByteArray text = "[global]\nauto_sockets=no\n[chatserver]\ngroup_autoconnect=0\nstorage_autoload=0\n" + "member_files_enabled=0\nlocal_invites_enabled=0\nlocal_broadcasts_enabled=0\n[ntp]\nenabled=no\n"; + QCOMPARE(config.write(text), text.size()); config.close(); + auto logger = qScopeGuard([] { debug_disable_file_output(); }); + DbManager db; MainWindow window(nullptr, &db, path, directory.path(), log); + auto* node = window.utunNode(); QVERIFY(node && node->isRunning()); QTRY_VERIFY(db.isOpen()); + window.resize(1017, 713); const QRect geometry = window.normalGeometry(); QVERIFY(!geometry.isEmpty()); + const QString expected = QStringLiteral("%1,%2,%3,%4").arg(geometry.width()).arg(geometry.height()).arg(geometry.x()).arg(geometry.y()); + QSignalSpy stopping(node, &UtunNode::stopping), stopped(node, &UtunNode::stopped); + window.requestShutdown(); QTRY_COMPARE_WITH_TIMEOUT(stopped.size(), 1, 5000); + QCOMPARE(stopping.size(), 1); QVERIFY(!db.isOpen()); + sqlite3* saved = nullptr; + QCOMPARE(sqlite3_open_v2(qPrintable(directory.filePath("chats.db")), &saved, SQLITE_OPEN_READONLY, nullptr), SQLITE_OK); + auto close = qScopeGuard([&] { sqlite3_close(saved); }); + DbManager snapshot; snapshot.setDb(saved); + QCOMPARE(snapshot.getUiState("window_geometry"), expected); + QCOMPARE(snapshot.getUiState("window_maximized"), QString("0")); + QVERIFY(!snapshot.getUiState("window_splitter").isEmpty()); snapshot.setDb(nullptr); + } void dmAcknowledgment_data() { QTest::addColumn("scenario"); for (const auto& name : {"executed", "stale-generation", "cancelled", "unavailable"})