#!/bin/bash
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Other
### run tests of fx and subcommands

## Usage:
##     fx self-test --all
##         Run all tests from all test scripts.
##
##     fx self-test TEST_SCRIPT|TEST_DIR [TEST_SCRIPT|TEST_DIR ...]
##         Run all tests from the specified test script(s) or in the
##         test scripts in the specified test subdirectory(ies), recursively.
##
##            TEST_SCRIPT  Name of a test script file containing tests.
##                         Test script filenames end with "_test" and are
##                         relative to //tools/devshell/tests.
##                         See the existing test scripts below.
##
##            TEST_DIR     A subdirectory of //tools/devshell/tests.
##
##     fx self-test TEST_SCRIPT [--test TEST_NAME] [--help]
##         Executes a single test script.
##            --test TEST_NAME   Only run the specified test
##            --help             List the tests and test options  in the test script
##
##
## Examples:
##    fx self-test --all   # run all tests from all tests scripts
##    fx self-test subcommands    # run all tests scripts in //tools/devshell/tests/subcommands
##    fx self-test subcommands/fx_set_test   # run all tests in //tools/devshell/tests/subcommands/fx_set_test
##    fx self-test fx-internal/fx_test   # run all tests in //tools/devshell/tests/fx-internal/fx_test
##    fx self-test fx-internal/fx_test --test TEST_fx-subcommand-run   # run a single test from fx-internal/fx_test

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh \
    || exit $?

declare -r test_framework_dir="${FUCHSIA_DIR}/tools/devshell/tests/lib"



usage() {
  fx-command-help
  echo
  echo "Available test scripts:"
  for script_name in $(list_tests); do
    echo "  //${script_name#${FUCHSIA_DIR}/}"
  done
}

# //<dir>
# //<file>
#if dir exists, use it. If file exists, use it
#otherwise, prefix with tools/devshell/tests and test again
# ./<dir>
# ./<file>
# <dir_or_file_inside_tools/devshell/tests/...>
list_tests() {
  local file=$1
  # expand // to FUCHSIA_DIR:
  if [[ "$file" =~ ^// ]]; then
    file="${FUCHSIA_DIR}/${file#\//}"
  fi
  if [[ -f "$file" && "$file" =~ _test$ ]]; then
    echo "$file"
  else
    file="/${file}"
    list_tests_in_dir "${FUCHSIA_DIR}/tools/devshell/tests${file}"
    list_tests_in_dir "${FUCHSIA_DIR}"/vendor/*/scripts/devshell/tests"${file}"
  fi
}

list_tests_in_dir() {
  local d="$1"
  if [[ -d "$d" ]]; then
    find "$d" -type f -path "*/devshell/*" -not -path "*/lib/*" -not -path "*/data/*" -name "*_test"
  elif [[ -f "$d" ]]; then
    echo "$d"
  fi
}

launch_script() {
  declare -r test_script_path="$1"
  shift

  if [[ ! -f "${test_script_path}" ]]; then
    fx-error "Test script '${test_script_path}' not found. Aborting."
    return 1
  fi
  # propagate certain bash flags if present
  local shell_flags=()
  if [[ $- == *x* ]]; then
    shell_flags+=( -x )
  fi

  # Start a clean environment, load the bash_test_framework.sh,
  # then start the test script.
  local -r launch_script="$(cat << EOF
source "${test_framework_dir}/bash_test_framework.sh" || exit \$?
source "${test_script_path}" || exit \$?
EOF
)"

  /usr/bin/env -i \
      USER="${USER}" \
      HOME="${HOME}" \
      bash "${shell_flags[@]}" \
      -c "${launch_script}" "${test_script_path}" "$@"
}


if [[ $# -eq 0 || "$1" == "--help" ]]; then
  usage
  exit 0
fi

all=0
test_args=()
if [[ "$1" == "--all" ]]; then
  tests="$(list_tests)"
else
  tests_arr=()
  while [[ $# -gt 0 && "$1" != "--"* ]]; do
    arg="$1"


    expanded_tests=( $(list_tests "$arg") )
    if [[ "${#expanded_tests[@]}" -eq 0 ]]; then
      fx-error "Invalid test name or directory '$arg'"
      usage
      exit 1
    fi

    tests_arr+=( "${expanded_tests[@]}" )
    shift
  done
  tests="${tests_arr[@]}"
  if [[ $# -gt 0 && "$1" == "--"* ]]; then
    test_args+=( "$@" )
  fi
fi

for script_name in ${tests}; do
  echo "Running test script ${script_name}"
  launch_script "${script_name}" "${test_args[@]}"
done
