1#!/bin/bash 2# 3# Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com> 4# 5# Sanity check for mkimage and dumpimage tools 6# 7# SPDX-License-Identifier: GPL-2.0+ 8# 9# To run this: 10# 11# make O=sandbox sandbox_config 12# make O=sandbox 13# ./test/image/test-imagetools.sh 14 15BASEDIR=sandbox 16SRCDIR=${BASEDIR}/boot 17IMAGE_NAME="v1.0-test" 18IMAGE_MULTI=linux.img 19DATAFILE0=vmlinuz 20DATAFILE1=initrd.img 21DATAFILE2=System.map 22DATAFILES="${DATAFILE0} ${DATAFILE1} ${DATAFILE2}" 23TEST_OUT=test_output 24MKIMAGE=${BASEDIR}/tools/mkimage 25DUMPIMAGE=${BASEDIR}/tools/dumpimage 26MKIMAGE_LIST=mkimage.list 27DUMPIMAGE_LIST=dumpimage.list 28 29# Remove all the files we created 30cleanup() 31{ 32 local file 33 34 for file in ${DATAFILES}; do 35 rm -f ${file} ${SRCDIR}/${file} 36 done 37 rm -f ${IMAGE_MULTI} ${DUMPIMAGE_LIST} ${MKIMAGE_LIST} ${TEST_OUT} 38 rmdir ${SRCDIR} 39} 40 41# Check that two files are the same 42assert_equal() 43{ 44 if ! diff -u $1 $2; then 45 echo "Failed." 46 cleanup 47 exit 1 48 fi 49} 50 51# Create some test files 52create_files() 53{ 54 local file 55 56 mkdir -p ${SRCDIR} 57 for file in ${DATAFILES}; do 58 head -c $RANDOM /dev/urandom >${SRCDIR}/${file} 59 done 60} 61 62# Run a command, echoing it first 63do_cmd() 64{ 65 local cmd="$@" 66 67 echo "# ${cmd}" 68 ${cmd} 2>&1 69} 70 71# Run a command, redirecting output 72# Args: 73# redirect_file 74# command... 75do_cmd_redir() 76{ 77 local redir="$1" 78 shift 79 local cmd="$@" 80 81 echo "# ${cmd}" 82 ${cmd} >${redir} 83} 84 85# Write files into an multi-file image 86create_multi_image() 87{ 88 local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}" 89 files+=":${SRCDIR}/${DATAFILE2}" 90 91 echo -e "\nBuilding multi-file image..." 92 do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \ 93 -d ${files} ${IMAGE_MULTI} 94 echo "done." 95} 96 97# Extract files from an multi-file image 98extract_multi_image() 99{ 100 echo -e "\nExtracting multi-file image contents..." 101 do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0} 102 do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1} 103 do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} 104 do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT} 105 echo "done." 106} 107 108# List the contents of a file 109# Args: 110# image filename 111list_image() 112{ 113 local image="$1" 114 115 echo -e "\nListing image contents..." 116 do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image} 117 do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image} 118 echo "done." 119} 120 121main() 122{ 123 local file 124 125 create_files 126 127 # Compress and extract multi-file images, compare the result 128 create_multi_image 129 extract_multi_image 130 for file in ${DATAFILES}; do 131 assert_equal ${file} ${SRCDIR}/${file} 132 done 133 assert_equal ${TEST_OUT} ${DATAFILE2} 134 135 # List contents of multi-file image and compares output from tools 136 list_image ${IMAGE_MULTI} 137 assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST} 138 139 # Remove files created 140 cleanup 141 142 echo "Tests passed." 143} 144 145main 146