test-imagetools.sh 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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. 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. # Remove all the files we created
  30. cleanup()
  31. {
  32. local file
  33. for file in ${DATAFILES}; do
  34. rm -f ${file} ${SRCDIR}/${file}
  35. done
  36. rm -f ${IMAGE_MULTI}
  37. rm -f ${DUMPIMAGE_LIST}
  38. rm -f ${MKIMAGE_LIST}
  39. rm -f ${TEST_OUT}
  40. rmdir ${SRCDIR}
  41. }
  42. # Check that two files are the same
  43. assert_equal()
  44. {
  45. if ! diff -u $1 $2; then
  46. echo "Failed."
  47. cleanup
  48. exit 1
  49. fi
  50. }
  51. # Create some test files
  52. create_files()
  53. {
  54. local file
  55. mkdir -p ${SRCDIR}
  56. for file in ${DATAFILES}; do
  57. head -c $RANDOM /dev/urandom >${SRCDIR}/${file}
  58. done
  59. }
  60. # Run a command, echoing it first
  61. do_cmd()
  62. {
  63. local cmd="$@"
  64. echo "# ${cmd}"
  65. ${cmd} 2>&1
  66. }
  67. # Run a command, redirecting output
  68. # Args:
  69. # redirect_file
  70. # command...
  71. do_cmd_redir()
  72. {
  73. local redir="$1"
  74. shift
  75. local cmd="$@"
  76. echo "# ${cmd}"
  77. ${cmd} >${redir}
  78. }
  79. # Write files into an multi-file image
  80. create_multi_image()
  81. {
  82. local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}"
  83. files+=":${SRCDIR}/${DATAFILE2}"
  84. echo -e "\nBuilding multi-file image..."
  85. do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \
  86. -d ${files} ${IMAGE_MULTI}
  87. echo "done."
  88. }
  89. # Extract files from an multi-file image
  90. extract_multi_image()
  91. {
  92. echo -e "\nExtracting multi-file image contents..."
  93. do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0}
  94. do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1}
  95. do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2}
  96. do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT}
  97. echo "done."
  98. }
  99. # Write files into a FIT image
  100. create_fit_image()
  101. {
  102. echo " \
  103. /dts-v1/; \
  104. / { \
  105. description = \"FIT image\"; \
  106. #address-cells = <1>; \
  107. \
  108. images { \
  109. kernel@1 { \
  110. description = \"kernel\"; \
  111. data = /incbin/(\"${DATAFILE0}\"); \
  112. type = \"kernel\"; \
  113. arch = \"sandbox\"; \
  114. os = \"linux\"; \
  115. compression = \"gzip\"; \
  116. load = <0x40000>; \
  117. entry = <0x8>; \
  118. }; \
  119. ramdisk@1 { \
  120. description = \"filesystem\"; \
  121. data = /incbin/(\"${DATAFILE1}\"); \
  122. type = \"ramdisk\"; \
  123. arch = \"sandbox\"; \
  124. os = \"linux\"; \
  125. compression = \"none\"; \
  126. load = <0x80000>; \
  127. entry = <0x16>; \
  128. }; \
  129. fdt@1 { \
  130. description = \"device tree\"; \
  131. data = /incbin/(\"${DATAFILE2}\"); \
  132. type = \"flat_dt\"; \
  133. arch = \"sandbox\"; \
  134. compression = \"none\"; \
  135. }; \
  136. }; \
  137. configurations { \
  138. default = \"conf@1\"; \
  139. conf@1 { \
  140. kernel = \"kernel@1\"; \
  141. fdt = \"fdt@1\"; \
  142. }; \
  143. }; \
  144. }; \
  145. " > ${IMAGE_FIT_ITS}
  146. echo -e "\nBuilding FIT image..."
  147. do_cmd ${MKIMAGE} -f ${IMAGE_FIT_ITS} ${IMAGE_FIT_ITB}
  148. echo "done."
  149. }
  150. # Extract files from a FIT image
  151. extract_fit_image()
  152. {
  153. echo -e "\nExtracting FIT image contents..."
  154. do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 0 ${DATAFILE0}
  155. do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 1 ${DATAFILE1}
  156. do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2}
  157. do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} -o ${TEST_OUT}
  158. echo "done."
  159. }
  160. # List the contents of a file
  161. # Args:
  162. # image filename
  163. list_image()
  164. {
  165. local image="$1"
  166. echo -e "\nListing image contents..."
  167. do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image}
  168. do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image}
  169. echo "done."
  170. }
  171. main()
  172. {
  173. local file
  174. create_files
  175. # Compress and extract multi-file images, compare the result
  176. create_multi_image
  177. extract_multi_image
  178. for file in ${DATAFILES}; do
  179. assert_equal ${file} ${SRCDIR}/${file}
  180. done
  181. assert_equal ${TEST_OUT} ${DATAFILE2}
  182. # List contents of multi-file image and compares output from tools
  183. list_image ${IMAGE_MULTI}
  184. assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
  185. # Compress and extract FIT images, compare the result
  186. create_fit_image
  187. extract_fit_image
  188. for file in ${DATAFILES}; do
  189. assert_equal ${file} ${SRCDIR}/${file}
  190. done
  191. assert_equal ${TEST_OUT} ${DATAFILE2}
  192. # List contents of FIT image and compares output from tools
  193. list_image ${IMAGE_FIT_ITB}
  194. assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
  195. # Remove files created
  196. cleanup
  197. echo "Tests passed."
  198. }
  199. main