Quiet capability probes, preserve runtime errors, and register the desktop portal application. Add logging and desktop launcher regression coverage.
45 lines
2.6 KiB
C++
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"
|