File indexing completed on 2024-04-28 15:34:48
0001 /* -*- C++ -*- 0002 This file contains a testsuite for JobPointer behaviour in ThreadWeaver. 0003 0004 SPDX-FileCopyrightText: 2005-2013 Mirko Boehm <mirko@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include <QString> 0010 #include <QTest> 0011 0012 #include <ThreadWeaver/Job> 0013 #include <ThreadWeaver/JobPointer> 0014 #include <ThreadWeaver/ThreadWeaver> 0015 0016 class NotifyOnDeletejob : public ThreadWeaver::Job 0017 { 0018 public: 0019 explicit NotifyOnDeletejob(bool &exists) 0020 : ThreadWeaver::Job() 0021 , m_exists(exists) 0022 { 0023 exists = true; 0024 } 0025 0026 ~NotifyOnDeletejob() override 0027 { 0028 m_exists = false; 0029 } 0030 0031 void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread *) override 0032 { 0033 } 0034 0035 private: 0036 bool &m_exists; 0037 }; 0038 0039 class LifecycleTests : public QObject 0040 { 0041 Q_OBJECT 0042 0043 public: 0044 LifecycleTests(); 0045 0046 private Q_SLOTS: 0047 void testJobAutoDeletionBasics(); 0048 void testJobAutoDeletion(); 0049 }; 0050 0051 LifecycleTests::LifecycleTests() 0052 { 0053 } 0054 0055 void LifecycleTests::testJobAutoDeletionBasics() 0056 { 0057 bool job1Exists = false; 0058 bool job2Exists = false; 0059 ThreadWeaver::JobPointer job2(new NotifyOnDeletejob(job2Exists)); 0060 Q_UNUSED(job2); 0061 QCOMPARE(true, job2Exists); 0062 { 0063 ThreadWeaver::JobPointer job1(new NotifyOnDeletejob(job1Exists)); 0064 Q_UNUSED(job1); 0065 QCOMPARE(job1Exists, true); 0066 } 0067 QCOMPARE(job1Exists, false); 0068 QCOMPARE(job2Exists, true); 0069 } 0070 0071 void LifecycleTests::testJobAutoDeletion() 0072 { 0073 bool job1Exists = false; 0074 bool job2Exists = false; 0075 { 0076 ThreadWeaver::JobPointer job1(new NotifyOnDeletejob(job1Exists)); 0077 QCOMPARE(job1Exists, true); 0078 int argc = 0; 0079 QCoreApplication app(argc, (char **)nullptr); 0080 Q_UNUSED(app); 0081 QVERIFY(ThreadWeaver::Queue::instance()); 0082 ThreadWeaver::Queue::instance()->suspend(); 0083 ThreadWeaver::Queue::instance()->enqueue(job1); 0084 ThreadWeaver::Queue::instance()->enqueue(ThreadWeaver::JobPointer(new NotifyOnDeletejob(job2Exists))); 0085 QCOMPARE(job2Exists, true); 0086 ThreadWeaver::Queue::instance()->resume(); 0087 ThreadWeaver::Queue::instance()->finish(); 0088 QVERIFY(ThreadWeaver::Queue::instance()->isIdle()); 0089 ThreadWeaver::Queue::instance()->suspend(); 0090 QCOMPARE(job2Exists, false); 0091 QCOMPARE(job1Exists, true); 0092 } 0093 QVERIFY(ThreadWeaver::Queue::instance() == nullptr); 0094 QCOMPARE(job2Exists, false); 0095 QCOMPARE(job1Exists, false); 0096 } 0097 0098 QTEST_APPLESS_MAIN(LifecycleTests) 0099 0100 #include "LifecycleTests.moc"