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