blob: a90463b8ac0b0d537d2f8dbbddf7da41096ac733 [file] [log] [blame]
#!/bin/bash
# Copyright 2020 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 fx emu
BT_FILE_DEPS=(
"scripts/fx"
"tools/devshell/emu"
"tools/devshell/get-build-dir"
"tools/devshell/lib/fvm.sh"
"tools/devshell/lib/fx-cmd-locator.sh"
"tools/devshell/lib/fx-optional-features.sh"
"tools/devshell/lib/image_build_vars.sh"
"tools/devshell/lib/platform.sh"
"tools/devshell/lib/vars.sh"
)
BT_MOCKED_TOOLS=(
"tools/devshell/build"
)
declare fx
BT_SET_UP() {
source "${BT_TEMP_DIR}/tools/devshell/lib/vars.sh"
source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh"
fx="$(btf::setup_fx)"
btf::make_mock "${PREBUILT_AEMU_DIR}/emulator"
btf::make_mock "${BT_TEMP_DIR}/out/default/image_paths.sh"
btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
btf::make_hosttools_mock zbi > /dev/null
fvm="$(btf::make_hosttools_mock fvm)"
}
# Test that -c arguments are added to the end of the kernel command line.
TEST_kernel_cmdline_append() {
BT_EXPECT ${fx} emu --no-build --headless -a off --experiment-arm64 -c foobar
source "${PREBUILT_AEMU_DIR}/emulator.mock_state"
# The last arg will contain the kernel command line string.
local cmdline_string="${BT_MOCK_ARGS[${#BT_MOCK_ARGS[@]}-1]}"
# Convert the string to an array so we can easily examine the last element.
local cmdline_array=($cmdline_string)
BT_EXPECT_EQ "${cmdline_array[${#cmdline_array[@]}-1]}" "foobar"
}
# Test that -A argument works.
TEST_arch_arm64() {
BT_EXPECT ${fx} emu --no-build --headless -a off --experiment-arm64 -A arm64
source "${PREBUILT_AEMU_DIR}/emulator.mock_state"
local machine_arg="$(get_machine_arg)"
BT_EXPECT_EQ "${machine_arg}" "virt"
}
# Test that -A argument works.
TEST_arch_x64() {
BT_EXPECT ${fx} emu --no-build --headless -a off -A x64
source "${PREBUILT_AEMU_DIR}/emulator.mock_state"
local machine_arg="$(get_machine_arg)"
BT_EXPECT_EQ "${machine_arg}" "q35"
}
get_machine_arg() {
for i in "${!BT_MOCK_ARGS[@]}"; do
if [[ "${BT_MOCK_ARGS[$i]}" == "-machine" ]]; then
echo ${BT_MOCK_ARGS[(($i + 1))]}
return
fi
done
echo "invalid"
}
# Test creating a raw FVM image on-demand.
TEST_create_fvm() {
# Fake that we have a sparse FVM image to use as a source.
touch "${BT_TEMP_DIR}/out/default/fvm.blk"
touch "${BT_TEMP_DIR}/out/default/fvm.blk.decompressed"
cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name zbi --expect-one tools" ]] ; then
echo "host/zbi"
elif [[ "$@" == "--name fvm --expect-one tools" ]] ; then
echo "host/fvm"
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
echo "fvm.blk"
fi
EOF
# We need to mock out 2 `fvm` tool behaviors:
# 1. "decompress" should create the requested file
# 2. "extend" should save the file path so we can verify it's passed as
# an emulator arg later
local created_fvm_path_file="${BT_TEMP_DIR}/out/default/created-fvm-path"
cat > "${fvm}.mock_side_effects" << EOF
if [[ \$2 == "decompress" ]]; then
touch \$1
elif [[ \$2 == "extend" ]]; then
echo \$1 > "${created_fvm_path_file}"
fi
EOF
BT_EXPECT ${fx} emu --no-build --headless -a off
local created_fvm_path=$(cat "${created_fvm_path_file}")
BT_EXPECT btf::does-mock-args-contain \
"${PREBUILT_AEMU_DIR}/emulator.mock_state" \
"-drive" "file=${created_fvm_path},format=raw,if=none,id=vdisk" \
"-device" "virtio-blk-pci,drive=vdisk"
}
# The emu script parses all of the args passed on the command line. Anything not
# recognized and handled by the emu script are passed along to the emulator
# itself. The next few tests illustrate how an argument in any position is
# passed along.
TEST_first_param_is_appended() {
BT_EXPECT ${fx} emu --emu_param --no-build --headless -a off
BT_EXPECT btf::does-mock-args-contain \
"${PREBUILT_AEMU_DIR}/emulator.mock_state" \
"--emu_param"
}
TEST_middle_param_is_appended() {
BT_EXPECT ${fx} emu --no-build --headless --emu_param -a off
BT_EXPECT btf::does-mock-args-contain \
"${PREBUILT_AEMU_DIR}/emulator.mock_state" \
"--emu_param"
}
TEST_last_param_is_appended() {
BT_EXPECT ${fx} emu --no-build --headless -a off --emu_param
BT_EXPECT btf::does-mock-args-contain \
"${PREBUILT_AEMU_DIR}/emulator.mock_state" \
"--emu_param"
}
TEST_multiple_params_are_appended() {
BT_EXPECT ${fx} emu --no-build --emu_param1 --headless --emu_param2 -a off --emu_param3
BT_EXPECT btf::does-mock-args-contain \
"${PREBUILT_AEMU_DIR}/emulator.mock_state" \
"--emu_param1" "--emu_param2" "--emu_param3"
}
BT_RUN_TESTS "$@"