File indexing completed on 2024-05-12 05:38:09

0001 /*
0002     SPDX-FileCopyrightText: 2016 Eike Hein <hein@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include <QObject>
0008 
0009 #include <KConfigGroup>
0010 #include <KSharedConfig>
0011 #include <KSycoca>
0012 
0013 #include <QDir>
0014 #include <QIcon>
0015 #include <QStandardPaths>
0016 #include <QTest>
0017 
0018 #include "tasktools.h"
0019 
0020 using namespace TaskManager;
0021 
0022 class TaskToolsTest : public QObject
0023 {
0024     Q_OBJECT
0025 
0026 private Q_SLOTS:
0027     void initTestCase();
0028 
0029     void shouldFindApp();
0030     void shouldFindApp_data();
0031     void shouldFindDefaultApp();
0032     void shouldCompareLauncherUrls();
0033     void testWindowUrlFromMetadata();
0034     void testWindowUrlFromMetadata_data();
0035 
0036 private:
0037     void createIcon();
0038 };
0039 
0040 void TaskToolsTest::initTestCase()
0041 {
0042     QStandardPaths::setTestModeEnabled(true);
0043 
0044     // Set up applications.menu so that kservice works
0045     const QString menusDir = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1String{"/menus"};
0046     QDir(menusDir).removeRecursively();
0047     QDir(menusDir).mkpath(QStringLiteral("."));
0048     QFile::copy(QFINDTESTDATA("../../../menu/desktop/plasma-applications.menu"), menusDir + QLatin1String("/applications.menu"));
0049 
0050     const QString dataDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
0051 
0052     qputenv("XDG_DATA_DIRS", dataDir.toUtf8());
0053 
0054     // Make sure we start with a clean dir
0055     QVERIFY(QDir(dataDir).removeRecursively());
0056     QVERIFY(QDir(dataDir).mkpath(QLatin1String("applications")));
0057     QVERIFY(QDir(dataDir).mkpath(QLatin1String("kservices6")));
0058 
0059     // Add our applications
0060     QFile::copy(QFINDTESTDATA("data/applications/org.kde.dolphin.desktop"), dataDir + QLatin1String("/applications/org.kde.dolphin.desktop"));
0061     QFile::copy(QFINDTESTDATA("data/applications/org.kde.konversation.desktop"), dataDir + QLatin1String("/applications/org.kde.konversation.desktop"));
0062     QFile::copy(QFINDTESTDATA("data/applications/im.riot.Riot.desktop"), dataDir + QLatin1String("/applications/im.riot.Riot.desktop"));
0063     QFile::copy(QFINDTESTDATA("data/applications/org.telegram.desktop.desktop"), dataDir + QLatin1String("/applications/org.telegram.desktop.desktop"));
0064     QFile::copy(QFINDTESTDATA("data/applications/com.spotify.Client.desktop"), dataDir + QLatin1String("/applications/com.spotify.Client.desktop"));
0065     QFile::copy(QFINDTESTDATA("data/applications/GammaRay.desktop"), dataDir + QLatin1String("/applications/GammaRay.desktop"));
0066     QFile::copy(QFINDTESTDATA("data/applications/org.kde.gwenview_importer.desktop"),
0067                 dataDir + QLatin1String("/applications/org.kde.gwenview_importer.desktop"));
0068     QFile::copy(QFINDTESTDATA("data/applications/kcm_autostart.desktop"), dataDir + QLatin1String("/applications/kcm_autostart.desktop"));
0069     QFile::copy(QFINDTESTDATA("data/applications/brave-browser.desktop"), dataDir + QLatin1String("/applications/brave-browser.desktop"));
0070     QFile::copy(QFINDTESTDATA("data/applications/brave-efmjfjelnicpmdcmfikempdhlmainjcb-Default.desktop"),
0071                 dataDir + QLatin1String("/applications/brave-efmjfjelnicpmdcmfikempdhlmainjcb-Default.desktop"));
0072     QFile::copy(QFINDTESTDATA("data/applications/marisa..desktop"), dataDir + QLatin1String("/applications/marisa..desktop"));
0073 
0074     QFile::copy(QFINDTESTDATA("data/applications/kcm_kdeconnect.desktop"), dataDir + QLatin1String("/kservices6/kcm_kdeconnect.desktop"));
0075 
0076     QFile::remove(KSycoca::absoluteFilePath());
0077     KSycoca::self()->ensureCacheValid();
0078     QVERIFY(QFile::exists(KSycoca::absoluteFilePath()));
0079 
0080     // Verify that our enviromnent is as expected and no outside apps leak in
0081     QVERIFY(!KService::serviceByDesktopName(QStringLiteral("org.kde.ktrip")));
0082     QVERIFY(KService::serviceByDesktopName(QStringLiteral("org.kde.dolphin")));
0083     QVERIFY(KService::serviceByDesktopName(QStringLiteral("org.kde.konversation")));
0084 }
0085 
0086 void TaskToolsTest::shouldFindApp_data()
0087 {
0088     QTest::addColumn<QString>("inputFileName");
0089     QTest::addColumn<QString>("id");
0090     QTest::addColumn<QString>("name");
0091     QTest::addColumn<QString>("genericName");
0092     QTest::addColumn<QUrl>("url");
0093 
0094     QTest::newRow("Konversation") << QStringLiteral("org.kde.konversation.desktop") << QStringLiteral("org.kde.konversation") << QStringLiteral("Konversation")
0095                                   << QStringLiteral("IRC Client") << QUrl(QStringLiteral("applications:org.kde.konversation.desktop"));
0096 
0097     QTest::newRow("Dolphin") << QStringLiteral("org.kde.dolphin.desktop") << QStringLiteral("org.kde.dolphin") << QStringLiteral("Dolphin")
0098                              << QStringLiteral("File Manager") << QUrl(QStringLiteral("applications:org.kde.dolphin.desktop"));
0099 }
0100 
0101 void TaskToolsTest::shouldFindApp()
0102 {
0103     // FIXME Test icon.
0104 
0105     QFETCH(QString, inputFileName);
0106 
0107     const QUrl inputUrl = QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("applications/") + inputFileName));
0108 
0109     const AppData &data = appDataFromUrl(inputUrl);
0110 
0111     QFETCH(QString, id);
0112     QFETCH(QString, name);
0113     QFETCH(QString, genericName);
0114     QFETCH(QUrl, url);
0115 
0116     QCOMPARE(data.id, id);
0117     QCOMPARE(data.name, name);
0118     QCOMPARE(data.genericName, genericName);
0119     QCOMPARE(data.url, url);
0120 }
0121 
0122 void TaskToolsTest::shouldFindDefaultApp()
0123 {
0124     // FIXME Test other recognized default app types.
0125 
0126     KConfigGroup config(KSharedConfig::openConfig(), QStringLiteral("General"));
0127     config.writePathEntry("BrowserApplication", QLatin1String("konqueror"));
0128 
0129     QVERIFY(defaultApplication(QUrl("wrong://url")).isEmpty());
0130     QCOMPARE(defaultApplication(QUrl("preferred://browser")), QLatin1String("konqueror"));
0131 }
0132 
0133 void TaskToolsTest::shouldCompareLauncherUrls()
0134 {
0135     QUrl a(QLatin1String("file:///usr/share/applications/org.kde.dolphin.desktop"));
0136     QUrl b(QLatin1String("file:///usr/share/applications/org.kde.konsole.desktop"));
0137     QUrl c(QLatin1String("file:///usr/share/applications/org.kde.dolphin.desktop?iconData=foo"));
0138     QUrl d(QLatin1String("file:///usr/share/applications/org.kde.konsole.desktop?iconData=bar"));
0139 
0140     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(a)));
0141     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(a), Strict));
0142     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(a), IgnoreQueryItems));
0143 
0144     QVERIFY(!launcherUrlsMatch(QUrl(a), QUrl(b)));
0145     QVERIFY(!launcherUrlsMatch(QUrl(a), QUrl(b), Strict));
0146     QVERIFY(!launcherUrlsMatch(QUrl(a), QUrl(b), IgnoreQueryItems));
0147 
0148     QVERIFY(!launcherUrlsMatch(QUrl(b), QUrl(c), Strict));
0149     QVERIFY(!launcherUrlsMatch(QUrl(c), QUrl(d), Strict));
0150 
0151     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(c), IgnoreQueryItems));
0152     QVERIFY(!launcherUrlsMatch(QUrl(c), QUrl(d), IgnoreQueryItems));
0153 }
0154 
0155 void TaskToolsTest::testWindowUrlFromMetadata()
0156 {
0157     QFETCH(QString, appId);
0158     QFETCH(QString, xWindowsWMClassName);
0159     QFETCH(QUrl, resultUrl);
0160 
0161     const QUrl actualResult = windowUrlFromMetadata(appId, 0, KSharedConfig::openConfig(QStringLiteral("taskmanagerrulestestrc")), xWindowsWMClassName);
0162 
0163     QCOMPARE(actualResult, resultUrl);
0164 }
0165 
0166 void TaskToolsTest::testWindowUrlFromMetadata_data()
0167 {
0168     QTest::addColumn<QString>("appId");
0169     QTest::addColumn<QString>("xWindowsWMClassName");
0170     QTest::addColumn<QUrl>("resultUrl");
0171 
0172     QTest::addRow("Dolphin") << QStringLiteral("org.kde.dolphin") << QString() << QUrl(QStringLiteral("applications:org.kde.dolphin.desktop"));
0173     QTest::addRow("Element (Flatpak)") << QStringLiteral("Element") << QStringLiteral("element") << QUrl(QStringLiteral("applications:im.riot.Riot.desktop"));
0174     QTest::addRow("Telegram (Flatpak)") << QStringLiteral("TelegramDesktop") << QStringLiteral("telegram-desktop")
0175                                         << QUrl(QStringLiteral("applications:org.telegram.desktop.desktop"));
0176     QTest::addRow("Spotify (Flatpak)") << QStringLiteral("Spotify") << QStringLiteral("spotify")
0177                                        << QUrl(QStringLiteral("applications:com.spotify.Client.desktop"));
0178     QTest::addRow("GammaRay") << QStringLiteral("GammaRay") << QStringLiteral("gammary-client") << QUrl(QStringLiteral("applications:GammaRay.desktop"));
0179     QTest::addRow("Gwenview Importer") << QStringLiteral("org.kde.gwenview_importer") << QStringLiteral("gwenview_importer")
0180                                        << QUrl(QStringLiteral("applications:org.kde.gwenview_importer.desktop"));
0181     QTest::addRow("kcm_autostart") << QStringLiteral("kcm_autostart") << QString() << QUrl(QStringLiteral("applications:kcm_autostart.desktop"));
0182     QTest::addRow("brave") << QStringLiteral("Brave-browser") << QStringLiteral("brave-browser") << QUrl("applications:brave-browser.desktop");
0183     QTest::addRow("brave_webapp") << QStringLiteral("Brave-browser") << QStringLiteral("crx_efmjfjelnicpmdcmfikempdhlmainjcb")
0184                                   << QUrl("applications:brave-efmjfjelnicpmdcmfikempdhlmainjcb-Default.desktop");
0185 
0186     const QString dataDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
0187     QTest::addRow("kcm_kdeconnect") << dataDir + QLatin1String("/kservices6/kcm_kdeconnect") << QString()
0188                                     << QUrl::fromLocalFile(dataDir + QLatin1String("/kservices6/kcm_kdeconnect.desktop"));
0189 
0190     QTest::addRow("Empty appId and xWindowsWMClassName, don't match marisa..desktop") << QString() << QString() << QUrl();
0191 
0192     // TODO test mapping rules
0193 }
0194 
0195 QTEST_MAIN(TaskToolsTest)
0196 
0197 #include "tasktoolstest.moc"