File indexing completed on 2024-04-28 03:56:49

0001 /*
0002     SPDX-FileCopyrightText: 2023 Alexander Lohnau <alexander.lohnau@gmx.de>
0003     SPDX-License-Identifier: LGPL-2.1-or-later
0004 */
0005 #include <KRunner/AbstractRunnerTest>
0006 #include <KRunner/RunnerManager>
0007 #include <QTest>
0008 
0009 using namespace KRunner;
0010 
0011 class ThreadingTest : public AbstractRunnerTest
0012 {
0013     Q_OBJECT
0014 
0015     AbstractRunner *fakeRunner = nullptr;
0016 private Q_SLOTS:
0017     void init()
0018     {
0019         initProperties();
0020         startDBusRunnerProcess({QStringLiteral("net.krunnertests.dave")});
0021         fakeRunner = manager->loadRunner(KPluginMetaData::findPluginById("krunnertest", "fakerunnerplugin"));
0022         QCOMPARE(manager->runners().size(), 2);
0023     }
0024     void cleanup()
0025     {
0026         killRunningDBusProcesses();
0027     }
0028 
0029     void testParallelQuerying()
0030     {
0031         constexpr int trottlingDelay = 250;
0032         manager->launchQuery("fooDelay300");
0033 
0034         QSignalSpy changedSpy(manager.get(), &RunnerManager::matchesChanged);
0035         QSignalSpy finishedSpy(manager.get(), &RunnerManager::queryFinished);
0036         QVERIFY(changedSpy.wait(trottlingDelay + 10)); // Due to throttling, otherwise we'd have this signal after 50 ms
0037         QCOMPARE(finishedSpy.count(), 0);
0038 
0039         const auto matches = manager->matches();
0040         QCOMPARE(matches.size(), 2);
0041         QVERIFY(std::all_of(matches.begin(), matches.end(), [this](QueryMatch m) {
0042             return m.runner() == fakeRunner;
0043         }));
0044 
0045         QVERIFY(finishedSpy.wait(trottlingDelay - 5));
0046         QCOMPARE(changedSpy.count(), 2);
0047 
0048         QCOMPARE(manager->matches().size(), 3);
0049     }
0050 
0051     void testDeletionOfRunningJob()
0052     {
0053         manager->setAllowedRunners({"fakerunnerplugin"});
0054         manager->launchQuery("foo");
0055         manager->launchQuery("foobar");
0056         QThread::msleep(1); // Wait for runner to be invoked and query started
0057         QPointer<QObject> ptr(fakeRunner);
0058 
0059         QEventLoop loop;
0060         QTimer::singleShot(500, &loop, &QEventLoop::quit);
0061 
0062         manager.reset(nullptr);
0063         QVERIFY(ptr); // Runner should not be deleted or reset now
0064 
0065         loop.exec();
0066         QVERIFY(!ptr);
0067     }
0068 
0069     void testTeardownWhileJobIsRunning()
0070     {
0071         manager->launchQuery("fooDelay500");
0072         manager->matchSessionComplete();
0073         QSignalSpy spy(fakeRunner, &AbstractRunner::teardown);
0074         QSignalSpy dbusSpy(manager->runners().constFirst(), &AbstractRunner::teardown);
0075         spy.wait(100);
0076         QCOMPARE(dbusSpy.count(), 0); // Should not be called due to the match fimeout
0077     }
0078 
0079     void benchmarkQuerying()
0080     {
0081         QSKIP("Skipped by default");
0082         QStandardPaths::setTestModeEnabled(false);
0083         manager.reset(new RunnerManager());
0084         QBENCHMARK_ONCE {
0085             launchQuery("test");
0086             launchQuery("spell bla");
0087             launchQuery("define test");
0088         }
0089     }
0090 };
0091 
0092 QTEST_MAIN(ThreadingTest)
0093 
0094 #include "threadingtest.moc"