| #!/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. | |
| ### Test expected behavior of fx test | |
| BT_FILE_DEPS=( | |
| "scripts/fx" | |
| "tools/devshell/lib/fx-cmd-locator.sh" | |
| "tools/devshell/lib/fx-optional-features.sh" | |
| "tools/devshell/lib/host_symbolizer.sh" | |
| "tools/devshell/lib/metrics.sh" | |
| "tools/devshell/lib/generate-ssh-config.sh" | |
| "tools/devshell/lib/vars.sh" | |
| "tools/devshell/lib/is_invoked_by_agent.sh" | |
| "tools/devshell/lib/agents.txt" | |
| "tools/devshell/lib/platform.sh" | |
| "tools/devshell/test" | |
| "tools/devshell/host-tool" | |
| ) | |
| BT_MOCKED_TOOLS=( | |
| "tools/devshell/host-tool" | |
| ) | |
| declare fx host_tool_state | |
| BT_SET_UP() { | |
| source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh" | |
| fx="$(btf::setup_fx 1)" | |
| host_tool_state="${BT_TEMP_DIR}/host_tool_calls" | |
| rm -f "${host_tool_state}" | |
| local mock_host_tool="${BT_TEMP_DIR}/tools/devshell/host-tool" | |
| cat > "${mock_host_tool}.mock_side_effects" <<'MOCK_EOF' | |
| echo "$*" >> "${BT_TEMP_DIR}/host_tool_calls" | |
| if [[ "$1" == "--print" ]]; then | |
| echo "/bin/true" | |
| exit 0 | |
| fi | |
| if [[ "$1" == "test" ]]; then | |
| if [[ -f "${BT_TEMP_DIR}/mock_abort_code" ]]; then | |
| code=$(cat "${BT_TEMP_DIR}/mock_abort_code") | |
| exit "${code}" | |
| fi | |
| for arg in "$@"; do | |
| if [[ "$arg" == "stats-analytics" ]]; then | |
| echo '{"t":1000000,"a":0,"ab":null,"top":[],"sum":{}}' | |
| exit 0 | |
| fi | |
| done | |
| save_ptr="" | |
| has_log=true | |
| prev="" | |
| for a in "$@"; do | |
| if [[ "$prev" == "--save-log-path-to-file" ]]; then | |
| save_ptr="$a" | |
| elif [[ "$a" =~ ^--save-log-path-to-file= ]]; then | |
| save_ptr="${a#--save-log-path-to-file=}" | |
| elif [[ "$a" == "--no-log" || "$a" == "--json" || "$a" == "--logpath=-" || ( "$a" == "-" && "$prev" == "--logpath" ) ]]; then | |
| has_log=false | |
| fi | |
| prev="$a" | |
| done | |
| if [[ -n "$save_ptr" && "$has_log" == true ]]; then | |
| mock_log="${BT_TEMP_DIR}/mock_test.log.json.gz" | |
| touch "$mock_log" | |
| echo "$mock_log" > "$save_ptr" | |
| fi | |
| exit 0 | |
| fi | |
| MOCK_EOF | |
| } | |
| # Verify all user arguments ($@) are passed intact to host-tool test | |
| TEST_user_args_passed_intact() { | |
| BT_EXPECT ${fx} test --test-filter my_filter pkg_name -- --custom_test_arg | |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "$(< "${host_tool_state}")" "--test-filter my_filter pkg_name -- --custom_test_arg" | |
| } | |
| # Verify --save-log-path-to-file is passed and cleaned up | |
| TEST_save_log_path_to_file_passed() { | |
| BT_EXPECT ${fx} test my_test | |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "$(< "${host_tool_state}")" "--save-log-path-to-file " | |
| local ptr_file | |
| ptr_file=$(sed -n 's/.*--save-log-path-to-file \([^ ]*\).*/\1/p' "${host_tool_state}" | head -n 1) | |
| [[ "${ptr_file}" =~ ^.*\.fxtest_logpath\.[A-Za-z0-9]+$ ]] | |
| BT_EXPECT_GOOD_STATUS $? | |
| # Pointer file should be cleaned up after execution | |
| [[ ! -f "${ptr_file}" ]] | |
| BT_EXPECT_GOOD_STATUS $? | |
| } | |
| # Verify user custom flags are passed intact without interference | |
| TEST_custom_flags_passed_intact() { | |
| local custom_path="${BT_TEMP_DIR}/custom.log.gz" | |
| BT_EXPECT ${fx} test --logpath "${custom_path}" --no-log my_test | |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "$(< "${host_tool_state}")" "--logpath ${custom_path} --no-log my_test" | |
| } | |
| # Verify fast path for non-test commands (help, info, dry, prev) | |
| TEST_fast_path_non_test() { | |
| for flag in "--help" "-h" "--info" "--dry" "-pr" "--prev"; do | |
| rm -f "${host_tool_state}" | |
| BT_EXPECT ${fx} test ${flag} | |
| [[ "$(< "${host_tool_state}")" != *"--print symbolizer"* ]] | |
| BT_EXPECT_GOOD_STATUS $? | |
| [[ "$(< "${host_tool_state}")" != *"--save-log-path-to-file"* ]] | |
| BT_EXPECT_GOOD_STATUS $? | |
| done | |
| } | |
| # Verify exit code propagation on simulated abort (exit 130) | |
| TEST_aborted_exit_code_propagation() { | |
| echo 130 > "${BT_TEMP_DIR}/mock_abort_code" | |
| BT_EXPECT_FAIL ${fx} test my_test | |
| rm -f "${BT_TEMP_DIR}/mock_abort_code" | |
| } | |
| BT_RUN_TESTS "$@" |