diff options
author | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-05-10 16:16:37 +0300 |
---|---|---|
committer | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-05-26 23:24:11 +0000 |
commit | 478ed8b71f289438ed664bf2676b270325c93bfc (patch) | |
tree | 0f698686f6c01b638f8f6b60da218289c06b30bb /tests/auto/corelib/platform/android/tst_android.cpp | |
parent | da30e402f38a434f856fa8670a8813c3cffe6440 (diff) |
Android: Add runOnMainAndroidThread() under QNativeInterface
This replaces QtAndroidPrivate::runOnAndroidThread{Sync} calls.
This also now allows passing std::function<> that can return values,
and not only an std::function<void()>.
This adds some tests for this calls as well.
Fixes: QTBUG-90501
Change-Id: I138d2aae64be17347f7ff712d8a86edb49ea8350
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests/auto/corelib/platform/android/tst_android.cpp')
-rw-r--r-- | tests/auto/corelib/platform/android/tst_android.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/tests/auto/corelib/platform/android/tst_android.cpp b/tests/auto/corelib/platform/android/tst_android.cpp index 3a00d9414b..710e5b2ecf 100644 --- a/tests/auto/corelib/platform/android/tst_android.cpp +++ b/tests/auto/corelib/platform/android/tst_android.cpp @@ -40,6 +40,7 @@ private slots: void assetsNotWritable(); void testAndroidSdkVersion(); void testAndroidActivity(); + void testRunOnAndroidMainThread(); }; void tst_Android::assetsRead() @@ -77,6 +78,117 @@ void tst_Android::testAndroidActivity() QVERIFY(activity.callMethod<jboolean>("isTaskRoot")); } +void tst_Android::testRunOnAndroidMainThread() +{ + // async void + { + int res = 0; + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ res = 1; }); + QTRY_COMPARE(res, 1); + } + + // sync void + { + int res = 0; + auto task = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + res = 1; + }); + task.waitForFinished(); + QCOMPARE(res, 1); + } + + // sync return value + { + auto task = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([]{ + return 1; + }); + task.waitForFinished(); + QVERIFY(task.isResultReadyAt(0)); + QCOMPARE(task.result().value<int>(), 1); + } + + // nested calls + { + // nested async/async + int res = 0; + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + res = 3; + }); + }); + QTRY_COMPARE(res, 3); + + // nested async/sync + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + res = 5; + }).waitForFinished(); + }); + QTRY_COMPARE(res, 5); + + // nested sync/sync + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + res = 4; + }).waitForFinished(); + }).waitForFinished(); + QCOMPARE(res, 4); + + + // nested sync/async + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + QNativeInterface::QAndroidApplication::runOnAndroidMainThread([&res]{ + res = 6; + }); + }).waitForFinished(); + QCOMPARE(res, 6); + } + + // timeouts + { + auto task = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([]{ + QThread::msleep(500); + return 1; + }, QDeadlineTimer(100)); + task.waitForFinished(); + QVERIFY(task.isCanceled()); + QVERIFY(task.isFinished()); + QVERIFY(!task.isResultReadyAt(0)); + + auto task2 = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([]{ + return 2; + }, QDeadlineTimer(0)); + task2.waitForFinished(); + QVERIFY(task2.isCanceled()); + QVERIFY(task2.isFinished()); + QVERIFY(!task2.isResultReadyAt(0)); + + QDeadlineTimer deadline(1000); + auto task3 = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([]{ + return 3; + }, QDeadlineTimer(10000)); + task3.waitForFinished(); + QVERIFY(deadline.remainingTime() > 0); + QVERIFY(task3.isFinished()); + QVERIFY(!task3.isCanceled()); + QVERIFY(task3.isResultReadyAt(0)); + QCOMPARE(task3.result().value<int>(), 3); + } + + // cancelled future + { + auto task = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([]{ + QThread::msleep(2000); + return 1; + }); + task.cancel(); + QVERIFY(task.isCanceled()); + task.waitForFinished(); + QVERIFY(task.isFinished()); + QVERIFY(!task.isResultReadyAt(0)); + } +} + QTEST_MAIN(tst_Android) #include "tst_android.moc" |