From 661d9e1cef57360806eb796a70bf9fbd54b628e4 Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Tue, 15 Apr 2025 17:08:24 +0200 Subject: [PATCH 1/6] [jnigen] Add Android emulator tests --- .github/workflows/jnigen.yaml | 24 +++++++++++++++++++ .../runtime_test_registrant.dart | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/jnigen.yaml b/.github/workflows/jnigen.yaml index 00ed2ab317..182bd3f225 100644 --- a/.github/workflows/jnigen.yaml +++ b/.github/workflows/jnigen.yaml @@ -121,6 +121,30 @@ jobs: path-to-lcov: ./pkgs/jnigen/coverage/lcov.info if: ${{ matrix.sdk == 'stable' }} + test_jnigen_android: + needs: [analyze_jnigen] + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./pkgs/jnigen + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 + with: + channel: 'stable' + cache: true + cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:' + - name: Enable KVM group perms + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: Run tests + uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d + with: + api-level: 21 + arch: x86_64 + script: cd android_test_runner && flutter test --timeout=1200s integration_test/ analyze_jni: runs-on: ubuntu-latest defaults: diff --git a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart index 8f8e947529..6fd9b172b5 100644 --- a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart +++ b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart @@ -742,7 +742,7 @@ void registerTests(String groupName, TestRunnerCallback test) { // listener, it will work. runner.runOnAnotherThreadAndJoin(); await completer.future; - expect(MyRunnable.$impls, hasLength(1)); + expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid); runnable.release(); runner.release(); if (!Platform.isAndroid) { @@ -762,7 +762,7 @@ void registerTests(String groupName, TestRunnerCallback test) { expect(runnable != runnable, false); expect(runnable.hashCode, runnable.hashCode); expect(runnable.toString(), runnable.toString()); - expect(MyRunnable.$impls, hasLength(1)); + expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid); runnable.release(); if (!Platform.isAndroid) { // Running garbage collection does not work on Android. Skipping From dad6be1a680cd8be8971aa9f3300b7fa20ecf6f9 Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Tue, 15 Apr 2025 17:50:24 +0200 Subject: [PATCH 2/6] Fix workflow --- .github/workflows/jnigen.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/jnigen.yaml b/.github/workflows/jnigen.yaml index 182bd3f225..8fd1a94078 100644 --- a/.github/workflows/jnigen.yaml +++ b/.github/workflows/jnigen.yaml @@ -126,7 +126,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./pkgs/jnigen + working-directory: ./pkgs/jnigen/android_test_runner steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 @@ -134,6 +134,8 @@ jobs: channel: 'stable' cache: true cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:' + - name: Install dependencies + run: flutter pub get - name: Enable KVM group perms run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules @@ -144,7 +146,7 @@ jobs: with: api-level: 21 arch: x86_64 - script: cd android_test_runner && flutter test --timeout=1200s integration_test/ + script: flutter test --timeout=1200s integration_test/ analyze_jni: runs-on: ubuntu-latest defaults: From 05f96da3e18a2b949051d32bb23b569e8536348b Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Tue, 15 Apr 2025 17:57:54 +0200 Subject: [PATCH 3/6] Fix workflow --- .github/workflows/jnigen.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jnigen.yaml b/.github/workflows/jnigen.yaml index 8fd1a94078..65666493e9 100644 --- a/.github/workflows/jnigen.yaml +++ b/.github/workflows/jnigen.yaml @@ -135,7 +135,7 @@ jobs: cache: true cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:' - name: Install dependencies - run: flutter pub get + run: dart pub get - name: Enable KVM group perms run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules From 15879845af5eebbca3c05a2e857630ea7a8b068c Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Tue, 15 Apr 2025 18:07:48 +0200 Subject: [PATCH 4/6] Fix workflow --- .github/workflows/jnigen.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/jnigen.yaml b/.github/workflows/jnigen.yaml index 65666493e9..7217d476da 100644 --- a/.github/workflows/jnigen.yaml +++ b/.github/workflows/jnigen.yaml @@ -147,6 +147,7 @@ jobs: api-level: 21 arch: x86_64 script: flutter test --timeout=1200s integration_test/ + working-directory: ./pkgs/jnigen/android_test_runner analyze_jni: runs-on: ubuntu-latest defaults: From 848e3844c1bba861e806564c30a360c7dba42333 Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Tue, 15 Apr 2025 18:18:44 +0200 Subject: [PATCH 5/6] Address comments --- .../runtime_test_registrant.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart index 6fd9b172b5..7cf9a331d8 100644 --- a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart +++ b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart @@ -646,12 +646,12 @@ void registerTests(String groupName, TestRunnerCallback test) { final manyPrimitives = await manyPrimitivesResult.future; expect(manyPrimitives, -1 + 3 + 3.14.toInt() + 1); + // Running garbage collection does not work on Android. Skipping this + // test on Android. // Currently we have one implementation of the interface. expect(MyInterface.$impls, hasLength(1), skip: Platform.isAndroid); myInterface.release(); if (!Platform.isAndroid) { - // Running garbage collection does not work on Android. Skipping this - // test for android. _runJavaGC(); await _waitUntil(() => MyInterface.$impls.isEmpty); expect(MyInterface.$impls, isEmpty); @@ -691,12 +691,12 @@ void registerTests(String groupName, TestRunnerCallback test) { ); expect(myInterface.manyPrimitives(1, true, 3, 4), 42); + // Running garbage collection does not work on Android. Skipping this + // test on Android. expect(MyInterface.$impls, hasLength(1), skip: Platform.isAndroid); expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid); myInterface.release(); if (!Platform.isAndroid) { - // Running garbage collection does not work on Android. Skipping this - // test for android. _runJavaGC(); await _waitUntil(() => MyInterface.$impls.isEmpty); // Since the interface is now deleted, the cleaner must signal to Dart @@ -742,12 +742,12 @@ void registerTests(String groupName, TestRunnerCallback test) { // listener, it will work. runner.runOnAnotherThreadAndJoin(); await completer.future; + // Running garbage collection does not work on Android. Skipping + // this test on Android. expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid); runnable.release(); runner.release(); if (!Platform.isAndroid) { - // Running garbage collection does not work on Android. Skipping - // this test for android. _runJavaGC(); await _waitUntil(() => MyInterface.$impls.isEmpty); // Since the interface is now deleted, the cleaner must signal to @@ -762,11 +762,11 @@ void registerTests(String groupName, TestRunnerCallback test) { expect(runnable != runnable, false); expect(runnable.hashCode, runnable.hashCode); expect(runnable.toString(), runnable.toString()); + // Running garbage collection does not work on Android. Skipping + // this test on Android. expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid); runnable.release(); if (!Platform.isAndroid) { - // Running garbage collection does not work on Android. Skipping - // this test for android. _runJavaGC(); await _waitUntil(() => MyInterface.$impls.isEmpty); expect(MyRunnable.$impls, isEmpty); From e2eb4fb8d4127c6e7802acbf26d3f064262c7780 Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Tue, 15 Apr 2025 18:44:11 +0200 Subject: [PATCH 6/6] Use a higher api level --- .github/workflows/jnigen.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jnigen.yaml b/.github/workflows/jnigen.yaml index 7217d476da..4be8317664 100644 --- a/.github/workflows/jnigen.yaml +++ b/.github/workflows/jnigen.yaml @@ -144,7 +144,7 @@ jobs: - name: Run tests uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d with: - api-level: 21 + api-level: 26 arch: x86_64 script: flutter test --timeout=1200s integration_test/ working-directory: ./pkgs/jnigen/android_test_runner