The CMakeOnly directory added by commit 9a20abf0 (Add infrastructure for CMake-only tests, 2012-01-11) was sufficient only for tests that always run CMake to successfully configure a project. Later commit eeaaffcb (find_package: Test error and warning messages in failure cases, 2012-02-28) added a sample test that covers failure cases. Generalize the above to create new "RunCMake" test infrastructure that can run CMake multiple times for a single project with different variations and check for expected result/stdout/stderr. Allow for both successful and failing CMake project configuration cases. This will be useful to test error messages and failure behavior.
70 lines
2.3 KiB
CMake
70 lines
2.3 KiB
CMake
foreach(arg
|
|
RunCMake_GENERATOR
|
|
RunCMake_SOURCE_DIR
|
|
RunCMake_BINARY_DIR
|
|
)
|
|
if(NOT DEFINED ${arg})
|
|
message(FATAL_ERROR "${arg} not given!")
|
|
endif()
|
|
endforeach()
|
|
|
|
function(run_cmake test)
|
|
set(top_src "${RunCMake_SOURCE_DIR}")
|
|
set(top_bin "${RunCMake_BINARY_DIR}")
|
|
if(EXISTS ${top_src}/${test}-result.txt)
|
|
file(READ ${top_src}/${test}-result.txt expect_result)
|
|
string(REGEX REPLACE "\n+$" "" expect_result "${expect_result}")
|
|
else()
|
|
set(expect_result 0)
|
|
endif()
|
|
foreach(o out err)
|
|
if(EXISTS ${top_src}/${test}-std${o}.txt)
|
|
file(READ ${top_src}/${test}-std${o}.txt expect_std${o})
|
|
string(REGEX REPLACE "\n+$" "" expect_std${o} "${expect_std${o}}")
|
|
else()
|
|
unset(expect_std${o})
|
|
endif()
|
|
endforeach()
|
|
set(source_dir "${top_src}")
|
|
set(binary_dir "${top_bin}/${test}-build")
|
|
file(REMOVE_RECURSE "${binary_dir}")
|
|
file(MAKE_DIRECTORY "${binary_dir}")
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} "${source_dir}"
|
|
-G "${RunCMake_GENERATOR}" -DRunCMake_TEST=${test}
|
|
WORKING_DIRECTORY "${binary_dir}"
|
|
OUTPUT_VARIABLE actual_stdout
|
|
ERROR_VARIABLE actual_stderr
|
|
RESULT_VARIABLE actual_result
|
|
)
|
|
set(msg "")
|
|
if(NOT "${actual_result}" STREQUAL "${expect_result}")
|
|
set(msg "${msg}Result is [${actual_result}], not [${expect_result}].\n")
|
|
endif()
|
|
foreach(o out err)
|
|
string(REGEX REPLACE "\n+$" "" actual_std${o} "${actual_std${o}}")
|
|
set(expect_${o} "")
|
|
if(DEFINED expect_std${o})
|
|
if(NOT "${actual_std${o}}" MATCHES "${expect_std${o}}")
|
|
string(REGEX REPLACE "\n" "\n expect-${o}> " expect_${o}
|
|
" expect-${o}> ${expect_std${o}}")
|
|
set(expect_${o} "Expected std${o} to match:\n${expect_${o}}\n")
|
|
set(msg "${msg}std${o} does not match that expected.\n")
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
if(msg)
|
|
string(REGEX REPLACE "\n" "\n actual-out> " actual_out " actual-out> ${actual_stdout}")
|
|
string(REGEX REPLACE "\n" "\n actual-err> " actual_err " actual-err> ${actual_stderr}")
|
|
message(SEND_ERROR "${test} - FAILED:\n"
|
|
"${msg}"
|
|
"${expect_out}"
|
|
"Actual stdout:\n${actual_out}\n"
|
|
"${expect_err}"
|
|
"Actual stderr:\n${actual_err}\n"
|
|
)
|
|
else()
|
|
message(STATUS "${test} - PASSED")
|
|
endif()
|
|
endfunction()
|