diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index 52fcc9284fde..24dc7a846ff2 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.2 + +* Adds support for Android E2E tests that utilize other @Rule's, like GrantPermissionRule. + ## 0.4.1 * Remove Android dependencies fallback. diff --git a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java index f214cd7ce3fe..78f0c3c5bac2 100644 --- a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java +++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java @@ -4,23 +4,24 @@ package dev.flutter.plugins.e2e; -import android.app.Activity; import android.util.Log; import androidx.test.rule.ActivityTestRule; import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ExecutionException; import org.junit.Rule; +import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; public class FlutterTestRunner extends Runner { + private static final String TAG = "FlutterTestRunner"; final Class testClass; - ActivityTestRule rule = null; + TestRule rule = null; public FlutterTestRunner(Class testClass) { super(); @@ -32,7 +33,10 @@ public FlutterTestRunner(Class testClass) { if (field.isAnnotationPresent(Rule.class)) { try { Object instance = testClass.newInstance(); - rule = (ActivityTestRule) field.get(instance); + if (field.get(instance) instanceof ActivityTestRule) { + rule = (TestRule) field.get(instance); + break; + } } catch (InstantiationException | IllegalAccessException e) { // This might occur if the developer did not make the rule public. // We could call field.setAccessible(true) but it seems better to throw. @@ -53,7 +57,9 @@ public void run(RunNotifier notifier) { throw new RuntimeException("Unable to run tests due to missing activity rule"); } try { - rule.launchActivity(null); + if (rule instanceof ActivityTestRule) { + ((ActivityTestRule) rule).launchActivity(null); + } } catch (RuntimeException e) { Log.v(TAG, "launchActivity failed, possibly because the activity was already running. " + e); Log.v( diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java new file mode 100644 index 000000000000..90218e8724a9 --- /dev/null +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java @@ -0,0 +1,25 @@ +package com.example.e2e_example; + +import android.Manifest.permission; +import androidx.test.rule.ActivityTestRule; +import androidx.test.rule.GrantPermissionRule; +import dev.flutter.plugins.e2e.FlutterTestRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +/** + * Demonstrates how a E2E test on Android can be run with permissions already granted. This is + * helpful if developers want to test native App behavior that depends on certain system service + * results which are guarded with permissions. + */ +@RunWith(FlutterTestRunner.class) +public class MainActivityWithPermissionTest { + + @Rule + public GrantPermissionRule permissionRule = + GrantPermissionRule.grant(permission.ACCESS_COARSE_LOCATION); + + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(MainActivity.class, true, false); +} diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index 72a782e25649..1857e2ddfb91 100644 --- a/packages/e2e/pubspec.yaml +++ b/packages/e2e/pubspec.yaml @@ -1,6 +1,6 @@ name: e2e description: Runs tests that use the flutter_test API as integration tests. -version: 0.4.1 +version: 0.4.2 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e environment: