blob: 467ffb0247e554178d2ed28f41255b18fb170f71 [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.
### Runs a Fuchsia integration test from shell/platform/fuchsia/flutter/tests/integration.
###
### Usage:
### $ENGINE_DIR/flutter/tools/fuchsia/devshell/run_integration_test <integration_test_folder_name>
###
### Arguments:
### --skip-fuchsia-build: Skips configuring and building Fuchsia for the test.
### --skip-fuchsia-emu: Skips starting the Fuchsia emulator for the test.
### --runtime-mode: The runtime mode to build Flutter in.
### Valid values: [debug, profile, release]
### Default value: debug
### --fuchsia-cpu: The architecture of the Fuchsia device to target.
### Valid values: [x64, arm64]
### Default value: x64
### --unoptimized: Disables C++ compiler optimizations.
### --goma: Speeds up builds. For Googlers only, sorry. :(
set -e # Fail on any error.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
ensure_fuchsia_dir
jiri_bin=$FUCHSIA_DIR/.jiri_root/bin
ensure_engine_dir
ensure_ninja
if [[ $# -lt 2 ]]
then
echo -e "Usage: $0 <integration_test_name>"
fi
# This script currently requires running `fx serve`.
if [[ -z "$(pgrep -f 'package-tool')" ]]
then
engine-error "This script currently requires running 'fx serve' first."
exit 1
fi
# The first argument is always assumed to be the integration test name.
test_name=$1
shift # past argument
# Ensure we know about the test and look up its packages.
# The first package listed here should be the main package for the test
# (the package that gets passed to `ffx test run`).
# Note: You do not need to include oot_flutter_jit_runner-0.far, the script
# automatically publishes it.
test_packages=
case $test_name in
embedder)
test_packages=("flutter-embedder-test-0.far" "parent-view.far" "child-view.far")
;;
text-input)
test_packages=("text-input-test-0.far" "text-input-view.far")
;;
touch-input)
test_packages=("touch-input-test-0.far" "touch-input-view.far" "embedding-flutter-view.far")
;;
mouse-input)
test_packages=("mouse-input-test-0.far" "mouse-input-view.far")
;;
*)
engine-error "Unknown test name $test_name. You may need to add it to $0"
exit 1
;;
esac
# Parse arguments.
skip_fuchsia_build=0
skip_fuchsia_emu=0
runtime_mode="debug"
compilation_mode="jit"
fuchsia_cpu="x64"
goma=0
goma_flags=""
ninja_cmd="ninja"
unoptimized_flags=""
unoptimized_suffix=""
extra_gn_args=()
while [[ $# -gt 0 ]]; do
case $1 in
--skip-fuchsia-build)
shift # past argument
skip_fuchsia_build=1
;;
--skip-fuchsia-emu|--skip-fuchsia-emulator)
shift # past argument
skip_fuchsia_emu=1
;;
--runtime-mode)
shift # past argument
runtime_mode="$1"
shift # past value
if [[ "${runtime_mode}" == debug ]]
then
compilation_mode="jit"
elif [[ "${runtime_mode}" == profile || "${runtime_mode}" == release ]]
then
compilation_mode="aot"
else
engine-error "Invalid value for --runtime_mode: ${runtime_mode}"
exit 1
fi
;;
--fuchsia-cpu)
shift # past argument
fuchsia_cpu="$1"
shift # past value
if [[ "${fuchsia_cpu}" != x64 && "${fuchsia_cpu}" != arm64 ]]
then
engine-error "Invalid value for --fuchsia-cpu: ${fuchsia_cpu}"
exit 1
fi
;;
--goma)
goma=1
goma_flags="--goma"
ninja_cmd="autoninja"
shift # past argument
;;
--unopt|--unoptimized)
unoptimized_flags="--unoptimized"
unoptimized_suffix="_unopt"
shift # past argument
;;
*)
extra_gn_args+=("$1") # forward argument
shift # past argument
;;
esac
done
headless_flags=
if [[ -z "$DISPLAY" ]]
then
engine-warning "You are running a Flutter integration test from a headless environment."
engine-warning "This may lead to bugs or the test failing."
engine-warning "You may want to switch to a graphical environment and try again, but the script will keep going."
headless_flags="--headless"
fi
all_gn_args="--fuchsia --fuchsia-cpu="${fuchsia_cpu}" --runtime-mode="${runtime_mode}" ${goma_flags} ${unoptimized_flags} ${extra_gn_args[@]}"
engine-info "Building Flutter test with GN args: ${all_gn_args}"
"$ENGINE_DIR"/flutter/tools/gn ${all_gn_args}
fuchsia_out_dir_name=fuchsia_${runtime_mode}${unoptimized_suffix}_${fuchsia_cpu}
fuchsia_out_dir="$ENGINE_DIR"/out/"${fuchsia_out_dir_name}"
engine-info "Building ${fuchsia_out_dir_name}..."
${ninja_cmd} -C "${fuchsia_out_dir}" flutter/shell/platform/fuchsia/flutter/tests/integration/$test_name:tests
engine-debug "Printing test package contents for debugging..."
far_tool="$ENGINE_DIR"/fuchsia/sdk/linux/tools/x64/far
for test_package in "${test_packages[@]}"
do
far_debug_dir=/tmp/"$test_name"_package_contents
"${far_tool}" extract --archive="$(find $fuchsia_out_dir -name "$test_package")" --output="${far_debug_dir}"
"${far_tool}" extract --archive="${far_debug_dir}"/meta.far --output="${far_debug_dir}"
engine-debug "... $test_package tree:"
tree "${far_debug_dir}"
engine-debug "... $test_package/meta/contents:"
cat "${far_debug_dir}"/meta/contents
rm -r "${far_debug_dir}"
done
# .jiri_root/bin/ffx needs to run from $FUCHSIA_DIR.
pushd $FUCHSIA_DIR
engine-info "Registering debug symbols..."
"$FUCHSIA_DIR"/.jiri_root/bin/ffx debug symbol-index add "${fuchsia_out_dir}"/.build-id --build-dir "${fuchsia_out_dir}"
if [[ "$skip_fuchsia_build" -eq 0 ]]
then
engine-info "Building Fuchsia in terminal.x64 mode... (to skip this, run with --skip-fuchsia-build)"
if [[ "$runtime_mode" -eq "debug" ]]
then
"$jiri_bin"/fx set terminal.x64
else
"$jiri_bin"/fx set terminal.x64 --release
fi
"$jiri_bin"/fx build
fi
test_package_paths=( "$fuchsia_out_dir"/oot_flutter_jit_runner-0.far )
for test_package in "${test_packages[@]}"
do
test_package_paths+=( $(find "$fuchsia_out_dir" -name "$test_package") )
done
fx_build_dir="$FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)"
if [[ "$skip_fuchsia_emu" -eq 0 ]]
then
engine-info "Starting the Fuchsia terminal.x64 emulator... (to skip this, run with --skip-fuchsia-emu)"
"$jiri_bin"/ffx emu stop fuchsia-emulator
"$jiri_bin"/ffx emu start "file://$fx_build_dir/*.json#terminal.x64" --net tap "${headless_flags}" --name fuchsia-emulator
fi
for test_package_path in "${test_package_paths[@]}"
do
engine-info "... Publishing $test_package_path to package repository ($fx_build_dir/amber-files)..."
"$jiri_bin"/ffx repository publish "$fx_build_dir/amber-files/" --package-archive "$test_package_path"
done
test_package_name_for_url="$(echo "${test_packages[0]}" | sed "s/\-0.far//")"
test_url="fuchsia-pkg://fuchsia.com/${test_package_name_for_url}/0#meta/${test_package_name_for_url}.cm"
engine-info "Running the test: $test_url"
"$jiri_bin"/ffx test run $test_url
popd # $FUCHSIA_DIR