| #!/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 serve | |
| # Source platform.sh so that we can point to jq and include it as a runtime dependency. | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/../../lib/platform.sh" || exit $? | |
| BT_FILE_DEPS=( | |
| "prebuilt/third_party/jq/${HOST_PLATFORM}/bin/jq" | |
| "scripts/fx" | |
| "tools/devshell/jq.fx" | |
| "tools/devshell/lib/agents.txt" | |
| "tools/devshell/lib/fx-cmd-locator.sh" | |
| "tools/devshell/lib/fx-optional-features.sh" | |
| "tools/devshell/lib/generate-ssh-config.sh" | |
| "tools/devshell/lib/is_invoked_by_agent.sh" | |
| "tools/devshell/lib/platform.sh" | |
| "tools/devshell/lib/updates.sh" | |
| "tools/devshell/lib/vars.sh" | |
| "tools/devshell/serve" | |
| ) | |
| BT_MOCKED_TOOLS=( | |
| "tools/devshell/build" | |
| ) | |
| declare fx ffx | |
| BT_SET_UP() { | |
| unset FUCHSIA_NODENAME | |
| unset FUCHSIA_DEVICE_ADDR | |
| source "${BT_TEMP_DIR}/tools/devshell/lib/vars.sh" | |
| source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh" | |
| fx="$(btf::setup_fx)" | |
| fx-config-read | |
| ffx="$(btf::make_installed_hosttools_mock ffx)" | |
| local repo_dir="${BT_TEMP_DIR}/out/default/amber-files" | |
| mkdir -p "${repo_dir}/keys" "${repo_dir}/repository" | |
| touch "${repo_dir}/keys/snapshot.json" | |
| touch "${repo_dir}/keys/targets.json" | |
| touch "${repo_dir}/keys/timestamp.json" | |
| touch "${repo_dir}/repository/1.root.json" | |
| touch "${repo_dir}/repository/root.json" | |
| } | |
| get_server_start_state_file() { | |
| local f | |
| for f in "${ffx}".mock_state*; do | |
| if [[ -f "$f" ]]; then | |
| if btf::does-mock-args-contain "$f" "repository" "server" "start"; then | |
| echo "$f" | |
| return 0 | |
| fi | |
| fi | |
| done | |
| return 1 | |
| } | |
| # Verifies that `fx -t my-device serve` passes `--target my-device` to `ffx repository server start`. | |
| TEST_serve_with_target_flag() { | |
| BT_EXPECT ${fx} -t my-device serve | |
| local state_file | |
| state_file="$(get_server_start_state_file)" | |
| BT_ASSERT_FILE_EXISTS "${state_file}" | |
| BT_EXPECT btf::does-mock-args-contain "${state_file}" "--target" "my-device" "repository" "server" "start" | |
| } | |
| # Verifies that `FUCHSIA_NODENAME=my-device fx serve` passes `--target my-device` to `ffx repository server start`. | |
| TEST_serve_with_nodename_env() { | |
| export FUCHSIA_NODENAME="my-device" | |
| BT_EXPECT ${fx} serve | |
| local state_file | |
| state_file="$(get_server_start_state_file)" | |
| BT_ASSERT_FILE_EXISTS "${state_file}" | |
| BT_EXPECT btf::does-mock-args-contain "${state_file}" "--target" "my-device" "repository" "server" "start" | |
| } | |
| # Verifies that `fx serve` without FUCHSIA_NODENAME does not pass `--target`. | |
| TEST_serve_without_target() { | |
| unset FUCHSIA_NODENAME | |
| BT_EXPECT ${fx} serve | |
| local state_file | |
| state_file="$(get_server_start_state_file)" | |
| BT_ASSERT_FILE_EXISTS "${state_file}" | |
| BT_EXPECT btf::does-mock-args-not-contain "${state_file}" "--target" | |
| BT_EXPECT btf::does-mock-args-contain "${state_file}" "repository" "server" "start" | |
| } | |
| # Verifies that `fx -t my-device serve --no-device` omits `--target` when `--no-device` is specified. | |
| TEST_serve_with_target_and_no_device() { | |
| BT_EXPECT ${fx} -t my-device serve --no-device | |
| local state_file | |
| state_file="$(get_server_start_state_file)" | |
| BT_ASSERT_FILE_EXISTS "${state_file}" | |
| BT_EXPECT btf::does-mock-args-not-contain "${state_file}" "--target" | |
| BT_EXPECT btf::does-mock-args-contain "${state_file}" "repository" "server" "start" | |
| BT_EXPECT btf::does-mock-args-contain "${state_file}" "--no-device" | |
| } | |
| # Verifies that `fx -t my-device serve` overrides the device file if one exists. | |
| TEST_serve_with_target_overrides_device_file() { | |
| echo "default-device" > "${BT_TEMP_DIR}/out/default.device" | |
| export FUCHSIA_NODENAME_IS_FROM_FILE="true" | |
| export FUCHSIA_NODENAME="default-device" | |
| BT_EXPECT ${fx} -t my-device serve | |
| local state_file | |
| state_file="$(get_server_start_state_file)" | |
| BT_ASSERT_FILE_EXISTS "${state_file}" | |
| BT_EXPECT btf::does-mock-args-contain "${state_file}" "--target" "my-device" "repository" "server" "start" | |
| } | |
| BT_RUN_TESTS "$@" |