File indexing completed on 2024-12-08 12:26:51
0001 /* 0002 SPDX-FileCopyrightText: 2014 Alejandro Fiestas Olivares <afiestas@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 #include <QSignalSpy> 0009 #include <QTest> 0010 0011 #include <Solid/Job> 0012 0013 using namespace Solid; 0014 0015 class MockSolidJob : public Solid::Job 0016 { 0017 Q_OBJECT 0018 public: 0019 enum Error { 0020 Foo = Job::UserDefinedError, 0021 Bar, 0022 }; 0023 bool execWithError(); 0024 void startWithError(); 0025 private Q_SLOTS: 0026 virtual void doStart(); 0027 void emitQueued() 0028 { 0029 emitResult(); 0030 } 0031 0032 private: 0033 Q_DECLARE_PRIVATE(Job) 0034 }; 0035 0036 void MockSolidJob::doStart() 0037 { 0038 QMetaObject::invokeMethod(this, "emitQueued", Qt::QueuedConnection); 0039 } 0040 0041 bool MockSolidJob::execWithError() 0042 { 0043 setError(Bar); 0044 setErrorText(QStringLiteral("Error Bar happened")); 0045 return exec(); 0046 } 0047 0048 void MockSolidJob::startWithError() 0049 { 0050 setError(Foo); 0051 setErrorText(QStringLiteral("Error Foo happened")); 0052 start(); 0053 } 0054 0055 class testSolidJob : public QObject 0056 { 0057 Q_OBJECT 0058 0059 private Q_SLOTS: 0060 void testAsyncAndResult(); 0061 void testAsyncWithError(); 0062 void testAutoDelete(); 0063 void testSync(); 0064 void testError(); 0065 }; 0066 0067 void testSolidJob::testAsyncAndResult() 0068 { 0069 MockSolidJob *job = new MockSolidJob(); 0070 QSignalSpy spy(job, SIGNAL(result(Solid::Job *))); 0071 0072 job->start(); 0073 0074 QVERIFY(spy.wait()); 0075 // Result is emitted 0076 QCOMPARE(spy.count(), 1); 0077 // Result argument is the job that emitted it 0078 QCOMPARE(spy.takeFirst().first().value<MockSolidJob *>(), job); 0079 } 0080 0081 void testSolidJob::testAsyncWithError() 0082 { 0083 MockSolidJob *job = new MockSolidJob(); 0084 QSignalSpy spy(job, SIGNAL(result(Solid::Job *))); 0085 0086 job->startWithError(); 0087 QVERIFY(spy.wait()); // Even on error, we get a result 0088 0089 MockSolidJob *rJob = spy.takeFirst().first().value<MockSolidJob *>(); 0090 QCOMPARE(rJob->error(), (int)MockSolidJob::Foo); 0091 QCOMPARE(rJob->errorText(), QStringLiteral("Error Foo happened")); 0092 } 0093 0094 void testSolidJob::testAutoDelete() 0095 { 0096 MockSolidJob *job = new MockSolidJob(); 0097 QSignalSpy spy(job, SIGNAL(destroyed(QObject *))); 0098 QSignalSpy spyResult(job, SIGNAL(destroyed(QObject *))); 0099 0100 job->start(); 0101 QVERIFY(spy.wait()); 0102 QVERIFY(!spyResult.isEmpty()); // Make sure result was emitted as well 0103 } 0104 0105 void testSolidJob::testSync() 0106 { 0107 MockSolidJob *job = new MockSolidJob(); 0108 QSignalSpy spy(job, SIGNAL(destroyed(QObject *))); 0109 0110 QVERIFY(job->exec()); 0111 QVERIFY(spy.wait()); // Jobs started with exec should also autodelete 0112 } 0113 0114 void testSolidJob::testError() 0115 { 0116 MockSolidJob *job = new MockSolidJob(); 0117 QVERIFY(!job->execWithError()); 0118 0119 QCOMPARE(job->error(), (int)MockSolidJob::Bar); 0120 QCOMPARE(job->errorText(), QStringLiteral("Error Bar happened")); 0121 } 0122 0123 QTEST_MAIN(testSolidJob) 0124 0125 #include "solidjobtest.moc"