| #!/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 "mkzedboot" script. |
| |
| BT_FILE_DEPS=( |
| "scripts/fx" |
| "tools/devshell/mkzedboot" |
| "tools/devshell/lib/fx-cmd-locator.sh" |
| "tools/devshell/lib/fx-optional-features.sh" |
| "tools/devshell/lib/generate-ssh-config.sh" |
| "tools/devshell/lib/fx-mkzedboot.sh" |
| "tools/devshell/lib/vars.sh" |
| "tools/devshell/lib/platform.sh" |
| ) |
| |
| BT_MOCKED_TOOLS=( |
| # FX tools. |
| "tools/devshell/list-usb-disks" |
| "tools/devshell/build" |
| |
| # Host tools. |
| "prebuilt/tools/cgpt/linux-x64/cgpt" |
| |
| # System utilites |
| "bin/dd" |
| "bin/diskutil" |
| "bin/eject" |
| "bin/sudo" |
| ) |
| |
| BT_MKDIR_DEPS=( |
| ".jiri_root" |
| "boards" |
| "dev" |
| "out/default" |
| "products" |
| ) |
| |
| BT_SET_UP() { |
| # Set up the testing framework. |
| source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh" |
| fx="$(btf::setup_fx)" |
| |
| # Set up a dummy "platform.sh" |
| cat > "${BT_TEMP_DIR}/tools/devshell/lib/platform.sh" <<EOF |
| readonly PREBUILT_CGPT_DIR="${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64" |
| EOF |
| |
| # Set up list-build-artifacts mock |
| btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts" |
| cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF" |
| if [[ "$@" == "--allow-empty --type blk mkzedboot" ]] ; then |
| echo "zedboot.esp.blk" |
| fi |
| EOF |
| |
| # Set up a fake USB device; just a plain 128MiB file. |
| USB_DRIVE="${BT_TEMP_DIR}/dev/sda" |
| dd if=/dev/zero of="${USB_DRIVE}" bs=1024 seek=$((128*1024-1)) count=1 >/dev/null 2>/dev/null |
| echo ${USB_DRIVE} > ${BT_TEMP_DIR}/tools/devshell/list-usb-disks.mock_stdout |
| |
| # Set up mocked replacements for system utils. |
| export PATH="${BT_TEMP_DIR}/bin:${PATH}" |
| } |
| |
| # Ensure that help is displayed if not argument is given. |
| TEST_fx-mkzedboot-no-args() { |
| local out="${BT_TEMP_DIR}/_fx_mkzedboot_output" |
| BT_EXPECT_FAIL ${fx} mkzedboot >"$out" 2>&1 |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "$out" 'Device argument required' |
| } |
| |
| # Ensure that invalid USB disks are detected. |
| TEST_fx-mkzedboot-invalid-arg() { |
| local out="${BT_TEMP_DIR}/_fx_mkzedboot_output" |
| BT_EXPECT_FAIL ${fx} mkzedboot /xxx/invalid >"$out" 2>&1 |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "$out" 'does not look like a USB device' |
| } |
| |
| # "force" should allow us to write to something that doesn't look like a USB device. |
| TEST_fx-mkzedboot-force-write() { |
| # Modify "list-usb-disks" to not return anything as a USB disk. |
| echo > ${BT_TEMP_DIR}/tools/devshell/list-usb-disks.mock_stdout |
| |
| local out="${BT_TEMP_DIR}/_fx_mkzedboot_output" |
| # Force write to the USB drive. |
| BT_EXPECT ${fx} mkzedboot -f ${USB_DRIVE} >"$out" 2>&1 |
| |
| # Ensure we wrote to the file. |
| source "${BT_TEMP_DIR}/bin/dd.mock_state" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "of=${USB_DRIVE}" |
| } |
| |
| # Write an EFI USB disk |
| TEST_fx-mkzedboot-efi() { |
| # Set up "list-build-artifacts" mock for x64 EFI builds. |
| cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF" |
| if [[ "$@" == "--allow-empty --type blk mkzedboot" ]] ; then |
| echo "zedboot.esp.blk" |
| fi |
| EOF |
| |
| local out="${BT_TEMP_DIR}/_fx_mkzedboot_output" |
| # Write to /dev/sda |
| BT_ASSERT ${fx} mkzedboot ${USB_DRIVE} >"$out" 2>&1 |
| |
| # Ensure we created the GPT. |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.1" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt create ${USB_DRIVE}" |
| |
| # Ensure we marked the device as bootable. |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.2" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt boot -p ${USB_DRIVE}" |
| |
| # Ensure we added an ESP partition. |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.3" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt add" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -t efi " |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -l esp " |
| |
| # We should have copied the ESP version of Zedboot. |
| source "${BT_TEMP_DIR}/bin/dd.mock_state" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "out/default/zedboot.esp.blk" |
| } |
| |
| # Write a Chromeboot vboot USB disk |
| TEST_fx-mkzedboot-vboot() { |
| # Set up "list-build-artifacts" mock for chromebook builds. |
| cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF" |
| if [[ "$@" == "--allow-empty --type zbi.signed mkzedboot" ]] ; then |
| echo "zedboot.zbi.signed" |
| fi |
| EOF |
| local out="${BT_TEMP_DIR}/_fx_mkzedboot_output" |
| # Write to /dev/sda |
| BT_ASSERT ${fx} mkzedboot ${USB_DRIVE} >"$out" 2>&1 |
| |
| # Ensure we created the GPT. |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.1" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt create ${USB_DRIVE}" |
| |
| # Ensure we marked the device as bootable. |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.2" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt boot -p ${USB_DRIVE}" |
| |
| # Ensure we set up VBOOT partitions: |
| # 1. reserved |
| # 2. vboot image |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.3" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt add" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -t reserved " |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -l reserved " |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.4" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt add" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -t kernel " |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -l zedboot " |
| |
| # Ensure we set the kernel partition to bootable. |
| source "${BT_TEMP_DIR}/prebuilt/tools/cgpt/linux-x64/cgpt.mock_state.5" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "cgpt add -i 2" # Modify partition |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" " -P 2 " # Priority 2 |
| |
| # We should have copied the Signed ZBI version of Zedboot. |
| source "${BT_TEMP_DIR}/bin/dd.mock_state" |
| BT_EXPECT_STRING_CONTAINS_SUBSTRING "${BT_MOCK_ARGS[*]}" "out/default/zedboot.zbi.signed" |
| } |
| |
| BT_RUN_TESTS "$@" |