| #!/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 |