| #!/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 "$@" |