diff --git a/CMakeLists.txt b/CMakeLists.txt index b9981fdc8..9910bfc6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -494,6 +494,62 @@ if(LIBXML2_WITH_TESTS) add_test(NAME testdict COMMAND testdict) add_test(NAME testparser COMMAND testparser WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_test(NAME testrecurse COMMAND testrecurse WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + + + function(ADD_SUITE test_dir program) + file(GLOB_RECURSE files_to_process CONFIGURE_DEPENDS "./test/${test_dir}/*.script") + + foreach(file_path ${files_to_process}) + file(RELATIVE_PATH file_relative "${CMAKE_CURRENT_SOURCE_DIR}" "${file_path}") + get_filename_component(dir_path ${file_relative} DIRECTORY) + get_filename_component(base_name ${file_relative} NAME_WE) + get_filename_component(extension ${file_relative} EXT) + + set(actual_stdout "${CMAKE_CURRENT_BINARY_DIR}/result/${test_dir}/${base_name}") + set(actual_stderr "${CMAKE_CURRENT_BINARY_DIR}/result/${test_dir}/${base_name}.err") + set(expected_stdout "${CMAKE_CURRENT_SOURCE_DIR}/result/${test_dir}/${base_name}") + set(expected_stderr "${CMAKE_CURRENT_SOURCE_DIR}/result/${test_dir}/${base_name}.err") + + set(xml_path "${CMAKE_CURRENT_SOURCE_DIR}/${dir_path}/${base_name}.xml") + set(sgml_path "${CMAKE_CURRENT_SOURCE_DIR}/${dir_path}/${base_name}.sgml") + + if(EXISTS "${xml_path}") + set(input_file "./${dir_path}/${base_name}.xml") + elseif(EXISTS "${sgml_path}") + set(input_file "./${dir_path}/${base_name}.sgml") + else() + message(FATAL_ERROR "Neither XML nor SGML exists for: ${dir_path}/${base_name}") + endif() + + add_test( + NAME ${test_dir}_${base_name} + COMMAND ${CMAKE_COMMAND} + -DPROG=$ + -DSTDIN=./${dir_path}/${base_name}.script + -DXML=${input_file} + -DSTDOUT=${actual_stdout} + -DSTDERR=${actual_stderr} + -DEXPECTED_STDOUT=${expected_stdout} + -DEXPECTED_STDERR=${expected_stderr} + -DWORKDIR=${CMAKE_CURRENT_SOURCE_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/run_and_diff.cmake + ) + + endforeach() + endfunction() + + add_suite("scripts" xmllint) + add_suite("catalogs" xmlcatalog) + + add_test( + NAME catalog_add_del + COMMAND ${CMAKE_COMMAND} + -DXMLCAT=$ + -DEXPECTED_FULL=${CMAKE_CURRENT_SOURCE_DIR}/result/catalogs/mycatalog.full + -DEXPECTED_EMPTY=${CMAKE_CURRENT_SOURCE_DIR}/result/catalogs/mycatalog.empty + -P ${CMAKE_CURRENT_SOURCE_DIR}/test_xmlcatalog_add_del.cmake + ) + endif() if(LIBXML2_WITH_DOCS OR LIBXML2_WITH_PYTHON) diff --git a/run_and_diff.cmake b/run_and_diff.cmake new file mode 100644 index 000000000..81a113efd --- /dev/null +++ b/run_and_diff.cmake @@ -0,0 +1,44 @@ +# Ensure output directory exists +get_filename_component(_outdir "${STDOUT}" DIRECTORY) +file(MAKE_DIRECTORY "${_outdir}") + +# Run the program +execute_process( + COMMAND "${PROG}" --shell "${XML}" + INPUT_FILE "${STDIN}" + OUTPUT_FILE "${STDOUT}" + ERROR_FILE "${STDERR}" + RESULT_VARIABLE rc + WORKING_DIRECTORY "${WORKDIR}" + ) + +if(NOT rc EQUAL 0) + message(STATUS "Program exited with ${rc}") +endif() + +# Diff stdout +if(NOT EXISTS "${EXPECTED_STDOUT}") + message(FATAL_ERROR "Missing expected stdout file: ${EXPECTED_STDOUT}") +endif() + +execute_process( + COMMAND ${CMAKE_COMMAND} -E compare_files + "${STDOUT}" "${EXPECTED_STDOUT}" + RESULT_VARIABLE cmp_stdout +) + +if(NOT cmp_stdout EQUAL 0) + message(FATAL_ERROR "stdout does not match expected") +endif() + +# Diff stderr if it exists +if(EXISTS "${EXPECTED_STDERR}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E compare_files + "${STDERR}" "${EXPECTED_STDERR}" + RESULT_VARIABLE cmp_stderr + ) + if(NOT cmp_stderr EQUAL 0) + message(FATAL_ERROR "stderr does not match expected") + endif() +endif() diff --git a/test_xmlcatalog_add_del.cmake b/test_xmlcatalog_add_del.cmake new file mode 100644 index 000000000..c124e5970 --- /dev/null +++ b/test_xmlcatalog_add_del.cmake @@ -0,0 +1,35 @@ +# test_xmlcatalog_add_del.cmake +cmake_minimum_required(VERSION 3.16) + +set(WORK "${CMAKE_CURRENT_BINARY_DIR}/catalog_add_del_work") +file(REMOVE_RECURSE "${WORK}") +file(MAKE_DIRECTORY "${WORK}") + +set(CAT "${WORK}/mycatalog") + +# small helper macro (shorter execute_process) +macro(run) + execute_process(COMMAND ${ARGV} RESULT_VARIABLE rv) + if(rv) + message(FATAL_ERROR "Command failed: ${ARGV}") + endif() +endmacro() + +# 1. Create +run("${XMLCAT}" --create --noout "${CAT}") + +# 2. Adds +run("${XMLCAT}" --noout --add public Pubid sysid "${CAT}") +run("${XMLCAT}" --noout --add public Pubid2 sysid2 "${CAT}") +run("${XMLCAT}" --noout --add public Pubid3 sysid3 "${CAT}") + +# Check full contents +run(${CMAKE_COMMAND} -E compare_files "${CAT}" "${EXPECTED_FULL}") + +# 3. Deletes +run("${XMLCAT}" --noout --del sysid "${CAT}") +run("${XMLCAT}" --noout --del sysid3 "${CAT}") +run("${XMLCAT}" --noout --del sysid2 "${CAT}") + +# Check empty contents +run(${CMAKE_COMMAND} -E compare_files "${CAT}" "${EXPECTED_EMPTY}")