blob: 20bb2dbf549b5f67173366875e0e1c7d52ee6807 [file] [log] [blame]
#!/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
###############################################################################
# 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
run_pigeon="dart bin/pigeon.dart.dill --copyright_header ./copyright_header.txt"
###############################################################################
# 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_android(<path to pigeon file>)
#
# Compiles the pigeon file to a temp directory and attempts to compile the java
# code.
# TODO(stuartmorgan): Remove this in favor of unit testing all files, which
# already includes compilation.
test_pigeon_android() {
echo "test_pigeon_android($1)"
temp_dir=$(mktmpdir)
$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.
# TODO(stuartmorgan): Remove this in favor of analyzing test_plugin.
test_pigeon_dart() {
echo "test_pigeon_dart($1, $2)"
local flutter_project_dir=$2
$run_pigeon \
--input $1 \
--dart_out $flutter_project_dir/lib/pigeon.dart
dart analyze $flutter_project_dir/lib/pigeon.dart --fatal-infos --fatal-warnings
rm $flutter_project_dir/lib/pigeon.dart
}
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 run tool/run_tests.dart -t dart_unittests --skip-generation
}
test_command_line() {
# Test with no arguments.
$run_pigeon 1>/dev/null
# Test one_language flag. With this flag specified, java_out can be generated
# without dart_out.
$run_pigeon \
--input pigeons/message.dart \
--one_language \
--java_out stdout \
| grep "public class Message">/dev/null
# Test dartOut in ConfigurePigeon overrides output.
$run_pigeon --input pigeons/configure_pigeon_dart_out.dart 1>/dev/null
# Make sure AST generation exits correctly.
$run_pigeon --input pigeons/message.dart --one_language --ast_out /dev/null
}
run_flutter_unittests() {
dart run tool/run_tests.dart -t flutter_unittests --skip-generation
}
run_mock_handler_tests() {
dart run tool/run_tests.dart -t mock_handler_tests --skip-generation
}
run_ios_swift_unittests() {
dart run tool/run_tests.dart -t ios_swift_unittests --skip-generation
}
run_ios_swift_e2e_tests() {
dart run tool/run_tests.dart -t ios_swift_integration_tests --skip-generation
}
run_macos_swift_unittests() {
dart run tool/run_tests.dart -t macos_swift_unittests --skip-generation
}
run_macos_swift_e2e_tests() {
dart run tool/run_tests.dart -t macos_swift_integration_tests --skip-generation
}
run_android_kotlin_unittests() {
dart run tool/run_tests.dart -t android_kotlin_unittests --skip-generation
}
run_android_kotlin_e2e_tests() {
dart run tool/run_tests.dart -t android_kotlin_integration_tests --skip-generation
}
run_dart_compilation_tests() {
local temp_dir=$(mktmpdir)
local flutter_project_dir=$temp_dir/project
flutter create --platforms="android" $flutter_project_dir 1> /dev/null
test_pigeon_dart ./pigeons/async_handlers.dart $flutter_project_dir
test_pigeon_dart ./pigeons/core_tests.dart $flutter_project_dir
test_pigeon_dart ./pigeons/host2flutter.dart $flutter_project_dir
test_pigeon_dart ./pigeons/list.dart $flutter_project_dir
test_pigeon_dart ./pigeons/message.dart $flutter_project_dir
test_pigeon_dart ./pigeons/void_arg_flutter.dart $flutter_project_dir
test_pigeon_dart ./pigeons/void_arg_host.dart $flutter_project_dir
test_pigeon_dart ./pigeons/voidflutter.dart $flutter_project_dir
test_pigeon_dart ./pigeons/voidhost.dart $flutter_project_dir
rm -rf $temp_dir
}
run_ios_objc_unittests() {
dart run tool/run_tests.dart -t ios_objc_unittests --skip-generation
}
# TODO(stuartmorgan): Remove once run_ios_objc_unittests works in CI; see
# related TODOs below.
run_ios_legacy_unittests() {
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_objc_e2e_tests() {
dart run tool/run_tests.dart -t ios_objc_integration_tests --skip-generation
}
run_android_unittests() {
pushd $PWD
cd platform_tests/alternate_language_test_plugin/example
if [ ! -f "android/gradlew" ]; then
flutter build apk --debug
fi
cd android
./gradlew test
popd
}
run_android_java_e2e_tests() {
dart run tool/run_tests.dart -t android_java_integration_tests --skip-generation
}
###############################################################################
# main
###############################################################################
should_run_android_unittests=true
should_run_dart_compilation_tests=true
should_run_dart_unittests=true
should_run_flutter_unittests=true
# TODO(stuartmorgan): Enable by default once CI issues are solved; see
# https://github.com/flutter/packages/pull/2816.
should_run_ios_objc_e2e_tests=false
# TODO(stuartmorgan): Enable the new version by default and remove the legacy
# version once CI issues are solved; see
# https://github.com/flutter/packages/pull/2816.
should_run_ios_objc_unittests=false
should_run_ios_legacy_unittests=true
should_run_ios_swift_unittests=true
# Currently these are testing exactly the same thing as macos_swift_e2e_tests,
# so we don't need to run both by default. This should become `true` if any
# iOS-only tests are added (e.g., for a feature not supported by macOS).
should_run_ios_swift_e2e_tests=false
should_run_mock_handler_tests=true
should_run_macos_swift_unittests=true
should_run_macos_swift_e2e_tests=true
should_run_android_kotlin_unittests=true
# Default to false until there is CI support. See
# https://github.com/flutter/flutter/issues/111505
should_run_android_java_e2e_tests=false
should_run_android_kotlin_e2e_tests=false
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_ios_objc_unittests=false
should_run_ios_objc_e2e_tests=false
should_run_ios_legacy_unittests=false
should_run_ios_swift_unittests=false
should_run_ios_swift_e2e_tests=false
should_run_mock_handler_tests=false
should_run_macos_swift_unittests=false
should_run_macos_swift_e2e_tests=false
should_run_android_kotlin_unittests=false
should_run_android_java_e2e_tests=false
should_run_android_kotlin_e2e_tests=false
case $OPTARG in
# TODO(stuartmorgan): Rename to include "java".
android_unittests) should_run_android_unittests=true ;;
android_java_e2e_tests) should_run_android_java_e2e_tests=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_objc_e2e_tests) should_run_ios_objc_e2e_tests=true ;;
ios_objc_unittests) should_run_ios_objc_unittests=true ;;
ios_unittests) should_run_ios_legacy_unittests=true ;;
ios_swift_unittests) should_run_ios_swift_unittests=true ;;
ios_swift_e2e_tests) should_run_ios_swift_e2e_tests=true ;;
mock_handler_tests) should_run_mock_handler_tests=true ;;
macos_swift_unittests) should_run_macos_swift_unittests=true ;;
macos_swift_e2e_tests) should_run_macos_swift_e2e_tests=true ;;
android_kotlin_unittests) should_run_android_kotlin_unittests=true ;;
android_kotlin_e2e_tests) should_run_android_kotlin_e2e_tests=true ;;
*)
echo "unrecognized test: $OPTARG"
exit 1
;;
esac
;;
l)
echo "available tests for -t:
android_unittests - Unit tests on generated Java code.
android_java_e2e_tests - Integration tests on generated Java code on Android.
android_kotlin_unittests - Unit tests on generated Kotlin code on Android.
android_kotlin_e2e_tests - Integration tests on generated Kotlin code on Android.
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_objc_unittests - Unit tests on generated Obj-C code.
ios_unittests - Legacy unit tests on generated Obj-C code. Use ios_objc_unittests instead.
ios_objc_e2e_tests - Integration tests on generated Obj-C code.
ios_swift_unittests - Unit tests on generated Swift code.
ios_swift_e2e_tests - Integration tests on generated Swift code on iOS.
mock_handler_tests - Unit tests on generated Dart mock handler code.
macos_swift_unittests - Unit tests on generated Swift code on macOS.
macos_swift_e2e_tests - Integration tests on generated Swift code on macOS.
"
exit 1
;;
\h)
print_usage
exit 1
;;
\?)
print_usage
exit 1
;;
?)
print_usage
exit 1
;;
esac
done
##############################################################################
dart pub get
dart --snapshot-kind=kernel --snapshot=bin/pigeon.dart.dill bin/pigeon.dart
# Pre-generate platform_test output files, which most tests rely on existing.
dart run tool/generate.dart
if [ "$should_run_android_unittests" = true ]; then
get_java_linter_formatter
fi
test_command_line
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_ios_objc_unittests" = true ]; then
run_ios_objc_unittests
fi
if [ "$should_run_ios_legacy_unittests" = true ]; then
run_ios_legacy_unittests
fi
if [ "$should_run_ios_swift_unittests" = true ]; then
run_ios_swift_unittests
fi
if [ "$should_run_ios_swift_e2e_tests" = true ]; then
run_ios_swift_e2e_tests
fi
if [ "$should_run_ios_objc_e2e_tests" = true ]; then
run_ios_objc_e2e_tests
fi
if [ "$should_run_android_unittests" = true ]; then
run_android_unittests
fi
if [ "$should_run_android_java_e2e_tests" = true ]; then
run_android_java_e2e_tests
fi
if [ "$should_run_macos_swift_unittests" = true ]; then
run_macos_swift_unittests
fi
if [ "$should_run_macos_swift_e2e_tests" = true ]; then
run_macos_swift_e2e_tests
fi
if [ "$should_run_android_kotlin_unittests" = true ]; then
run_android_kotlin_unittests
fi
if [ "$should_run_android_kotlin_e2e_tests" = true ]; then
run_android_kotlin_e2e_tests
fi