From 9b631a2184fec9cb95876c4a962a4d72a1ed7e53 Mon Sep 17 00:00:00 2001 From: Brett Morgan Date: Wed, 27 Jan 2021 18:42:33 +1100 Subject: [PATCH] Split CI testing based on flutter channels (#651) --- .github/workflows/main.yml | 19 +++--- .../desktop_photo_search/lib/main.dart | 1 - .../null_safety/null_safe_app/lib/badapp.dart | 2 + .../null_unsafe_app/test/widget_test.dart | 15 +++++ .../veggieseasons/lib/screens/settings.dart | 13 ++-- .../veggieseasons/test/restoration_test.dart | 26 +++++--- .../web_dashboard/lib/src/auth/firebase.dart | 1 - .../web_dashboard/lib/src/auth/mock.dart | 2 +- .../web_dashboard/lib/src/pages/sign_in.dart | 2 +- experimental/web_dashboard/tool/grind.dart | 3 +- tool/android_ci_script.sh | 2 +- tool/flutter_ci_script_beta.sh | 63 ++++++++++++++++++ tool/flutter_ci_script_dev.sh | 64 +++++++++++++++++++ ..._script.sh => flutter_ci_script_stable.sh} | 2 +- 14 files changed, 184 insertions(+), 31 deletions(-) create mode 100644 experimental/null_safety/null_unsafe_app/test/widget_test.dart create mode 100755 tool/flutter_ci_script_beta.sh create mode 100755 tool/flutter_ci_script_dev.sh rename tool/{flutter_ci_script.sh => flutter_ci_script_stable.sh} (93%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9e69d67f7..663fb9950 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,16 +9,19 @@ on: schedule: - cron: '0 0 * * *' # Every day at midnight +defaults: + run: + shell: bash + jobs: flutter-tests: - runs-on: ubuntu-latest + name: Test Flutter ${{ matrix.flutter_version }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - include: - - flutter_version: dev - - flutter_version: beta - - flutter_version: stable + flutter_version: [dev, beta, stable] + os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 @@ -27,11 +30,9 @@ jobs: - uses: subosito/flutter-action@v1 with: channel: ${{ matrix.flutter_version }} - - run: ./tool/flutter_ci_script.sh + - run: ./tool/flutter_ci_script_${{ matrix.flutter_version }}.sh android-build: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 @@ -43,8 +44,6 @@ jobs: - run: ./tool/android_ci_script.sh ios-build: runs-on: macos-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 diff --git a/experimental/desktop_photo_search/lib/main.dart b/experimental/desktop_photo_search/lib/main.dart index 203b64a65..db9921b51 100644 --- a/experimental/desktop_photo_search/lib/main.dart +++ b/experimental/desktop_photo_search/lib/main.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. import 'dart:io'; -import 'dart:typed_data'; import 'package:file_selector/file_selector.dart'; import 'package:flutter/foundation.dart'; diff --git a/experimental/null_safety/null_safe_app/lib/badapp.dart b/experimental/null_safety/null_safe_app/lib/badapp.dart index be5d20884..311a5b450 100644 --- a/experimental/null_safety/null_safe_app/lib/badapp.dart +++ b/experimental/null_safety/null_safe_app/lib/badapp.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: unused_local_variable + import 'package:flutter/material.dart'; import 'services.dart'; diff --git a/experimental/null_safety/null_unsafe_app/test/widget_test.dart b/experimental/null_safety/null_unsafe_app/test/widget_test.dart new file mode 100644 index 000000000..8c65b0917 --- /dev/null +++ b/experimental/null_safety/null_unsafe_app/test/widget_test.dart @@ -0,0 +1,15 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Rendering the page throws an exception', + (WidgetTester tester) async { + // Do nothing, running the app throws an exception on widget render. + }); +} diff --git a/experimental/veggieseasons/lib/screens/settings.dart b/experimental/veggieseasons/lib/screens/settings.dart index 6accd80d6..6f44fcbea 100644 --- a/experimental/veggieseasons/lib/screens/settings.dart +++ b/experimental/veggieseasons/lib/screens/settings.dart @@ -23,7 +23,8 @@ class VeggieCategorySettingsScreen extends StatelessWidget { static Route _routeBuilder(BuildContext context, Object argument) { return CupertinoPageRoute( - builder: (context) => VeggieCategorySettingsScreen(restorationId: 'category'), + builder: (context) => + VeggieCategorySettingsScreen(restorationId: 'category'), title: 'Preferred Categories', ); } @@ -136,9 +137,10 @@ class CalorieSettingsScreen extends StatelessWidget { label: cals.toString(), icon: SettingsIcon( icon: Styles.checkIcon, - foregroundColor: snapshot.hasData && snapshot.data == cals - ? CupertinoColors.activeBlue - : Styles.transparentColor, + foregroundColor: + snapshot.hasData && snapshot.data == cals + ? CupertinoColors.activeBlue + : Styles.transparentColor, backgroundColor: Styles.transparentColor, ), onPress: snapshot.hasData @@ -219,7 +221,8 @@ class SettingsScreen extends StatelessWidget { restorationId: restorationId, child: CupertinoPageScaffold( child: Container( - color: Styles.scaffoldBackground(CupertinoTheme.brightnessOf(context)), + color: + Styles.scaffoldBackground(CupertinoTheme.brightnessOf(context)), child: CustomScrollView( restorationId: 'list', slivers: [ diff --git a/experimental/veggieseasons/test/restoration_test.dart b/experimental/veggieseasons/test/restoration_test.dart index b06449ddd..4472f42ac 100644 --- a/experimental/veggieseasons/test/restoration_test.dart +++ b/experimental/veggieseasons/test/restoration_test.dart @@ -43,27 +43,32 @@ void main() { expect(find.text('Grapes'), findsNothing); expect(find.text('Figs'), findsOneWidget); expect(find.text('Serving info'), findsOneWidget); - expect(tester.widget(find.byType(CupertinoSwitch)).value, isFalse); + expect(tester.widget(find.byType(CupertinoSwitch)).value, + isFalse); await tester.tap(find.byType(CupertinoSwitch)); await tester.pumpAndSettle(); - expect(tester.widget(find.byType(CupertinoSwitch)).value, isTrue); + expect(tester.widget(find.byType(CupertinoSwitch)).value, + isTrue); // Current details page is restored. await tester.restartAndRestore(); expect(find.text('Grapes'), findsNothing); expect(find.text('Figs'), findsOneWidget); expect(find.text('Serving info'), findsOneWidget); - expect(tester.widget(find.byType(CupertinoSwitch)).value, isTrue); + expect(tester.widget(find.byType(CupertinoSwitch)).value, + isTrue); await tester.tap(find.text('Trivia')); await tester.pumpAndSettle(); expect(find.text('Serving info'), findsNothing); - expect(find.text("Which of these isn't a variety of figs?"), findsOneWidget); + expect( + find.text("Which of these isn't a variety of figs?"), findsOneWidget); // Restores to trivia page. await tester.restartAndRestore(); expect(find.text('Serving info'), findsNothing); - expect(find.text("Which of these isn't a variety of figs?"), findsOneWidget); + expect( + find.text("Which of these isn't a variety of figs?"), findsOneWidget); await tester.tap(find.text('Brown Turkey')); await tester.pumpAndSettle(); @@ -92,13 +97,15 @@ void main() { await tester.tap(find.text('My Garden')); await tester.pumpAndSettle(); - expect(find.text('My Garden'), findsNWidgets(2)); // Name of the tap & title of page. + expect(find.text('My Garden'), + findsNWidgets(2)); // Name of the tap & title of page. expect(find.text('Grapes'), findsNothing); expect(find.text('Figs'), findsOneWidget); // Restores the current selected tab. await tester.restartAndRestore(); - expect(find.text('My Garden'), findsNWidgets(2)); // Name of the tap & title of page. + expect(find.text('My Garden'), + findsNWidgets(2)); // Name of the tap & title of page. expect(find.text('Grapes'), findsNothing); expect(find.text('Figs'), findsOneWidget); expect(find.text('Apples'), findsNothing); @@ -109,7 +116,8 @@ void main() { expect(find.text('Apples'), findsOneWidget); expect(find.text('Tangelo'), findsNothing); - await tester.enterText(find.byType(CupertinoTextField).hitTestable(), 'Tan'); + await tester.enterText( + find.byType(CupertinoTextField).hitTestable(), 'Tan'); await tester.pumpAndSettle(); expect(find.text('Apples'), findsNothing); expect(find.text('Tangelo'), findsOneWidget); @@ -129,7 +137,7 @@ void main() { expect(find.text('Tangelo'), findsOneWidget); expect(find.text('Serving info'), findsOneWidget); - + // Restores details page await tester.restartAndRestore(); expect(find.text('Tangelo'), findsOneWidget); diff --git a/experimental/web_dashboard/lib/src/auth/firebase.dart b/experimental/web_dashboard/lib/src/auth/firebase.dart index 5c8b7807a..99a308092 100644 --- a/experimental/web_dashboard/lib/src/auth/firebase.dart +++ b/experimental/web_dashboard/lib/src/auth/firebase.dart @@ -54,4 +54,3 @@ class _FirebaseUser implements User { _FirebaseUser(this.uid); } - diff --git a/experimental/web_dashboard/lib/src/auth/mock.dart b/experimental/web_dashboard/lib/src/auth/mock.dart index a1bdcd16c..6dbf8ba46 100644 --- a/experimental/web_dashboard/lib/src/auth/mock.dart +++ b/experimental/web_dashboard/lib/src/auth/mock.dart @@ -13,7 +13,7 @@ class MockAuthService implements Auth { Future signIn() async { // Sign in will randomly fail 25% of the time. var random = Random(); - if (random.nextInt(4) == 0) { + if (random.nextInt(4) == 0) { throw SignInException(); } return MockUser(); diff --git a/experimental/web_dashboard/lib/src/pages/sign_in.dart b/experimental/web_dashboard/lib/src/pages/sign_in.dart index 947db02d1..ca4cc9d92 100644 --- a/experimental/web_dashboard/lib/src/pages/sign_in.dart +++ b/experimental/web_dashboard/lib/src/pages/sign_in.dart @@ -95,7 +95,7 @@ class _SignInButtonState extends State { } void _showError() { - Scaffold.of(context).showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Unable to sign in.'), ), diff --git a/experimental/web_dashboard/tool/grind.dart b/experimental/web_dashboard/tool/grind.dart index e98f791b8..88eace491 100644 --- a/experimental/web_dashboard/tool/grind.dart +++ b/experimental/web_dashboard/tool/grind.dart @@ -26,7 +26,8 @@ void runWeb() { @Task() void runFirebase() { run('flutter', - arguments: 'run -d web --web-port=5000 lib/main_firebase.dart '.split(' ')); + arguments: + 'run -d web --web-port=5000 lib/main_firebase.dart '.split(' ')); } @Task() diff --git a/tool/android_ci_script.sh b/tool/android_ci_script.sh index f1b0f0b15..fcbb9e98a 100755 --- a/tool/android_ci_script.sh +++ b/tool/android_ci_script.sh @@ -21,7 +21,7 @@ declare -ar ANDROID_PROJECT_NAMES=( for PROJECT_NAME in "${ANDROID_PROJECT_NAMES[@]}" do - echo "== Testing '${PROJECT_NAME}' on Flutter's ${FLUTTER_VERSION} channel ==" + echo "== Testing '${PROJECT_NAME}' on Flutter's stable channel ==" pushd "${PROJECT_NAME}" ./gradlew --stacktrace assembleDebug diff --git a/tool/flutter_ci_script_beta.sh b/tool/flutter_ci_script_beta.sh new file mode 100755 index 000000000..23c91482c --- /dev/null +++ b/tool/flutter_ci_script_beta.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +set -e + +declare -ar PROJECT_NAMES=( + "add_to_app/flutter_module" \ + "add_to_app/flutter_module_using_plugin" \ + "add_to_app/flutter_module_books" \ + "animations" \ + # Tracking issue: https://github.com/flutter/samples/issues/652 + # "flutter_maps_firestore" \ + "infinite_list" \ + "ios_app_clip" \ + # Tracking issue: https://github.com/flutter/samples/issues/653 + # "isolate_example" \ + "jsonexample" \ + # Tracking issue: https://github.com/flutter/samples/issues/655 + # "place_tracker" \ + # Tracking issue: https://github.com/flutter/samples/issues/656 + # "platform_channels" \ + "platform_design" + "platform_view_swift" \ + "provider_counter" \ + # Tracking issue: https://github.com/flutter/samples/issues/657 + # "provider_shopper" \ + # Tracking issue: https://github.com/flutter/samples/issues/658 + # "testing_app" \ + # Tracking issue: https://github.com/flutter/samples/issues/659 + # "experimental/federated_plugin/federated_plugin" \ + "experimental/null_safety/null_safe_app" \ + "experimental/null_safety/null_unsafe_app" \ + "experimental/veggieseasons" \ + "experimental/web_dashboard" \ +) + +for PROJECT_NAME in "${PROJECT_NAMES[@]}" +do + echo "== Testing '${PROJECT_NAME}' on Flutter's beta channel ==" + pushd "${PROJECT_NAME}" + + # Grab packages. + flutter pub get + + # Run the analyzer to find any static analysis issues. + flutter analyze + + # Reformat the web plugin registrant, if necessary. + if [ -f "lib/generated_plugin_registrant.dart" ] + then + echo "Renaming $(pwd)/lib/generated_plugin_registrant.dart" + flutter format "lib/generated_plugin_registrant.dart" + fi + + # Run the formatter on all the dart files to make sure everything's linted. + flutter format -n --set-exit-if-changed . + + # Run the actual tests. + flutter test + + popd +done + +echo "-- Success --" diff --git a/tool/flutter_ci_script_dev.sh b/tool/flutter_ci_script_dev.sh new file mode 100755 index 000000000..bbf8abc4d --- /dev/null +++ b/tool/flutter_ci_script_dev.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +set -e + +declare -ar PROJECT_NAMES=( + "add_to_app/flutter_module" \ + "add_to_app/flutter_module_using_plugin" \ + "add_to_app/flutter_module_books" \ + "animations" \ + # Tracking issue: https://github.com/flutter/samples/issues/652 + # "flutter_maps_firestore" \ + "infinite_list" \ + "ios_app_clip" \ + # Tracking issue: https://github.com/flutter/samples/issues/653 + # "isolate_example" \ + "jsonexample" \ + # Tracking issue: https://github.com/flutter/samples/issues/655 + # "place_tracker" \ + # Tracking issue: https://github.com/flutter/samples/issues/656 + # "platform_channels" \ + "platform_design" + "platform_view_swift" \ + "provider_counter" \ + # Tracking issue: https://github.com/flutter/samples/issues/657 + # "provider_shopper" \ + # Tracking issue: https://github.com/flutter/samples/issues/658 + # "testing_app" \ + "experimental/desktop_photo_search" \ + # https://github.com/flutter/samples/issues/659 + # "experimental/federated_plugin/federated_plugin" \ + "experimental/null_safety/null_safe_app" \ + "experimental/null_safety/null_unsafe_app" \ + "experimental/veggieseasons" \ + "experimental/web_dashboard" \ +) + +for PROJECT_NAME in "${PROJECT_NAMES[@]}" +do + echo "== Testing '${PROJECT_NAME}' on Flutter's dev channel ==" + pushd "${PROJECT_NAME}" + + # Grab packages. + flutter pub get + + # Run the analyzer to find any static analysis issues. + flutter analyze + + # Reformat the web plugin registrant, if necessary. + if [ -f "lib/generated_plugin_registrant.dart" ] + then + echo "Renaming $(pwd)/lib/generated_plugin_registrant.dart" + flutter format "lib/generated_plugin_registrant.dart" + fi + + # Run the formatter on all the dart files to make sure everything's linted. + flutter format -n --set-exit-if-changed . + + # Run the actual tests. + flutter test + + popd +done + +echo "-- Success --" diff --git a/tool/flutter_ci_script.sh b/tool/flutter_ci_script_stable.sh similarity index 93% rename from tool/flutter_ci_script.sh rename to tool/flutter_ci_script_stable.sh index a0cb1b078..d9ccdb2cf 100755 --- a/tool/flutter_ci_script.sh +++ b/tool/flutter_ci_script_stable.sh @@ -25,7 +25,7 @@ declare -ar PROJECT_NAMES=( for PROJECT_NAME in "${PROJECT_NAMES[@]}" do - echo "== Testing '${PROJECT_NAME}' on Flutter's ${FLUTTER_VERSION} channel ==" + echo "== Testing '${PROJECT_NAME}' on Flutter's stable channel ==" pushd "${PROJECT_NAME}" # Grab packages.