File indexing completed on 2024-04-21 15:03:01

0001 /*
0002     SPDX-FileCopyrightText: 2021 Alexander Lohnau <alexander.lohnau@gmx.de>
0003     SPDX-License-Identifier: LGPL-2.1-or-later
0004 */
0005 
0006 #include "runnermanager.h"
0007 
0008 #include <KConfigGroup>
0009 #include <KSharedConfig>
0010 #include <QAction>
0011 #include <QCoreApplication>
0012 #include <QObject>
0013 #include <QProcess>
0014 #include <QStandardPaths>
0015 #include <QTest>
0016 
0017 #include "abstractrunnertest.h"
0018 #include "kpluginmetadata_utils_p.h"
0019 
0020 using namespace Plasma;
0021 
0022 class RunnerManagerSingleRunnerModeTest : public AbstractRunnerTest
0023 {
0024     Q_OBJECT
0025 private Q_SLOTS:
0026     void loadTwoRunners()
0027     {
0028         startDBusRunnerProcess({QStringLiteral("net.krunnertests.dave")});
0029         startDBusRunnerProcess({QStringLiteral("net.krunnertests.multi.a1")}, QStringLiteral("net.krunnertests.multi.a1"));
0030         qputenv("XDG_DATA_DIRS", QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation).toLocal8Bit());
0031         QCoreApplication::setLibraryPaths(QStringList());
0032         initProperties();
0033         auto md = parseMetaDataFromDesktopFile(QFINDTESTDATA("dbusrunnertestmulti.desktop"));
0034         QVERIFY(md.isValid());
0035         manager->loadRunner(md);
0036     }
0037 
0038     void cleanup()
0039     {
0040         killRunningDBusProcesses();
0041         const QString configFile = QStandardPaths::locate(QStandardPaths::ConfigLocation, "runnermanagersinglerunnermodetestrcm");
0042         if (!configFile.isEmpty()) {
0043             QFile::remove(configFile);
0044         }
0045     }
0046 
0047     void testAllRunnerResults();
0048     void testSingleRunnerResults();
0049     void testNonExistentRunnerId();
0050     void testLoadingDisabledRunner();
0051 #if KRUNNER_BUILD_DEPRECATED_SINCE(5, 81)
0052     void testAdvertisedSingleRunners();
0053 #endif
0054 };
0055 
0056 void RunnerManagerSingleRunnerModeTest::testAllRunnerResults()
0057 {
0058     loadTwoRunners();
0059     launchQuery("foo");
0060     const auto matches = manager->matches();
0061     QCOMPARE(matches.count(), 2);
0062     const QStringList ids = {matches.at(0).runner()->id(), matches.at(1).runner()->id()};
0063     // Both runners should have produced one result
0064     QVERIFY(ids.contains("dbusrunnertest"));
0065     QVERIFY(ids.contains("dbusrunnertestmulti"));
0066 }
0067 
0068 void RunnerManagerSingleRunnerModeTest::testSingleRunnerResults()
0069 {
0070     loadTwoRunners();
0071     launchQuery("foo", "dbusrunnertest");
0072     QCOMPARE(manager->matches().count(), 1);
0073     QCOMPARE(manager->matches().constFirst().runner()->id(), "dbusrunnertest");
0074     launchQuery("foo", "dbusrunnertestmulti");
0075     QCOMPARE(manager->matches().count(), 1);
0076     QCOMPARE(manager->matches().constFirst().runner()->id(), "dbusrunnertestmulti");
0077 }
0078 
0079 void RunnerManagerSingleRunnerModeTest::testNonExistentRunnerId()
0080 {
0081     loadTwoRunners();
0082     manager->launchQuery("foo", "bla"); // This internally calls reset, we just wait a bit and make sure there are no matches
0083     QTest::qSleep(250);
0084     QVERIFY(manager->matches().isEmpty());
0085 }
0086 
0087 void RunnerManagerSingleRunnerModeTest::testLoadingDisabledRunner()
0088 {
0089     loadTwoRunners();
0090     // Make sure the runner is disabled in the config
0091     auto config = KSharedConfig::openConfig();
0092     config->group("Plugins").writeEntry("dbusrunnertestEnabled", false);
0093     // reset our manager to start clean
0094     manager.reset(new RunnerManager());
0095     // Copy the service files to the appropriate location and only load runners from there
0096     QString location = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/krunner/dbusplugins/";
0097     QDir().mkpath(location);
0098     QFile::copy(QFINDTESTDATA("dbusrunnertest.desktop"), location + "dbusrunnertest.desktop");
0099     QFile::copy(QFINDTESTDATA("dbusrunnertestmulti.desktop"), location + "dbusrunnertestmulti.desktop");
0100 
0101     // Only enabled runner should be loaded and have results
0102     launchQuery("foo");
0103     QCOMPARE(manager->runners().count(), 1);
0104     QCOMPARE(manager->runners().constFirst()->id(), "dbusrunnertestmulti");
0105     QCOMPARE(manager->matches().count(), 1);
0106     QCOMPARE(manager->matches().constFirst().runner()->id(), "dbusrunnertestmulti");
0107 
0108     // Only enabled runner should be loaded and have results
0109     launchQuery("foo", "dbusrunnertest");
0110     QCOMPARE(manager->runners().count(), 2);
0111     const QStringList ids{manager->runners().at(0)->id(), manager->runners().at(1)->id()};
0112     QVERIFY(ids.contains("dbusrunnertestmulti"));
0113     QVERIFY(ids.contains("dbusrunnertest"));
0114     QCOMPARE(manager->matches().count(), 1);
0115     QCOMPARE(manager->matches().constFirst().runner()->id(), "dbusrunnertest");
0116 
0117     // Only enabled runner should used for querying
0118     launchQuery("foo");
0119     QCOMPARE(manager->runners().count(), 2);
0120     QCOMPARE(manager->matches().count(), 1);
0121     QCOMPARE(manager->matches().constFirst().runner()->id(), "dbusrunnertestmulti");
0122 }
0123 
0124 #if KRUNNER_BUILD_DEPRECATED_SINCE(5, 82)
0125 void RunnerManagerSingleRunnerModeTest::testAdvertisedSingleRunners()
0126 {
0127     loadTwoRunners();
0128     QCOMPARE(manager->singleModeAdvertisedRunnerIds(), QStringList{"dbusrunnertest"});
0129 }
0130 #endif
0131 
0132 QTEST_MAIN(RunnerManagerSingleRunnerModeTest)
0133 
0134 #include "runnermanagersinglerunnermodetest.moc"