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"