tst_QFuture::continuationsWithContext: fix the flakiness

When attaching a continuation with the default (QtFuture::Launch::Sync)
policy, it will be launched in the same thread where the parent has
been executing, or in the thread where the parent lives, if the
continuation is attached after the parent has already finished. Fixed
the test-case to make sure the continuations are attached while the
parent is still running, so that they can be resolved in the parent's
context.

Fixes: QTBUG-91373
Change-Id: I82b3b0c47b76d121b44bd512659c08b3b474e351
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
(cherry picked from commit 5a3bbb55851b84aa6a46c23e5a6fb33b4860edc6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Sona Kurazyan 2021-02-24 14:58:09 +01:00 committed by Qt Cherry-pick Bot
parent b74f77bd63
commit d6531d1d14

View File

@ -2837,7 +2837,8 @@ void tst_QFuture::continuationsWithContext()
// .then()
{
auto future = QtFuture::makeReadyFuture(0)
QPromise<int> promise;
auto future = promise.future()
.then([&](int val) {
if (QThread::currentThread() != tstThread)
return 0;
@ -2854,12 +2855,16 @@ void tst_QFuture::continuationsWithContext()
return 0;
return val + 1;
});
promise.start();
promise.addResult(0);
promise.finish();
QCOMPARE(future.result(), 3);
}
// .onCanceled
{
auto future = createCanceledFuture<int>()
QPromise<int> promise;
auto future = promise.future()
.onCanceled(context,
[&] {
if (QThread::currentThread() != &thread)
@ -2871,13 +2876,17 @@ void tst_QFuture::continuationsWithContext()
return 0;
return val + 1;
});
promise.start();
promise.future().cancel();
promise.finish();
QCOMPARE(future.result(), 2);
}
#ifndef QT_NO_EXCEPTIONS
// .onFaled()
{
auto future = QtFuture::makeReadyFuture()
QPromise<void> promise;
auto future = promise.future()
.then([&] {
if (QThread::currentThread() != tstThread)
return 0;
@ -2894,6 +2903,8 @@ void tst_QFuture::continuationsWithContext()
return 0;
return val + 1;
});
promise.start();
promise.finish();
QCOMPARE(future.result(), 2);
}
#endif // QT_NO_EXCEPTIONS