Home | History | Annotate | Download | only in image
      1 #!/bin/bash
      2 # SPDX-License-Identifier: GPL-2.0+
      3 #
      4 # Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira (at] gmail.com>
      5 #
      6 # Sanity check for mkimage and dumpimage tools
      7 #
      8 # To run this:
      9 #
     10 # make O=sandbox sandbox_config
     11 # make O=sandbox
     12 # ./test/image/test-imagetools.sh
     13 
     14 BASEDIR=sandbox
     15 SRCDIR=${BASEDIR}/boot
     16 IMAGE_NAME="v1.0-test"
     17 IMAGE_MULTI=linux.img
     18 IMAGE_FIT_ITS=linux.its
     19 IMAGE_FIT_ITB=linux.itb
     20 DATAFILE0=vmlinuz
     21 DATAFILE1=initrd.img
     22 DATAFILE2=System.map
     23 DATAFILES="${DATAFILE0} ${DATAFILE1} ${DATAFILE2}"
     24 TEST_OUT=test_output
     25 MKIMAGE=${BASEDIR}/tools/mkimage
     26 DUMPIMAGE=${BASEDIR}/tools/dumpimage
     27 MKIMAGE_LIST=mkimage.list
     28 DUMPIMAGE_LIST=dumpimage.list
     29 
     30 # Remove all the files we created
     31 cleanup()
     32 {
     33 	local file
     34 
     35 	for file in ${DATAFILES}; do
     36 		rm -f ${file} ${SRCDIR}/${file}
     37 	done
     38 	rm -f ${IMAGE_MULTI}
     39 	rm -f ${DUMPIMAGE_LIST}
     40 	rm -f ${MKIMAGE_LIST}
     41 	rm -f ${TEST_OUT}
     42 	rmdir ${SRCDIR}
     43 }
     44 
     45 # Check that two files are the same
     46 assert_equal()
     47 {
     48 	if ! diff -u $1 $2; then
     49 		echo "Failed."
     50 		cleanup
     51 		exit 1
     52 	fi
     53 }
     54 
     55 # Create some test files
     56 create_files()
     57 {
     58 	local file
     59 
     60 	mkdir -p ${SRCDIR}
     61 	for file in ${DATAFILES}; do
     62 		head -c $RANDOM /dev/urandom >${SRCDIR}/${file}
     63 	done
     64 }
     65 
     66 # Run a command, echoing it first
     67 do_cmd()
     68 {
     69 	local cmd="$@"
     70 
     71 	echo "# ${cmd}"
     72 	${cmd} 2>&1
     73 }
     74 
     75 # Run a command, redirecting output
     76 # Args:
     77 #    redirect_file
     78 #    command...
     79 do_cmd_redir()
     80 {
     81 	local redir="$1"
     82 	shift
     83 	local cmd="$@"
     84 
     85 	echo "# ${cmd}"
     86 	${cmd} >${redir}
     87 }
     88 
     89 # Write files into an multi-file image
     90 create_multi_image()
     91 {
     92 	local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}"
     93 	files+=":${SRCDIR}/${DATAFILE2}"
     94 
     95 	echo -e "\nBuilding multi-file image..."
     96 	do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \
     97 		-d ${files} ${IMAGE_MULTI}
     98 	echo "done."
     99 }
    100 
    101 # Extract files from an multi-file image
    102 extract_multi_image()
    103 {
    104 	echo -e "\nExtracting multi-file image contents..."
    105 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0}
    106 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1}
    107 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2}
    108 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT}
    109 	echo "done."
    110 }
    111 
    112 # Write files into a FIT image
    113 create_fit_image()
    114 {
    115 	echo " \
    116 	/dts-v1/; \
    117 	/ { \
    118 	    description = \"FIT image\"; \
    119 	    #address-cells = <1>; \
    120 	\
    121 	    images { \
    122 	        kernel@1 { \
    123 	            description = \"kernel\"; \
    124 	            data = /incbin/(\"${DATAFILE0}\"); \
    125 	            type = \"kernel\"; \
    126 	            arch = \"sandbox\"; \
    127 	            os = \"linux\"; \
    128 	            compression = \"gzip\"; \
    129 	            load = <0x40000>; \
    130 	            entry = <0x8>; \
    131 	        }; \
    132 	        ramdisk@1 { \
    133 	            description = \"filesystem\"; \
    134 	            data = /incbin/(\"${DATAFILE1}\"); \
    135 	            type = \"ramdisk\"; \
    136 	            arch = \"sandbox\"; \
    137 	            os = \"linux\"; \
    138 	            compression = \"none\"; \
    139 	            load = <0x80000>; \
    140 	            entry = <0x16>; \
    141 	        }; \
    142 	        fdt@1 { \
    143 	            description = \"device tree\"; \
    144 	            data = /incbin/(\"${DATAFILE2}\"); \
    145 	            type = \"flat_dt\"; \
    146 	            arch = \"sandbox\"; \
    147 	            compression = \"none\"; \
    148 	        }; \
    149 	    }; \
    150 	    configurations { \
    151 	        default = \"conf@1\"; \
    152 	        conf@1 { \
    153 	            kernel = \"kernel@1\"; \
    154 	            fdt = \"fdt@1\"; \
    155 	        }; \
    156 	    }; \
    157 	}; \
    158 	" > ${IMAGE_FIT_ITS}
    159 
    160 	echo -e "\nBuilding FIT image..."
    161 	do_cmd ${MKIMAGE} -f ${IMAGE_FIT_ITS} ${IMAGE_FIT_ITB}
    162 	echo "done."
    163 }
    164 
    165 # Extract files from a FIT image
    166 extract_fit_image()
    167 {
    168 	echo -e "\nExtracting FIT image contents..."
    169 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 0 ${DATAFILE0}
    170 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 1 ${DATAFILE1}
    171 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2}
    172 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} -o ${TEST_OUT}
    173 	echo "done."
    174 }
    175 
    176 # List the contents of a file
    177 # Args:
    178 #    image filename
    179 list_image()
    180 {
    181 	local image="$1"
    182 
    183 	echo -e "\nListing image contents..."
    184 	do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image}
    185 	do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image}
    186 	echo "done."
    187 }
    188 
    189 main()
    190 {
    191 	local file
    192 
    193 	create_files
    194 
    195 	# Compress and extract multi-file images, compare the result
    196 	create_multi_image
    197 	extract_multi_image
    198 	for file in ${DATAFILES}; do
    199 		assert_equal ${file} ${SRCDIR}/${file}
    200 	done
    201 	assert_equal ${TEST_OUT} ${DATAFILE2}
    202 
    203 	# List contents of multi-file image and compares output from tools
    204 	list_image ${IMAGE_MULTI}
    205 	assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
    206 
    207 	# Compress and extract FIT images, compare the result
    208 	create_fit_image
    209 	extract_fit_image
    210 	for file in ${DATAFILES}; do
    211 		assert_equal ${file} ${SRCDIR}/${file}
    212 	done
    213 	assert_equal ${TEST_OUT} ${DATAFILE2}
    214 
    215 	# List contents of FIT image and compares output from tools
    216 	list_image ${IMAGE_FIT_ITB}
    217 	assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
    218 
    219 	# Remove files created
    220 	cleanup
    221 
    222 	echo "Tests passed."
    223 }
    224 
    225 main
    226