diff options
author | Dan Vrátil <dvratil@redhat.com> | 2015-03-30 17:49:26 +0200 |
---|---|---|
committer | Dan Vrátil <dvratil@redhat.com> | 2015-03-30 17:49:28 +0200 |
commit | 8f2fed8d2a1b23a8f318047b6592ad64b6ecbd22 (patch) | |
tree | 6f8d5ea2dc8695dfc6c3c641c2ef044ad5810bd8 /async/autotests | |
parent | 1d946c166cc7a4a2556e8bfaab7dc66695b555e1 (diff) | |
download | sink-8f2fed8d2a1b23a8f318047b6592ad64b6ecbd22.tar.gz sink-8f2fed8d2a1b23a8f318047b6592ad64b6ecbd22.zip |
Async: initial support for native chaining of KJobs
It is now possible use KJob-derived jobs with libasync without having to write
lambda wrappers.
auto job = Async::start<ReturnType, MyKJob, MyKJob::result, Args ...)
.then<ReturnType, OtherKJob, OtherKJob::result, PrevKJobReturnType>();
job.exec(arg1, arg2, ...);
The reason for this approach (instead of taking KJob* as an argument is that
we usually want the KJob ctor arguments to depend on result of previous job.
At least in case of Async::start() however it makes sense to support passing
KJob* as an argument (not yet implemented).
In future we should also support custom error handlers.
The KJob integration is build-time optional, but enabled by default (pass
-DWITH_KJOB=FALSE to CMake to disable).
Adds KCoreAddons dependency.
Diffstat (limited to 'async/autotests')
-rw-r--r-- | async/autotests/CMakeLists.txt | 8 | ||||
-rw-r--r-- | async/autotests/kjobtest.cpp | 69 | ||||
-rw-r--r-- | async/autotests/testkjob.cpp | 28 | ||||
-rw-r--r-- | async/autotests/testkjob.h | 48 |
4 files changed, 152 insertions, 1 deletions
diff --git a/async/autotests/CMakeLists.txt b/async/autotests/CMakeLists.txt index a2bedc8..8116f13 100644 --- a/async/autotests/CMakeLists.txt +++ b/async/autotests/CMakeLists.txt | |||
@@ -2,4 +2,10 @@ include_directories(../src ${CMAKE_CURRENT_BINARY_DIR}) | |||
2 | 2 | ||
3 | add_executable(asynctest asynctest.cpp) | 3 | add_executable(asynctest asynctest.cpp) |
4 | qt5_use_modules(asynctest Test) | 4 | qt5_use_modules(asynctest Test) |
5 | target_link_libraries(asynctest akonadi2async Qt5::Core Qt5::Test) \ No newline at end of file | 5 | target_link_libraries(asynctest akonadi2async Qt5::Core Qt5::Test) |
6 | |||
7 | if (WITH_KJOB) | ||
8 | add_executable(kjobtest kjobtest.cpp testkjob.cpp) | ||
9 | qt5_use_modules(kjobtest Test) | ||
10 | target_link_libraries(kjobtest akonadi2async Qt5::Core Qt5::Test KF5::CoreAddons) | ||
11 | endif () \ No newline at end of file | ||
diff --git a/async/autotests/kjobtest.cpp b/async/autotests/kjobtest.cpp new file mode 100644 index 0000000..be92d68 --- /dev/null +++ b/async/autotests/kjobtest.cpp | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * Copyright 2015 Daniel Vrátil <dvratil@redhat.com> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License as | ||
6 | * published by the Free Software Foundation; either version 2 of | ||
7 | * the License or (at your option) version 3 or any later version | ||
8 | * accepted by the membership of KDE e.V. (or its successor approved | ||
9 | * by the membership of KDE e.V.), which shall act as a proxy | ||
10 | * defined in Section 14 of version 3 of the license. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include "../src/async.h" | ||
23 | #include "testkjob.h" | ||
24 | |||
25 | #include <QtTest/QTest> | ||
26 | |||
27 | class KJobTest : public QObject | ||
28 | { | ||
29 | Q_OBJECT | ||
30 | |||
31 | public: | ||
32 | KJobTest() | ||
33 | {} | ||
34 | |||
35 | ~KJobTest() | ||
36 | {} | ||
37 | |||
38 | private Q_SLOTS: | ||
39 | void testSingleKJob(); | ||
40 | void testKJobChain(); | ||
41 | |||
42 | }; | ||
43 | |||
44 | void KJobTest::testSingleKJob() | ||
45 | { | ||
46 | auto job = Async::start<int, TestKJob, &TestKJob::result, int>(); | ||
47 | |||
48 | auto future = job.exec(42); | ||
49 | future.waitForFinished(); | ||
50 | |||
51 | QVERIFY(future.isFinished()); | ||
52 | QCOMPARE(future.value(), 42); | ||
53 | } | ||
54 | |||
55 | void KJobTest::testKJobChain() | ||
56 | { | ||
57 | auto job = Async::start<int, TestKJob, &TestKJob::result, int>() | ||
58 | .then<int, TestKJob, &TestKJob::result, int>(); | ||
59 | |||
60 | auto future = job.exec(42); | ||
61 | future.waitForFinished(); | ||
62 | |||
63 | QVERIFY(future.isFinished()); | ||
64 | QCOMPARE(future.value(), 42); | ||
65 | } | ||
66 | |||
67 | QTEST_MAIN(KJobTest) | ||
68 | |||
69 | #include "kjobtest.moc" \ No newline at end of file | ||
diff --git a/async/autotests/testkjob.cpp b/async/autotests/testkjob.cpp new file mode 100644 index 0000000..b86f913 --- /dev/null +++ b/async/autotests/testkjob.cpp | |||
@@ -0,0 +1,28 @@ | |||
1 | #include "testkjob.h" | ||
2 | |||
3 | TestKJob::TestKJob(int result) | ||
4 | : mResult(result) | ||
5 | { | ||
6 | connect(&mTimer, &QTimer::timeout, | ||
7 | this, &TestKJob::onTimeout); | ||
8 | mTimer.setSingleShot(true); | ||
9 | mTimer.setInterval(200); | ||
10 | } | ||
11 | |||
12 | TestKJob::~TestKJob() | ||
13 | {} | ||
14 | |||
15 | void TestKJob::start() | ||
16 | { | ||
17 | mTimer.start(); | ||
18 | } | ||
19 | |||
20 | int TestKJob::result() | ||
21 | { | ||
22 | return mResult; | ||
23 | } | ||
24 | |||
25 | void TestKJob::onTimeout() | ||
26 | { | ||
27 | emitResult(); | ||
28 | } \ No newline at end of file | ||
diff --git a/async/autotests/testkjob.h b/async/autotests/testkjob.h new file mode 100644 index 0000000..eead98e --- /dev/null +++ b/async/autotests/testkjob.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * Copyright 2015 Daniel Vrátil <dvratil@redhat.com> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License as | ||
6 | * published by the Free Software Foundation; either version 2 of | ||
7 | * the License or (at your option) version 3 or any later version | ||
8 | * accepted by the membership of KDE e.V. (or its successor approved | ||
9 | * by the membership of KDE e.V.), which shall act as a proxy | ||
10 | * defined in Section 14 of version 3 of the license. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #ifndef TESTKJOB_H | ||
23 | #define TESTKJOB_H | ||
24 | |||
25 | #include <KJob> | ||
26 | #include <QTimer> | ||
27 | |||
28 | class TestKJob : public KJob | ||
29 | { | ||
30 | Q_OBJECT | ||
31 | |||
32 | public: | ||
33 | TestKJob(int result); | ||
34 | ~TestKJob(); | ||
35 | |||
36 | void start(); | ||
37 | |||
38 | int result(); | ||
39 | |||
40 | private Q_SLOTS: | ||
41 | void onTimeout(); | ||
42 | |||
43 | private: | ||
44 | int mResult; | ||
45 | QTimer mTimer; | ||
46 | }; | ||
47 | |||
48 | #endif // TESTKJOB_H \ No newline at end of file | ||