[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdelibs/ksecretsservice] /: Add a unit-test for the
From: Michael Leupold <lemma () confuego ! org>
Date: 2011-09-04 15:26:47
Message-ID: 20110904152647.585CEA60B9 () git ! kde ! org
[Download RAW message or body]
Git commit 6d9ec8b36f44cdb99b6c0da9dde4cf1f87a8f7cd by Michael Leupold.
Committed on 10/08/2010 at 15:53.
Pushed by vrusu into branch 'ksecretsservice'.
Add a unit-test for the QueuedJob/JobQueue classes and fix a small bug while doing so.
svn path=/trunk/playground/base/ksecretservice/; revision=1161638
M +1 -0 jobqueue.cpp
A +132 -0 tests/queuedjobtest.cpp [License: GPL (v2/3)]
A +62 -0 tests/queuedjobtest.h [License: GPL (v2/3)]
M +3 -3 queuedjob.h
M +2 -0 CMakeLists.txt
A +9 -0 tests/CMakeLists.txt
http://commits.kde.org/kdelibs/6d9ec8b36f44cdb99b6c0da9dde4cf1f87a8f7cd
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7a28533..194c614 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,3 +6,5 @@ SET (ksecretservice_lib_SRCS
KDE4_ADD_LIBRARY (ksecretservicelib STATIC ${ksecretservice_lib_SRCS})
TARGET_LINK_LIBRARIES (ksecretservicelib ${QT_QTCORE_LIBRARY})
+
+ADD_SUBDIRECTORY (tests)
\ No newline at end of file
diff --git a/jobqueue.cpp b/jobqueue.cpp
index 5cdee0c..e0bfb0a 100644
--- a/jobqueue.cpp
+++ b/jobqueue.cpp
@@ -66,6 +66,7 @@ void JobQueuePrivate::process()
connect(m_currentJob.data(), SIGNAL(result(QueuedJob*)),
SLOT(jobFinished(QueuedJob*)));
+ m_currentJob->start();
}
void JobQueuePrivate::jobFinished(QueuedJob *job)
diff --git a/queuedjob.h b/queuedjob.h
index b0941b2..59dcb75 100644
--- a/queuedjob.h
+++ b/queuedjob.h
@@ -81,9 +81,9 @@ public:
* not involve an event-loop and it should only be available if the job
* advertised that it can be called immediately.
*
- * @note This method may emit the result but it doesn't have to. If it
- * doesn't call emitResult() it has to ensure that the object gets
- * deleted using deleteLater() by itself.
+ * @note This method has to call emitResult() before returning. Even if
+ * noone is interested in the signal it's used to set mark this
+ * job as finished.
*/
virtual void exec() = 0;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..3b4d00a
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,9 @@
+INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR})
+
+KDE4_ADD_EXECUTABLE (ksecretservice_lib_queuedjobtest queuedjobtest.cpp)
+TARGET_LINK_LIBRARIES (ksecretservice_lib_queuedjobtest
+ ksecretservicelib
+ ${QT_QTTEST_LIBRARIES}
+)
+
+ADD_TEST (QueuedJobTest ksecretservice_lib_queuedjobtest)
diff --git a/tests/queuedjobtest.cpp b/tests/queuedjobtest.cpp
new file mode 100644
index 0000000..a61ecec
--- /dev/null
+++ b/tests/queuedjobtest.cpp
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2010, Michael Leupold <lemma@confuego.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License or (at your option) version 3 or any later version
+ * accepted by the membership of KDE e.V. (or its successor approved
+ * by the membership of KDE e.V.), which shall act as a proxy
+ * defined in Section 14 of version 3 of the license.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "queuedjobtest.h"
+#include <QtCore/QTimer>
+#include <QtCore/QEventLoop>
+#include <QtCore/QPointer>
+#include <jobqueue.h>
+
+TestJob::TestJob(JobQueue *queue) : QueuedJob(queue)
+{
+}
+
+TestJob::~TestJob()
+{
+}
+
+bool TestJob::isImmediate() const
+{
+ return true;
+}
+
+void TestJob::exec()
+{
+ doWork();
+}
+
+void TestJob::start()
+{
+ QTimer::singleShot(0, this, SLOT(doWork()));
+}
+
+void TestJob::doWork()
+{
+ // nothing to do really
+ emitResult();
+}
+
+void QueuedJobTest::initTestCase()
+{
+ m_queue = new JobQueue;
+}
+
+void QueuedJobTest::testSync()
+{
+ QPointer<TestJob> job = new TestJob(m_queue);
+ QVERIFY(job->isImmediate());
+ QVERIFY(!job->isFinished());
+ job->exec();
+ QVERIFY(job->isFinished());
+
+ // make sure the job gets deleted
+ QEventLoop loop;
+ QTimer::singleShot(0, &loop, SLOT(quit()));
+ loop.exec();
+ QVERIFY(job.isNull());
+}
+
+void QueuedJobTest::testAsync()
+{
+ QPointer<TestJob> job = new TestJob(m_queue);
+ QEventLoop loop;
+ loop.connect(job, SIGNAL(result(QueuedJob*)), SLOT(quit()));
+ QVERIFY(!job->isFinished());
+ job->enqueue();
+ loop.exec();
+ // if we end up here, the job will already be deleted
+ QVERIFY(job.isNull() || job->isFinished());
+ if (!job.isNull()) {
+ // if the job wasn't deleted yet, make sure it's getting deleted
+ QTimer::singleShot(0, &loop, SLOT(quit()));
+ loop.exec();
+ QVERIFY(job.isNull());
+ }
+}
+
+void QueuedJobTest::testAsyncOrder()
+{
+ QPointer<TestJob> job1 = new TestJob(m_queue);
+ QPointer<TestJob> job2 = new TestJob(m_queue);
+ QEventLoop loop1;
+ QEventLoop loop2;
+ loop1.connect(job1, SIGNAL(result(QueuedJob*)), SLOT(quit()));
+ loop2.connect(job2, SIGNAL(result(QueuedJob*)), SLOT(quit()));
+ job1->enqueue();
+ job2->enqueue();
+ loop1.exec();
+ loop2.exec();
+ QVERIFY(job1.isNull() || job1->isFinished());
+ QVERIFY(job2.isNull() || job2->isFinished());
+}
+
+void QueuedJobTest::testAsyncOrderInFront()
+{
+ QPointer<TestJob> job1 = new TestJob(m_queue);
+ QPointer<TestJob> job2 = new TestJob(m_queue);
+ QEventLoop loop1;
+ QEventLoop loop2;
+ loop1.connect(job1, SIGNAL(result(QueuedJob*)), SLOT(quit()));
+ loop2.connect(job2, SIGNAL(result(QueuedJob*)), SLOT(quit()));
+ job1->enqueue();
+ job2->enqueue(true);
+ loop2.exec();
+ loop1.exec();
+ QVERIFY(job1.isNull() || job1->isFinished());
+ QVERIFY(job2.isNull() || job2->isFinished());
+}
+
+void QueuedJobTest::cleanupTestCase()
+{
+ delete m_queue;
+}
+
+QTEST_MAIN(QueuedJobTest)
+#include "queuedjobtest.moc"
diff --git a/tests/queuedjobtest.h b/tests/queuedjobtest.h
new file mode 100644
index 0000000..3729666
--- /dev/null
+++ b/tests/queuedjobtest.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010, Michael Leupold <lemma@confuego.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License or (at your option) version 3 or any later version
+ * accepted by the membership of KDE e.V. (or its successor approved
+ * by the membership of KDE e.V.), which shall act as a proxy
+ * defined in Section 14 of version 3 of the license.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef QUEUEDJOBTEST_H
+#define QUEUEDJOBTEST_H
+
+#include <QtTest>
+#include <queuedjob.h>
+
+class JobQueue;
+
+class TestJob : public QueuedJob
+{
+ Q_OBJECT
+
+public:
+ TestJob(JobQueue *queue);
+ virtual ~TestJob();
+ virtual bool isImmediate() const;
+ virtual void exec();
+ virtual void start();
+
+protected Q_SLOTS:
+ void doWork();
+};
+
+class QueuedJobTest : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void initTestCase();
+
+ void testSync();
+ void testAsync();
+ void testAsyncOrder();
+ void testAsyncOrderInFront();
+
+ void cleanupTestCase();
+
+private:
+ JobQueue *m_queue;
+};
+
+#endif // QUEUEDJOBTEST_H
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic