[e2e] Reland: Replaces the check for ActivityTestRule (#2633) (#2661)
This reverts commit 608774119dd5c9d68f5237347c12669fa9110c2b.
diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md
index 52fcc92..24dc7a8 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 f214cd7..78f0c3c 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<Activity> rule = null;
+ TestRule rule = null;
public FlutterTestRunner(Class<?> testClass) {
super();
@@ -32,7 +33,10 @@
if (field.isAnnotationPresent(Rule.class)) {
try {
Object instance = testClass.newInstance();
- rule = (ActivityTestRule<Activity>) 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 @@
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 0000000..90218e8
--- /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<MainActivity> rule =
+ new ActivityTestRule<>(MainActivity.class, true, false);
+}
diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml
index 72a782e..1857e2d 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: