Test compressed recording rejection and ordered MainWindow shutdown

This commit is contained in:
evgeny committed 2026-10-28 00:59:00 +01:00
1 parent fee528194b
commit 65f39b6bae
1 file changed
+33
@@ -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<attachment_send_req*>(u_calloc(1, sizeof(attachment_send_req))); QVERIFY(request);
request->compressor = audio_compressor_create(); QVERIFY(request->compressor);
const std::vector<int16_t> 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<QString>("scenario");
for (const auto& name : {"executed", "stale-generation", "cancelled", "unavailable"})