#!/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 the Fuchsia unit tests in the debug configuration.
###
### Arguments:
###   --package-filter: Only runs tests in packages that match the given `find` statement.
###   --gtest-filter: In the packages, only runs tests that match the given filter.
###                   For example: --gtest-filter "*FlatlandConnection*" to run any tests
###                   that have the phrase FlatlandConnection in them.
###   --unoptimized: Disables C++ compiler optimizations.
###   --count: Number of times to run the test. By default runs 1 time.
###            See `ffx test run --count`.
###   --goma: Speeds up builds for Googlers. 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
ensure_engine_dir
ensure_ninja

# Parse arguments.
runtime_mode="debug"
compilation_mode="jit"
fuchsia_cpu="x64"
goma=0
goma_flags=""
ninja_cmd="ninja"
package_filter="*tests-0.far"
test_filter_flags=""
unoptimized_flags=""
unoptimized_suffix=""
count_flags=""
while [[ $# -gt 0 ]]; do
  case $1 in
    --package_filter|--package-filter)
      shift # past argument
      package_filter="$1"
      shift # past value
      ;;
    --count)
      shift # past argument
      count_flags="--count $1"
      shift # past value
      ;;
    --goma)
      goma=1
      goma_flags="--goma"
      ninja_cmd="autoninja"
      shift # past argument
      ;;
    --unopt|--unoptimized)
      unoptimized_flags="--unoptimized"
      unoptimized_suffix="_unopt"
      shift # past argument
      ;;
    --gtest_filter|--gtest-filter)
      shift # past argument
      test_filter_flags="-- --gtest_filter=$1"
      shift # past value
      ;;
    *)
      engine-error "Unknown argument: $1"
      exit 1
      ;;
  esac
done

all_gn_args="--fuchsia --no-lto --fuchsia-cpu="${fuchsia_cpu}" --runtime-mode="${runtime_mode}" ${goma_flags} ${unoptimized_flags}"
engine-info "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}" fuchsia_tests

engine-info "Registering debug symbols..."
# .jiri_root/bin/ffx needs to run from $FUCHSIA_DIR.
pushd $FUCHSIA_DIR
"$FUCHSIA_DIR"/.jiri_root/bin/ffx debug symbol-index add "${fuchsia_out_dir}"/.build-id --build-dir "${fuchsia_out_dir}"
popd  # $FUCHSIA_DIR

test_packages="$(find ${fuchsia_out_dir} -name "${package_filter}")"

engine-info "Publishing test packages..."
test_names=()
for test_package in $test_packages
do
  engine-info "... publishing ${test_package} ..."
  ${FUCHSIA_DIR}/.jiri_root/bin/ffx repository publish $FUCHSIA_DIR/$(cat $FUCHSIA_DIR/.fx-build-dir)/amber-files --package-archive "${test_package}"
  test_names+=("$(basename ${test_package} | sed -e "s/-0.far//")")
done

# .jiri_root/bin/ffx needs to run from $FUCHSIA_DIR.

pushd $FUCHSIA_DIR

# TODO(akbiggs): Match the behavior of this script more closely with test_suites.yaml.
engine-info "Running tests... (if this fails because of Launch(InstanceCannotResolve), run fx serve and try again)"
for test_name in "${test_names[@]}"
do
  # ParagraphTest.* fails in txt_tests.
  if [[ "${test_name}" == "txt_tests" ]]
  then
    engine-warning "Skipping txt_tests because I don't know how to filter out ParagraphTests.*"
    continue
  fi
  # ${test_filter_flags} must come last below because it includes " -- " to start program arguments.
  test_cmd="${FUCHSIA_DIR}/.jiri_root/bin/ffx test run fuchsia-pkg://fuchsia.com/${test_name}#meta/${test_name}.cm ${count_flags} ${test_filter_flags}"

  engine-info "... $test_cmd ..."
  $test_cmd
done

popd  # $FUCHSIA_DIR
