Files
utun2/tools/chatgui/tests/test_desktop_integration.cpp
T
evgeny 7c814f5cb9 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.
2026-10-21 15:45:40 +02:00

45 lines
2.6 KiB
C++

// Настоящий 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"