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