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"