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