| #!/bin/bash |
| # Copyright 2013 The Flutter Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| ############################################################################### |
| # run_tests.sh |
| # |
| # This runs all the different types of tests for pigeon. It should be run from |
| # the directory that contains the script. |
| ############################################################################### |
| |
| # exit when any command fails |
| set -e |
| |
| # TODO(blasten): Enable on stable when possible. |
| # https://github.com/flutter/flutter/issues/75187 |
| if [[ "$CHANNEL" == "stable" ]]; then |
| exit 0 |
| fi |
| |
| ############################################################################### |
| # Variables |
| ############################################################################### |
| flutter=$(which flutter) |
| flutter_bin=$(dirname $flutter) |
| framework_path="$flutter_bin/cache/artifacts/engine/ios/" |
| |
| java_linter=checkstyle-8.41-all.jar |
| java_formatter=google-java-format-1.3-all-deps.jar |
| google_checks=google_checks.xml |
| google_checks_version=7190c47ca5515ad8cb827bc4065ae7664d2766c1 |
| java_error_prone=error_prone_core-2.5.1-with-dependencies.jar |
| dataflow_shaded=dataflow-shaded-3.7.1.jar |
| jformat_string=jFormatString-3.0.0.jar |
| java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) |
| javac_jar=javac-9+181-r4173-1.jar |
| if [ $java_version == "8" ]; then |
| javac_bootclasspath="-J-Xbootclasspath/p:ci/$javac_jar" |
| else |
| javac_bootclasspath= |
| fi |
| |
| ############################################################################### |
| # Helper Functions |
| ############################################################################### |
| |
| # Create a temporary directory in a way that works on both Linux and macOS. |
| # |
| # The mktemp commands have slighly semantics on the BSD systems vs GNU systems. |
| mktmpdir() { |
| mktemp -d flutter_pigeon.XXXXXX 2>/dev/null || mktemp -d -t flutter_pigeon. |
| } |
| |
| # test_pigeon_ios(<path to pigeon file>) |
| # |
| # Compiles the pigeon file to a temp directory and attempts to compile the objc |
| # code. |
| test_pigeon_ios() { |
| echo "test_pigeon_ios($1)" |
| temp_dir=$(mktmpdir) |
| |
| pub run pigeon \ |
| --no-dart_null_safety \ |
| --input $1 \ |
| --dart_out $temp_dir/pigeon.dart \ |
| --objc_header_out $temp_dir/pigeon.h \ |
| --objc_source_out $temp_dir/pigeon.m |
| |
| xcrun clang \ |
| -arch arm64 \ |
| -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \ |
| -F $framework_path \ |
| -F $framework_path/Flutter.xcframework/ios-armv7_arm64 \ |
| -Werror \ |
| -fobjc-arc \ |
| -c $temp_dir/pigeon.m \ |
| -o $temp_dir/pigeon.o |
| |
| rm -rf $temp_dir |
| } |
| |
| # test_pigeon_android(<path to pigeon file>) |
| # |
| # Compiles the pigeon file to a temp directory and attempts to compile the java |
| # code. |
| test_pigeon_android() { |
| echo "test_pigeon_android($1)" |
| temp_dir=$(mktmpdir) |
| |
| pub run pigeon \ |
| --input $1 \ |
| --dart_out $temp_dir/pigeon.dart \ |
| --java_out $temp_dir/Pigeon.java \ |
| --java_package foo |
| |
| java -jar ci/$java_formatter --replace "$temp_dir/Pigeon.java" |
| java -jar ci/$java_linter -c "ci/$google_checks" "$temp_dir/Pigeon.java" |
| if ! javac \ |
| $javac_bootclasspath \ |
| -XDcompilePolicy=simple \ |
| -processorpath "ci/$java_error_prone:ci/$dataflow_shaded:ci/$jformat_string" \ |
| '-Xplugin:ErrorProne -Xep:CatchingUnchecked:ERROR' \ |
| -classpath "$flutter_bin/cache/artifacts/engine/android-x64/flutter.jar" \ |
| $temp_dir/Pigeon.java; then |
| echo "javac $temp_dir/Pigeon.java failed" |
| exit 1 |
| fi |
| |
| rm -rf $temp_dir |
| } |
| |
| # test_null_safe_dart(<path to pigeon file>) |
| # |
| # Compiles the pigeon file to a temp directory and attempts to run the dart |
| # analyzer on it with and without null safety turned on. |
| test_pigeon_dart() { |
| echo "test_pigeon_dart($1)" |
| temp_dir_1=$(mktmpdir) |
| temp_dir_2=$(mktmpdir) |
| |
| pub run pigeon \ |
| --input $1 \ |
| --dart_out $temp_dir_1/pigeon.dart & |
| null_safe_gen_pid=$! |
| |
| pub run pigeon \ |
| --no-dart_null_safety \ |
| --input $1 \ |
| --dart_out $temp_dir_2/pigeon.dart & |
| non_null_safe_gen_pid=$! |
| |
| wait $null_safe_gen_pid |
| wait $non_null_safe_gen_pid |
| |
| # `./e2e_tests/test_objc/.packages` is used to get access to Flutter since |
| # Pigeon doesn't depend on Flutter. |
| dartanalyzer $temp_dir_1/pigeon.dart --fatal-infos --fatal-warnings --packages ./e2e_tests/test_objc/.packages & |
| null_safe_analyze_pid=$! |
| dartanalyzer $temp_dir_2/pigeon.dart --fatal-infos --fatal-warnings --packages ./e2e_tests/test_objc/.packages & |
| non_null_safe_analyze_pid=$! |
| |
| wait $null_safe_analyze_pid |
| wait $non_null_safe_analyze_pid |
| |
| rm -rf $temp_dir_1 |
| rm -rf $temp_dir_2 |
| } |
| |
| print_usage() { |
| echo "usage: ./run_tests.sh [-l] [-t test_name] |
| |
| flags: |
| -t test_name: Run only specified test. |
| -l : List available tests. |
| " |
| } |
| |
| ############################################################################### |
| # Stages |
| ############################################################################### |
| get_java_linter_formatter() { |
| if [ ! -f "ci/$java_linter" ]; then |
| curl -L https://github.com/checkstyle/checkstyle/releases/download/checkstyle-8.41/$java_linter >"ci/$java_linter" |
| fi |
| if [ ! -f "ci/$java_formatter" ]; then |
| curl -L https://github.com/google/google-java-format/releases/download/google-java-format-1.3/$java_formatter >"ci/$java_formatter" |
| fi |
| if [ ! -f "ci/$google_checks" ]; then |
| curl -L https://raw.githubusercontent.com/checkstyle/checkstyle/$google_checks_version/src/main/resources/$google_checks >"ci/$google_checks" |
| fi |
| if [ ! -f "ci/$java_error_prone" ]; then |
| curl https://repo1.maven.org/maven2/com/google/errorprone/error_prone_core/2.5.1/$java_error_prone >"ci/$java_error_prone" |
| fi |
| if [ ! -f "ci/$dataflow_shaded" ]; then |
| curl https://repo1.maven.org/maven2/org/checkerframework/dataflow-shaded/3.7.1/$dataflow_shaded >"ci/$dataflow_shaded" |
| fi |
| if [ ! -f "ci/$jformat_string" ]; then |
| curl https://repo1.maven.org/maven2/com/google/code/findbugs/jFormatString/3.0.0/$jformat_string >"ci/$jformat_string" |
| fi |
| if [ ! -f "ci/$javac_jar" ]; then |
| curl https://repo1.maven.org/maven2/com/google/errorprone/javac/9+181-r4173-1/$javac_jar >"ci/$javac_jar" |
| fi |
| } |
| |
| run_dart_unittests() { |
| dart analyze bin |
| dart analyze lib |
| dart test |
| } |
| |
| test_running_without_arguments() { |
| pub run pigeon 1>/dev/null |
| } |
| |
| run_flutter_unittests() { |
| pushd $PWD |
| pub run pigeon \ |
| --input pigeons/flutter_unittests.dart \ |
| --dart_out platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart |
| cd platform_tests/flutter_null_safe_unit_tests |
| flutter pub get |
| flutter test test/null_safe_test.dart |
| popd |
| } |
| |
| run_mock_handler_tests() { |
| pushd $PWD |
| pub run pigeon \ |
| --input pigeons/message.dart \ |
| --dart_out mock_handler_tester/test/message.dart \ |
| --dart_test_out mock_handler_tester/test/test.dart |
| dartfmt -w mock_handler_tester/test/message.dart |
| dartfmt -w mock_handler_tester/test/test.dart |
| cd mock_handler_tester |
| flutter test |
| popd |
| } |
| |
| run_dart_compilation_tests() { |
| # Make sure the artifacts are present. |
| flutter precache |
| # Make sure flutter dependencies are available. |
| pushd $PWD |
| cd e2e_tests/test_objc/ |
| flutter pub get |
| popd |
| test_pigeon_dart ./pigeons/all_datatypes.dart |
| test_pigeon_dart ./pigeons/async_handlers.dart |
| test_pigeon_dart ./pigeons/host2flutter.dart |
| test_pigeon_dart ./pigeons/list.dart |
| test_pigeon_dart ./pigeons/message.dart |
| test_pigeon_dart ./pigeons/void_arg_flutter.dart |
| test_pigeon_dart ./pigeons/void_arg_host.dart |
| test_pigeon_dart ./pigeons/voidflutter.dart |
| test_pigeon_dart ./pigeons/voidhost.dart |
| } |
| |
| run_java_compilation_tests() { |
| # Make sure the artifacts are present. |
| flutter precache |
| # Make sure flutter dependencies are available. |
| pushd $PWD |
| # We use e2e_tests/test_objc in order to get access to Flutter. |
| cd e2e_tests/test_objc/ |
| flutter pub get |
| popd |
| test_pigeon_android ./pigeons/all_datatypes.dart |
| test_pigeon_android ./pigeons/async_handlers.dart |
| test_pigeon_android ./pigeons/host2flutter.dart |
| test_pigeon_android ./pigeons/java_double_host_api.dart |
| test_pigeon_android ./pigeons/list.dart |
| test_pigeon_android ./pigeons/message.dart |
| test_pigeon_android ./pigeons/void_arg_flutter.dart |
| test_pigeon_android ./pigeons/void_arg_host.dart |
| test_pigeon_android ./pigeons/voidflutter.dart |
| test_pigeon_android ./pigeons/voidhost.dart |
| } |
| |
| run_objc_compilation_tests() { |
| # Make sure the artifacts are present. |
| flutter precache |
| |
| test_pigeon_ios ./pigeons/all_datatypes.dart |
| test_pigeon_ios ./pigeons/async_handlers.dart |
| test_pigeon_ios ./pigeons/host2flutter.dart |
| test_pigeon_ios ./pigeons/list.dart |
| test_pigeon_ios ./pigeons/message.dart |
| test_pigeon_ios ./pigeons/void_arg_flutter.dart |
| test_pigeon_ios ./pigeons/void_arg_host.dart |
| test_pigeon_ios ./pigeons/voidflutter.dart |
| test_pigeon_ios ./pigeons/voidhost.dart |
| } |
| |
| run_ios_unittests() { |
| pub run pigeon \ |
| --no-dart_null_safety \ |
| --input pigeons/message.dart \ |
| --dart_out /dev/null \ |
| --objc_header_out platform_tests/ios_unit_tests/ios/Runner/messages.h \ |
| --objc_source_out platform_tests/ios_unit_tests/ios/Runner/messages.m |
| pub run pigeon \ |
| --no-dart_null_safety \ |
| --input pigeons/async_handlers.dart \ |
| --dart_out /dev/null \ |
| --objc_header_out platform_tests/ios_unit_tests/ios/Runner/async_handlers.h \ |
| --objc_source_out platform_tests/ios_unit_tests/ios/Runner/async_handlers.m |
| clang-format -i platform_tests/ios_unit_tests/ios/Runner/messages.h |
| clang-format -i platform_tests/ios_unit_tests/ios/Runner/messages.m |
| clang-format -i platform_tests/ios_unit_tests/ios/Runner/async_handlers.h |
| clang-format -i platform_tests/ios_unit_tests/ios/Runner/async_handlers.m |
| pushd $PWD |
| cd platform_tests/ios_unit_tests |
| flutter build ios --simulator |
| cd ios |
| xcodebuild \ |
| -workspace Runner.xcworkspace \ |
| -scheme RunnerTests \ |
| -sdk iphonesimulator \ |
| -destination 'platform=iOS Simulator,name=iPhone 8' \ |
| test |
| popd |
| } |
| |
| run_ios_e2e_tests() { |
| DARTLE_H="e2e_tests/test_objc/ios/Runner/dartle.h" |
| DARTLE_M="e2e_tests/test_objc/ios/Runner/dartle.m" |
| DARTLE_DART="e2e_tests/test_objc/lib/dartle.dart" |
| PIGEON_JAVA="e2e_tests/test_objc/android/app/src/main/java/io/flutter/plugins/Pigeon.java" |
| pub run pigeon \ |
| --input pigeons/message.dart \ |
| --dart_out $DARTLE_DART \ |
| --objc_header_out $DARTLE_H \ |
| --objc_source_out $DARTLE_M \ |
| --java_out $PIGEON_JAVA |
| dartfmt -w $DARTLE_DART |
| |
| pushd $PWD |
| cd e2e_tests/test_objc |
| flutter build ios -t test_driver/e2e_test.dart --simulator |
| cd ios |
| xcodebuild \ |
| -workspace Runner.xcworkspace \ |
| -scheme RunnerTests \ |
| -sdk iphonesimulator \ |
| -destination 'platform=iOS Simulator,name=iPhone 8' \ |
| test |
| popd |
| } |
| |
| run_formatter() { |
| cd ../.. |
| pub global activate flutter_plugin_tools && pub global run flutter_plugin_tools format 2>/dev/null |
| } |
| |
| run_android_unittests() { |
| pushd $PWD |
| pub run pigeon \ |
| --input pigeons/android_unittests.dart \ |
| --dart_out /dev/null \ |
| --java_out platform_tests/android_unit_tests/android/app/src/main/java/com/example/android_unit_tests/Pigeon.java \ |
| --java_package "com.example.android_unit_tests" |
| |
| cd platform_tests/android_unit_tests |
| if [ ! -f "android/gradlew" ]; then |
| flutter build apk --debug |
| fi |
| cd android |
| ./gradlew test |
| popd |
| } |
| |
| ############################################################################### |
| # main |
| ############################################################################### |
| should_run_android_unittests=true |
| should_run_dart_compilation_tests=true |
| should_run_dart_unittests=true |
| should_run_flutter_unittests=true |
| should_run_formatter=true |
| should_run_ios_e2e_tests=true |
| should_run_ios_unittests=true |
| should_run_java_compilation_tests=true |
| should_run_mock_handler_tests=true |
| should_run_objc_compilation_tests=true |
| while getopts "t:l?h" opt; do |
| case $opt in |
| t) |
| should_run_android_unittests=false |
| should_run_dart_compilation_tests=false |
| should_run_dart_unittests=false |
| should_run_flutter_unittests=false |
| should_run_formatter=false |
| should_run_ios_e2e_tests=false |
| should_run_ios_unittests=false |
| should_run_java_compilation_tests=false |
| should_run_mock_handler_tests=false |
| should_run_objc_compilation_tests=false |
| case $OPTARG in |
| android_unittests) should_run_android_unittests=true ;; |
| dart_compilation_tests) should_run_dart_compilation_tests=true ;; |
| dart_unittests) should_run_dart_unittests=true ;; |
| flutter_unittests) should_run_flutter_unittests=true ;; |
| ios_e2e_tests) should_run_ios_e2e_tests=true ;; |
| ios_unittests) should_run_ios_unittests=true ;; |
| java_compilation_tests) should_run_java_compilation_tests=true ;; |
| mock_handler_tests) should_run_mock_handler_tests=true ;; |
| objc_compilation_tests) should_run_objc_compilation_tests=true ;; |
| *) |
| echo "unrecognized test: $OPTARG" |
| exit 1 |
| ;; |
| esac |
| ;; |
| l) |
| echo "available tests for -t: |
| android_unittests - Unit tests on generated Java code. |
| dart_compilation_tests - Compilation tests on generated Dart code. |
| dart_unittests - Unit tests on and analysis on Pigeon's implementation. |
| flutter_unittests - Unit tests on generated Dart code. |
| ios_e2e_tests - End-to-end objc tests run on iOS Simulator |
| ios_unittests - Unit tests on generated Objc code. |
| java_compilation_tests - Compilation tests on generated Java code. |
| mock_handler_tests - Unit tests on generated Dart mock handler code. |
| objc_compilation_tests - Compilation tests on generated Objc code. |
| " |
| exit 1 |
| ;; |
| \h) |
| print_usage |
| exit 1 |
| ;; |
| \?) |
| print_usage |
| exit 1 |
| ;; |
| ?) |
| print_usage |
| exit 1 |
| ;; |
| esac |
| done |
| |
| if [ "$should_run_java_compilation_tests" = true ]; then |
| get_java_linter_formatter |
| fi |
| pub get |
| test_running_without_arguments |
| if [ "$should_run_dart_unittests" = true ]; then |
| run_dart_unittests |
| fi |
| if [ "$should_run_flutter_unittests" = true ]; then |
| run_flutter_unittests |
| fi |
| if [ "$should_run_mock_handler_tests" = true ]; then |
| run_mock_handler_tests |
| fi |
| if [ "$should_run_dart_compilation_tests" = true ]; then |
| run_dart_compilation_tests |
| fi |
| if [ "$should_run_java_compilation_tests" = true ]; then |
| run_java_compilation_tests |
| fi |
| if [ "$should_run_objc_compilation_tests" = true ]; then |
| run_objc_compilation_tests |
| fi |
| if [ "$should_run_ios_unittests" = true ]; then |
| run_ios_unittests |
| fi |
| if [ "$should_run_ios_e2e_tests" = true ]; then |
| run_ios_e2e_tests |
| fi |
| if [ "$should_run_android_unittests" = true ]; then |
| run_android_unittests |
| fi |
| if [ "$should_run_formatter" = true ]; then |
| run_formatter |
| fi |