summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/platform/android/tst_android.cpp
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2021-05-10 16:16:37 +0300
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2021-05-26 23:24:11 +0000
commit478ed8b71f289438ed664bf2676b270325c93bfc (patch)
tree0f698686f6c01b638f8f6b60da218289c06b30bb /tests/auto/corelib/platform/android/tst_android.cpp
parentda30e402f38a434f856fa8670a8813c3cffe6440 (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.cpp112
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"