#!/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 'pm serve')" ]]
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)
    # TODO(https://fxbug.dev/107917): Finish implementing and remove this warning.
    engine-warning "This test currently hangs because the Dart view hasn't been implemented yet. https://fxbug.dev/107917"
    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"/fx pm publish -a -repo "$fx_build_dir/amber-files/" -f "$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
