CMakeLists.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. # NON-REGRESSION TESTS ON THIS DATASET LOCATED ${OPJ_DATA_ROOT}/input/nonregression
  2. cmake_minimum_required(VERSION 2.8.7)
  3. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Temporary)
  4. set(TEMP ${CMAKE_CURRENT_BINARY_DIR}/Temporary)
  5. set(BASELINE_NR ${OPJ_DATA_ROOT}/baseline/nonregression)
  6. set(INPUT_NR ${OPJ_DATA_ROOT}/input/nonregression)
  7. set(INPUT_NR_PATH ${INPUT_NR})
  8. set(TEMP_PATH ${TEMP})
  9. set(INPUT_CONF_PATH ${OPJ_DATA_ROOT}/input/conformance)
  10. # need kdu_expand if possible
  11. find_package(KAKADU)
  12. # need jpylyzer if possible
  13. find_package(JPYLYZER)
  14. #########################################################################
  15. # GENERATION OF THE TEST SUITE (DUMP)
  16. # Dump all files with the selected extension inside the input directory
  17. # technically opj_dump should simply parse these one, since syntax is ok.
  18. set(BLACKLIST_JPEG2000_TMP
  19. 2539.pdf.SIGFPE.706.1712.jp2
  20. 0290cb77c5df21828fa74cf2ab2c84d8.SIGFPE.d25.31.jp2
  21. 26ccf3651020967f7778238ef5af08af.SIGFPE.d25.527.jp2
  22. 4035.pdf.SIGSEGV.d8b.3375.jp2
  23. 3635.pdf.asan.77.2930.jp2
  24. issue165.jp2
  25. #edf_c2_1103421.jp2
  26. edf_c2_1178956.jp2
  27. edf_c2_1000290.jp2
  28. #edf_c2_1000691.jp2 # ok
  29. #edf_c2_20.jp2 #looks ok as per kdu_jp2info
  30. edf_c2_1377017.jp2
  31. edf_c2_1002767.jp2
  32. edf_c2_10025.jp2
  33. edf_c2_1000234.jp2
  34. edf_c2_225881.jp2
  35. edf_c2_1000671.jp2
  36. #edf_c2_1013627.jp2 # weird box, but kdu_jp2info ok
  37. edf_c2_1015644.jp2
  38. edf_c2_101463.jp2
  39. edf_c2_1674177.jp2
  40. edf_c2_1673169.jp2
  41. issue418.jp2
  42. issue429.jp2
  43. issue427-null-image-size.jp2
  44. issue427-illegal-tile-offset.jp2
  45. issue495.jp2
  46. issue820.jp2
  47. )
  48. # Define a list of file which should be gracefully rejected:
  49. set(BLACKLIST_JPEG2000
  50. ${BLACKLIST_JPEG2000_TMP}
  51. broken1.jp2
  52. broken2.jp2
  53. broken3.jp2
  54. broken4.jp2
  55. gdal_fuzzer_assert_in_opj_j2k_read_SQcd_SQcc.patch.jp2
  56. gdal_fuzzer_check_comp_dx_dy.jp2
  57. gdal_fuzzer_check_number_of_tiles.jp2
  58. gdal_fuzzer_unchecked_numresolutions.jp2
  59. mem-b2ace68c-1381.jp2
  60. 1851.pdf.SIGSEGV.ce9.948.jp2
  61. 1888.pdf.asan.35.988.jp2
  62. issue362-2863.jp2 #kdu_jp2info ok
  63. issue362-2866.jp2
  64. issue362-2894.jp2
  65. issue400.jp2 #kdu_jp2info ok
  66. issue364-38.jp2
  67. issue364-903.jp2 #kdu_jp2info ok
  68. issue393.jp2 #kdu_jp2info ok
  69. issue408.jp2 #kdu_jp2info ok
  70. issue420.jp2 #kdu_jp2info ok
  71. 27ac957758a35d00d6765a0c86350d9c.SIGFPE.d25.537.jpc #kdu_jp2info crash
  72. 3672da2f1f67bbecad27d7181b4e9d7c.SIGFPE.d25.805.jpc #kdu_jp2info crash
  73. issue475.jp2 #kdu_jp2info ok
  74. issue413.jp2 #kdu_jp2info ok
  75. issue823.jp2 #kdu_jp2info ok
  76. )
  77. file(GLOB_RECURSE OPJ_DATA_NR_LIST
  78. "${INPUT_NR}/*.j2k"
  79. "${INPUT_NR}/*.j2c"
  80. "${INPUT_NR}/*.jp2"
  81. "${INPUT_NR}/*.jpc"
  82. #"${INPUT_NR}/*.jpx"
  83. )
  84. foreach(INPUT_FILENAME ${OPJ_DATA_NR_LIST})
  85. get_filename_component(INPUT_FILENAME_NAME ${INPUT_FILENAME} NAME)
  86. #get_filename_component(INPUT_FILENAME_NAME_WE ${INPUT_FILENAME_NAME} NAME_WE)
  87. # cannot use longest extension function, since some name contains multiples
  88. # dots. Instead write out own shortest extension function:
  89. string(FIND ${INPUT_FILENAME_NAME} "." SHORTEST_EXT_POS REVERSE)
  90. string(SUBSTRING ${INPUT_FILENAME_NAME} 0 ${SHORTEST_EXT_POS} INPUT_FILENAME_NAME_WE)
  91. string(REGEX MATCH ${INPUT_FILENAME_NAME} bad_jpeg2000 ${BLACKLIST_JPEG2000})
  92. # Dump the input image
  93. add_test(NAME NR-${INPUT_FILENAME_NAME}-dump
  94. COMMAND opj_dump
  95. -i ${INPUT_FILENAME}
  96. -o ${TEMP}/${INPUT_FILENAME_NAME}.txt
  97. -v
  98. )
  99. if(bad_jpeg2000)
  100. set_tests_properties(NR-${INPUT_FILENAME_NAME}-dump
  101. PROPERTIES WILL_FAIL TRUE)
  102. else()
  103. # Compare the dump output with the baseline
  104. add_test(NAME NR-${INPUT_FILENAME_NAME}-compare_dump2base
  105. COMMAND compare_dump_files
  106. -b ${BASELINE_NR}/opj_v2_${INPUT_FILENAME_NAME_WE}.txt
  107. -t ${TEMP}/${INPUT_FILENAME_NAME}.txt
  108. )
  109. set_tests_properties(NR-${INPUT_FILENAME_NAME}-compare_dump2base
  110. PROPERTIES DEPENDS
  111. NR-${INPUT_FILENAME_NAME}-dump)
  112. endif()
  113. endforeach()
  114. #########################################################################
  115. # GENERATION OF THE TEST SUITE (DECODE AND ENCODE)
  116. # Read one and more input file(s) (located in ${OPJ_DATA_ROOT}/input/nonregression)
  117. # to know which files processed and with which options.
  118. # Configure the test suite file:
  119. configure_file("test_suite.ctest.in"
  120. "${CMAKE_CURRENT_BINARY_DIR}/test_suite.ctest"
  121. @ONLY)
  122. # Read the file into a list
  123. file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/test_suite.ctest OPJ_TEST_CMD_LINE_LIST)
  124. # Try to find and configure and read another test suite file
  125. file(GLOB TEST_SUITE_FILES *.ctest.in)
  126. if (TEST_SUITE_FILES)
  127. foreach(TEST_SUITE_FILE ${TEST_SUITE_FILES})
  128. # Avoid to process the official test suite
  129. set(FILE_ALREADY_READ 0)
  130. get_filename_component(TEST_SUITE_FILENAME ${TEST_SUITE_FILE} NAME)
  131. string(REGEX MATCH "^test_suite.ctest.in$" FILE_ALREADY_READ ${TEST_SUITE_FILENAME})
  132. if(NOT FILE_ALREADY_READ)
  133. # Configure the additional test suite file:
  134. get_filename_component(TEST_SUITE_FILE_SUB ${TEST_SUITE_FILE} NAME_WE)
  135. configure_file("${TEST_SUITE_FILE}"
  136. "${CMAKE_CURRENT_BINARY_DIR}/${TEST_SUITE_FILE_SUB}.ctest"
  137. @ONLY)
  138. # Read the additional file into a list
  139. file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/${TEST_SUITE_FILE_SUB}.ctest OPJ_TEST_CMD_LINE_LIST_TEMP)
  140. # Append the list of command
  141. set(OPJ_TEST_CMD_LINE_LIST ${OPJ_TEST_CMD_LINE_LIST} ${OPJ_TEST_CMD_LINE_LIST_TEMP})
  142. endif()
  143. endforeach()
  144. else()
  145. message(FATAL_ERROR "One test suite should be available (test_suite.ctest.in) !!!")
  146. endif()
  147. set(nonregression_filenames_used)
  148. # Parse the command line found in the file(s)
  149. set(IT_TEST_ENC 0)
  150. set(IT_TEST_DEC 0)
  151. foreach(OPJ_TEST_CMD_LINE ${OPJ_TEST_CMD_LINE_LIST})
  152. set(IGNORE_LINE_FOUND 0)
  153. # Replace space by ; to generate a list
  154. string(REPLACE " " ";" CMD_ARG_LIST ${OPJ_TEST_CMD_LINE})
  155. # Check if the first argument begin by the comment sign
  156. list(GET CMD_ARG_LIST 0 EXE_NAME)
  157. if(EXE_NAME)
  158. string(REGEX MATCH "^#" IGNORE_LINE_FOUND ${EXE_NAME})
  159. endif()
  160. if(IGNORE_LINE_FOUND OR NOT EXE_NAME)
  161. #message( STATUS "Current line is ignored: ${OPJ_TEST_CMD_LINE}")
  162. else()
  163. # Check if the first argument begin by the failed sign
  164. set(FAILED_TEST_FOUND 0)
  165. string(REGEX MATCH "^!" FAILED_TEST_FOUND ${EXE_NAME})
  166. if (FAILED_TEST_FOUND)
  167. # Manage the different cases with the failed sign to remove the first argument which must be opj_compress
  168. set(FAILED_TEST_FOUND_1 0)
  169. string(REGEX MATCH "^!opj_compress$|^!opj_decompress$" FAILED_TEST_FOUND_1 ${EXE_NAME})
  170. if (FAILED_TEST_FOUND_1)
  171. list(REMOVE_AT CMD_ARG_LIST 0)
  172. else ()
  173. set(FAILED_TEST_FOUND_2 0)
  174. list(GET CMD_ARG_LIST 1 EXE_NAME)
  175. string(REGEX MATCH "^opj_compress$|^opj_decompress$" FAILED_TEST_FOUND_2 ${EXE_NAME})
  176. if (FAILED_TEST_FOUND_2)
  177. list(REMOVE_AT CMD_ARG_LIST 0)
  178. list(REMOVE_AT CMD_ARG_LIST 0)
  179. else ()
  180. message( FATAL_ERROR "${EXE_NAME} is not the right executable name to encode file (try to use opj_compress or opj_decompress)")
  181. endif ()
  182. endif ()
  183. else ()
  184. # Check if the first argument is equal to opj_compress
  185. string(REGEX MATCH "^opj_compress$|^opj_decompress$" EXE_NAME_FOUND ${EXE_NAME})
  186. if(EXE_NAME_FOUND)
  187. string(REGEX MATCH "opj_compress" ENC_TEST_FOUND ${EXE_NAME})
  188. else()
  189. message( FATAL_ERROR "${EXE_NAME} is not the right executable name to encode file (try to use opj_compress)")
  190. endif()
  191. list(REMOVE_AT CMD_ARG_LIST 0)
  192. endif ()
  193. # Parse the argument list to find the input filename and output filename
  194. set(CMD_ARG_LIST_2 "")
  195. set(ARG_POS 0)
  196. set(INPUT_ARG_POS 0)
  197. set(OUTPUT_ARG_POS 0)
  198. foreach(CMD_ARG_ELT ${CMD_ARG_LIST})
  199. math(EXPR ARG_POS "${ARG_POS}+1" )
  200. string(COMPARE EQUAL ${CMD_ARG_ELT} "-i" INPUT_ARG_FOUND)
  201. if(INPUT_ARG_FOUND)
  202. set(INPUT_ARG_POS ${ARG_POS})
  203. set(INPUT_ARG_FOUND 0)
  204. endif()
  205. string(COMPARE EQUAL ${CMD_ARG_ELT} "-o" OUTPUT_ARG_FOUND)
  206. if(OUTPUT_ARG_FOUND)
  207. set(OUTPUT_ARG_POS ${ARG_POS})
  208. set(OUTPUT_ARG_FOUND 0)
  209. endif()
  210. list (APPEND CMD_ARG_LIST_2 ${CMD_ARG_ELT})
  211. endforeach()
  212. list(GET CMD_ARG_LIST_2 ${INPUT_ARG_POS} INPUT_FILENAME)
  213. get_filename_component(INPUT_FILENAME_NAME ${INPUT_FILENAME} NAME)
  214. get_filename_component(INPUT_FILENAME_NAME_WE ${INPUT_FILENAME_NAME} NAME_WE)
  215. list(GET CMD_ARG_LIST_2 ${OUTPUT_ARG_POS} OUTPUT_FILENAME)
  216. get_filename_component(OUTPUT_FILENAME_NAME_WE ${OUTPUT_FILENAME} NAME_WE)
  217. #-----
  218. # Now we can add the test suite corresponding to a line command in the file
  219. #-----
  220. # ENCODER TEST SUITE
  221. if(ENC_TEST_FOUND)
  222. math(EXPR IT_TEST_ENC "${IT_TEST_ENC}+1" )
  223. # Encode an image into the jpeg2000 format
  224. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode
  225. COMMAND opj_compress
  226. ${CMD_ARG_LIST_2}
  227. )
  228. if(FAILED_TEST_FOUND)
  229. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode PROPERTIES WILL_FAIL TRUE)
  230. else()
  231. # Dump the encoding file
  232. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-dump
  233. COMMAND opj_dump
  234. -i ${OUTPUT_FILENAME}
  235. -o ${OUTPUT_FILENAME}-ENC-${IT_TEST_ENC}.txt
  236. )
  237. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-dump
  238. PROPERTIES DEPENDS
  239. NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode)
  240. # Compare the dump file with the baseline
  241. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dump2base
  242. COMMAND compare_dump_files
  243. -b ${BASELINE_NR}/opj_v2_${OUTPUT_FILENAME_NAME_WE}-ENC-${IT_TEST_ENC}.txt
  244. -t ${OUTPUT_FILENAME}-ENC-${IT_TEST_ENC}.txt
  245. )
  246. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dump2base
  247. PROPERTIES DEPENDS
  248. NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-dump)
  249. # Decode the encoding file with kakadu expand command
  250. if (KDU_EXPAND_EXECUTABLE)
  251. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-decode-ref
  252. COMMAND ${KDU_EXPAND_EXECUTABLE}
  253. -i ${OUTPUT_FILENAME}
  254. -o ${OUTPUT_FILENAME}.raw
  255. )
  256. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-decode-ref
  257. PROPERTIES DEPENDS
  258. NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode)
  259. # Compare the decoding file with baseline generated from the kdu_expand and baseline.j2k
  260. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dec-ref-out2base
  261. COMMAND compare_raw_files
  262. -b ${BASELINE_NR}/opj_${OUTPUT_FILENAME_NAME_WE}-ENC-${IT_TEST_ENC}.raw
  263. -t ${OUTPUT_FILENAME}.raw
  264. )
  265. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dec-ref-out2base
  266. PROPERTIES DEPENDS
  267. NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-decode-ref)
  268. endif()
  269. # Test the encoded file is a valid JP2 file
  270. if (JPYLYZER_EXECUTABLE)
  271. if (${OUTPUT_FILENAME} MATCHES "\\.jp2$")
  272. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-jpylyser
  273. COMMAND ${JPYLYZER_EXECUTABLE}
  274. ${OUTPUT_FILENAME}
  275. )
  276. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-jpylyser PROPERTIES
  277. DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode
  278. PASS_REGULAR_EXPRESSION "<isValidJP2>True</isValidJP2>"
  279. )
  280. endif()
  281. endif(JPYLYZER_EXECUTABLE)
  282. # If lossless compression (simple test is 4 arguments), decompress & compare
  283. list(LENGTH CMD_ARG_LIST_2 ARG_COUNT)
  284. if (ARG_COUNT EQUAL 4)
  285. # can we compare with the input image ?
  286. if (${INPUT_FILENAME_NAME} MATCHES "\\.tif$")
  287. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-lossless-decode
  288. COMMAND opj_decompress -i ${OUTPUT_FILENAME} -o ${OUTPUT_FILENAME}.lossless.tif
  289. )
  290. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-lossless-decode PROPERTIES
  291. DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode
  292. )
  293. add_test(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-lossless-compare
  294. COMMAND compare_images -b ${INPUT_FILENAME} -t ${OUTPUT_FILENAME}.lossless.tif -n 1 -d
  295. )
  296. set_tests_properties(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-lossless-compare PROPERTIES
  297. DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-lossless-decode
  298. )
  299. endif()
  300. endif()
  301. endif()
  302. # DECODER TEST SUITE
  303. else()
  304. string(FIND ${INPUT_FILENAME} "nonregression" nr_pos)
  305. if(${nr_pos} GREATER 0)
  306. list(APPEND nonregression_filenames_used ${INPUT_FILENAME_NAME})
  307. endif()
  308. math(EXPR IT_TEST_DEC "${IT_TEST_DEC}+1" )
  309. # Decode the input image
  310. add_test(NAME NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode
  311. COMMAND opj_decompress
  312. ${CMD_ARG_LIST_2}
  313. )
  314. if(FAILED_TEST_FOUND)
  315. set_tests_properties(NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode PROPERTIES WILL_FAIL TRUE)
  316. else()
  317. # if not failed, check against registered md5:
  318. add_test(NAME NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode-md5 COMMAND ${CMAKE_COMMAND}
  319. -DREFFILE:STRING=${CMAKE_CURRENT_SOURCE_DIR}/md5refs.txt
  320. -DOUTFILENAME:STRING=${OUTPUT_FILENAME}
  321. -P ${CMAKE_CURRENT_SOURCE_DIR}/checkmd5refs.cmake)
  322. set_tests_properties(NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode-md5
  323. PROPERTIES DEPENDS NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode
  324. )
  325. # FIXME: add a compare2base function base on raw which
  326. # can output png diff files if necessary
  327. # add_test(NR-${filename}-compare2base
  328. # ${EXECUTABLE_OUTPUT_PATH}/compare_images
  329. # -b ${BASELINE_NR}/opj_${filenameRef}
  330. # -t ${TEMP}/${filename}.pgx
  331. # -n ${nbComponents}
  332. # -d
  333. # -s b_t_
  334. # )
  335. #
  336. # set_tests_properties(NR-${filename}-compare2base
  337. # PROPERTIES DEPENDS
  338. # NR-${filename}-decode)
  339. endif()
  340. endif()
  341. endif()
  342. endforeach()
  343. set(existing_filenames)
  344. foreach(f ${OPJ_DATA_NR_LIST})
  345. get_filename_component(ff ${f} NAME)
  346. list(APPEND existing_filenames ${ff})
  347. endforeach()
  348. if(existing_filenames)
  349. list(REMOVE_ITEM existing_filenames ${nonregression_filenames_used})
  350. endif()
  351. # keep track of new addition:
  352. # if we reach here, then a J2K files was added but no test is present in
  353. # test_suite.ctest.in:
  354. foreach(found_but_no_test ${existing_filenames})
  355. add_test(NAME Found-But-No-Test-${found_but_no_test} COMMAND ${CMAKE_COMMAND} -E echo "${found_but_no_test}")
  356. set_tests_properties(Found-But-No-Test-${found_but_no_test} PROPERTIES WILL_FAIL TRUE)
  357. endforeach()