| #!/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_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/tests" >/dev/null 2>&1 && pwd)" |
| declare -r test_framework_dir="${test_dir}/lib" |
| |
| usage() { |
| fx-command-help |
| echo |
| echo "Available test scripts:" |
| for script_name in $(all_tests); do |
| echo " ${script_name}" |
| done |
| } |
| |
| all_tests() { |
| local subdirectory |
| if [[ $# -gt 0 ]]; then |
| subdirectory="/$1" |
| fi |
| local tests=() |
| for t in $(find "${test_dir}${subdirectory}" -type f -not -path "${test_framework_dir}" -name "*_test"); do |
| if [[ ! -f "${t}" || "${t}" != *${test_dir}/* ]]; then |
| fx-error "Test file '${t}' doesn't exist, make sure test files and subdirectories don't contain spaces" |
| exit 1 |
| fi |
| tests+=( "${t#${test_dir}/}" ) |
| done |
| echo "${tests[@]}" |
| } |
| |
| launch_script() { |
| local test_script_name="$1" |
| shift |
| declare -r test_script_path="${test_dir}/${test_script_name}" |
| |
| 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="$(all_tests)" |
| else |
| tests_arr=() |
| while [[ $# -gt 0 && "$1" != "--"* ]]; do |
| if [[ "$1" == *_test ]]; then |
| tests_arr+=( "$1" ) |
| elif [[ -d "${test_dir}/$1" ]]; then |
| tests_arr+=( $(all_tests "$1") ) |
| else |
| fx-error "Invalid option $1" |
| usage |
| exit 1 |
| fi |
| 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 |