#!/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 $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/style.sh \
    || exit $?

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



usage() {
  fx-command-help
  echo
  echo "Available test scripts:"
  local has_not_in_cq=false
  for script_name in $(list_tests | sort); do
    local simple="${script_name#${FUCHSIA_DIR}/}"
    echo -n "  //${simple}"
    if ! is_in_buildgn "$simple"; then
      echo "    $(style::echo --color red -n "(not in CQ)")"
      has_not_in_cq=true
    else
      echo
    fi
  done
  if $has_not_in_cq; then
    fx-warn "Some tests are not configured to run in CQ."
    fx-warn "If possible, add them to //tools/devshell/BUILD.gn or //vendor/*/scripts/devshell/BUILD.gn"
  fi
}

is_in_buildgn() {
  # for performance reasons, this method uses a regular expression
  # to look up in the corresponding BUILD.gn file. The exact search would
  # require a more extensive GN walk and some assumptions about infra
  # setup. The current heuristics is sufficiently stable as long as the
  # corresponding BUILD.gn files keep the same structure.
  local n="$1"
  local buildgn="tools/devshell/BUILD.gn"
  if [[ "$1" =~ ^vendor/(.*)/scripts/devshell/tests ]]; then
    v="${BASH_REMATCH[1]}"
    buildgn="vendor/${v}/scripts/devshell/BUILD.gn"
  fi
  local p="$(dirname "$buildgn")"
  n="${n#$p/}"
  grep -q "^\\s*\"$n\"" $buildgn
}

# //<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() {
  # the old 'find' tool in MacOS does not handle trailing slashs correctly.
  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
