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