// Настоящий desktop parser/launcher: путь с пробелами, кавычками и спецсимволами сохраняется без shell-подстановок. #include #include #include #include #include #include #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"