Warning, file /plasma/plasma-workspace/libtaskmanager/autotests/tasktoolstest.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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     const QString dataDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
0045 
0046     qputenv("XDG_DATA_DIRS", dataDir.toUtf8());
0047 
0048     // Make sure we start with a clean dir
0049     QVERIFY(QDir(dataDir).removeRecursively());
0050     QVERIFY(QDir(dataDir).mkpath(QLatin1String("applications")));
0051     QVERIFY(QDir(dataDir).mkpath(QLatin1String("kservices5")));
0052 
0053     // Add our applications
0054     QFile::copy(QFINDTESTDATA("data/applications/org.kde.dolphin.desktop"), dataDir + QLatin1String("/applications/org.kde.dolphin.desktop"));
0055     QFile::copy(QFINDTESTDATA("data/applications/org.kde.konversation.desktop"), dataDir + QLatin1String("/applications/org.kde.konversation.desktop"));
0056     QFile::copy(QFINDTESTDATA("data/applications/im.riot.Riot.desktop"), dataDir + QLatin1String("/applications/im.riot.Riot.desktop"));
0057     QFile::copy(QFINDTESTDATA("data/applications/org.telegram.desktop.desktop"), dataDir + QLatin1String("/applications/org.telegram.desktop.desktop"));
0058     QFile::copy(QFINDTESTDATA("data/applications/com.spotify.Client.desktop"), dataDir + QLatin1String("/applications/com.spotify.Client.desktop"));
0059     QFile::copy(QFINDTESTDATA("data/applications/GammaRay.desktop"), dataDir + QLatin1String("/applications/GammaRay.desktop"));
0060     QFile::copy(QFINDTESTDATA("data/applications/org.kde.gwenview_importer.desktop"),
0061                 dataDir + QLatin1String("/applications/org.kde.gwenview_importer.desktop"));
0062     QFile::copy(QFINDTESTDATA("data/applications/kcm_autostart.desktop"), dataDir + QLatin1String("/applications/kcm_autostart.desktop"));
0063     QFile::copy(QFINDTESTDATA("data/applications/brave-browser.desktop"), dataDir + QLatin1String("/applications/brave-browser.desktop"));
0064     QFile::copy(QFINDTESTDATA("data/applications/brave-efmjfjelnicpmdcmfikempdhlmainjcb-Default.desktop"),
0065                 dataDir + QLatin1String("/applications/brave-efmjfjelnicpmdcmfikempdhlmainjcb-Default.desktop"));
0066     QFile::copy(QFINDTESTDATA("data/applications/marisa..desktop"), dataDir + QLatin1String("/applications/marisa..desktop"));
0067 
0068     QFile::copy(QFINDTESTDATA("data/applications/kcm_kdeconnect.desktop"), dataDir + QLatin1String("/kservices5/kcm_kdeconnect.desktop"));
0069 
0070     QFile::remove(KSycoca::absoluteFilePath());
0071     KSycoca::self()->ensureCacheValid();
0072     QVERIFY(QFile::exists(KSycoca::absoluteFilePath()));
0073 
0074     // Verify that our enviromnent is as expected and no outside apps leak in
0075     QVERIFY(!KService::serviceByDesktopName(QStringLiteral("org.kde.ktrip")));
0076     QVERIFY(KService::serviceByDesktopName(QStringLiteral("org.kde.dolphin")));
0077     QVERIFY(KService::serviceByDesktopName(QStringLiteral("org.kde.konversation")));
0078 }
0079 
0080 void TaskToolsTest::shouldFindApp_data()
0081 {
0082     QTest::addColumn<QString>("inputFileName");
0083     QTest::addColumn<QString>("id");
0084     QTest::addColumn<QString>("name");
0085     QTest::addColumn<QString>("genericName");
0086     QTest::addColumn<QUrl>("url");
0087 
0088     QTest::newRow("Konversation") << QStringLiteral("org.kde.konversation.desktop") << QStringLiteral("org.kde.konversation") << QStringLiteral("Konversation")
0089                                   << QStringLiteral("IRC Client") << QUrl(QStringLiteral("applications:org.kde.konversation.desktop"));
0090 
0091     QTest::newRow("Dolphin") << QStringLiteral("org.kde.dolphin.desktop") << QStringLiteral("org.kde.dolphin") << QStringLiteral("Dolphin")
0092                              << QStringLiteral("File Manager") << QUrl(QStringLiteral("applications:org.kde.dolphin.desktop"));
0093 }
0094 
0095 void TaskToolsTest::shouldFindApp()
0096 {
0097     // FIXME Test icon.
0098 
0099     QFETCH(QString, inputFileName);
0100 
0101     const QUrl inputUrl = QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("applications/") + inputFileName));
0102 
0103     const AppData &data = appDataFromUrl(inputUrl);
0104 
0105     QFETCH(QString, id);
0106     QFETCH(QString, name);
0107     QFETCH(QString, genericName);
0108     QFETCH(QUrl, url);
0109 
0110     QCOMPARE(data.id, id);
0111     QCOMPARE(data.name, name);
0112     QCOMPARE(data.genericName, genericName);
0113     QCOMPARE(data.url, url);
0114 }
0115 
0116 void TaskToolsTest::shouldFindDefaultApp()
0117 {
0118     // FIXME Test other recognized default app types.
0119 
0120     KConfigGroup config(KSharedConfig::openConfig(), "General");
0121     config.writePathEntry("BrowserApplication", QLatin1String("konqueror"));
0122 
0123     QVERIFY(defaultApplication(QUrl("wrong://url")).isEmpty());
0124     QCOMPARE(defaultApplication(QUrl("preferred://browser")), QLatin1String("konqueror"));
0125 }
0126 
0127 void TaskToolsTest::shouldCompareLauncherUrls()
0128 {
0129     QUrl a(QLatin1String("file:///usr/share/applications/org.kde.dolphin.desktop"));
0130     QUrl b(QLatin1String("file:///usr/share/applications/org.kde.konsole.desktop"));
0131     QUrl c(QLatin1String("file:///usr/share/applications/org.kde.dolphin.desktop?iconData=foo"));
0132     QUrl d(QLatin1String("file:///usr/share/applications/org.kde.konsole.desktop?iconData=bar"));
0133 
0134     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(a)));
0135     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(a), Strict));
0136     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(a), IgnoreQueryItems));
0137 
0138     QVERIFY(!launcherUrlsMatch(QUrl(a), QUrl(b)));
0139     QVERIFY(!launcherUrlsMatch(QUrl(a), QUrl(b), Strict));
0140     QVERIFY(!launcherUrlsMatch(QUrl(a), QUrl(b), IgnoreQueryItems));
0141 
0142     QVERIFY(!launcherUrlsMatch(QUrl(b), QUrl(c), Strict));
0143     QVERIFY(!launcherUrlsMatch(QUrl(c), QUrl(d), Strict));
0144 
0145     QVERIFY(launcherUrlsMatch(QUrl(a), QUrl(c), IgnoreQueryItems));
0146     QVERIFY(!launcherUrlsMatch(QUrl(c), QUrl(d), IgnoreQueryItems));
0147 }
0148 
0149 void TaskToolsTest::testWindowUrlFromMetadata()
0150 {
0151     QFETCH(QString, appId);
0152     QFETCH(QString, xWindowsWMClassName);
0153     QFETCH(QUrl, resultUrl);
0154 
0155     const QUrl actualResult = windowUrlFromMetadata(appId, 0, KSharedConfig::openConfig(QStringLiteral("taskmanagerrulestestrc")), xWindowsWMClassName);
0156 
0157     QCOMPARE(actualResult, resultUrl);
0158 }
0159 
0160 void TaskToolsTest::testWindowUrlFromMetadata_data()
0161 {
0162     QTest::addColumn<QString>("appId");
0163     QTest::addColumn<QString>("xWindowsWMClassName");
0164     QTest::addColumn<QUrl>("resultUrl");
0165 
0166     QTest::addRow("Dolphin") << QStringLiteral("org.kde.dolphin") << QString() << QUrl(QStringLiteral("applications:org.kde.dolphin.desktop"));
0167     QTest::addRow("Element (Flatpak)") << QStringLiteral("Element") << QStringLiteral("element") << QUrl(QStringLiteral("applications:im.riot.Riot.desktop"));
0168     QTest::addRow("Telegram (Flatpak)") << QStringLiteral("TelegramDesktop") << QStringLiteral("telegram-desktop")
0169                                         << QUrl(QStringLiteral("applications:org.telegram.desktop.desktop"));
0170     QTest::addRow("Spotify (Flatpak)") << QStringLiteral("Spotify") << QStringLiteral("spotify")
0171                                        << QUrl(QStringLiteral("applications:com.spotify.Client.desktop"));
0172     QTest::addRow("GammaRay") << QStringLiteral("GammaRay") << QStringLiteral("gammary-client") << QUrl(QStringLiteral("applications:GammaRay.desktop"));
0173     QTest::addRow("Gwenview Importer") << QStringLiteral("org.kde.gwenview_importer") << QStringLiteral("gwenview_importer")
0174                                        << QUrl(QStringLiteral("applications:org.kde.gwenview_importer.desktop"));
0175     QTest::addRow("kcm_autostart") << QStringLiteral("kcm_autostart") << QString() << QUrl(QStringLiteral("applications:kcm_autostart.desktop"));
0176     QTest::addRow("brave") << QStringLiteral("Brave-browser") << QStringLiteral("brave-browser") << QUrl("applications:brave-browser.desktop");
0177     QTest::addRow("brave_webapp") << QStringLiteral("Brave-browser") << QStringLiteral("crx_efmjfjelnicpmdcmfikempdhlmainjcb")
0178                                   << QUrl("applications:brave-efmjfjelnicpmdcmfikempdhlmainjcb-Default.desktop");
0179 
0180     const QString dataDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
0181     QTest::addRow("kcm_kdeconnect") << dataDir + QLatin1String("/kservices5/kcm_kdeconnect") << QString()
0182                                     << QUrl::fromLocalFile(dataDir + QLatin1String("/kservices5/kcm_kdeconnect.desktop"));
0183 
0184     QTest::addRow("Empty appId and xWindowsWMClassName, don't match marisa..desktop") << QString() << QString() << QUrl();
0185 
0186     // TODO test mapping rules
0187 }
0188 
0189 QTEST_MAIN(TaskToolsTest)
0190 
0191 #include "tasktoolstest.moc"