diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2020-09-30 16:42:47 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2020-10-28 15:38:52 +0100 |
commit | c34673e5d918e1882401572f81d8c2d6f54c5459 (patch) | |
tree | e85108896b9cd29a035384846d50d423d79e1c73 /tests/auto | |
parent | cf043a785ac9357e8f1283ea9e1496261af2b1a5 (diff) |
QtConcurrent: Handle running with promise inside QTaskBuilder
Please note, that in case of run with promise it doesn't make
sense to provide the overload taking the FutureResult, as if we are
going to ignore the returned QFuture object, we can't communicate
with the passed QPromise.
Fixes: QTBUG-87083
Change-Id: I4066506736c2bbeea3e42030b9495f13e06cb27e
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp b/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp index f4e6f99660..3ad34c3369 100644 --- a/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp +++ b/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp @@ -41,9 +41,11 @@ private Q_SLOTS: void taskWithLambda(); void taskWithArguments(); void useCustomThreadPool(); + void setPriority_data(); void setPriority(); void adjustAllSettings(); void ignoreFutureResult(); + void withPromise(); }; using namespace QtConcurrent; @@ -59,6 +61,7 @@ void tst_QtConcurrentTask::taskWithFreeFunction() QCOMPARE(result, 42); } + void tst_QtConcurrentTask::taskWithClassMethod() { QString result("foobar"); @@ -67,6 +70,7 @@ void tst_QtConcurrentTask::taskWithClassMethod() QCOMPARE(result, "foo"); } + void tst_QtConcurrentTask::taskWithCallableObject() { QCOMPARE(task(std::plus<int>()) @@ -100,8 +104,18 @@ void tst_QtConcurrentTask::useCustomThreadPool() QCOMPARE(result, 42); } +void tst_QtConcurrentTask::setPriority_data() +{ + QTest::addColumn<bool>("runWithPromise"); + + QTest::addRow("without promise") << false; + QTest::addRow("with promise") << true; +} + void tst_QtConcurrentTask::setPriority() { + QFETCH(bool, runWithPromise); + QThreadPool pool; pool.setMaxThreadCount(1); @@ -115,15 +129,25 @@ void tst_QtConcurrentTask::setPriority() const int tasksCount = 10; QList<int> priorities(tasksCount); std::iota(priorities.begin(), priorities.end(), 1); - auto seed = std::chrono::system_clock::now().time_since_epoch().count(); + auto seed = std::random_device {}(); std::shuffle(priorities.begin(), priorities.end(), std::default_random_engine(seed)); + qDebug() << "Generated priorities list" << priorities << "using seed" << seed; + QList<int> actual; - for (int priority : priorities) - futureResults << task([priority, &actual] { actual << priority; }) - .onThreadPool(pool) - .withPriority(priority) - .spawn(); + for (int priority : priorities) { + if (runWithPromise) { + futureResults << task([priority, &actual] (QPromise<void> &) { actual << priority; }) + .onThreadPool(pool) + .withPriority(priority) + .spawn(); + } else { + futureResults << task([priority, &actual] { actual << priority; }) + .onThreadPool(pool) + .withPriority(priority) + .spawn(); + } + } sem.release(); pool.waitForDone(); @@ -156,6 +180,7 @@ void tst_QtConcurrentTask::adjustAllSettings() QCOMPARE(result, QList<int>({ 1, 2, 3 })); } + void tst_QtConcurrentTask::ignoreFutureResult() { QThreadPool pool; @@ -171,5 +196,23 @@ void tst_QtConcurrentTask::ignoreFutureResult() QCOMPARE(value, 10); } +void incrementWithPromise(QPromise<int> &promise, int i) +{ + promise.addResult(i + 1); +} + +void return0WithPromise(QPromise<int> &promise) +{ + promise.addResult(0); +} + +void tst_QtConcurrentTask::withPromise() +{ + QCOMPARE(task(&return0WithPromise).spawn().result(), 0); + QCOMPARE(task(&return0WithPromise).withPriority(7).spawn().result(), 0); + QCOMPARE(task(&incrementWithPromise).withArguments(1).spawn().result(), 2); + QCOMPARE(task(&incrementWithPromise).withArguments(1).withPriority(7).spawn().result(), 2); +} + QTEST_MAIN(tst_QtConcurrentTask) #include "tst_qtconcurrenttask.moc" |