From a7fe226b3cac7bbc250a141640a85cc96c9da80b Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Sun, 5 Apr 2020 22:56:31 +0100 Subject: [PATCH 1/6] Android: Replaces the check for ActivityTestRule and adds a second test for GrantPermissionRule --- .../plugins/e2e/FlutterTestRunner.java | 14 +++++++++---- .../MainActivityWithPermissionTest.java | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java 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..4c77ea2a00d7 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 (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..4d335388a947 --- /dev/null +++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java @@ -0,0 +1,20 @@ +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; + +@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); +} From 6c2be6825c966cecd17ee08901b0dff6453aedda Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 6 Apr 2020 07:06:41 +0100 Subject: [PATCH 2/6] Correct the field retrieval for checking the TestRule --- .../main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4c77ea2a00d7..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 @@ -33,7 +33,7 @@ public FlutterTestRunner(Class testClass) { if (field.isAnnotationPresent(Rule.class)) { try { Object instance = testClass.newInstance(); - if (instance instanceof ActivityTestRule) { + if (field.get(instance) instanceof ActivityTestRule) { rule = (TestRule) field.get(instance); break; } From 7fa9091050c32a13202ce9fe100dafe70b5f026b Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Mon, 6 Apr 2020 07:09:23 +0100 Subject: [PATCH 3/6] Bump version, add changelog --- packages/e2e/CHANGELOG.md | 4 ++++ packages/e2e/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index 79969126bb70..ae6e06b15902 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.1 + +* Adds support for Android E2E tests that utilize other @Rule's, like GrantPermissionTest. + ## 0.4.0 * **Breaking change** Driver request_data call's response has changed to diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index 1af3ab911447..d3a86cf65f21 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.0 +version: 0.4.1 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e environment: From 357753579273ea27035d23104778a2a66061ee33 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Wed, 8 Apr 2020 08:58:41 +0100 Subject: [PATCH 4/6] Fix typo in changelog --- packages/e2e/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index ae6e06b15902..305a288d949a 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.4.1 -* Adds support for Android E2E tests that utilize other @Rule's, like GrantPermissionTest. +* Adds support for Android E2E tests that utilize other @Rule's, like GrantPermissionRule. ## 0.4.0 From 9627f1fe79fc29bf64b13b9fc7d69eb6369eafd6 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Tue, 14 Apr 2020 21:53:38 +0100 Subject: [PATCH 5/6] document MainActivityWithPermissionTest --- .../example/e2e_example/MainActivityWithPermissionTest.java | 5 +++++ 1 file changed, 5 insertions(+) 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 index 4d335388a947..bedcb1f6aff2 100644 --- 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 @@ -7,6 +7,11 @@ 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 { From 231a515ed58895a25eb0de28abd05cce20ebcfb0 Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Wed, 15 Apr 2020 09:11:12 +0100 Subject: [PATCH 6/6] Formatting --- .../example/e2e_example/MainActivityWithPermissionTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 index bedcb1f6aff2..90218e8724a9 100644 --- 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 @@ -8,9 +8,9 @@ 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. + * 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 {