test-imagetools.sh 4.9 KB

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