| #!/bin/bash | |
| # Copyright 2026 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 add-test' and 'fx add-host-test' | |
| BT_FILE_DEPS=( | |
| "scripts/fx" | |
| "tools/devshell/lib/vars.sh" | |
| "tools/devshell/lib/is_invoked_by_agent.sh" | |
| "tools/devshell/lib/agents.txt" | |
| "tools/devshell/lib/fx-cmd-locator.sh" | |
| "tools/devshell/lib/fx-optional-features.sh" | |
| "tools/devshell/lib/platform.sh" | |
| "tools/devshell/lib/generate-ssh-config.sh" | |
| "tools/devshell/contrib/add-test" | |
| "tools/devshell/contrib/add-host-test" | |
| ) | |
| BT_MOCKED_TOOLS=( | |
| "build/regenerator" | |
| ) | |
| declare fx | |
| BT_SET_UP() { | |
| source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh" | |
| fx="$(btf::setup_fx)" | |
| FUCHSIA_DIR="${BT_TEMP_DIR}" | |
| # Default mock regenerator to succeed | |
| cat > "${FUCHSIA_DIR}/build/regenerator.mock_side_effects" <<EOF | |
| exit 0 | |
| EOF | |
| } | |
| # Test that `fx add-test` appends to target_labels by default | |
| TEST_fx-add-test-default() { | |
| local args_gn="${FUCHSIA_DIR}/out/default/args.gn" | |
| echo "# initial args" > "${args_gn}" | |
| BT_EXPECT "${fx}" add-test //src/sys:foo //src/sys:bar | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'target_labels += \["//src/sys:foo"\]' | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'target_labels += \["//src/sys:bar"\]' | |
| } | |
| # Test that `fx add-test --target-list` specifies a custom target list | |
| TEST_fx-add-test-target-list-flag() { | |
| local args_gn="${FUCHSIA_DIR}/out/default/args.gn" | |
| echo "# initial args" > "${args_gn}" | |
| BT_EXPECT "${fx}" add-test --target-list host_labels //src/host:foo //src/host:bar | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'host_labels += \["//src/host:foo"\]' | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'host_labels += \["//src/host:bar"\]' | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "target_labels" | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "target-list" | |
| } | |
| # Test that `fx add-host-test` appends to host_labels | |
| TEST_fx-add-host-test() { | |
| local args_gn="${FUCHSIA_DIR}/out/default/args.gn" | |
| echo "# initial args" > "${args_gn}" | |
| BT_EXPECT "${fx}" add-host-test //src/host:test1 //src/host:test2 | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'host_labels += \["//src/host:test1"\]' | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'host_labels += \["//src/host:test2"\]' | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "target-list" | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "target_labels" | |
| } | |
| # Test that `fx add-test` ignores the --with argument | |
| TEST_fx-add-test-skips-with() { | |
| local args_gn="${FUCHSIA_DIR}/out/default/args.gn" | |
| echo "# initial args" > "${args_gn}" | |
| BT_EXPECT "${fx}" add-test --with //src/sys:foo | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" 'target_labels += \["//src/sys:foo"\]' | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "with" | |
| } | |
| # Helper to configure the mock regenerator to fail on its first run and succeed thereafter. | |
| setup_mock_regenerator_fail_once() { | |
| local marker="$1" | |
| rm -f "${FUCHSIA_DIR}/${marker}" | |
| cat > "${FUCHSIA_DIR}/build/regenerator.mock_side_effects" <<EOF | |
| if [[ -f "${FUCHSIA_DIR}/${marker}" ]]; then | |
| exit 0 | |
| else | |
| touch "${FUCHSIA_DIR}/${marker}" | |
| exit 1 | |
| fi | |
| EOF | |
| } | |
| # Test that `fx add-test` restores args.gn and exits with failure on gen failure | |
| TEST_fx-add-test-reverts-on-gen-failure() { | |
| local args_gn="${FUCHSIA_DIR}/out/default/args.gn" | |
| echo "# pristine args" > "${args_gn}" | |
| setup_mock_regenerator_fail_once ".add_test_failed_once" | |
| BT_EXPECT_FAIL "${fx}" add-test //invalid:target | |
| # args.gn should be restored to pristine state | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" "# pristine args" | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "//invalid:target" | |
| } | |
| # Test that `fx add-host-test` restores args.gn and exits with failure on gen failure | |
| TEST_fx-add-host-test-reverts-on-gen-failure() { | |
| local args_gn="${FUCHSIA_DIR}/out/default/args.gn" | |
| echo "# pristine args" > "${args_gn}" | |
| setup_mock_regenerator_fail_once ".add_host_test_failed_once" | |
| BT_EXPECT_FAIL "${fx}" add-host-test //invalid:target | |
| # args.gn should be restored to pristine state | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${args_gn}" "# pristine args" | |
| BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${args_gn}" "//invalid:target" | |
| } | |
| # Test error handling when too few arguments are given | |
| TEST_fx-add-test-too-few-args() { | |
| local out="${BT_TEMP_DIR}/_fx_add_test_output" | |
| BT_EXPECT_FAIL "${fx}" add-test >"$out" 2>&1 | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "$out" "ERROR: Too few arguments. At least one label is required." | |
| BT_EXPECT_FAIL "${fx}" add-test --target-list >"$out" 2>&1 | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "$out" "ERROR: Missing argument for --target-list" | |
| BT_EXPECT_FAIL "${fx}" add-test --target-list host_labels >"$out" 2>&1 | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "$out" "ERROR: Too few arguments. At least one label is required." | |
| } | |
| BT_RUN_TESTS "$@" |