| #!/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/fx-mkzedboot.sh" | |
| "tools/devshell/lib/image_build_vars.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.vboot" | |
| 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.vboot" | |
| } | |
| BT_RUN_TESTS "$@" |