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:
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"
|
||||
Reference in new issue
Block a user