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"