blob: 403652b3ccc5d3eb499a39f6cdc58260d03d1a75 [file]
#!/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 "$@"