Route desktop codec diagnostics through the shared log

Quiet capability probes, preserve runtime errors, and register the desktop portal application. Add logging and desktop launcher regression coverage.
This commit is contained in:
evgeny committed 2026-10-21 15:45:40 +02:00
1 parent 9ba78c084b
commit 7c814f5cb9
17 files changed
+349 -44

No files matched your search

@@ -0,0 +1,44 @@
// Настоящий desktop parser/launcher: путь с пробелами, кавычками и спецсимволами сохраняется без shell-подстановок.
#include <QtTest>
#include <QDir>
#include <QFile>
#include <QProcess>
#include <QStandardPaths>
#include <QTemporaryDir>
#include "../src/desktop_integration.h"
#include "debug_config.h"
class DesktopTest : public QObject {
Q_OBJECT
private slots:
void registrationAndLaunch() {
QTemporaryDir directory; QVERIFY(directory.isValid());
qputenv("XDG_DATA_HOME", directory.path().toUtf8());
qputenv("XDG_DATA_DIRS", directory.filePath("system-data").toUtf8());
const QString executable = directory.filePath("space quote\" dollar$ backtick` percent% slash\\-тест");
QFile script(executable); QVERIFY(script.open(QIODevice::WriteOnly));
script.write("#!/bin/sh\nprintf '%s' \"$0\" > \"$DESKTOP_RESULT\"\n"); script.close();
QVERIFY(script.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner));
QVERIFY(registerDesktopApplication(executable));
const QString path = directory.filePath("applications/org.utun.vibechat.desktop");
QFile file(path); QVERIFY(file.open(QIODevice::ReadOnly)); const auto original = file.readAll(); file.close();
QVERIFY(registerDesktopApplication("/must/not/replace/existing/entry"));
QVERIFY(file.open(QIODevice::ReadOnly)); QCOMPARE(file.readAll(), original); file.close();
const auto gio = QStandardPaths::findExecutable("gio");
if (gio.isEmpty()) QSKIP("gio unavailable: desktop entry created; launcher validation needs GLib tools");
const QString output = directory.filePath("result"); qputenv("DESKTOP_RESULT", output.toUtf8());
QProcess process; process.start(gio, {"launch", path}); QVERIFY(process.waitForFinished(5000));
QCOMPARE(process.exitStatus(), QProcess::NormalExit);
QVERIFY2(process.exitCode() == 0, (process.readAllStandardError() + "\nentry:\n" + original).constData());
QFile result(output); QTRY_VERIFY(result.exists()); QVERIFY(result.open(QIODevice::ReadOnly));
QCOMPARE(QString::fromUtf8(result.readAll()), executable);
}
void registrationFailure() {
QTemporaryDir directory; QVERIFY(directory.isValid());
qputenv("XDG_DATA_HOME", directory.path().toUtf8());
QFile obstacle(directory.filePath("applications")); QVERIFY(obstacle.open(QIODevice::WriteOnly)); obstacle.close();
QVERIFY(!registerDesktopApplication("/example/vibechat"));
}
};
QTEST_GUILESS_MAIN(DesktopTest)
#include "test_desktop_integration.moc"