diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart index 95f92f4dc2..41c1dcbf23 100644 --- a/packages/pigeon/lib/dart_generator.dart +++ b/packages/pigeon/lib/dart_generator.dart @@ -137,8 +137,8 @@ void _writeFlutterApi( final String emptyReturnStatement = isMockHandler ? 'return {};' : func.returnType == 'void' - ? 'return;' - : 'return null;'; + ? 'return;' + : 'return null;'; String call; if (argType == 'void') { indent.writeln('// ignore message'); diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index d99e2e425f..bc6ce58caf 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -1,3 +1,4 @@ +#!/bin/bash ############################################################################### # run_tests.sh # @@ -6,22 +7,7 @@ ############################################################################### # exit when any command fails -set -ex - -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 +set -e # TODO(blasten): Enable on stable when possible. # https://github.com/flutter/flutter/issues/75187 @@ -36,8 +22,23 @@ 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 + ############################################################################### -# Functions +# Helper Functions ############################################################################### # Create a temporary directory in a way that works on both Linux and macOS. @@ -49,9 +50,10 @@ mktmpdir() { # test_pigeon_ios() # -# Compiles the pigeon file to a temp directory and attempts to compile the code -# and runs the dart analyzer on the generated dart code. +# 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 \ @@ -76,8 +78,10 @@ test_pigeon_ios() { # test_pigeon_android() # -# Compiles the pigeon file to a temp directory and attempts to compile the code. +# 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 \ @@ -86,12 +90,12 @@ test_pigeon_android() { --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" + 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 \ + $javac_bootclasspath \ -XDcompilePolicy=simple \ - -processorpath "ci/$JAVA_ERROR_PRONE:ci/$DATAFLOW_SHADED:ci/$JFORMAT_STRING" \ + -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 @@ -99,182 +103,327 @@ test_pigeon_android() { exit 1 fi - dartfmt -w $temp_dir/pigeon.dart - dartanalyzer $temp_dir/pigeon.dart --fatal-infos --fatal-warnings --packages ./e2e_tests/test_objc/.packages - rm -rf $temp_dir } # test_null_safe_dart() # # Compiles the pigeon file to a temp directory and attempts to run the dart -# analyzer on it with null safety turned on. -test_null_safe_dart() { - temp_dir=$(mktmpdir) +# 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/pigeon.dart + --dart_out $temp_dir_1/pigeon.dart & + null_safe_gen_pid=$! - dartanalyzer $temp_dir/pigeon.dart --fatal-infos --fatal-warnings --packages ./e2e_tests/test_objc/.packages - rm -rf $temp_dir + 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. +" } ############################################################################### -# Get java linter / formatter +# Stages ############################################################################### -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 +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 +} -############################################################################### -# Dart analysis and unit tests -############################################################################### -pub get -dart analyze bin -dart analyze lib -dart test +test_running_without_arguments() { + pub run pigeon 1>/dev/null +} -############################################################################### -# Execute without arguments test -############################################################################### -pub run pigeon 1> /dev/null - -############################################################################### -# Run unit tests on generated Dart code. -############################################################################### -pushd $PWD -pub run pigeon \ +run_flutter_unittests() { + pushd $PWD + pub run pigeon \ --input pigeons/message.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 + cd platform_tests/flutter_null_safe_unit_tests + flutter pub get + flutter test test/null_safe_test.dart + popd +} -############################################################################### -# Mock handler flutter 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_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 +} -############################################################################### -# Compilation tests (Code is generated and compiled) -############################################################################### -# 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_ios ./pigeons/async_handlers.dart -test_null_safe_dart ./pigeons/message.dart -test_pigeon_android ./pigeons/voidflutter.dart -test_pigeon_android ./pigeons/voidhost.dart -test_pigeon_android ./pigeons/host2flutter.dart -test_pigeon_android ./pigeons/message.dart -test_pigeon_android ./pigeons/void_arg_host.dart -test_pigeon_android ./pigeons/void_arg_flutter.dart -test_pigeon_android ./pigeons/list.dart -test_pigeon_android ./pigeons/all_datatypes.dart -test_pigeon_android ./pigeons/async_handlers.dart -test_pigeon_ios ./pigeons/message.dart -test_pigeon_ios ./pigeons/host2flutter.dart -test_pigeon_ios ./pigeons/voidhost.dart -test_pigeon_ios ./pigeons/voidflutter.dart -test_pigeon_ios ./pigeons/void_arg_host.dart -test_pigeon_ios ./pigeons/void_arg_flutter.dart -test_pigeon_ios ./pigeons/list.dart -test_pigeon_ios ./pigeons/all_datatypes.dart +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 +} -############################################################################### -# iOS unit tests on generated code. -############################################################################### -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 \ +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/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 + 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 +} ############################################################################### -# End-to-end (e2e) integration tests. +# main ############################################################################### -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 +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_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 + 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: + 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 -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 the formatter on generated code. -############################################################################### -cd ../.. -pub global activate flutter_plugin_tools && pub global run flutter_plugin_tools format +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_formatter" = true ]; then + run_formatter +fi