| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0+ |
| # |
| # Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com> |
| # |
| # Sanity check for mkimage and dumpimage tools |
| # |
| # To run this: |
| # |
| # make O=sandbox sandbox_config |
| # make O=sandbox |
| # ./test/image/test-imagetools.sh |
| |
| BASEDIR=sandbox |
| SRCDIR=${BASEDIR}/boot |
| IMAGE_NAME="v1.0-test" |
| IMAGE_MULTI=linux.img |
| IMAGE_FIT_ITS=linux.its |
| IMAGE_FIT_ITB=linux.itb |
| DATAFILE0=vmlinuz |
| DATAFILE1=initrd.img |
| DATAFILE2=System.map |
| DATAFILES="${DATAFILE0} ${DATAFILE1} ${DATAFILE2}" |
| TEST_OUT=test_output |
| MKIMAGE=${BASEDIR}/tools/mkimage |
| DUMPIMAGE=${BASEDIR}/tools/dumpimage |
| MKIMAGE_LIST=mkimage.list |
| DUMPIMAGE_LIST=dumpimage.list |
| |
| # Remove all the files we created |
| cleanup() |
| { |
| local file |
| |
| for file in ${DATAFILES}; do |
| rm -f ${file} ${SRCDIR}/${file} |
| done |
| rm -f ${IMAGE_MULTI} |
| rm -f ${DUMPIMAGE_LIST} |
| rm -f ${MKIMAGE_LIST} |
| rm -f ${TEST_OUT} |
| rmdir ${SRCDIR} |
| } |
| |
| # Check that two files are the same |
| assert_equal() |
| { |
| if ! diff -u $1 $2; then |
| echo "Failed." |
| cleanup |
| exit 1 |
| fi |
| } |
| |
| # Create some test files |
| create_files() |
| { |
| local file |
| |
| mkdir -p ${SRCDIR} |
| for file in ${DATAFILES}; do |
| head -c $RANDOM /dev/urandom >${SRCDIR}/${file} |
| done |
| } |
| |
| # Run a command, echoing it first |
| do_cmd() |
| { |
| local cmd="$@" |
| |
| echo "# ${cmd}" |
| ${cmd} 2>&1 |
| } |
| |
| # Run a command, redirecting output |
| # Args: |
| # redirect_file |
| # command... |
| do_cmd_redir() |
| { |
| local redir="$1" |
| shift |
| local cmd="$@" |
| |
| echo "# ${cmd}" |
| ${cmd} >${redir} |
| } |
| |
| # Write files into an multi-file image |
| create_multi_image() |
| { |
| local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}" |
| files+=":${SRCDIR}/${DATAFILE2}" |
| |
| echo -e "\nBuilding multi-file image..." |
| do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \ |
| -d ${files} ${IMAGE_MULTI} |
| echo "done." |
| } |
| |
| # Extract files from an multi-file image |
| extract_multi_image() |
| { |
| echo -e "\nExtracting multi-file image contents..." |
| do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0} |
| do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1} |
| do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} |
| do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT} |
| echo "done." |
| } |
| |
| # Write files into a FIT image |
| create_fit_image() |
| { |
| echo " \ |
| /dts-v1/; \ |
| / { \ |
| description = \"FIT image\"; \ |
| #address-cells = <1>; \ |
| \ |
| images { \ |
| kernel@1 { \ |
| description = \"kernel\"; \ |
| data = /incbin/(\"${DATAFILE0}\"); \ |
| type = \"kernel\"; \ |
| arch = \"sandbox\"; \ |
| os = \"linux\"; \ |
| compression = \"gzip\"; \ |
| load = <0x40000>; \ |
| entry = <0x8>; \ |
| }; \ |
| ramdisk@1 { \ |
| description = \"filesystem\"; \ |
| data = /incbin/(\"${DATAFILE1}\"); \ |
| type = \"ramdisk\"; \ |
| arch = \"sandbox\"; \ |
| os = \"linux\"; \ |
| compression = \"none\"; \ |
| load = <0x80000>; \ |
| entry = <0x16>; \ |
| }; \ |
| fdt@1 { \ |
| description = \"device tree\"; \ |
| data = /incbin/(\"${DATAFILE2}\"); \ |
| type = \"flat_dt\"; \ |
| arch = \"sandbox\"; \ |
| compression = \"none\"; \ |
| }; \ |
| }; \ |
| configurations { \ |
| default = \"conf@1\"; \ |
| conf@1 { \ |
| kernel = \"kernel@1\"; \ |
| fdt = \"fdt@1\"; \ |
| }; \ |
| }; \ |
| }; \ |
| " > ${IMAGE_FIT_ITS} |
| |
| echo -e "\nBuilding FIT image..." |
| do_cmd ${MKIMAGE} -f ${IMAGE_FIT_ITS} ${IMAGE_FIT_ITB} |
| echo "done." |
| } |
| |
| # Extract files from a FIT image |
| extract_fit_image() |
| { |
| echo -e "\nExtracting FIT image contents..." |
| do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 0 ${DATAFILE0} |
| do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 1 ${DATAFILE1} |
| do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} |
| do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} -o ${TEST_OUT} |
| echo "done." |
| } |
| |
| # List the contents of a file |
| # Args: |
| # image filename |
| list_image() |
| { |
| local image="$1" |
| |
| echo -e "\nListing image contents..." |
| do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image} |
| do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image} |
| echo "done." |
| } |
| |
| main() |
| { |
| local file |
| |
| create_files |
| |
| # Compress and extract multi-file images, compare the result |
| create_multi_image |
| extract_multi_image |
| for file in ${DATAFILES}; do |
| assert_equal ${file} ${SRCDIR}/${file} |
| done |
| assert_equal ${TEST_OUT} ${DATAFILE2} |
| |
| # List contents of multi-file image and compares output from tools |
| list_image ${IMAGE_MULTI} |
| assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST} |
| |
| # Compress and extract FIT images, compare the result |
| create_fit_image |
| extract_fit_image |
| for file in ${DATAFILES}; do |
| assert_equal ${file} ${SRCDIR}/${file} |
| done |
| assert_equal ${TEST_OUT} ${DATAFILE2} |
| |
| # List contents of FIT image and compares output from tools |
| list_image ${IMAGE_FIT_ITB} |
| assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST} |
| |
| # Remove files created |
| cleanup |
| |
| echo "Tests passed." |
| } |
| |
| main |