From 6e19bf12f5780c583469b785e3ebe74727867862 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 08:30:28 -0700 Subject: [PATCH 01/74] =?UTF-8?q?Use=20testWidgets=20since=20we=20don?= =?UTF-8?q?=E2=80=99t=20support=20package:test=20yet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/package_info/example/test_driver/package_info.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/package_info/example/test_driver/package_info.dart b/packages/package_info/example/test_driver/package_info.dart index 97c2db6363c7..1fc45a198748 100644 --- a/packages/package_info/example/test_driver/package_info.dart +++ b/packages/package_info/example/test_driver/package_info.dart @@ -10,7 +10,7 @@ void main() { tearDownAll(() => completer.complete(null)); group('package_info test driver', () { - test('test package info result', () async { + testWidgets('test package info result', (_) async { final PackageInfo info = await PackageInfo.fromPlatform(); // These tests are based on the example app. The tests should be updated if any related info changes. if (Platform.isAndroid) { From 40e6fb6ae68da0c4d2ca9784197236d209483968 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 08:31:23 -0700 Subject: [PATCH 02/74] Use forked flutter_plugin_tools for now --- .cirrus.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 1ec5818409e8..cb14b5e9f831 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -8,7 +8,10 @@ task: - flutter channel master - flutter upgrade - git fetch origin master - activate_script: pub global activate flutter_plugin_tools + activate_script: + - // TODO(jackson): Remove this line once the flutter_plugin_tools PR lands + - git clone git@github.com:collinjackson/flutter_plugin_tools.git -b ftl_demo + - pub global activate flutter_plugin_tools -s path matrix: - name: publishable script: ./script/check_publish.sh From 13391544e5ce47ef62c010bb7a0c698b5cdecfcc Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 12:27:39 -0700 Subject: [PATCH 03/74] Example of simple test using adapter --- .../example/android/app/build.gradle | 2 + .../FlutterJUnitRunner.java | 71 +++++++++++++++++++ .../packageinfoexample/WidgetTests.java | 12 ++++ .../package_info/example/android/run_test.sh | 8 +++ .../example/test_driver/package_info.dart | 26 +------ .../example/test_live/adapter.dart | 38 ++++++++++ .../example/test_live/package_info.dart | 32 +++++++++ 7 files changed, 166 insertions(+), 23 deletions(-) create mode 100644 packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java create mode 100644 packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java create mode 100755 packages/package_info/example/android/run_test.sh create mode 100644 packages/package_info/example/test_live/adapter.dart create mode 100644 packages/package_info/example/test_live/package_info.dart diff --git a/packages/package_info/example/android/app/build.gradle b/packages/package_info/example/android/app/build.gradle index c24eba0fe81d..c39e3e286453 100644 --- a/packages/package_info/example/android/app/build.gradle +++ b/packages/package_info/example/android/app/build.gradle @@ -54,6 +54,8 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:core:1.0.0' androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' } diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java new file mode 100644 index 000000000000..c3bf276a026d --- /dev/null +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java @@ -0,0 +1,71 @@ +package io.flutter.plugins.packageinfoexample; + +import androidx.test.rule.ActivityTestRule; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.view.FlutterView; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import org.junit.runner.Description; +import org.junit.runner.Runner; +import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunNotifier; + +public class FlutterJUnitRunner extends Runner { + + private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; + CompletableFuture> testResults; + + public FlutterJUnitRunner(Class klass) { + ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + MainActivity fa = rule.launchActivity(null); + FlutterView fv = fa.getFlutterView(); + MethodChannel methodChannel = new MethodChannel(fv, CHANNEL); + testResults = new CompletableFuture<>(); + methodChannel.setMethodCallHandler( + new MethodCallHandler() { + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("testFinished")) { + Map results = call.argument("results"); + testResults.complete(results); + result.success(null); + } else { + result.notImplemented(); + } + } + }); + } + + @Override + public Description getDescription() { + return Description.createTestDescription(MainActivity.class, "foobar"); + } + + @Override + public void run(RunNotifier notifier) { + Map results = null; + try { + results = testResults.get(); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + for (String name : results.keySet()) { + Description d = Description.createTestDescription(MainActivity.class, name); + notifier.fireTestStarted(d); + String outcome = results.get(name); + if (outcome.equals("failed")) { + Exception dummyException = new Exception(outcome); + notifier.fireTestFailure(new Failure(d, dummyException)); + } + notifier.fireTestFinished(d); + } + } +} diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java new file mode 100644 index 000000000000..0b603581ef17 --- /dev/null +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java @@ -0,0 +1,12 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.packageinfoexample; + +import org.junit.runner.RunWith; + +@RunWith(FlutterJUnitRunner.class) +public class WidgetTests { + // This class is intentionally left blank. +} diff --git a/packages/package_info/example/android/run_test.sh b/packages/package_info/example/android/run_test.sh new file mode 100755 index 000000000000..b6613e2be88f --- /dev/null +++ b/packages/package_info/example/android/run_test.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +./gradlew \ + -Pverbose=true \ + -Ptarget=$(pwd)/../test_driver/adapter.dart \ + -Ptrack-widget-creation=false \ + -Pfilesystem-scheme=org-dartlang-root \ + connectedAndroidTest diff --git a/packages/package_info/example/test_driver/package_info.dart b/packages/package_info/example/test_driver/package_info.dart index 1fc45a198748..9004f8a4a39d 100644 --- a/packages/package_info/example/test_driver/package_info.dart +++ b/packages/package_info/example/test_driver/package_info.dart @@ -1,31 +1,11 @@ import 'dart:async'; -import 'dart:io'; import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:package_info/package_info.dart'; + +import '../test_live/package_info.dart' as live_test; void main() { final Completer completer = Completer(); enableFlutterDriverExtension(handler: (_) => completer.future); tearDownAll(() => completer.complete(null)); - - group('package_info test driver', () { - testWidgets('test package info result', (_) async { - final PackageInfo info = await PackageInfo.fromPlatform(); - // These tests are based on the example app. The tests should be updated if any related info changes. - if (Platform.isAndroid) { - expect(info.appName, 'package_info_example'); - expect(info.buildNumber, '1'); - expect(info.packageName, 'io.flutter.plugins.packageinfoexample'); - expect(info.version, '1.0'); - } else if (Platform.isIOS) { - expect(info.appName, 'Package Info Example'); - expect(info.buildNumber, '1'); - expect(info.packageName, 'io.flutter.plugins.packageInfoExample'); - expect(info.version, '1.0'); - } else { - throw (UnsupportedError('platform not supported')); - } - }); - }); + live_test.main(); } diff --git a/packages/package_info/example/test_live/adapter.dart b/packages/package_info/example/test_live/adapter.dart new file mode 100644 index 000000000000..125357e508c1 --- /dev/null +++ b/packages/package_info/example/test_live/adapter.dart @@ -0,0 +1,38 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'dart:io'; +import 'package_info.dart' as widget_test; + +/// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results +/// on a channel to adapt them to native instrumentation test format. +//// TODO(jackson): Move this into a shared package +class _InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { + _InstrumentationTestFlutterBinding(); + static const MethodChannel _channel = const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); + + static Map _results = {}; + + @override + Future runTest(Future testBody(), VoidCallback invariantTester, { String description = '', Duration timeout }) async { + reportTestException = (FlutterErrorDetails details, String testDescription) { + _results[description] = 'failed'; + }; + await super.runTest(testBody, invariantTester, description: description, timeout: timeout); + _results[description] ??= 'success'; + } + + static void finish() => _channel.invokeMethod('testFinished', { 'results': _results }); +} + +void main() { + _InstrumentationTestFlutterBinding(); + tearDownAll(() { + _InstrumentationTestFlutterBinding.finish(); + }); + widget_test.main(); +} diff --git a/packages/package_info/example/test_live/package_info.dart b/packages/package_info/example/test_live/package_info.dart new file mode 100644 index 000000000000..7991658c05aa --- /dev/null +++ b/packages/package_info/example/test_live/package_info.dart @@ -0,0 +1,32 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:package_info/package_info.dart'; + + +void main() { + group('package_info test driver', () { + testWidgets('test package info result', (_) async { + final PackageInfo info = await PackageInfo.fromPlatform(); + // These tests are based on the example app. The tests should be updated if any related info changes. + if (Platform.isAndroid) { + expect(info.appName, 'package_info_example'); + expect(info.buildNumber, '1'); + expect(info.packageName, 'io.flutter.plugins.packageinfoexample'); + expect(info.version, '1.0'); + } else if (Platform.isIOS) { + expect(info.appName, 'Package Info Example'); + expect(info.buildNumber, '1'); + expect(info.packageName, 'io.flutter.plugins.packageInfoExample'); + expect(info.version, '1.0'); + } else { + throw (UnsupportedError('platform not supported')); + } + }); + }); + + testWidgets("failing test example", (WidgetTester tester) async { + expect(2 + 2, equals(5)); + }, skip: true); +} From 17b865f2cbfe24fef9451121b462141fceca4667 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:14:49 -0700 Subject: [PATCH 04/74] Add instrumentation command on Cirrus --- .cirrus.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.cirrus.yml b/.cirrus.yml index cb14b5e9f831..48e83c40c885 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -51,6 +51,7 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build + - ./script/incremental_build.sh instrumentation-test # must come after apk build # TODO(jackson): Re-enable once Android emulators support Firebase # https://github.com/flutter/flutter/issues/29571 # - ./script/incremental_build.sh drive-examples From 799a698be6b54e207681ec556c2272f0e9c7255b Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:16:56 -0700 Subject: [PATCH 05/74] Update test name --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 48e83c40c885..c350974ff278 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -27,7 +27,7 @@ task: script: ./script/incremental_build.sh analyze - name: build_all_plugins_apk script: ./script/build_all_plugins_app.sh apk - - name: build-apks+java-test+drive-examples + - name: build-apks+java-test+instrumentation-test+drive-examples env: matrix: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" From f60918c2f9aa7d3e8e72d1f1f4659259036e1482 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:17:46 -0700 Subject: [PATCH 06/74] Temporarily comment out unrelated tests so we can get faster results on this PR. --- .cirrus.yml | 90 +++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index c350974ff278..4f812a2e926d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -13,26 +13,28 @@ task: - git clone git@github.com:collinjackson/flutter_plugin_tools.git -b ftl_demo - pub global activate flutter_plugin_tools -s path matrix: - - name: publishable - script: ./script/check_publish.sh - - name: test+format - install_script: - - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" - - sudo apt-get update - - sudo apt-get install -y --allow-unauthenticated clang-format-7 - format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 - test_script: ./script/incremental_build.sh test - - name: analyze - script: ./script/incremental_build.sh analyze - - name: build_all_plugins_apk - script: ./script/build_all_plugins_app.sh apk +# - name: publishable +# script: ./script/check_publish.sh +# - name: test+format +# install_script: +# - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - +# - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" +# - sudo apt-get update +# - sudo apt-get install -y --allow-unauthenticated clang-format-7 +# format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 +# test_script: ./script/incremental_build.sh test +# - name: analyze +# script: ./script/incremental_build.sh analyze +# - name: build_all_plugins_apk +# script: ./script/build_all_plugins_app.sh apk - name: build-apks+java-test+instrumentation-test+drive-examples env: matrix: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] + CLOUDSDK_CORE_DISABLE_PROMPTS: 1 + GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: @@ -58,33 +60,33 @@ task: - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` -task: - use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' - osx_instance: - image: mojave-xcode-10.2-flutter - setup_script: - - pod repo update - switch_channel_script: - - flutter channel master - - flutter upgrade - - flutter doctor - activate_script: - - pub global activate flutter_plugin_tools - create_simulator_script: - - xcrun simctl list - - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot - matrix: - - name: build_all_plugins_ipa - script: ./script/build_all_plugins_app.sh ios --no-codesign - - name: build-ipas+drive-examples - env: - PATH: $PATH:/usr/local/bin - matrix: - PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" - PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" - PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" - PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" - SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] - build_script: - - ./script/incremental_build.sh build-examples --ipa - - ./script/incremental_build.sh drive-examples \ No newline at end of file +#task: +# use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' +# osx_instance: +# image: mojave-xcode-10.2-flutter +# setup_script: +# - pod repo update +# switch_channel_script: +# - flutter channel master +# - flutter upgrade +# - flutter doctor +# activate_script: +# - pub global activate flutter_plugin_tools +# create_simulator_script: +# - xcrun simctl list +# - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot +# matrix: +# - name: build_all_plugins_ipa +# script: ./script/build_all_plugins_app.sh ios --no-codesign +# - name: build-ipas+drive-examples +# env: +# PATH: $PATH:/usr/local/bin +# matrix: +# PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" +# PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" +# PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" +# PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" +# SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] +# build_script: +# - ./script/incremental_build.sh build-examples --ipa +# - ./script/incremental_build.sh drive-examples \ No newline at end of file From 15661154ed38a88a96ed3eca85a73acc24999ddb Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:29:25 -0700 Subject: [PATCH 07/74] Fix comment --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 4f812a2e926d..87f422caeffa 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -9,7 +9,7 @@ task: - flutter upgrade - git fetch origin master activate_script: - - // TODO(jackson): Remove this line once the flutter_plugin_tools PR lands + # TODO(jackson): Remove this line once the flutter_plugin_tools PR lands - git clone git@github.com:collinjackson/flutter_plugin_tools.git -b ftl_demo - pub global activate flutter_plugin_tools -s path matrix: From fed897d570fb83a56fe0614cec4496e433c54393 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:32:53 -0700 Subject: [PATCH 08/74] Fix git clone command --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 87f422caeffa..a49434a6516a 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,7 +10,7 @@ task: - git fetch origin master activate_script: # TODO(jackson): Remove this line once the flutter_plugin_tools PR lands - - git clone git@github.com:collinjackson/flutter_plugin_tools.git -b ftl_demo + - git clone https://github.com/collinjackson/flutter_plugin_tools.git -b ftl_demo - pub global activate flutter_plugin_tools -s path matrix: # - name: publishable From 1743e6d04ec2da55dfc8aef367acba0dafce493a Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:33:51 -0700 Subject: [PATCH 09/74] Fix repo name --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index a49434a6516a..ba235df18605 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,7 +10,7 @@ task: - git fetch origin master activate_script: # TODO(jackson): Remove this line once the flutter_plugin_tools PR lands - - git clone https://github.com/collinjackson/flutter_plugin_tools.git -b ftl_demo + - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo - pub global activate flutter_plugin_tools -s path matrix: # - name: publishable From 724cca2e1ca4e02802455d05933fa9087f81b1e9 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:37:33 -0700 Subject: [PATCH 10/74] Remove blank line --- packages/package_info/example/test_live/package_info.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/package_info/example/test_live/package_info.dart b/packages/package_info/example/test_live/package_info.dart index 7991658c05aa..cd6f52b11f37 100644 --- a/packages/package_info/example/test_live/package_info.dart +++ b/packages/package_info/example/test_live/package_info.dart @@ -4,7 +4,6 @@ import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:package_info/package_info.dart'; - void main() { group('package_info test driver', () { testWidgets('test package info result', (_) async { From 366c0dd381f4c87f50847068cae480852c8c9f98 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:38:59 -0700 Subject: [PATCH 11/74] fix clone command path --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index ba235df18605..6bbd5f9e2411 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,7 +10,7 @@ task: - git fetch origin master activate_script: # TODO(jackson): Remove this line once the flutter_plugin_tools PR lands - - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo + - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools - pub global activate flutter_plugin_tools -s path matrix: # - name: publishable From 89c64a7829893f76e8acec6bf63a1f0af7712298 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 13:57:59 -0700 Subject: [PATCH 12/74] Use API level 24 for CompletableFuture --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 6bbd5f9e2411..63272974488a 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -36,7 +36,7 @@ task: CLOUDSDK_CORE_DISABLE_PROMPTS: 1 GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" + echo no | avdmanager -v create avd -n test -k "system-images;android-24;default;armeabi-v7a" start_emulator_background_script: - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window wait_for_emulator_script: adb wait-for-device From 3cd9fa1748cb0aecac734171ee3047ec275ba7b1 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 14:08:49 -0700 Subject: [PATCH 13/74] Update to a system image that supports completeablefuture --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 09db02e8967e..dbe4f315a285 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -6,6 +6,6 @@ RUN yes | sdkmanager \ "build-tools;27.0.3" \ "extras;google;m2repository" \ "extras;android;m2repository" \ - "system-images;android-21;default;armeabi-v7a" + "system-images;android-24;default;armeabi-v7a" RUN yes | sdkmanager --licenses From c2171fc4be00dc34b53365940ec0cee9290dd995 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 14:28:33 -0700 Subject: [PATCH 14/74] Another attempt at a compatible emulator --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index dbe4f315a285..7dce9583fbe5 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -6,6 +6,6 @@ RUN yes | sdkmanager \ "build-tools;27.0.3" \ "extras;google;m2repository" \ "extras;android;m2repository" \ - "system-images;android-24;default;armeabi-v7a" + "system-images;android-24;default;x86_64" RUN yes | sdkmanager --licenses From b81b2ee28252d26f02d552e5db8ffb7974caa42c Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 15:07:05 -0700 Subject: [PATCH 15/74] Fix the other emulator reference --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 63272974488a..d2cedb83ee8b 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -36,7 +36,7 @@ task: CLOUDSDK_CORE_DISABLE_PROMPTS: 1 GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-24;default;armeabi-v7a" + echo no | avdmanager -v create avd -n test -k "system-images;android-24;default;x86_64" start_emulator_background_script: - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window wait_for_emulator_script: adb wait-for-device From a501aa908a7eb24784d51d4e5668b1f1131c9d20 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 15:49:50 -0700 Subject: [PATCH 16/74] Use a 32-bit image --- .ci/Dockerfile | 2 +- .cirrus.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 7dce9583fbe5..a6fc15ecca8d 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -6,6 +6,6 @@ RUN yes | sdkmanager \ "build-tools;27.0.3" \ "extras;google;m2repository" \ "extras;android;m2repository" \ - "system-images;android-24;default;x86_64" + "system-images;android-24;default;x86" RUN yes | sdkmanager --licenses diff --git a/.cirrus.yml b/.cirrus.yml index d2cedb83ee8b..4761e3ca2fdd 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -36,7 +36,7 @@ task: CLOUDSDK_CORE_DISABLE_PROMPTS: 1 GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-24;default;x86_64" + echo no | avdmanager -v create avd -n test -k "system-images;android-24;default;x86" start_emulator_background_script: - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window wait_for_emulator_script: adb wait-for-device From d0edaad64819c44d3de5a199b4300f21753e2408 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 16 Jul 2019 18:19:59 -0700 Subject: [PATCH 17/74] Remove local simulators, double down on Firebase Test Lab --- .ci/Dockerfile | 15 +++++++++++++-- .cirrus.yml | 5 ----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index a6fc15ecca8d..2807fdfa827c 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,11 +1,22 @@ FROM cirrusci/flutter:latest +RUN apt-get update +RUN apt-get install -y git wget curl unzip python lsb-release sudo apt-transport-https + RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ "extras;android;m2repository" \ - "system-images;android-24;default;x86" -RUN yes | sdkmanager --licenses +# Add repo for gcloud sdk and install it +RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ + tee -a /etc/apt/sources.list.d/google-cloud-sdk.list + +RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ + apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - + +RUN apt-get update && apt-get install -y google-cloud-sdk && \ + gcloud config set core/disable_usage_reporting true && \ + gcloud config set component_manager/disable_update_check true \ No newline at end of file diff --git a/.cirrus.yml b/.cirrus.yml index 4761e3ca2fdd..77aef349ae16 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -35,11 +35,6 @@ task: MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] CLOUDSDK_CORE_DISABLE_PROMPTS: 1 GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] - create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-24;default;x86" - start_emulator_background_script: - - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window - wait_for_emulator_script: adb wait-for-device script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. From e3b539e583ead40d1fca93f83eaee1716a607492 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 17 Jul 2019 08:26:50 -0700 Subject: [PATCH 18/74] Fix empty continuation line --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 2807fdfa827c..0a07540166b4 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -8,7 +8,7 @@ RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ - "extras;android;m2repository" \ + "extras;android;m2repository" # Add repo for gcloud sdk and install it RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ From 6f39b81e8b1d4902528ae42f96acea524a8f1f66 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 17 Jul 2019 09:07:31 -0700 Subject: [PATCH 19/74] Simpler fix --- script/incremental_build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script/incremental_build.sh b/script/incremental_build.sh index adb0acc72b97..bd0551057a32 100755 --- a/script/incremental_build.sh +++ b/script/incremental_build.sh @@ -15,7 +15,7 @@ fi BRANCH_NAME="${BRANCH_NAME:-"$(git rev-parse --abbrev-ref HEAD)"}" if [[ "${BRANCH_NAME}" == "master" ]]; then echo "Running for all packages" - (cd "$REPO_DIR" && pub global run flutter_plugin_tools "${ACTIONS[@]}" $PLUGIN_SHARDING) + (cd "$REPO_DIR"; pub global run flutter_plugin_tools "${ACTIONS[@]}" $PLUGIN_SHARDING) else # Sets CHANGED_PACKAGES check_changed_packages @@ -23,8 +23,8 @@ else if [[ "$CHANGED_PACKAGES" == "" ]]; then echo "No changes detected in packages." else - (cd "$REPO_DIR" && pub global run flutter_plugin_tools "${ACTIONS[@]}" --plugins="$CHANGED_PACKAGES" $PLUGIN_SHARDING) + (cd "$REPO_DIR"; pub global run flutter_plugin_tools "${ACTIONS[@]}" --plugins="$CHANGED_PACKAGES" $PLUGIN_SHARDING) echo "Running version check for changed packages" - (cd "$REPO_DIR" && pub global run flutter_plugin_tools version-check --base_sha="$(get_branch_base_sha)") + (cd "$REPO_DIR"; pub global run flutter_plugin_tools version-check --base_sha="$(get_branch_base_sha)") fi fi From 900c764012d22c27144aef007223047805ac7668 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Thu, 18 Jul 2019 09:47:36 -0700 Subject: [PATCH 20/74] Add example UiAutomator test --- .../packageinfoexample/UiAutomatorTest.java | 0 .../example/lib/package_info.dart | 0 .../example/android/app/build.gradle | 5 ++- .../urllauncherexample/UiAutomatorTest.java | 35 +++++++++++++++++++ script/firebase_test_lab.sh | 11 ++++++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/UiAutomatorTest.java create mode 100644 packages/package_info/example/lib/package_info.dart create mode 100644 packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java create mode 100644 script/firebase_test_lab.sh diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/UiAutomatorTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/UiAutomatorTest.java new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/package_info/example/lib/package_info.dart b/packages/package_info/example/lib/package_info.dart new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/url_launcher/example/android/app/build.gradle b/packages/url_launcher/example/android/app/build.gradle index 325396c57235..155bae600703 100644 --- a/packages/url_launcher/example/android/app/build.gradle +++ b/packages/url_launcher/example/android/app/build.gradle @@ -33,7 +33,7 @@ android { defaultConfig { applicationId "io.flutter.plugins.urllauncherexample" - minSdkVersion 16 + minSdkVersion 18 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName @@ -55,6 +55,9 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:core:1.0.0' androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'; } diff --git a/packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java b/packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java new file mode 100644 index 000000000000..55bc5239d009 --- /dev/null +++ b/packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java @@ -0,0 +1,35 @@ +package io.flutter.plugins.urllauncherexample; + +import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.notNullValue; + +import android.app.Instrumentation; +import androidx.test.rule.ActivityTestRule; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.Until; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class UiAutomatorTest { + private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + private UiDevice device = UiDevice.getInstance(instrumentation); + private static final int LAUNCH_TIMEOUT = 5000; + + @Rule + public ActivityTestRule activityTestRule = + new ActivityTestRule<>(MainActivity.class); + + @Test + public void launchInApp() { + assertThat(device.wait(Until.hasObject(By.text("Launch in app")), LAUNCH_TIMEOUT), notNullValue()); + device.findObject(By.text("Launch in app")).click(); + assertThat(device.wait(Until.hasObject(By.text("HTTP Request Header Display")), LAUNCH_TIMEOUT), notNullValue()); + device.pressBack(); + assertThat(device.wait(Until.hasObject(By.text("Launch in app")), LAUNCH_TIMEOUT), notNullValue()); + } +} \ No newline at end of file diff --git a/script/firebase_test_lab.sh b/script/firebase_test_lab.sh new file mode 100644 index 000000000000..6a55a3bd637f --- /dev/null +++ b/script/firebase_test_lab.sh @@ -0,0 +1,11 @@ +#!/bin/bash + + +gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json +gcloud --quiet config set project flutter-infra +gcloud firebase test android run --type instrumentation \ + --app build/app/outputs/apk/debug/app-debug.apk \ + --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk\ + --timeout 2m \ + --results-bucket=gs://flutter_firebase_testlab \ + --results-dir=engine_android_test/$GIT_REVISION/$CIRRUS_BUILD_ID From f67af6a7b05eb617d4ae0bf3f4663f062fe311fd Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 11:30:49 -0700 Subject: [PATCH 21/74] Remove apt-get steps --- .ci/Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 0a07540166b4..cf9c402e5515 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,9 +1,6 @@ FROM cirrusci/flutter:latest -RUN apt-get update -RUN apt-get install -y git wget curl unzip python lsb-release sudo apt-transport-https - RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ @@ -19,4 +16,4 @@ RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ RUN apt-get update && apt-get install -y google-cloud-sdk && \ gcloud config set core/disable_usage_reporting true && \ - gcloud config set component_manager/disable_update_check true \ No newline at end of file + gcloud config set component_manager/disable_update_check true From c104d7ef81893fd0fae61c48c40b7d2dc8871aac Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 13:28:50 -0700 Subject: [PATCH 22/74] Simplify implementation, remove UiAutomatorTest from this PR (will add in a subsequent PR) --- .ci/Dockerfile | 14 +-- .cirrus.yml | 103 +++++++++--------- CONTRIBUTING.md | 9 +- .../FlutterJUnitRunner.java | 4 +- .../packageinfoexample/UiAutomatorTest.java | 0 .../package_info/example/android/run_test.sh | 8 -- .../example/test_driver/package_info.dart | 1 + .../test_driver/package_info_test.dart | 1 - .../example/test_live/package_info.dart | 1 - .../{adapter.dart => package_info_test.dart} | 3 +- script/incremental_build.sh | 6 +- 11 files changed, 71 insertions(+), 79 deletions(-) delete mode 100644 packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/UiAutomatorTest.java delete mode 100755 packages/package_info/example/android/run_test.sh rename packages/package_info/example/test_live/{adapter.dart => package_info_test.dart} (92%) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index cf9c402e5515..09db02e8967e 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -5,15 +5,7 @@ RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ - "extras;android;m2repository" + "extras;android;m2repository" \ + "system-images;android-21;default;armeabi-v7a" -# Add repo for gcloud sdk and install it -RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ - tee -a /etc/apt/sources.list.d/google-cloud-sdk.list - -RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ - apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - - -RUN apt-get update && apt-get install -y google-cloud-sdk && \ - gcloud config set core/disable_usage_reporting true && \ - gcloud config set component_manager/disable_update_check true +RUN yes | sdkmanager --licenses diff --git a/.cirrus.yml b/.cirrus.yml index 77aef349ae16..6735d0b62e7d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -8,33 +8,33 @@ task: - flutter channel master - flutter upgrade - git fetch origin master - activate_script: - # TODO(jackson): Remove this line once the flutter_plugin_tools PR lands - - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools - - pub global activate flutter_plugin_tools -s path + activate_script: pub global activate flutter_plugin_tools matrix: -# - name: publishable -# script: ./script/check_publish.sh -# - name: test+format -# install_script: -# - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - -# - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" -# - sudo apt-get update -# - sudo apt-get install -y --allow-unauthenticated clang-format-7 -# format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 -# test_script: ./script/incremental_build.sh test -# - name: analyze -# script: ./script/incremental_build.sh analyze -# - name: build_all_plugins_apk -# script: ./script/build_all_plugins_app.sh apk - - name: build-apks+java-test+instrumentation-test+drive-examples + - name: publishable + script: ./script/check_publish.sh + - name: test+format + install_script: + - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" + - sudo apt-get update + - sudo apt-get install -y --allow-unauthenticated clang-format-7 + format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 + test_script: ./script/incremental_build.sh test + - name: analyze + script: ./script/incremental_build.sh analyze + - name: build_all_plugins_apk + script: ./script/build_all_plugins_app.sh apk + - name: build-apks+java-test+drive-examples env: matrix: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] - CLOUDSDK_CORE_DISABLE_PROMPTS: 1 - GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] + create_device_script: + echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" + start_emulator_background_script: + - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window + wait_for_emulator_script: adb wait-for-device script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. @@ -48,40 +48,39 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build - - ./script/incremental_build.sh instrumentation-test # must come after apk build # TODO(jackson): Re-enable once Android emulators support Firebase # https://github.com/flutter/flutter/issues/29571 # - ./script/incremental_build.sh drive-examples - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` -#task: -# use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' -# osx_instance: -# image: mojave-xcode-10.2-flutter -# setup_script: -# - pod repo update -# switch_channel_script: -# - flutter channel master -# - flutter upgrade -# - flutter doctor -# activate_script: -# - pub global activate flutter_plugin_tools -# create_simulator_script: -# - xcrun simctl list -# - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot -# matrix: -# - name: build_all_plugins_ipa -# script: ./script/build_all_plugins_app.sh ios --no-codesign -# - name: build-ipas+drive-examples -# env: -# PATH: $PATH:/usr/local/bin -# matrix: -# PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" -# PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" -# PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" -# PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" -# SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] -# build_script: -# - ./script/incremental_build.sh build-examples --ipa -# - ./script/incremental_build.sh drive-examples \ No newline at end of file +task: + use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' + osx_instance: + image: mojave-xcode-10.2-flutter + setup_script: + - pod repo update + upgrade_script: + - flutter channel master + - flutter upgrade + - git fetch origin master + activate_script: + - pub global activate flutter_plugin_tools + create_simulator_script: + - xcrun simctl list + - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot + matrix: + - name: build_all_plugins_ipa + script: ./script/build_all_plugins_app.sh ios --no-codesign + - name: build-ipas+drive-examples + env: + PATH: $PATH:/usr/local/bin + matrix: + PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" + PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" + PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" + PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" + SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] + build_script: + - ./script/incremental_build.sh build-examples --ipa + - ./script/incremental_build.sh drive-examples diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 936b5b921ebf..095d3b0c4c46 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,13 +50,20 @@ To run the unit tests: flutter test test/_test.dart ``` -To run the integration tests: +To run the integration tests using Flutter driver: ``` cd example flutter drive test/.dart ``` +To run integration tests as an instrumentation tests on a local Android device: + +``` +cd example +(cd android && ./gradlew -Ptarget=$(pwd)/../test_live/_test.dart connectedAndroidTest) +``` + ## Contributing code We gladly accept contributions via GitHub pull requests. diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java index c3bf276a026d..dd1a3b608938 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java @@ -15,6 +15,7 @@ import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; +// TODO(jackson): The test runner class should be included in Flutter engine. public class FlutterJUnitRunner extends Runner { private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; @@ -43,7 +44,8 @@ public void onMethodCall(MethodCall call, Result result) { @Override public Description getDescription() { - return Description.createTestDescription(MainActivity.class, "foobar"); + // TODO(jackson): Expose an API that allows developers to specify a custom string. + return Description.createTestDescription(MainActivity.class, "Flutter Tests"); } @Override diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/UiAutomatorTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/UiAutomatorTest.java deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/package_info/example/android/run_test.sh b/packages/package_info/example/android/run_test.sh deleted file mode 100755 index b6613e2be88f..000000000000 --- a/packages/package_info/example/android/run_test.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -./gradlew \ - -Pverbose=true \ - -Ptarget=$(pwd)/../test_driver/adapter.dart \ - -Ptrack-widget-creation=false \ - -Pfilesystem-scheme=org-dartlang-root \ - connectedAndroidTest diff --git a/packages/package_info/example/test_driver/package_info.dart b/packages/package_info/example/test_driver/package_info.dart index 9004f8a4a39d..75121de28c26 100644 --- a/packages/package_info/example/test_driver/package_info.dart +++ b/packages/package_info/example/test_driver/package_info.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:flutter_driver/driver_extension.dart'; +import 'package:test/test.dart'; import '../test_live/package_info.dart' as live_test; diff --git a/packages/package_info/example/test_driver/package_info_test.dart b/packages/package_info/example/test_driver/package_info_test.dart index c1d690c17ee3..81f735482835 100644 --- a/packages/package_info/example/test_driver/package_info_test.dart +++ b/packages/package_info/example/test_driver/package_info_test.dart @@ -1,5 +1,4 @@ import 'package:flutter_driver/flutter_driver.dart'; -import 'package:test/test.dart'; void main() { test('package_info', () async { diff --git a/packages/package_info/example/test_live/package_info.dart b/packages/package_info/example/test_live/package_info.dart index cd6f52b11f37..7f80d2662599 100644 --- a/packages/package_info/example/test_live/package_info.dart +++ b/packages/package_info/example/test_live/package_info.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:package_info/package_info.dart'; diff --git a/packages/package_info/example/test_live/adapter.dart b/packages/package_info/example/test_live/package_info_test.dart similarity index 92% rename from packages/package_info/example/test_live/adapter.dart rename to packages/package_info/example/test_live/package_info_test.dart index 125357e508c1..38f9f3069215 100644 --- a/packages/package_info/example/test_live/adapter.dart +++ b/packages/package_info/example/test_live/package_info_test.dart @@ -10,7 +10,7 @@ import 'package_info.dart' as widget_test; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. -//// TODO(jackson): Move this into a shared package +// TODO(jackson): Move to a shared package class _InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { _InstrumentationTestFlutterBinding(); static const MethodChannel _channel = const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); @@ -19,6 +19,7 @@ class _InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { @override Future runTest(Future testBody(), VoidCallback invariantTester, { String description = '', Duration timeout }) async { + // TODO(jackson): Report the results individually instead of all at once reportTestException = (FlutterErrorDetails details, String testDescription) { _results[description] = 'failed'; }; diff --git a/script/incremental_build.sh b/script/incremental_build.sh index bd0551057a32..adb0acc72b97 100755 --- a/script/incremental_build.sh +++ b/script/incremental_build.sh @@ -15,7 +15,7 @@ fi BRANCH_NAME="${BRANCH_NAME:-"$(git rev-parse --abbrev-ref HEAD)"}" if [[ "${BRANCH_NAME}" == "master" ]]; then echo "Running for all packages" - (cd "$REPO_DIR"; pub global run flutter_plugin_tools "${ACTIONS[@]}" $PLUGIN_SHARDING) + (cd "$REPO_DIR" && pub global run flutter_plugin_tools "${ACTIONS[@]}" $PLUGIN_SHARDING) else # Sets CHANGED_PACKAGES check_changed_packages @@ -23,8 +23,8 @@ else if [[ "$CHANGED_PACKAGES" == "" ]]; then echo "No changes detected in packages." else - (cd "$REPO_DIR"; pub global run flutter_plugin_tools "${ACTIONS[@]}" --plugins="$CHANGED_PACKAGES" $PLUGIN_SHARDING) + (cd "$REPO_DIR" && pub global run flutter_plugin_tools "${ACTIONS[@]}" --plugins="$CHANGED_PACKAGES" $PLUGIN_SHARDING) echo "Running version check for changed packages" - (cd "$REPO_DIR"; pub global run flutter_plugin_tools version-check --base_sha="$(get_branch_base_sha)") + (cd "$REPO_DIR" && pub global run flutter_plugin_tools version-check --base_sha="$(get_branch_base_sha)") fi fi From 7332e33b22b17d2f45af7f2e9abe4b74b9840b79 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 14:03:38 -0700 Subject: [PATCH 23/74] Remove comments --- .../flutter/plugins/packageinfoexample/FlutterJUnitRunner.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java index dd1a3b608938..c11bb1aaa475 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java @@ -15,7 +15,6 @@ import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; -// TODO(jackson): The test runner class should be included in Flutter engine. public class FlutterJUnitRunner extends Runner { private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; @@ -44,7 +43,6 @@ public void onMethodCall(MethodCall call, Result result) { @Override public Description getDescription() { - // TODO(jackson): Expose an API that allows developers to specify a custom string. return Description.createTestDescription(MainActivity.class, "Flutter Tests"); } From 48886db72c475f83c64a83b6d996ae28608cf048 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 14:24:30 -0700 Subject: [PATCH 24/74] Switch to using engine builder, comment out unnecessary tests for now --- .cirrus.yml | 103 +++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 6735d0b62e7d..7d141eecb168 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,7 +1,12 @@ +gcp_credentials: ENCRYPTED[987a78af29b91ce8489594c9ab3fec21845bbe5ba68294b8f6def3cf0d380830f06687a89ea69c87344c5ade369700fe] + task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == '' - container: - dockerfile: .ci/Dockerfile + gke_container: + image: gcr.io/flutter-cirrus/build-engine-image:latest + cluster_name: build-32-cluster + zone: us-central1-a + namespace: default cpu: 8 memory: 16G upgrade_script: @@ -10,26 +15,28 @@ task: - git fetch origin master activate_script: pub global activate flutter_plugin_tools matrix: - - name: publishable - script: ./script/check_publish.sh - - name: test+format - install_script: - - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" - - sudo apt-get update - - sudo apt-get install -y --allow-unauthenticated clang-format-7 - format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 - test_script: ./script/incremental_build.sh test - - name: analyze - script: ./script/incremental_build.sh analyze - - name: build_all_plugins_apk - script: ./script/build_all_plugins_app.sh apk +# - name: publishable +# script: ./script/check_publish.sh +# - name: test+format +# install_script: +# - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - +# - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" +# - sudo apt-get update +# - sudo apt-get install -y --allow-unauthenticated clang-format-7 +# format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 +# test_script: ./script/incremental_build.sh test +# - name: analyze +# script: ./script/incremental_build.sh analyze +# - name: build_all_plugins_apk +# script: ./script/build_all_plugins_app.sh apk - name: build-apks+java-test+drive-examples env: matrix: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] + CLOUDSDK_CORE_DISABLE_PROMPTS: 1 + GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: @@ -48,39 +55,37 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build - # TODO(jackson): Re-enable once Android emulators support Firebase - # https://github.com/flutter/flutter/issues/29571 - # - ./script/incremental_build.sh drive-examples + - ./script/incremental_build.sh firebase-test-lab - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` -task: - use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' - osx_instance: - image: mojave-xcode-10.2-flutter - setup_script: - - pod repo update - upgrade_script: - - flutter channel master - - flutter upgrade - - git fetch origin master - activate_script: - - pub global activate flutter_plugin_tools - create_simulator_script: - - xcrun simctl list - - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot - matrix: - - name: build_all_plugins_ipa - script: ./script/build_all_plugins_app.sh ios --no-codesign - - name: build-ipas+drive-examples - env: - PATH: $PATH:/usr/local/bin - matrix: - PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" - PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" - PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" - PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" - SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] - build_script: - - ./script/incremental_build.sh build-examples --ipa - - ./script/incremental_build.sh drive-examples +#task: +# use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' +# osx_instance: +# image: mojave-xcode-10.2-flutter +# setup_script: +# - pod repo update +# upgrade_script: +# - flutter channel master +# - flutter upgrade +# - git fetch origin master +# activate_script: +# - pub global activate flutter_plugin_tools +# create_simulator_script: +# - xcrun simctl list +# - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot +# matrix: +# - name: build_all_plugins_ipa +# script: ./script/build_all_plugins_app.sh ios --no-codesign +# - name: build-ipas+drive-examples +# env: +# PATH: $PATH:/usr/local/bin +# matrix: +# PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" +# PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" +# PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" +# PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" +# SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] +# build_script: +# - ./script/incremental_build.sh build-examples --ipa +# - ./script/incremental_build.sh drive-examples From 71c69bb22732e8c57c8ca86eba3d9310f1ce5735 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 14:26:37 -0700 Subject: [PATCH 25/74] Remove gcp credentials --- .cirrus.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 7d141eecb168..83512ca8869c 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,5 +1,3 @@ -gcp_credentials: ENCRYPTED[987a78af29b91ce8489594c9ab3fec21845bbe5ba68294b8f6def3cf0d380830f06687a89ea69c87344c5ade369700fe] - task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == '' gke_container: From cc945bcd5a89cee614d32282908ed7f6043fa660 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 14:39:31 -0700 Subject: [PATCH 26/74] Update credentials --- .cirrus.yml | 4 +++- script/firebase_test_lab.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) mode change 100644 => 100755 script/firebase_test_lab.sh diff --git a/.cirrus.yml b/.cirrus.yml index 83512ca8869c..fed27da0f2f3 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,3 +1,5 @@ +gcp_credentials: ENCRYPTED[7e11fd2d7fbe7656d724ba5aaa1c16ee8c6b9a094498b6532420d7c3e76b7d854ef97673818d6f9433857af2bcd3e701] + task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == '' gke_container: @@ -34,7 +36,7 @@ task: PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] CLOUDSDK_CORE_DISABLE_PROMPTS: 1 - GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[1c140257edc48f5578fa5a0e5038b84c8e53270c405efa5a8e35ea303a4e0d135853989f448f72136206de854d17fbec] + GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[39c6adf685d3ca9fa398722548588017b3ffd2c5bdc0ceeb437b7c03702f46dbc61124fb6283c0c01427cfd4761d97e5] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: diff --git a/script/firebase_test_lab.sh b/script/firebase_test_lab.sh old mode 100644 new mode 100755 index 6a55a3bd637f..a628b785a101 --- a/script/firebase_test_lab.sh +++ b/script/firebase_test_lab.sh @@ -1,6 +1,6 @@ #!/bin/bash - +echo $GCLOUD_FIREBASE_TESTLAB_KEY > ${HOME}/gcloud-service-key.json gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json gcloud --quiet config set project flutter-infra gcloud firebase test android run --type instrumentation \ From 439219032d6ab0146c934d9ad46ccee88f85fab0 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 14:46:19 -0700 Subject: [PATCH 27/74] Use built flutter image --- .cirrus.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index fed27da0f2f3..e00e0144d29f 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,12 +1,7 @@ -gcp_credentials: ENCRYPTED[7e11fd2d7fbe7656d724ba5aaa1c16ee8c6b9a094498b6532420d7c3e76b7d854ef97673818d6f9433857af2bcd3e701] - task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == '' - gke_container: - image: gcr.io/flutter-cirrus/build-engine-image:latest - cluster_name: build-32-cluster - zone: us-central1-a - namespace: default + container: + image: gcr.io/flutter-cirrus/build-flutter-image:latest cpu: 8 memory: 16G upgrade_script: From 51abd9bc4e2ffdac002eb8b2ec0940573d480b6a Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 14:53:12 -0700 Subject: [PATCH 28/74] More stuff for the Flutter build image --- .cirrus.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.cirrus.yml b/.cirrus.yml index e00e0144d29f..2d8dda08e53e 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -4,6 +4,16 @@ task: image: gcr.io/flutter-cirrus/build-flutter-image:latest cpu: 8 memory: 16G + env: + # Name the SDK directory to include a space so that we constantly + # test path names with spaces in them. + CIRRUS_WORKING_DIR: "/tmp/flutter sdk" + PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH" + ANDROID_SDK_ROOT: "/opt/android_sdk" + git_fetch_script: + - git clean -xfd + - git fetch origin + - git fetch origin master # To set FETCH_HEAD for "git merge-base" to work upgrade_script: - flutter channel master - flutter upgrade From 33f226a67d4178b590d06bdbe357d59b2b5fc5d9 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 15:34:22 -0700 Subject: [PATCH 29/74] Go back to using unbuilt Dockerfile --- .ci/Dockerfile | 12 +++++++++++- .cirrus.yml | 12 +----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 09db02e8967e..8174d4fbeb91 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -6,6 +6,16 @@ RUN yes | sdkmanager \ "build-tools;27.0.3" \ "extras;google;m2repository" \ "extras;android;m2repository" \ - "system-images;android-21;default;armeabi-v7a" RUN yes | sdkmanager --licenses + +# Add repo for gcloud sdk and install it +RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ + tee -a /etc/apt/sources.list.d/google-cloud-sdk.list + +RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ + apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - + +RUN apt-get update && apt-get install -y google-cloud-sdk && \ + gcloud config set core/disable_usage_reporting true && \ + gcloud config set component_manager/disable_update_check true diff --git a/.cirrus.yml b/.cirrus.yml index 2d8dda08e53e..b39190ff1837 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,19 +1,9 @@ task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == '' container: - image: gcr.io/flutter-cirrus/build-flutter-image:latest + dockerfile: .ci/Dockerfile cpu: 8 memory: 16G - env: - # Name the SDK directory to include a space so that we constantly - # test path names with spaces in them. - CIRRUS_WORKING_DIR: "/tmp/flutter sdk" - PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH" - ANDROID_SDK_ROOT: "/opt/android_sdk" - git_fetch_script: - - git clean -xfd - - git fetch origin - - git fetch origin master # To set FETCH_HEAD for "git merge-base" to work upgrade_script: - flutter channel master - flutter upgrade From 24dd8814d529ac105a3d5d1a8a69077a783576db Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 15:34:33 -0700 Subject: [PATCH 30/74] reformat --- .../FlutterJUnitRunner.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java index c11bb1aaa475..04ced89a410d 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java @@ -27,18 +27,19 @@ public FlutterJUnitRunner(Class klass) { MethodChannel methodChannel = new MethodChannel(fv, CHANNEL); testResults = new CompletableFuture<>(); methodChannel.setMethodCallHandler( - new MethodCallHandler() { - @Override - public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("testFinished")) { - Map results = call.argument("results"); - testResults.complete(results); - result.success(null); - } else { - result.notImplemented(); - } + new MethodCallHandler() { + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("testFinished")) { + Map results = call.argument("results"); + testResults.complete(results); + result.success(null); + } else { + result.notImplemented(); } - }); + } + } + ); } @Override From c1ac1e60858bd18988fe9c4d134be11fdafaedd9 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 15:37:17 -0700 Subject: [PATCH 31/74] Fix empty continuation line --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 8174d4fbeb91..fc5041df5cbf 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -5,7 +5,7 @@ RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ - "extras;android;m2repository" \ + "extras;android;m2repository" RUN yes | sdkmanager --licenses From 4323cae8b16f7eb5f618a7840165d542e7006fc6 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 16:25:58 -0700 Subject: [PATCH 32/74] Sudo everything --- .ci/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index fc5041df5cbf..64d9998b2ad3 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -10,12 +10,12 @@ RUN yes | sdkmanager \ RUN yes | sdkmanager --licenses # Add repo for gcloud sdk and install it -RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ +RUN sudo echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ tee -a /etc/apt/sources.list.d/google-cloud-sdk.list -RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ +RUN sudo curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - -RUN apt-get update && apt-get install -y google-cloud-sdk && \ +RUN sudo apt-get update && apt-get install -y google-cloud-sdk && \ gcloud config set core/disable_usage_reporting true && \ gcloud config set component_manager/disable_update_check true From e1e26940dee716e7e9a822832555e562df888cd1 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 16:36:14 -0700 Subject: [PATCH 33/74] Another attempt at sudo --- .ci/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 64d9998b2ad3..5aaed4fa5ed6 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -10,12 +10,12 @@ RUN yes | sdkmanager \ RUN yes | sdkmanager --licenses # Add repo for gcloud sdk and install it -RUN sudo echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ - tee -a /etc/apt/sources.list.d/google-cloud-sdk.list +RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ + sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list -RUN sudo curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ +RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - -RUN sudo apt-get update && apt-get install -y google-cloud-sdk && \ +RUN sudo apt-get update && sudo apt-get install -y google-cloud-sdk && \ gcloud config set core/disable_usage_reporting true && \ gcloud config set component_manager/disable_update_check true From 1d1dc70ad5c6ef7321f49c4724b45711bfc500ff Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 16:41:34 -0700 Subject: [PATCH 34/74] Move gcloud first --- .ci/Dockerfile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 5aaed4fa5ed6..7bc17fef6ca3 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,21 +1,21 @@ FROM cirrusci/flutter:latest -RUN yes | sdkmanager \ - "platforms;android-27" \ - "build-tools;27.0.3" \ - "extras;google;m2repository" \ - "extras;android;m2repository" - -RUN yes | sdkmanager --licenses - # Add repo for gcloud sdk and install it RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ - apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - + sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - RUN sudo apt-get update && sudo apt-get install -y google-cloud-sdk && \ gcloud config set core/disable_usage_reporting true && \ gcloud config set component_manager/disable_update_check true + +RUN yes | sdkmanager \ + "platforms;android-27" \ + "build-tools;27.0.3" \ + "extras;google;m2repository" \ + "extras;android;m2repository" + +RUN yes | sdkmanager --licenses From df085c29e40109ae56a65d5749f0e25bacbbc687 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 6 Aug 2019 16:48:05 -0700 Subject: [PATCH 35/74] Ensure https --- .ci/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 7bc17fef6ca3..f53dca4a28df 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,6 +1,8 @@ FROM cirrusci/flutter:latest +RUN apt-get install -y apt-transport-https + # Add repo for gcloud sdk and install it RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list From 830c13791a6112f5155d319f5420caf8e785c6d7 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 7 Aug 2019 18:02:18 -0700 Subject: [PATCH 36/74] add missing sudo --- .ci/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index f53dca4a28df..d25779a443c6 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,7 +1,7 @@ FROM cirrusci/flutter:latest -RUN apt-get install -y apt-transport-https +RUN sudo apt-get install -y apt-transport-https # Add repo for gcloud sdk and install it RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ From 5ddc3d1e54ecd38c6973ad5305aa131909654c63 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Thu, 8 Aug 2019 14:50:27 -0700 Subject: [PATCH 37/74] Fix sudo command --- .ci/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index d25779a443c6..4f1c50cca517 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,7 +1,8 @@ FROM cirrusci/flutter:latest -RUN sudo apt-get install -y apt-transport-https +RUN sudo apt-get update +RUN sudo apt-get install -y git wget curl unzip python lsb-release sudo apt-transport-https # Add repo for gcloud sdk and install it RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ From a739395319699e32a74e40c6d9eb904ed8aeb817 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 11:16:36 -0700 Subject: [PATCH 38/74] Remove emulator scripts --- .cirrus.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index b39190ff1837..7add09c34d0c 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -32,11 +32,6 @@ task: MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] CLOUDSDK_CORE_DISABLE_PROMPTS: 1 GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[39c6adf685d3ca9fa398722548588017b3ffd2c5bdc0ceeb437b7c03702f46dbc61124fb6283c0c01427cfd4761d97e5] - create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" - start_emulator_background_script: - - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window - wait_for_emulator_script: adb wait-for-device script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. From 4ee27a12b606242e597e919be6b31ac677aab4e7 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 12:10:32 -0700 Subject: [PATCH 39/74] Point plugin tools at a branch --- .cirrus.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 7add09c34d0c..f0125cbb402b 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -8,7 +8,9 @@ task: - flutter channel master - flutter upgrade - git fetch origin master - activate_script: pub global activate flutter_plugin_tools + activate_script: + - git clone git@github.com:collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools + - pub global activate flutter_plugin_tools -s path matrix: # - name: publishable # script: ./script/check_publish.sh From a7fa78c8758b529d4bd7ea2199d0589135526c6b Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 12:23:38 -0700 Subject: [PATCH 40/74] Fix repo url --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index f0125cbb402b..b93f583174e9 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -9,7 +9,7 @@ task: - flutter upgrade - git fetch origin master activate_script: - - git clone git@github.com:collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools + - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools - pub global activate flutter_plugin_tools -s path matrix: # - name: publishable From 8d8cbb6a5b163ed462382507e3e75b44c8069497 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 13:25:39 -0700 Subject: [PATCH 41/74] Update gcloud service key --- .cirrus.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index b93f583174e9..44de3c9a2677 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -33,8 +33,9 @@ task: PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] CLOUDSDK_CORE_DISABLE_PROMPTS: 1 - GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[39c6adf685d3ca9fa398722548588017b3ffd2c5bdc0ceeb437b7c03702f46dbc61124fb6283c0c01427cfd4761d97e5] + GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[ae17cec7f4d708b1e5c2e841c3643006c2ef46f3745e28fd965bc26b224158f408a0c2da40a1beb0addb163fa4c11389] script: + - echo $GCLOUD_FIREBASE_TESTLAB_KEY > ${HOME}/gcloud-service-key.json # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. # See: https://github.com/flutter/flutter/issues/24935 From d129b5e6d2536f7d6b09c7416dba4f976b528748 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 13:51:06 -0700 Subject: [PATCH 42/74] Move the test into the test folder --- .../example/{test_live => test}/package_info.dart | 0 packages/package_info/example/test_driver/package_info.dart | 4 ++-- .../package_info/example/test_live/package_info_test.dart | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename packages/package_info/example/{test_live => test}/package_info.dart (100%) diff --git a/packages/package_info/example/test_live/package_info.dart b/packages/package_info/example/test/package_info.dart similarity index 100% rename from packages/package_info/example/test_live/package_info.dart rename to packages/package_info/example/test/package_info.dart diff --git a/packages/package_info/example/test_driver/package_info.dart b/packages/package_info/example/test_driver/package_info.dart index 75121de28c26..f1b4f2d1ae2d 100644 --- a/packages/package_info/example/test_driver/package_info.dart +++ b/packages/package_info/example/test_driver/package_info.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'package:flutter_driver/driver_extension.dart'; import 'package:test/test.dart'; -import '../test_live/package_info.dart' as live_test; +import '../test/package_info.dart' as test; void main() { final Completer completer = Completer(); enableFlutterDriverExtension(handler: (_) => completer.future); tearDownAll(() => completer.complete(null)); - live_test.main(); + test.main(); } diff --git a/packages/package_info/example/test_live/package_info_test.dart b/packages/package_info/example/test_live/package_info_test.dart index 38f9f3069215..408589cbb2a9 100644 --- a/packages/package_info/example/test_live/package_info_test.dart +++ b/packages/package_info/example/test_live/package_info_test.dart @@ -6,7 +6,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'dart:io'; -import 'package_info.dart' as widget_test; +import 'package_info.dart' as test; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. @@ -35,5 +35,5 @@ void main() { tearDownAll(() { _InstrumentationTestFlutterBinding.finish(); }); - widget_test.main(); + test.main(); } From 5ca79743bc8eb5db82be90a23641678af3781394 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 14:19:14 -0700 Subject: [PATCH 43/74] Move test --- .../{test_live => test_instrumentation}/package_info_test.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/package_info/example/{test_live => test_instrumentation}/package_info_test.dart (100%) diff --git a/packages/package_info/example/test_live/package_info_test.dart b/packages/package_info/example/test_instrumentation/package_info_test.dart similarity index 100% rename from packages/package_info/example/test_live/package_info_test.dart rename to packages/package_info/example/test_instrumentation/package_info_test.dart From ea1f47d29cf573dff3f65e6a81749791c984ad28 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 14:21:29 -0700 Subject: [PATCH 44/74] Fix test import --- .../example/test_instrumentation/package_info_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/package_info/example/test_instrumentation/package_info_test.dart b/packages/package_info/example/test_instrumentation/package_info_test.dart index 408589cbb2a9..1751adc49518 100644 --- a/packages/package_info/example/test_instrumentation/package_info_test.dart +++ b/packages/package_info/example/test_instrumentation/package_info_test.dart @@ -6,7 +6,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'dart:io'; -import 'package_info.dart' as test; +import '../test/package_info.dart' as test; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. From 542359c137644d8806950d2007acedd355ed564f Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 14:33:09 -0700 Subject: [PATCH 45/74] Fix driver test to not be a test --- .../example/test_driver/package_info_test.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/package_info/example/test_driver/package_info_test.dart b/packages/package_info/example/test_driver/package_info_test.dart index 81f735482835..88e53d1c1f05 100644 --- a/packages/package_info/example/test_driver/package_info_test.dart +++ b/packages/package_info/example/test_driver/package_info_test.dart @@ -1,9 +1,9 @@ +import 'dart:async'; + import 'package:flutter_driver/flutter_driver.dart'; -void main() { - test('package_info', () async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); - }); +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); } From 5622b44607f244d8088dfa278b5987d732fdf181 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 15:19:42 -0700 Subject: [PATCH 46/74] Uncomment other tests --- .cirrus.yml | 88 ++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 44de3c9a2677..932062f6a71d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -12,20 +12,20 @@ task: - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools - pub global activate flutter_plugin_tools -s path matrix: -# - name: publishable -# script: ./script/check_publish.sh -# - name: test+format -# install_script: -# - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - -# - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" -# - sudo apt-get update -# - sudo apt-get install -y --allow-unauthenticated clang-format-7 -# format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 -# test_script: ./script/incremental_build.sh test -# - name: analyze -# script: ./script/incremental_build.sh analyze -# - name: build_all_plugins_apk -# script: ./script/build_all_plugins_app.sh apk + - name: publishable + script: ./script/check_publish.sh + - name: test+format + install_script: + - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + - sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main" + - sudo apt-get update + - sudo apt-get install -y --allow-unauthenticated clang-format-7 + format_script: ./script/incremental_build.sh format --travis --clang-format=clang-format-7 + test_script: ./script/incremental_build.sh test + - name: analyze + script: ./script/incremental_build.sh analyze + - name: build_all_plugins_apk + script: ./script/build_all_plugins_app.sh apk - name: build-apks+java-test+drive-examples env: matrix: @@ -52,33 +52,33 @@ task: - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` -#task: -# use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' -# osx_instance: -# image: mojave-xcode-10.2-flutter -# setup_script: -# - pod repo update -# upgrade_script: -# - flutter channel master -# - flutter upgrade -# - git fetch origin master -# activate_script: -# - pub global activate flutter_plugin_tools -# create_simulator_script: -# - xcrun simctl list -# - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot -# matrix: -# - name: build_all_plugins_ipa -# script: ./script/build_all_plugins_app.sh ios --no-codesign -# - name: build-ipas+drive-examples -# env: -# PATH: $PATH:/usr/local/bin -# matrix: -# PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" -# PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" -# PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" -# PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" -# SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] -# build_script: -# - ./script/incremental_build.sh build-examples --ipa -# - ./script/incremental_build.sh drive-examples +task: + use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' + osx_instance: + image: mojave-xcode-10.2-flutter + setup_script: + - pod repo update + upgrade_script: + - flutter channel master + - flutter upgrade + - git fetch origin master + activate_script: + - pub global activate flutter_plugin_tools + create_simulator_script: + - xcrun simctl list + - xcrun simctl create Flutter-iPhone com.apple.CoreSimulator.SimDeviceType.iPhone-X com.apple.CoreSimulator.SimRuntime.iOS-12-2 | xargs xcrun simctl boot + matrix: + - name: build_all_plugins_ipa + script: ./script/build_all_plugins_app.sh ios --no-codesign + - name: build-ipas+drive-examples + env: + PATH: $PATH:/usr/local/bin + matrix: + PLUGIN_SHARDING: "--shardIndex 0 --shardCount 4" + PLUGIN_SHARDING: "--shardIndex 1 --shardCount 4" + PLUGIN_SHARDING: "--shardIndex 2 --shardCount 4" + PLUGIN_SHARDING: "--shardIndex 3 --shardCount 4" + SIMCTL_CHILD_MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] + build_script: + - ./script/incremental_build.sh build-examples --ipa + - ./script/incremental_build.sh drive-examples From 1adc8e21e893186300fe343d329ae550a0d32ef8 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 15:41:37 -0700 Subject: [PATCH 47/74] fix lint error --- packages/package_info/example/test/package_info.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/package_info/example/test/package_info.dart b/packages/package_info/example/test/package_info.dart index 7f80d2662599..8ee6fded3653 100644 --- a/packages/package_info/example/test/package_info.dart +++ b/packages/package_info/example/test/package_info.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:package_info/package_info.dart'; From fa8690fd52f270f7c7f3f9add0dfb511f1c91dd7 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 16:13:52 -0700 Subject: [PATCH 48/74] Add a README --- packages/instrumentation_test/README.md | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 packages/instrumentation_test/README.md diff --git a/packages/instrumentation_test/README.md b/packages/instrumentation_test/README.md new file mode 100644 index 000000000000..78ab681e9a33 --- /dev/null +++ b/packages/instrumentation_test/README.md @@ -0,0 +1,43 @@ +# instrumentation_test + +Adapts flutter_test results as Android instrumentation tests, making them usable for Firebase Test Lab and other Android CI providers. + +iOS support is not available yet, but is planned in the future. + +## Usage + +Use `InstrumentationTestFlutterBinding()` at the start of a test file. + +```dart +import 'package:instrumentation_test/instrumentation_test.dart'; +import '../test/package_info.dart' as test; + +void main() { + InstrumentationTestFlutterBinding(); + testWidgets("failing test example", (WidgetTester tester) async { + expect(2 + 2, equals(5)); + }); +} +``` + +Use gradle commands to build an instrumentation test for Android. + +``` +pushd android +./gradlew assembleAndroidTest +./gradlew assembleDebug -Ptarget=.dart +popd +``` + +Upload to Firebase Test Lab, making sure to replace , , , and with your values. + +``` +gcloud auth activate-service-account --key-file= +gcloud --quiet config set project +gcloud firebase test android run --type instrumentation \ + --app build/app/outputs/apk/debug/app-debug.apk \ + --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk\ + --timeout 2m \ + --results-bucket= \ + --results-dir= +``` From 2524211596fe718ef9501aeeb9342804cc66df12 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 16:14:59 -0700 Subject: [PATCH 49/74] Publish as a package --- packages/instrumentation_test/.gitignore | 7 ++++ packages/instrumentation_test/.metadata | 10 +++++ packages/instrumentation_test/CHANGELOG.md | 3 ++ packages/instrumentation_test/LICENSE | 27 ++++++++++++ .../instrumentation_test/android/.gitignore | 8 ++++ .../instrumentation_test/android/build.gradle | 41 +++++++++++++++++++ .../android/gradle.properties | 2 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 ++ .../instrumentationtest/FlutterRunner.java} | 24 +++++++---- .../InstrumentationTestPlugin.java | 25 +++++++++++ .../lib/instrumentation_test.dart | 26 ++++++++++++ packages/instrumentation_test/pubspec.yaml | 21 ++++++++++ .../packageinfo/FlutterJUnitRunner.java | 0 ...WidgetTests.java => MainActivityTest.java} | 6 +-- packages/package_info/example/pubspec.yaml | 2 + .../package_info_test.dart | 32 +-------------- 17 files changed, 196 insertions(+), 42 deletions(-) create mode 100644 packages/instrumentation_test/.gitignore create mode 100644 packages/instrumentation_test/.metadata create mode 100644 packages/instrumentation_test/CHANGELOG.md create mode 100644 packages/instrumentation_test/LICENSE create mode 100644 packages/instrumentation_test/android/.gitignore create mode 100644 packages/instrumentation_test/android/build.gradle create mode 100644 packages/instrumentation_test/android/gradle.properties create mode 100644 packages/instrumentation_test/android/settings.gradle create mode 100644 packages/instrumentation_test/android/src/main/AndroidManifest.xml rename packages/{package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java => instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java} (74%) create mode 100644 packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java create mode 100644 packages/instrumentation_test/lib/instrumentation_test.dart create mode 100644 packages/instrumentation_test/pubspec.yaml create mode 100644 packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/FlutterJUnitRunner.java rename packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/{WidgetTests.java => MainActivityTest.java} (63%) diff --git a/packages/instrumentation_test/.gitignore b/packages/instrumentation_test/.gitignore new file mode 100644 index 000000000000..e9dc58d3d6e2 --- /dev/null +++ b/packages/instrumentation_test/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/packages/instrumentation_test/.metadata b/packages/instrumentation_test/.metadata new file mode 100644 index 000000000000..2b43f17e4faa --- /dev/null +++ b/packages/instrumentation_test/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 3374ee380b499d99c50ed6dfdd45510aa8318741 + channel: master + +project_type: plugin diff --git a/packages/instrumentation_test/CHANGELOG.md b/packages/instrumentation_test/CHANGELOG.md new file mode 100644 index 000000000000..29f648fd17f1 --- /dev/null +++ b/packages/instrumentation_test/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* Initial release diff --git a/packages/instrumentation_test/LICENSE b/packages/instrumentation_test/LICENSE new file mode 100644 index 000000000000..0c382ce171cc --- /dev/null +++ b/packages/instrumentation_test/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/instrumentation_test/android/.gitignore b/packages/instrumentation_test/android/.gitignore new file mode 100644 index 000000000000..c6cbe562a427 --- /dev/null +++ b/packages/instrumentation_test/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/packages/instrumentation_test/android/build.gradle b/packages/instrumentation_test/android/build.gradle new file mode 100644 index 000000000000..e308214a6af0 --- /dev/null +++ b/packages/instrumentation_test/android/build.gradle @@ -0,0 +1,41 @@ +group 'com.example.instrumentation_test' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 16 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } + dependencies { + api 'junit:junit:4.12' + api 'androidx.test:core:1.0.0' + api 'androidx.test:runner:1.1.1' + api 'androidx.test:rules:1.1.1' + api 'androidx.test.espresso:espresso-core:3.1.1' + } +} diff --git a/packages/instrumentation_test/android/gradle.properties b/packages/instrumentation_test/android/gradle.properties new file mode 100644 index 000000000000..2bd6f4fda009 --- /dev/null +++ b/packages/instrumentation_test/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx1536M + diff --git a/packages/instrumentation_test/android/settings.gradle b/packages/instrumentation_test/android/settings.gradle new file mode 100644 index 000000000000..e8ee6c7acbcb --- /dev/null +++ b/packages/instrumentation_test/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'instrumentation_test' diff --git a/packages/instrumentation_test/android/src/main/AndroidManifest.xml b/packages/instrumentation_test/android/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..1d9d4fb8aac9 --- /dev/null +++ b/packages/instrumentation_test/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java similarity index 74% rename from packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java rename to packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java index 04ced89a410d..983d5cd14838 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/FlutterJUnitRunner.java +++ b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java @@ -1,11 +1,14 @@ -package io.flutter.plugins.packageinfoexample; +package io.flutter.plugins.instrumentationtest; import androidx.test.rule.ActivityTestRule; +import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.view.FlutterView; +import java.lang.reflect.Method; +import java.lang.IllegalArgumentException; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -15,16 +18,19 @@ import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; -public class FlutterJUnitRunner extends Runner { +public class FlutterRunner extends Runner { private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; CompletableFuture> testResults; - public FlutterJUnitRunner(Class klass) { - ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); - MainActivity fa = rule.launchActivity(null); - FlutterView fv = fa.getFlutterView(); - MethodChannel methodChannel = new MethodChannel(fv, CHANNEL); + final Class activityClass; + + public FlutterRunner(Class klass) { + activityClass = klass; + ActivityTestRule rule = new ActivityTestRule<>(activityClass); + FlutterActivity activity = rule.launchActivity(null); + FlutterView view = activity.getFlutterView(); + MethodChannel methodChannel = new MethodChannel(view, CHANNEL); testResults = new CompletableFuture<>(); methodChannel.setMethodCallHandler( new MethodCallHandler() { @@ -44,7 +50,7 @@ public void onMethodCall(MethodCall call, Result result) { @Override public Description getDescription() { - return Description.createTestDescription(MainActivity.class, "Flutter Tests"); + return Description.createTestDescription(activityClass, "Flutter Tests"); } @Override @@ -59,7 +65,7 @@ public void run(RunNotifier notifier) { } for (String name : results.keySet()) { - Description d = Description.createTestDescription(MainActivity.class, name); + Description d = Description.createTestDescription(activityClass, name); notifier.fireTestStarted(d); String outcome = results.get(name); if (outcome.equals("failed")) { diff --git a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java new file mode 100644 index 000000000000..38ba58214d5d --- /dev/null +++ b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java @@ -0,0 +1,25 @@ +package com.example.instrumentationtest; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.PluginRegistry.Registrar; + +/** InstrumentationTestPlugin */ +public class InstrumentationTestPlugin implements MethodCallHandler { + /** Plugin registration. */ + public static void registerWith(Registrar registrar) { + final MethodChannel channel = new MethodChannel(registrar.messenger(), "instrumentation_test"); + channel.setMethodCallHandler(new InstrumentationTestPlugin()); + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("getPlatformVersion")) { + result.success("Android " + android.os.Build.VERSION.RELEASE); + } else { + result.notImplemented(); + } + } +} diff --git a/packages/instrumentation_test/lib/instrumentation_test.dart b/packages/instrumentation_test/lib/instrumentation_test.dart new file mode 100644 index 000000000000..b476bcc089a1 --- /dev/null +++ b/packages/instrumentation_test/lib/instrumentation_test.dart @@ -0,0 +1,26 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +/// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results +/// on a channel to adapt them to native instrumentation test format. +class InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { + InstrumentationTestFlutterBinding() { + tearDownAll(() { + _channel.invokeMethod('testFinished', { 'results': _results }); + }); + } + static const MethodChannel _channel = const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); + + static Map _results = {}; + + @override + Future runTest(Future testBody(), VoidCallback invariantTester, { String description = '', Duration timeout }) async { + // TODO(jackson): Report the results individually instead of all at once + reportTestException = (FlutterErrorDetails details, String testDescription) { + _results[description] = 'failed'; + }; + await super.runTest(testBody, invariantTester, description: description, timeout: timeout); + _results[description] ??= 'success'; + } +} diff --git a/packages/instrumentation_test/pubspec.yaml b/packages/instrumentation_test/pubspec.yaml new file mode 100644 index 000000000000..a7255680b509 --- /dev/null +++ b/packages/instrumentation_test/pubspec.yaml @@ -0,0 +1,21 @@ +name: instrumentation_test +description: A new flutter plugin project. +version: 0.0.1 +author: +homepage: + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + plugin: + androidPackage: com.example.instrumentationtest + pluginClass: InstrumentationTestPlugin diff --git a/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/FlutterJUnitRunner.java b/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/FlutterJUnitRunner.java new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java similarity index 63% rename from packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java rename to packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java index 0b603581ef17..93a526c1b6f5 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/WidgetTests.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java @@ -5,8 +5,8 @@ package io.flutter.plugins.packageinfoexample; import org.junit.runner.RunWith; +import io.flutter.plugins.instrumentationtest.FlutterRunner; -@RunWith(FlutterJUnitRunner.class) -public class WidgetTests { - // This class is intentionally left blank. +@RunWith(FlutterRunner.class) +public class MainActivityTest extends MainActivity { } diff --git a/packages/package_info/example/pubspec.yaml b/packages/package_info/example/pubspec.yaml index e4844cd95648..3e6ff98780ce 100644 --- a/packages/package_info/example/pubspec.yaml +++ b/packages/package_info/example/pubspec.yaml @@ -10,6 +10,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + instrumentation_test: + path: ../../instrumentation_test # TODO(jackson): Point to published version when available test: any flutter: diff --git a/packages/package_info/example/test_instrumentation/package_info_test.dart b/packages/package_info/example/test_instrumentation/package_info_test.dart index 1751adc49518..3f45f2658660 100644 --- a/packages/package_info/example/test_instrumentation/package_info_test.dart +++ b/packages/package_info/example/test_instrumentation/package_info_test.dart @@ -2,38 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; -import 'dart:io'; +import 'package:instrumentation_test/instrumentation_test.dart'; import '../test/package_info.dart' as test; -/// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results -/// on a channel to adapt them to native instrumentation test format. -// TODO(jackson): Move to a shared package -class _InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { - _InstrumentationTestFlutterBinding(); - static const MethodChannel _channel = const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); - - static Map _results = {}; - - @override - Future runTest(Future testBody(), VoidCallback invariantTester, { String description = '', Duration timeout }) async { - // TODO(jackson): Report the results individually instead of all at once - reportTestException = (FlutterErrorDetails details, String testDescription) { - _results[description] = 'failed'; - }; - await super.runTest(testBody, invariantTester, description: description, timeout: timeout); - _results[description] ??= 'success'; - } - - static void finish() => _channel.invokeMethod('testFinished', { 'results': _results }); -} - void main() { - _InstrumentationTestFlutterBinding(); - tearDownAll(() { - _InstrumentationTestFlutterBinding.finish(); - }); + InstrumentationTestFlutterBinding(); test.main(); } From 9901bf809628e19ee3e0cace24eb69853c7fa435 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 16:16:32 -0700 Subject: [PATCH 50/74] Format --- .../instrumentationtest/FlutterRunner.java | 98 +++++++++---------- .../lib/instrumentation_test.dart | 14 ++- .../packageinfoexample/MainActivityTest.java | 5 +- 3 files changed, 58 insertions(+), 59 deletions(-) diff --git a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java index 983d5cd14838..15ae86a47761 100644 --- a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java +++ b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java @@ -7,12 +7,9 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.view.FlutterView; -import java.lang.reflect.Method; -import java.lang.IllegalArgumentException; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.notification.Failure; @@ -20,59 +17,58 @@ public class FlutterRunner extends Runner { - private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; - CompletableFuture> testResults; + private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; + CompletableFuture> testResults; - final Class activityClass; + final Class activityClass; - public FlutterRunner(Class klass) { - activityClass = klass; - ActivityTestRule rule = new ActivityTestRule<>(activityClass); - FlutterActivity activity = rule.launchActivity(null); - FlutterView view = activity.getFlutterView(); - MethodChannel methodChannel = new MethodChannel(view, CHANNEL); - testResults = new CompletableFuture<>(); - methodChannel.setMethodCallHandler( - new MethodCallHandler() { - @Override - public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("testFinished")) { - Map results = call.argument("results"); - testResults.complete(results); - result.success(null); - } else { - result.notImplemented(); - } - } + public FlutterRunner(Class klass) { + activityClass = klass; + ActivityTestRule rule = new ActivityTestRule<>(activityClass); + FlutterActivity activity = rule.launchActivity(null); + FlutterView view = activity.getFlutterView(); + MethodChannel methodChannel = new MethodChannel(view, CHANNEL); + testResults = new CompletableFuture<>(); + methodChannel.setMethodCallHandler( + new MethodCallHandler() { + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("testFinished")) { + Map results = call.argument("results"); + testResults.complete(results); + result.success(null); + } else { + result.notImplemented(); } - ); - } + } + }); + } - @Override - public Description getDescription() { - return Description.createTestDescription(activityClass, "Flutter Tests"); - } + @Override + public Description getDescription() { + return Description.createTestDescription(activityClass, "Flutter Tests"); + } - @Override - public void run(RunNotifier notifier) { - Map results = null; - try { - results = testResults.get(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + @Override + public void run(RunNotifier notifier) { + Map results = null; + try { + results = testResults.get(); + } catch (ExecutionException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } - for (String name : results.keySet()) { - Description d = Description.createTestDescription(activityClass, name); - notifier.fireTestStarted(d); - String outcome = results.get(name); - if (outcome.equals("failed")) { - Exception dummyException = new Exception(outcome); - notifier.fireTestFailure(new Failure(d, dummyException)); - } - notifier.fireTestFinished(d); - } + for (String name : results.keySet()) { + Description d = Description.createTestDescription(activityClass, name); + notifier.fireTestStarted(d); + String outcome = results.get(name); + if (outcome.equals("failed")) { + Exception dummyException = new Exception(outcome); + notifier.fireTestFailure(new Failure(d, dummyException)); + } + notifier.fireTestFinished(d); } + } } diff --git a/packages/instrumentation_test/lib/instrumentation_test.dart b/packages/instrumentation_test/lib/instrumentation_test.dart index b476bcc089a1..14eb2bc0fc58 100644 --- a/packages/instrumentation_test/lib/instrumentation_test.dart +++ b/packages/instrumentation_test/lib/instrumentation_test.dart @@ -7,20 +7,24 @@ import 'package:flutter/services.dart'; class InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { InstrumentationTestFlutterBinding() { tearDownAll(() { - _channel.invokeMethod('testFinished', { 'results': _results }); + _channel.invokeMethod('testFinished', {'results': _results}); }); } - static const MethodChannel _channel = const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); + static const MethodChannel _channel = + const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); static Map _results = {}; @override - Future runTest(Future testBody(), VoidCallback invariantTester, { String description = '', Duration timeout }) async { + Future runTest(Future testBody(), VoidCallback invariantTester, + {String description = '', Duration timeout}) async { // TODO(jackson): Report the results individually instead of all at once - reportTestException = (FlutterErrorDetails details, String testDescription) { + reportTestException = + (FlutterErrorDetails details, String testDescription) { _results[description] = 'failed'; }; - await super.runTest(testBody, invariantTester, description: description, timeout: timeout); + await super.runTest(testBody, invariantTester, + description: description, timeout: timeout); _results[description] ??= 'success'; } } diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java index 93a526c1b6f5..3f6f82b92ca5 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java @@ -4,9 +4,8 @@ package io.flutter.plugins.packageinfoexample; -import org.junit.runner.RunWith; import io.flutter.plugins.instrumentationtest.FlutterRunner; +import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends MainActivity { -} +public class MainActivityTest extends MainActivity {} From bc8160bcb51b033e4ed7ea0b1c3eaeb5c613f9b3 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 16:26:03 -0700 Subject: [PATCH 51/74] Remove changes that are being moved to a later PR --- .../example/android/app/build.gradle | 5 +-- .../urllauncherexample/UiAutomatorTest.java | 35 ------------------- script/firebase_test_lab.sh | 11 ------ 3 files changed, 1 insertion(+), 50 deletions(-) delete mode 100644 packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java delete mode 100755 script/firebase_test_lab.sh diff --git a/packages/url_launcher/example/android/app/build.gradle b/packages/url_launcher/example/android/app/build.gradle index 155bae600703..325396c57235 100644 --- a/packages/url_launcher/example/android/app/build.gradle +++ b/packages/url_launcher/example/android/app/build.gradle @@ -33,7 +33,7 @@ android { defaultConfig { applicationId "io.flutter.plugins.urllauncherexample" - minSdkVersion 18 + minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName @@ -55,9 +55,6 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:core:1.0.0' androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' - androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'; } diff --git a/packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java b/packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java deleted file mode 100644 index 55bc5239d009..000000000000 --- a/packages/url_launcher/example/android/app/src/androidTest/java/io/flutter/plugins/urllauncherexample/UiAutomatorTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.flutter.plugins.urllauncherexample; - -import static org.junit.Assert.assertThat; -import static org.hamcrest.CoreMatchers.notNullValue; - -import android.app.Instrumentation; -import androidx.test.rule.ActivityTestRule; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.UiDevice; -import androidx.test.uiautomator.Until; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -public class UiAutomatorTest { - private Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); - private UiDevice device = UiDevice.getInstance(instrumentation); - private static final int LAUNCH_TIMEOUT = 5000; - - @Rule - public ActivityTestRule activityTestRule = - new ActivityTestRule<>(MainActivity.class); - - @Test - public void launchInApp() { - assertThat(device.wait(Until.hasObject(By.text("Launch in app")), LAUNCH_TIMEOUT), notNullValue()); - device.findObject(By.text("Launch in app")).click(); - assertThat(device.wait(Until.hasObject(By.text("HTTP Request Header Display")), LAUNCH_TIMEOUT), notNullValue()); - device.pressBack(); - assertThat(device.wait(Until.hasObject(By.text("Launch in app")), LAUNCH_TIMEOUT), notNullValue()); - } -} \ No newline at end of file diff --git a/script/firebase_test_lab.sh b/script/firebase_test_lab.sh deleted file mode 100755 index a628b785a101..000000000000 --- a/script/firebase_test_lab.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -echo $GCLOUD_FIREBASE_TESTLAB_KEY > ${HOME}/gcloud-service-key.json -gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json -gcloud --quiet config set project flutter-infra -gcloud firebase test android run --type instrumentation \ - --app build/app/outputs/apk/debug/app-debug.apk \ - --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk\ - --timeout 2m \ - --results-bucket=gs://flutter_firebase_testlab \ - --results-dir=engine_android_test/$GIT_REVISION/$CIRRUS_BUILD_ID From e99089ff85afb25e3ddb9c60e0cb7d291602b796 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 16:35:58 -0700 Subject: [PATCH 52/74] Lints --- packages/instrumentation_test/lib/instrumentation_test.dart | 4 ++-- packages/instrumentation_test/pubspec.yaml | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/instrumentation_test/lib/instrumentation_test.dart b/packages/instrumentation_test/lib/instrumentation_test.dart index 14eb2bc0fc58..defac8ca5bac 100644 --- a/packages/instrumentation_test/lib/instrumentation_test.dart +++ b/packages/instrumentation_test/lib/instrumentation_test.dart @@ -7,11 +7,11 @@ import 'package:flutter/services.dart'; class InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { InstrumentationTestFlutterBinding() { tearDownAll(() { - _channel.invokeMethod('testFinished', {'results': _results}); + _channel.invokeMethod('testFinished', {'results': _results}); }); } static const MethodChannel _channel = - const MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); + MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); static Map _results = {}; diff --git a/packages/instrumentation_test/pubspec.yaml b/packages/instrumentation_test/pubspec.yaml index a7255680b509..8d4828f1f78e 100644 --- a/packages/instrumentation_test/pubspec.yaml +++ b/packages/instrumentation_test/pubspec.yaml @@ -10,8 +10,6 @@ environment: dependencies: flutter: sdk: flutter - -dev_dependencies: flutter_test: sdk: flutter From 5c93814dfd980b255dd211b565c1976e6e41d591 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Fri, 9 Aug 2019 16:54:47 -0700 Subject: [PATCH 53/74] Update description --- packages/instrumentation_test/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/instrumentation_test/pubspec.yaml b/packages/instrumentation_test/pubspec.yaml index 8d4828f1f78e..be3975ae1b2c 100644 --- a/packages/instrumentation_test/pubspec.yaml +++ b/packages/instrumentation_test/pubspec.yaml @@ -1,5 +1,5 @@ name: instrumentation_test -description: A new flutter plugin project. +description: Runs tests that use the flutter_test API as platform native instrumentation tests. version: 0.0.1 author: homepage: From 4d12729377de5ca5bde34aafe1c7a805b0c69b42 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 21 Aug 2019 09:54:43 -0700 Subject: [PATCH 54/74] Reformat, code review feedback --- CONTRIBUTING.md | 2 +- .../InstrumentationTestPlugin.java | 17 +++++++++++------ .../lib/instrumentation_test.dart | 1 + packages/instrumentation_test/pubspec.yaml | 2 +- .../package_info/example/test/package_info.dart | 4 ---- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 095d3b0c4c46..e6e3e957af29 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,7 +57,7 @@ cd example flutter drive test/.dart ``` -To run integration tests as an instrumentation tests on a local Android device: +To run integration tests as instrumentation tests on a local Android device: ``` cd example diff --git a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java index 38ba58214d5d..bca927f9c052 100644 --- a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java +++ b/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java @@ -8,18 +8,23 @@ /** InstrumentationTestPlugin */ public class InstrumentationTestPlugin implements MethodCallHandler { + + private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; + /** Plugin registration. */ public static void registerWith(Registrar registrar) { - final MethodChannel channel = new MethodChannel(registrar.messenger(), "instrumentation_test"); + final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); channel.setMethodCallHandler(new InstrumentationTestPlugin()); } @Override public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("getPlatformVersion")) { - result.success("Android " + android.os.Build.VERSION.RELEASE); - } else { - result.notImplemented(); - } + if (call.method.equals("testFinished")) { + Map results = call.argument("results"); + FlutterRunner.completeTestResults(results); + result.success(null); + } else { + result.notImplemented(); + } } } diff --git a/packages/instrumentation_test/lib/instrumentation_test.dart b/packages/instrumentation_test/lib/instrumentation_test.dart index defac8ca5bac..0f1330256309 100644 --- a/packages/instrumentation_test/lib/instrumentation_test.dart +++ b/packages/instrumentation_test/lib/instrumentation_test.dart @@ -19,6 +19,7 @@ class InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { Future runTest(Future testBody(), VoidCallback invariantTester, {String description = '', Duration timeout}) async { // TODO(jackson): Report the results individually instead of all at once + // See https://github.com/flutter/flutter/issues/38985 reportTestException = (FlutterErrorDetails details, String testDescription) { _results[description] = 'failed'; diff --git a/packages/instrumentation_test/pubspec.yaml b/packages/instrumentation_test/pubspec.yaml index be3975ae1b2c..6b72b8c76736 100644 --- a/packages/instrumentation_test/pubspec.yaml +++ b/packages/instrumentation_test/pubspec.yaml @@ -15,5 +15,5 @@ dependencies: flutter: plugin: - androidPackage: com.example.instrumentationtest + androidPackage: io.flutter.plugins.instrumentationtest pluginClass: InstrumentationTestPlugin diff --git a/packages/package_info/example/test/package_info.dart b/packages/package_info/example/test/package_info.dart index 8ee6fded3653..184c007214fd 100644 --- a/packages/package_info/example/test/package_info.dart +++ b/packages/package_info/example/test/package_info.dart @@ -22,8 +22,4 @@ void main() { } }); }); - - testWidgets("failing test example", (WidgetTester tester) async { - expect(2 + 2, equals(5)); - }, skip: true); } From 6183ca3d3870b14a79491dbf756939508c965f8d Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 21 Aug 2019 09:57:01 -0700 Subject: [PATCH 55/74] Update cirrus command to point to landed PR --- .cirrus.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 932062f6a71d..29792ae41fc6 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -9,8 +9,7 @@ task: - flutter upgrade - git fetch origin master activate_script: - - git clone https://github.com/collinjackson/plugin_tools.git -b ftl_demo flutter_plugin_tools - - pub global activate flutter_plugin_tools -s path + - pub global activate flutter_plugin_tools matrix: - name: publishable script: ./script/check_publish.sh From 151626489edb67c73eb17ef4858bd7e44f0e6c0e Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 21 Aug 2019 12:40:17 -0700 Subject: [PATCH 56/74] Rename to instrumentation_adapter --- .../.gitignore | 0 .../.metadata | 0 .../CHANGELOG.md | 0 .../LICENSE | 0 .../README.md | 10 ++++++---- .../android/.gitignore | 0 .../android/build.gradle | 2 +- .../android/gradle.properties | 0 .../instrumentation_adapter/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 2 +- .../flutter/instrumentationadapter}/FlutterRunner.java | 9 +-------- .../InstrumentationTestPlugin.java | 4 ++-- .../lib/instrumentation_adapter.dart} | 4 ++-- .../pubspec.yaml | 6 +++--- packages/instrumentation_test/android/settings.gradle | 1 - .../plugins/packageinfo/FlutterJUnitRunner.java | 0 .../plugins/packageinfoexample/MainActivityTest.java | 4 ++-- .../package_info_test.dart | 0 packages/package_info/example/pubspec.yaml | 4 ++-- 19 files changed, 21 insertions(+), 26 deletions(-) rename packages/{instrumentation_test => instrumentation_adapter}/.gitignore (100%) rename packages/{instrumentation_test => instrumentation_adapter}/.metadata (100%) rename packages/{instrumentation_test => instrumentation_adapter}/CHANGELOG.md (100%) rename packages/{instrumentation_test => instrumentation_adapter}/LICENSE (100%) rename packages/{instrumentation_test => instrumentation_adapter}/README.md (74%) rename packages/{instrumentation_test => instrumentation_adapter}/android/.gitignore (100%) rename packages/{instrumentation_test => instrumentation_adapter}/android/build.gradle (94%) rename packages/{instrumentation_test => instrumentation_adapter}/android/gradle.properties (100%) create mode 100644 packages/instrumentation_adapter/android/settings.gradle rename packages/{instrumentation_test => instrumentation_adapter}/android/src/main/AndroidManifest.xml (62%) rename packages/{instrumentation_test/android/src/main/java/com/example/instrumentationtest => instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter}/FlutterRunner.java (88%) rename packages/{instrumentation_test/android/src/main/java/com/example/instrumentationtest => instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter}/InstrumentationTestPlugin.java (92%) rename packages/{instrumentation_test/lib/instrumentation_test.dart => instrumentation_adapter/lib/instrumentation_adapter.dart} (90%) rename packages/{instrumentation_test => instrumentation_adapter}/pubspec.yaml (65%) delete mode 100644 packages/instrumentation_test/android/settings.gradle delete mode 100644 packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/FlutterJUnitRunner.java rename packages/package_info/example/{test_instrumentation => instrumentation_adapter}/package_info_test.dart (100%) diff --git a/packages/instrumentation_test/.gitignore b/packages/instrumentation_adapter/.gitignore similarity index 100% rename from packages/instrumentation_test/.gitignore rename to packages/instrumentation_adapter/.gitignore diff --git a/packages/instrumentation_test/.metadata b/packages/instrumentation_adapter/.metadata similarity index 100% rename from packages/instrumentation_test/.metadata rename to packages/instrumentation_adapter/.metadata diff --git a/packages/instrumentation_test/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md similarity index 100% rename from packages/instrumentation_test/CHANGELOG.md rename to packages/instrumentation_adapter/CHANGELOG.md diff --git a/packages/instrumentation_test/LICENSE b/packages/instrumentation_adapter/LICENSE similarity index 100% rename from packages/instrumentation_test/LICENSE rename to packages/instrumentation_adapter/LICENSE diff --git a/packages/instrumentation_test/README.md b/packages/instrumentation_adapter/README.md similarity index 74% rename from packages/instrumentation_test/README.md rename to packages/instrumentation_adapter/README.md index 78ab681e9a33..b30cbaa6641a 100644 --- a/packages/instrumentation_test/README.md +++ b/packages/instrumentation_adapter/README.md @@ -1,4 +1,4 @@ -# instrumentation_test +# instrumentation_adapter Adapts flutter_test results as Android instrumentation tests, making them usable for Firebase Test Lab and other Android CI providers. @@ -6,14 +6,16 @@ iOS support is not available yet, but is planned in the future. ## Usage -Use `InstrumentationTestFlutterBinding()` at the start of a test file. +Add a dependency on the `instrumentation_adapter` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the pubspec.yaml of the example app. + +Invoke `InstrumentationAdapterFlutterBinding()` at the start of a test file. ```dart -import 'package:instrumentation_test/instrumentation_test.dart'; +import 'package:instrumentation_adapter/instrumentation_adapter.dart'; import '../test/package_info.dart' as test; void main() { - InstrumentationTestFlutterBinding(); + InstrumentationAdapterFlutterBinding(); testWidgets("failing test example", (WidgetTester tester) async { expect(2 + 2, equals(5)); }); diff --git a/packages/instrumentation_test/android/.gitignore b/packages/instrumentation_adapter/android/.gitignore similarity index 100% rename from packages/instrumentation_test/android/.gitignore rename to packages/instrumentation_adapter/android/.gitignore diff --git a/packages/instrumentation_test/android/build.gradle b/packages/instrumentation_adapter/android/build.gradle similarity index 94% rename from packages/instrumentation_test/android/build.gradle rename to packages/instrumentation_adapter/android/build.gradle index e308214a6af0..a117873b3560 100644 --- a/packages/instrumentation_test/android/build.gradle +++ b/packages/instrumentation_adapter/android/build.gradle @@ -1,4 +1,4 @@ -group 'com.example.instrumentation_test' +group 'com.example.instrumentation_adapter' version '1.0-SNAPSHOT' buildscript { diff --git a/packages/instrumentation_test/android/gradle.properties b/packages/instrumentation_adapter/android/gradle.properties similarity index 100% rename from packages/instrumentation_test/android/gradle.properties rename to packages/instrumentation_adapter/android/gradle.properties diff --git a/packages/instrumentation_adapter/android/settings.gradle b/packages/instrumentation_adapter/android/settings.gradle new file mode 100644 index 000000000000..ed03d0eb2a5e --- /dev/null +++ b/packages/instrumentation_adapter/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'instrumentation_adapter' diff --git a/packages/instrumentation_test/android/src/main/AndroidManifest.xml b/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml similarity index 62% rename from packages/instrumentation_test/android/src/main/AndroidManifest.xml rename to packages/instrumentation_adapter/android/src/main/AndroidManifest.xml index 1d9d4fb8aac9..3b424b6fad67 100644 --- a/packages/instrumentation_test/android/src/main/AndroidManifest.xml +++ b/packages/instrumentation_adapter/android/src/main/AndroidManifest.xml @@ -1,3 +1,3 @@ + package="dev.flutter.instrumentation_adapter"> diff --git a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java similarity index 88% rename from packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java rename to packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index 15ae86a47761..b8620b6ef28c 100644 --- a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -23,7 +23,7 @@ public class FlutterRunner extends Runner { final Class activityClass; public FlutterRunner(Class klass) { - activityClass = klass; + activityClass = klass.newInstance().getActivityClass(); ActivityTestRule rule = new ActivityTestRule<>(activityClass); FlutterActivity activity = rule.launchActivity(null); FlutterView view = activity.getFlutterView(); @@ -33,13 +33,6 @@ public FlutterRunner(Class klass) { new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("testFinished")) { - Map results = call.argument("results"); - testResults.complete(results); - result.success(null); - } else { - result.notImplemented(); - } } }); } diff --git a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationTestPlugin.java similarity index 92% rename from packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java rename to packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationTestPlugin.java index bca927f9c052..928af32c8042 100644 --- a/packages/instrumentation_test/android/src/main/java/com/example/instrumentationtest/InstrumentationTestPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationTestPlugin.java @@ -1,4 +1,4 @@ -package com.example.instrumentationtest; +package com.example.instrumentationadapter; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; @@ -6,7 +6,7 @@ import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; -/** InstrumentationTestPlugin */ +/** InstrumentationAdapterPlugin */ public class InstrumentationTestPlugin implements MethodCallHandler { private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; diff --git a/packages/instrumentation_test/lib/instrumentation_test.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart similarity index 90% rename from packages/instrumentation_test/lib/instrumentation_test.dart rename to packages/instrumentation_adapter/lib/instrumentation_adapter.dart index 0f1330256309..4e741f9b0f3b 100644 --- a/packages/instrumentation_test/lib/instrumentation_test.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -4,8 +4,8 @@ import 'package:flutter/services.dart'; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. -class InstrumentationTestFlutterBinding extends LiveTestWidgetsFlutterBinding { - InstrumentationTestFlutterBinding() { +class InstrumentationAdapterFlutterBinding extends LiveTestWidgetsFlutterBinding { + InstrumentationAdapterFlutterBinding() { tearDownAll(() { _channel.invokeMethod('testFinished', {'results': _results}); }); diff --git a/packages/instrumentation_test/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml similarity index 65% rename from packages/instrumentation_test/pubspec.yaml rename to packages/instrumentation_adapter/pubspec.yaml index 6b72b8c76736..b8289d274f83 100644 --- a/packages/instrumentation_test/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,4 +1,4 @@ -name: instrumentation_test +name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. version: 0.0.1 author: @@ -15,5 +15,5 @@ dependencies: flutter: plugin: - androidPackage: io.flutter.plugins.instrumentationtest - pluginClass: InstrumentationTestPlugin + androidPackage: io.flutter.plugins.instrumentationadapter + pluginClass: InstrumentationAdapterPlugin diff --git a/packages/instrumentation_test/android/settings.gradle b/packages/instrumentation_test/android/settings.gradle deleted file mode 100644 index e8ee6c7acbcb..000000000000 --- a/packages/instrumentation_test/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'instrumentation_test' diff --git a/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/FlutterJUnitRunner.java b/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/FlutterJUnitRunner.java deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java index 3f6f82b92ca5..b48b503088be 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java @@ -4,8 +4,8 @@ package io.flutter.plugins.packageinfoexample; -import io.flutter.plugins.instrumentationtest.FlutterRunner; +import io.flutter.plugins.instrumentationadapter.FlutterRunner; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends MainActivity {} +public class MainActivityTest extends FlutterRunnerTest {} diff --git a/packages/package_info/example/test_instrumentation/package_info_test.dart b/packages/package_info/example/instrumentation_adapter/package_info_test.dart similarity index 100% rename from packages/package_info/example/test_instrumentation/package_info_test.dart rename to packages/package_info/example/instrumentation_adapter/package_info_test.dart diff --git a/packages/package_info/example/pubspec.yaml b/packages/package_info/example/pubspec.yaml index 3e6ff98780ce..b7c3f7f7e13a 100644 --- a/packages/package_info/example/pubspec.yaml +++ b/packages/package_info/example/pubspec.yaml @@ -10,8 +10,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter - instrumentation_test: - path: ../../instrumentation_test # TODO(jackson): Point to published version when available + instrumentation_adapter: + path: ../../instrumentation_adapter # TODO(jackson): Point to published version when available test: any flutter: From 44cb9dad6f3d889b9c19bd36d75e0e088e06abf6 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 21 Aug 2019 14:37:14 -0700 Subject: [PATCH 57/74] Rename more things to instrumentation_adapter --- .../dev/flutter/instrumentationadapter/FlutterRunner.java | 2 +- ...ionTestPlugin.java => InstrumentationAdapterPlugin.java} | 6 +++--- .../lib/instrumentation_adapter.dart | 2 +- .../example/instrumentation_adapter/package_info_test.dart | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/{InstrumentationTestPlugin.java => InstrumentationAdapterPlugin.java} (84%) diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index b8620b6ef28c..90a3849cfaf1 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -1,4 +1,4 @@ -package io.flutter.plugins.instrumentationtest; +package io.flutter.plugins.instrumentationadapter; import androidx.test.rule.ActivityTestRule; import io.flutter.app.FlutterActivity; diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationTestPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java similarity index 84% rename from packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationTestPlugin.java rename to packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java index 928af32c8042..521556b7bee3 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationTestPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -7,14 +7,14 @@ import io.flutter.plugin.common.PluginRegistry.Registrar; /** InstrumentationAdapterPlugin */ -public class InstrumentationTestPlugin implements MethodCallHandler { +public class InstrumentationAdapterPlugin implements MethodCallHandler { - private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; + private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; /** Plugin registration. */ public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - channel.setMethodCallHandler(new InstrumentationTestPlugin()); + channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); } @Override diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index 4e741f9b0f3b..aa146c31fc8c 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -11,7 +11,7 @@ class InstrumentationAdapterFlutterBinding extends LiveTestWidgetsFlutterBinding }); } static const MethodChannel _channel = - MethodChannel('dev.flutter/InstrumentationTestFlutterBinding'); + MethodChannel('dev.flutter/InstrumentationAdapterFlutterBinding'); static Map _results = {}; diff --git a/packages/package_info/example/instrumentation_adapter/package_info_test.dart b/packages/package_info/example/instrumentation_adapter/package_info_test.dart index 3f45f2658660..1701cf086aa8 100644 --- a/packages/package_info/example/instrumentation_adapter/package_info_test.dart +++ b/packages/package_info/example/instrumentation_adapter/package_info_test.dart @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:instrumentation_test/instrumentation_test.dart'; +import 'package:instrumentation_adapter/instrumentation_adapter.dart'; import '../test/package_info.dart' as test; void main() { - InstrumentationTestFlutterBinding(); + InstrumentationAdapterFlutterBinding(); test.main(); } From 4af2bbed2373f7de8309e944d6ce8bce49cc2933 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 08:38:18 -0700 Subject: [PATCH 58/74] Update documentation to use ensureInitialized() --- packages/instrumentation_adapter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index b30cbaa6641a..b2a65bd84a46 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -8,14 +8,14 @@ iOS support is not available yet, but is planned in the future. Add a dependency on the `instrumentation_adapter` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the pubspec.yaml of the example app. -Invoke `InstrumentationAdapterFlutterBinding()` at the start of a test file. +Invoke `InstrumentationAdapterFlutterBinding.ensureInitialized()` at the start of a test file. ```dart import 'package:instrumentation_adapter/instrumentation_adapter.dart'; import '../test/package_info.dart' as test; void main() { - InstrumentationAdapterFlutterBinding(); + InstrumentationAdapterFlutterBinding.ensureInitialized(); testWidgets("failing test example", (WidgetTester tester) async { expect(2 + 2, equals(5)); }); From 69e10e51f97ea86fe3e589f0a4fe6eb1dedc2290 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 09:15:00 -0700 Subject: [PATCH 59/74] Update API to ensureInitialized() --- .../lib/instrumentation_adapter.dart | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index aa146c31fc8c..db5b5ffe1fbe 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -5,11 +5,21 @@ import 'package:flutter/services.dart'; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. class InstrumentationAdapterFlutterBinding extends LiveTestWidgetsFlutterBinding { - InstrumentationAdapterFlutterBinding() { - tearDownAll(() { - _channel.invokeMethod('testFinished', {'results': _results}); + + InstrumentationAdapter._() { + tearDownAll(() async { + await _channel.invokeMethod('allTestsFinished'); }); } + + static WidgetsBinding ensureInitialized() { + if (WidgetsBinding.instance == null) { + InstrumentationAdapter(); + } + assert(WidgetsBinding.instance is InstrumentationAdapter); + return WidgetsBinding.instance; + } + static const MethodChannel _channel = MethodChannel('dev.flutter/InstrumentationAdapterFlutterBinding'); From 4c6ec4e9d36578d115255eb5273e9a6032d13912 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 09:17:10 -0700 Subject: [PATCH 60/74] Reformat --- .../instrumentationadapter/FlutterRunner.java | 3 +-- .../InstrumentationAdapterPlugin.java | 14 +++++++------- .../lib/instrumentation_adapter.dart | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index 90a3849cfaf1..d6aa0b8b94cc 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -32,8 +32,7 @@ public FlutterRunner(Class klass) { methodChannel.setMethodCallHandler( new MethodCallHandler() { @Override - public void onMethodCall(MethodCall call, Result result) { - } + public void onMethodCall(MethodCall call, Result result) {} }); } diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java index 521556b7bee3..fa09c75b26a0 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -19,12 +19,12 @@ public static void registerWith(Registrar registrar) { @Override public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("testFinished")) { - Map results = call.argument("results"); - FlutterRunner.completeTestResults(results); - result.success(null); - } else { - result.notImplemented(); - } + if (call.method.equals("testFinished")) { + Map results = call.argument("results"); + FlutterRunner.completeTestResults(results); + result.success(null); + } else { + result.notImplemented(); + } } } diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index db5b5ffe1fbe..7659e372645f 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -4,8 +4,8 @@ import 'package:flutter/services.dart'; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. -class InstrumentationAdapterFlutterBinding extends LiveTestWidgetsFlutterBinding { - +class InstrumentationAdapterFlutterBinding + extends LiveTestWidgetsFlutterBinding { InstrumentationAdapter._() { tearDownAll(() async { await _channel.invokeMethod('allTestsFinished'); From cdf97f4e07c013fce9095cb25139b54a5d209845 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 09:18:48 -0700 Subject: [PATCH 61/74] Fix pubspec.yaml --- packages/instrumentation_adapter/pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index b8289d274f83..b55d7d2ce62b 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,8 +1,8 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. version: 0.0.1 -author: -homepage: +author: Flutter Team +homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter environment: sdk: ">=2.1.0 <3.0.0" @@ -15,5 +15,5 @@ dependencies: flutter: plugin: - androidPackage: io.flutter.plugins.instrumentationadapter - pluginClass: InstrumentationAdapterPlugin + androidPackage: io.flutter.plugins.instrumentationtest + pluginClass: InstrumentationTestPlugin \ No newline at end of file From 6bfc0c141a69c9911eb9f522a4b2feac9453c95e Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 09:21:11 -0700 Subject: [PATCH 62/74] Fix analyzer issues --- .../lib/instrumentation_adapter.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index 7659e372645f..ae8b6916c620 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -1,12 +1,13 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results /// on a channel to adapt them to native instrumentation test format. class InstrumentationAdapterFlutterBinding extends LiveTestWidgetsFlutterBinding { - InstrumentationAdapter._() { + InstrumentationAdapterFlutterBinding() { tearDownAll(() async { await _channel.invokeMethod('allTestsFinished'); }); @@ -14,9 +15,9 @@ class InstrumentationAdapterFlutterBinding static WidgetsBinding ensureInitialized() { if (WidgetsBinding.instance == null) { - InstrumentationAdapter(); + InstrumentationAdapterFlutterBinding(); } - assert(WidgetsBinding.instance is InstrumentationAdapter); + assert(WidgetsBinding.instance is InstrumentationAdapterFlutterBinding); return WidgetsBinding.instance; } From e851a836cfd3def080dbdb3d6feedfc2cbb1e623 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 09:48:46 -0700 Subject: [PATCH 63/74] =?UTF-8?q?Merge=20in=20some=20naming=20changes=20ba?= =?UTF-8?q?sed=20on=20Tong=E2=80=99s=20version=20and=20get=20tests=20passi?= =?UTF-8?q?ng=20again?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../instrumentationadapter/FlutterRunner.java | 22 +++++++------------ .../InstrumentationAdapterPlugin.java | 11 ++++++---- packages/instrumentation_adapter/pubspec.yaml | 4 ++-- .../packageinfoexample/MainActivityTest.java | 2 +- .../package_info_test.dart | 2 +- 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index d6aa0b8b94cc..17835ca9e954 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -1,4 +1,4 @@ -package io.flutter.plugins.instrumentationadapter; +package dev.flutter.plugins.instrumentationadapter; import androidx.test.rule.ActivityTestRule; import io.flutter.app.FlutterActivity; @@ -17,23 +17,17 @@ public class FlutterRunner extends Runner { - private static final String CHANNEL = "dev.flutter/InstrumentationTestFlutterBinding"; - CompletableFuture> testResults; + private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; + static CompletableFuture> testResults = new CompletableFuture<>(); final Class activityClass; - public FlutterRunner(Class klass) { - activityClass = klass.newInstance().getActivityClass(); - ActivityTestRule rule = new ActivityTestRule<>(activityClass); + public FlutterRunner(Class activityClass) { + super(); + this.activityClass = activityClass; + Class mainClass = activityClass.getSuperclass(); + ActivityTestRule rule = new ActivityTestRule<>(mainClass); FlutterActivity activity = rule.launchActivity(null); - FlutterView view = activity.getFlutterView(); - MethodChannel methodChannel = new MethodChannel(view, CHANNEL); - testResults = new CompletableFuture<>(); - methodChannel.setMethodCallHandler( - new MethodCallHandler() { - @Override - public void onMethodCall(MethodCall call, Result result) {} - }); } @Override diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java index fa09c75b26a0..78d55cab0398 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -1,10 +1,13 @@ -package com.example.instrumentationadapter; +package dev.flutter.plugins.instrumentationadapter; +import android.util.Log; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; +import java.util.concurrent.CompletableFuture; +import java.util.Map; /** InstrumentationAdapterPlugin */ public class InstrumentationAdapterPlugin implements MethodCallHandler { @@ -14,14 +17,14 @@ public class InstrumentationAdapterPlugin implements MethodCallHandler { /** Plugin registration. */ public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); + channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); } @Override public void onMethodCall(MethodCall call, Result result) { - if (call.method.equals("testFinished")) { + if (call.method.equals("allTestsFinished")) { Map results = call.argument("results"); - FlutterRunner.completeTestResults(results); + FlutterRunner.testResults.complete(results); result.success(null); } else { result.notImplemented(); diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index b55d7d2ce62b..103a43628024 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -15,5 +15,5 @@ dependencies: flutter: plugin: - androidPackage: io.flutter.plugins.instrumentationtest - pluginClass: InstrumentationTestPlugin \ No newline at end of file + androidPackage: dev.flutter.plugins.instrumentationadapter + pluginClass: InstrumentationAdapterPlugin \ No newline at end of file diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java index b48b503088be..d42f420cf3f0 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java @@ -8,4 +8,4 @@ import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends FlutterRunnerTest {} +public class MainActivityTest extends MainActivity {} diff --git a/packages/package_info/example/instrumentation_adapter/package_info_test.dart b/packages/package_info/example/instrumentation_adapter/package_info_test.dart index 1701cf086aa8..fa972a06d5f8 100644 --- a/packages/package_info/example/instrumentation_adapter/package_info_test.dart +++ b/packages/package_info/example/instrumentation_adapter/package_info_test.dart @@ -6,6 +6,6 @@ import 'package:instrumentation_adapter/instrumentation_adapter.dart'; import '../test/package_info.dart' as test; void main() { - InstrumentationAdapterFlutterBinding(); + InstrumentationAdapterFlutterBinding.ensureInitialized(); test.main(); } From 7a9fbe2349c218fe87410f0fa909b22e8efb9de4 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 10:33:06 -0700 Subject: [PATCH 64/74] Code review feedback --- .../instrumentationadapter/FlutterRunner.java | 18 +++++------------- .../InstrumentationAdapterPlugin.java | 4 +++- .../lib/instrumentation_adapter.dart | 5 ++++- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index 17835ca9e954..cafc7b222ec0 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -17,14 +17,8 @@ public class FlutterRunner extends Runner { - private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; - static CompletableFuture> testResults = new CompletableFuture<>(); - - final Class activityClass; - public FlutterRunner(Class activityClass) { super(); - this.activityClass = activityClass; Class mainClass = activityClass.getSuperclass(); ActivityTestRule rule = new ActivityTestRule<>(mainClass); FlutterActivity activity = rule.launchActivity(null); @@ -32,22 +26,20 @@ public FlutterRunner(Class activityClass) { @Override public Description getDescription() { - return Description.createTestDescription(activityClass, "Flutter Tests"); + return Description.createTestDescription(FlutterRunner.class, "Flutter Tests"); } @Override public void run(RunNotifier notifier) { Map results = null; try { - results = testResults.get(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); + results = InstrumentationAdapterPlugin.testResults.get(); + } catch (ExecutionException | InterruptedException e) { + throw new IllegalThreadStateException("Unable to get test results"); } for (String name : results.keySet()) { - Description d = Description.createTestDescription(activityClass, name); + Description d = Description.createTestDescription(FlutterRunner.class, name); notifier.fireTestStarted(d); String outcome = results.get(name); if (outcome.equals("failed")) { diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java index 78d55cab0398..8e911b294013 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -12,6 +12,8 @@ /** InstrumentationAdapterPlugin */ public class InstrumentationAdapterPlugin implements MethodCallHandler { + static CompletableFuture> testResults = new CompletableFuture<>(); + private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; /** Plugin registration. */ @@ -24,7 +26,7 @@ public static void registerWith(Registrar registrar) { public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("allTestsFinished")) { Map results = call.argument("results"); - FlutterRunner.testResults.complete(results); + testResults.complete(results); result.success(null); } else { result.notImplemented(); diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index ae8b6916c620..aa3b263180d5 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -8,8 +8,11 @@ import 'package:flutter/widgets.dart'; class InstrumentationAdapterFlutterBinding extends LiveTestWidgetsFlutterBinding { InstrumentationAdapterFlutterBinding() { + // TODO(jackson): Report test results as they arrive tearDownAll(() async { - await _channel.invokeMethod('allTestsFinished'); + await _channel.invokeMethod( + 'allTestsFinished', { 'results': _results } + ); }); } From 23abd9378b8ba9a578b5ff59563ebaa8fc341e21 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 11:45:31 -0700 Subject: [PATCH 65/74] Fixes to get tests passing --- .../instrumentationadapter/FlutterRunner.java | 72 +++++++++++-------- .../instrumentationadapter/FlutterTest.java | 0 .../InstrumentationAdapterPlugin.java | 2 +- .../packageinfoexample/MainActivityTest.java | 12 +++- 4 files changed, 54 insertions(+), 32 deletions(-) create mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index cafc7b222ec0..d5c9b7c15de1 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -1,5 +1,8 @@ package dev.flutter.plugins.instrumentationadapter; +import dev.flutter.plugins.instrumentationadapter.FlutterTest; +import dev.flutter.plugins.instrumentationadapter.InstrumentationAdapterPlugin; +import android.util.Log; import androidx.test.rule.ActivityTestRule; import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.MethodCall; @@ -17,36 +20,47 @@ public class FlutterRunner extends Runner { - public FlutterRunner(Class activityClass) { - super(); - Class mainClass = activityClass.getSuperclass(); - ActivityTestRule rule = new ActivityTestRule<>(mainClass); - FlutterActivity activity = rule.launchActivity(null); - } - - @Override - public Description getDescription() { - return Description.createTestDescription(FlutterRunner.class, "Flutter Tests"); - } - - @Override - public void run(RunNotifier notifier) { - Map results = null; - try { - results = InstrumentationAdapterPlugin.testResults.get(); - } catch (ExecutionException | InterruptedException e) { - throw new IllegalThreadStateException("Unable to get test results"); + final Class testClass; + + public FlutterRunner(Class testClass) { + super(); + this.testClass = testClass; + try { + testClass.newInstance().launchActivity(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalThreadStateException("Unable to launch test"); + } + } + + @Override + public Description getDescription() { + return Description.createTestDescription(testClass, "Flutter Tests"); } - for (String name : results.keySet()) { - Description d = Description.createTestDescription(FlutterRunner.class, name); - notifier.fireTestStarted(d); - String outcome = results.get(name); - if (outcome.equals("failed")) { - Exception dummyException = new Exception(outcome); - notifier.fireTestFailure(new Failure(d, dummyException)); - } - notifier.fireTestFinished(d); + @Override + public void run(RunNotifier notifier) { + Map results = null; + try { + results = InstrumentationAdapterPlugin.testResults.get(); + } catch (ExecutionException | InterruptedException e) { + throw new IllegalThreadStateException("Unable to get test results"); + } + + // Log.v("flutter", "COLLIN sending result"); + // Description d = Description.createTestDescription(testClass, "hello"); + // notifier.fireTestStarted(d); + // notifier.fireTestFinished(d); + // Log.v("flutter", "COLLIN sending result done"); + + for (String name : results.keySet()) { + Description d = Description.createTestDescription(testClass, name); + notifier.fireTestStarted(d); + String outcome = results.get(name); + if (outcome.equals("failed")) { + Exception dummyException = new Exception(outcome); + notifier.fireTestFailure(new Failure(d, dummyException)); + } + notifier.fireTestFinished(d); + } } - } } diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java index 8e911b294013..d367fb472b78 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -12,7 +12,7 @@ /** InstrumentationAdapterPlugin */ public class InstrumentationAdapterPlugin implements MethodCallHandler { - static CompletableFuture> testResults = new CompletableFuture<>(); + public static CompletableFuture> testResults = new CompletableFuture<>(); private static final String CHANNEL = "dev.flutter/InstrumentationAdapterFlutterBinding"; diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java index d42f420cf3f0..853c93876dbb 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java @@ -4,8 +4,16 @@ package io.flutter.plugins.packageinfoexample; -import io.flutter.plugins.instrumentationadapter.FlutterRunner; +import io.flutter.app.FlutterActivity; +import dev.flutter.plugins.instrumentationadapter.FlutterRunner; +import dev.flutter.plugins.instrumentationadapter.FlutterTest; +import androidx.test.rule.ActivityTestRule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends MainActivity {} +public class MainActivityTest extends FlutterTest { + public void launchActivity() { + ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + rule.launchActivity(null); + } +} From 91ba4aa1a6d48e3fc61854f3d7d237a8a1a0444c Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 11:48:14 -0700 Subject: [PATCH 66/74] Reformat, add license blocks --- .../instrumentationadapter/FlutterRunner.java | 85 ++++++++----------- .../instrumentationadapter/FlutterTest.java | 9 ++ .../InstrumentationAdapterPlugin.java | 9 +- .../lib/instrumentation_adapter.dart | 9 +- .../packageinfoexample/MainActivityTest.java | 11 ++- .../example/lib/package_info.dart | 1 + 6 files changed, 63 insertions(+), 61 deletions(-) diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index d5c9b7c15de1..bc635ea080de 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -1,17 +1,10 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package dev.flutter.plugins.instrumentationadapter; -import dev.flutter.plugins.instrumentationadapter.FlutterTest; -import dev.flutter.plugins.instrumentationadapter.InstrumentationAdapterPlugin; -import android.util.Log; -import androidx.test.rule.ActivityTestRule; -import io.flutter.app.FlutterActivity; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.view.FlutterView; import java.util.Map; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.junit.runner.Description; import org.junit.runner.Runner; @@ -20,47 +13,41 @@ public class FlutterRunner extends Runner { - final Class testClass; + final Class testClass; - public FlutterRunner(Class testClass) { - super(); - this.testClass = testClass; - try { - testClass.newInstance().launchActivity(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalThreadStateException("Unable to launch test"); - } + public FlutterRunner(Class testClass) { + super(); + this.testClass = testClass; + try { + testClass.newInstance().launchActivity(); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalThreadStateException("Unable to launch test"); } - - @Override - public Description getDescription() { - return Description.createTestDescription(testClass, "Flutter Tests"); + } + + @Override + public Description getDescription() { + return Description.createTestDescription(testClass, "Flutter Tests"); + } + + @Override + public void run(RunNotifier notifier) { + Map results = null; + try { + results = InstrumentationAdapterPlugin.testResults.get(); + } catch (ExecutionException | InterruptedException e) { + throw new IllegalThreadStateException("Unable to get test results"); } - @Override - public void run(RunNotifier notifier) { - Map results = null; - try { - results = InstrumentationAdapterPlugin.testResults.get(); - } catch (ExecutionException | InterruptedException e) { - throw new IllegalThreadStateException("Unable to get test results"); - } - - // Log.v("flutter", "COLLIN sending result"); - // Description d = Description.createTestDescription(testClass, "hello"); - // notifier.fireTestStarted(d); - // notifier.fireTestFinished(d); - // Log.v("flutter", "COLLIN sending result done"); - - for (String name : results.keySet()) { - Description d = Description.createTestDescription(testClass, name); - notifier.fireTestStarted(d); - String outcome = results.get(name); - if (outcome.equals("failed")) { - Exception dummyException = new Exception(outcome); - notifier.fireTestFailure(new Failure(d, dummyException)); - } - notifier.fireTestFinished(d); - } + for (String name : results.keySet()) { + Description d = Description.createTestDescription(testClass, name); + notifier.fireTestStarted(d); + String outcome = results.get(name); + if (outcome.equals("failed")) { + Exception dummyException = new Exception(outcome); + notifier.fireTestFailure(new Failure(d, dummyException)); + } + notifier.fireTestFinished(d); } + } } diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java index e69de29bb2d1..df6b398bddd6 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java @@ -0,0 +1,9 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package dev.flutter.plugins.instrumentationadapter; + +public abstract class FlutterTest { + public abstract void launchActivity(); +} diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java index d367fb472b78..c77a94e89f91 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/InstrumentationAdapterPlugin.java @@ -1,13 +1,16 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package dev.flutter.plugins.instrumentationadapter; -import android.util.Log; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.util.concurrent.CompletableFuture; import java.util.Map; +import java.util.concurrent.CompletableFuture; /** InstrumentationAdapterPlugin */ public class InstrumentationAdapterPlugin implements MethodCallHandler { @@ -19,7 +22,7 @@ public class InstrumentationAdapterPlugin implements MethodCallHandler { /** Plugin registration. */ public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); + channel.setMethodCallHandler(new InstrumentationAdapterPlugin()); } @Override diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index aa3b263180d5..5932d032f22d 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; @@ -10,9 +14,8 @@ class InstrumentationAdapterFlutterBinding InstrumentationAdapterFlutterBinding() { // TODO(jackson): Report test results as they arrive tearDownAll(() async { - await _channel.invokeMethod( - 'allTestsFinished', { 'results': _results } - ); + await _channel + .invokeMethod('allTestsFinished', {'results': _results}); }); } diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java index 853c93876dbb..4743c68073e1 100644 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java +++ b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java @@ -4,16 +4,15 @@ package io.flutter.plugins.packageinfoexample; -import io.flutter.app.FlutterActivity; +import androidx.test.rule.ActivityTestRule; import dev.flutter.plugins.instrumentationadapter.FlutterRunner; import dev.flutter.plugins.instrumentationadapter.FlutterTest; -import androidx.test.rule.ActivityTestRule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) public class MainActivityTest extends FlutterTest { - public void launchActivity() { - ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); - rule.launchActivity(null); - } + public void launchActivity() { + ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); + rule.launchActivity(null); + } } diff --git a/packages/package_info/example/lib/package_info.dart b/packages/package_info/example/lib/package_info.dart index e69de29bb2d1..8b137891791f 100644 --- a/packages/package_info/example/lib/package_info.dart +++ b/packages/package_info/example/lib/package_info.dart @@ -0,0 +1 @@ + From a269aff2256ba00259f2e39fbe6ad298fe524015 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 12:25:01 -0700 Subject: [PATCH 67/74] Revert package_info changes for now --- .../example/android/app/build.gradle | 2 -- .../packageinfoexample/MainActivityTest.java | 18 ------------- .../package_info_test.dart | 11 -------- .../example/lib/package_info.dart | 1 - packages/package_info/example/pubspec.yaml | 2 -- .../example/test/package_info.dart | 25 ----------------- .../example/test_driver/package_info.dart | 27 ++++++++++++++++--- .../test_driver/package_info_test.dart | 13 ++++----- 8 files changed, 30 insertions(+), 69 deletions(-) delete mode 100644 packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java delete mode 100644 packages/package_info/example/instrumentation_adapter/package_info_test.dart delete mode 100644 packages/package_info/example/lib/package_info.dart delete mode 100644 packages/package_info/example/test/package_info.dart diff --git a/packages/package_info/example/android/app/build.gradle b/packages/package_info/example/android/app/build.gradle index c39e3e286453..c24eba0fe81d 100644 --- a/packages/package_info/example/android/app/build.gradle +++ b/packages/package_info/example/android/app/build.gradle @@ -54,8 +54,6 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:core:1.0.0' androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' } diff --git a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java b/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java deleted file mode 100644 index 4743c68073e1..000000000000 --- a/packages/package_info/example/android/app/src/androidTest/java/io/flutter/plugins/packageinfoexample/MainActivityTest.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.packageinfoexample; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.instrumentationadapter.FlutterRunner; -import dev.flutter.plugins.instrumentationadapter.FlutterTest; -import org.junit.runner.RunWith; - -@RunWith(FlutterRunner.class) -public class MainActivityTest extends FlutterTest { - public void launchActivity() { - ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); - rule.launchActivity(null); - } -} diff --git a/packages/package_info/example/instrumentation_adapter/package_info_test.dart b/packages/package_info/example/instrumentation_adapter/package_info_test.dart deleted file mode 100644 index fa972a06d5f8..000000000000 --- a/packages/package_info/example/instrumentation_adapter/package_info_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:instrumentation_adapter/instrumentation_adapter.dart'; -import '../test/package_info.dart' as test; - -void main() { - InstrumentationAdapterFlutterBinding.ensureInitialized(); - test.main(); -} diff --git a/packages/package_info/example/lib/package_info.dart b/packages/package_info/example/lib/package_info.dart deleted file mode 100644 index 8b137891791f..000000000000 --- a/packages/package_info/example/lib/package_info.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/package_info/example/pubspec.yaml b/packages/package_info/example/pubspec.yaml index b7c3f7f7e13a..e4844cd95648 100644 --- a/packages/package_info/example/pubspec.yaml +++ b/packages/package_info/example/pubspec.yaml @@ -10,8 +10,6 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter - instrumentation_adapter: - path: ../../instrumentation_adapter # TODO(jackson): Point to published version when available test: any flutter: diff --git a/packages/package_info/example/test/package_info.dart b/packages/package_info/example/test/package_info.dart deleted file mode 100644 index 184c007214fd..000000000000 --- a/packages/package_info/example/test/package_info.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'dart:io'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:package_info/package_info.dart'; - -void main() { - group('package_info test driver', () { - testWidgets('test package info result', (_) async { - final PackageInfo info = await PackageInfo.fromPlatform(); - // These tests are based on the example app. The tests should be updated if any related info changes. - if (Platform.isAndroid) { - expect(info.appName, 'package_info_example'); - expect(info.buildNumber, '1'); - expect(info.packageName, 'io.flutter.plugins.packageinfoexample'); - expect(info.version, '1.0'); - } else if (Platform.isIOS) { - expect(info.appName, 'Package Info Example'); - expect(info.buildNumber, '1'); - expect(info.packageName, 'io.flutter.plugins.packageInfoExample'); - expect(info.version, '1.0'); - } else { - throw (UnsupportedError('platform not supported')); - } - }); - }); -} diff --git a/packages/package_info/example/test_driver/package_info.dart b/packages/package_info/example/test_driver/package_info.dart index f1b4f2d1ae2d..97c2db6363c7 100644 --- a/packages/package_info/example/test_driver/package_info.dart +++ b/packages/package_info/example/test_driver/package_info.dart @@ -1,12 +1,31 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter_driver/driver_extension.dart'; -import 'package:test/test.dart'; - -import '../test/package_info.dart' as test; +import 'package:flutter_test/flutter_test.dart'; +import 'package:package_info/package_info.dart'; void main() { final Completer completer = Completer(); enableFlutterDriverExtension(handler: (_) => completer.future); tearDownAll(() => completer.complete(null)); - test.main(); + + group('package_info test driver', () { + test('test package info result', () async { + final PackageInfo info = await PackageInfo.fromPlatform(); + // These tests are based on the example app. The tests should be updated if any related info changes. + if (Platform.isAndroid) { + expect(info.appName, 'package_info_example'); + expect(info.buildNumber, '1'); + expect(info.packageName, 'io.flutter.plugins.packageinfoexample'); + expect(info.version, '1.0'); + } else if (Platform.isIOS) { + expect(info.appName, 'Package Info Example'); + expect(info.buildNumber, '1'); + expect(info.packageName, 'io.flutter.plugins.packageInfoExample'); + expect(info.version, '1.0'); + } else { + throw (UnsupportedError('platform not supported')); + } + }); + }); } diff --git a/packages/package_info/example/test_driver/package_info_test.dart b/packages/package_info/example/test_driver/package_info_test.dart index 88e53d1c1f05..c1d690c17ee3 100644 --- a/packages/package_info/example/test_driver/package_info_test.dart +++ b/packages/package_info/example/test_driver/package_info_test.dart @@ -1,9 +1,10 @@ -import 'dart:async'; - import 'package:flutter_driver/flutter_driver.dart'; +import 'package:test/test.dart'; -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); +void main() { + test('package_info', () async { + final FlutterDriver driver = await FlutterDriver.connect(); + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + }); } From a95a286453c6315a7e906deb5da0a0e724a90e7a Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 12:37:15 -0700 Subject: [PATCH 68/74] Fix analyzer --- .../instrumentation_adapter/lib/instrumentation_adapter.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart index 5932d032f22d..81f81872d950 100644 --- a/packages/instrumentation_adapter/lib/instrumentation_adapter.dart +++ b/packages/instrumentation_adapter/lib/instrumentation_adapter.dart @@ -14,8 +14,8 @@ class InstrumentationAdapterFlutterBinding InstrumentationAdapterFlutterBinding() { // TODO(jackson): Report test results as they arrive tearDownAll(() async { - await _channel - .invokeMethod('allTestsFinished', {'results': _results}); + await _channel.invokeMethod( + 'allTestsFinished', {'results': _results}); }); } From 21c96e3ffdf7251f49ef80dfd4783b10625cb1a7 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 12:45:46 -0700 Subject: [PATCH 69/74] Disable failing --- .cirrus.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 29792ae41fc6..0053361a7da3 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -47,7 +47,6 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build - - ./script/incremental_build.sh firebase-test-lab - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` From e14c5b53306ffe5e66c0bd5b8f89e611164af16e Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 12:47:21 -0700 Subject: [PATCH 70/74] Revert CI changes for now (landing in a separate change) --- .ci/Dockerfile | 17 ++--------------- .cirrus.yml | 14 +++++++++----- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 4f1c50cca517..09db02e8967e 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,24 +1,11 @@ FROM cirrusci/flutter:latest -RUN sudo apt-get update -RUN sudo apt-get install -y git wget curl unzip python lsb-release sudo apt-transport-https - -# Add repo for gcloud sdk and install it -RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ - sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list - -RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ - sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - - -RUN sudo apt-get update && sudo apt-get install -y google-cloud-sdk && \ - gcloud config set core/disable_usage_reporting true && \ - gcloud config set component_manager/disable_update_check true - RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ - "extras;android;m2repository" + "extras;android;m2repository" \ + "system-images;android-21;default;armeabi-v7a" RUN yes | sdkmanager --licenses diff --git a/.cirrus.yml b/.cirrus.yml index 0053361a7da3..6735d0b62e7d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -8,8 +8,7 @@ task: - flutter channel master - flutter upgrade - git fetch origin master - activate_script: - - pub global activate flutter_plugin_tools + activate_script: pub global activate flutter_plugin_tools matrix: - name: publishable script: ./script/check_publish.sh @@ -31,10 +30,12 @@ task: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] - CLOUDSDK_CORE_DISABLE_PROMPTS: 1 - GCLOUD_FIREBASE_TESTLAB_KEY: ENCRYPTED[ae17cec7f4d708b1e5c2e841c3643006c2ef46f3745e28fd965bc26b224158f408a0c2da40a1beb0addb163fa4c11389] + create_device_script: + echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" + start_emulator_background_script: + - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window + wait_for_emulator_script: adb wait-for-device script: - - echo $GCLOUD_FIREBASE_TESTLAB_KEY > ${HOME}/gcloud-service-key.json # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. # See: https://github.com/flutter/flutter/issues/24935 @@ -47,6 +48,9 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build + # TODO(jackson): Re-enable once Android emulators support Firebase + # https://github.com/flutter/flutter/issues/29571 + # - ./script/incremental_build.sh drive-examples - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` From 58a93a770dfa8b82bdf6ab09d2144d8f2e307035 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 13:04:53 -0700 Subject: [PATCH 71/74] Remove instrumentation adapter from all_plugins app for now --- script/build_all_plugins_app.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index 4d30ad73e8a1..4bf59d2e8a80 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -12,7 +12,7 @@ check_changed_packages > /dev/null cd $REPO_DIR/examples/all_plugins flutter clean > /dev/null -(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec) +(cd "$REPO_DIR" && pub global run flutter_plugin_tools gen-pubspec --exclude instrumentation_adapter) function error() { echo "$@" 1>&2 From 6f61e3cd713fbaa2a3c24568bdb4ef137c03b19e Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 13:11:42 -0700 Subject: [PATCH 72/74] Remove unused emulators from Cirrus --- .ci/Dockerfile | 3 +-- .cirrus.yml | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 09db02e8967e..324a2b97615f 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -5,7 +5,6 @@ RUN yes | sdkmanager \ "platforms;android-27" \ "build-tools;27.0.3" \ "extras;google;m2repository" \ - "extras;android;m2repository" \ - "system-images;android-21;default;armeabi-v7a" + "extras;android;m2repository" RUN yes | sdkmanager --licenses diff --git a/.cirrus.yml b/.cirrus.yml index 6735d0b62e7d..ba99edac136b 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -34,7 +34,6 @@ task: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" start_emulator_background_script: - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window - wait_for_emulator_script: adb wait-for-device script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. @@ -48,9 +47,6 @@ task: - export CIRRUS_COMMIT_MESSAGE="" - ./script/incremental_build.sh build-examples --apk - ./script/incremental_build.sh java-test # must come after apk build - # TODO(jackson): Re-enable once Android emulators support Firebase - # https://github.com/flutter/flutter/issues/29571 - # - ./script/incremental_build.sh drive-examples - export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt` - export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt` From c797834750e04a97bf3843bd4f118a047ba12012 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 13:12:34 -0700 Subject: [PATCH 73/74] Remove start_emulator command from Cirrus --- .cirrus.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index ba99edac136b..9f00635671e2 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -32,8 +32,6 @@ task: MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] create_device_script: echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" - start_emulator_background_script: - - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash. From 79bfe5c6ed6ab021a8482108fe516e4ff3ed8de2 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 13:23:35 -0700 Subject: [PATCH 74/74] Remove create device script --- .cirrus.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 9f00635671e2..02c7551b3500 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -30,8 +30,6 @@ task: PLUGIN_SHARDING: "--shardIndex 0 --shardCount 2" PLUGIN_SHARDING: "--shardIndex 1 --shardCount 2" MAPS_API_KEY: ENCRYPTED[596a9f6bca436694625ac50851dc5da6b4d34cba8025f7db5bc9465142e8cd44e15f69e3507787753accebfc4910d550] - create_device_script: - echo no | avdmanager -v create avd -n test -k "system-images;android-21;default;armeabi-v7a" script: # Unsetting CIRRUS_CHANGE_MESSAGE and CIRRUS_COMMIT_MESSAGE as they # might include non-ASCII characters which makes Gradle crash.