# Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
# file Copyright.txt or https://cmake.org/licensing for details. | |
# This is an undocumented internal helper for the FindMatlab | |
# module ``matlab_add_unit_test`` command. | |
# Usage: cmake | |
# -Dtest_timeout=180 | |
# -Doutput_directory= | |
# -Dadditional_paths="" | |
# -Dno_unittest_framework="" | |
# -DMatlab_PROGRAM=matlab_exe_location | |
# -DMatlab_ADDITIONAL_STARTUP_OPTIONS="" | |
# -Dtest_name=name_of_the_test | |
# -Dcustom_Matlab_test_command="" | |
# -Dcmd_to_run_before_test="" | |
# -Dunittest_file_to_run | |
# -P FindMatlab_TestsRedirect.cmake | |
set(Matlab_UNIT_TESTS_CMD -nosplash -nodesktop -nodisplay ${Matlab_ADDITIONAL_STARTUP_OPTIONS}) | |
if(WIN32) | |
set(Matlab_UNIT_TESTS_CMD ${Matlab_UNIT_TESTS_CMD} -wait) | |
endif() | |
if(NOT test_timeout) | |
set(test_timeout 180) | |
endif() | |
# If timeout is -1, then do not put a timeout on the execute_process | |
if(test_timeout EQUAL -1) | |
set(test_timeout "") | |
else() | |
set(test_timeout TIMEOUT ${test_timeout}) | |
endif() | |
if(NOT cmd_to_run_before_test) | |
set(cmd_to_run_before_test) | |
endif() | |
get_filename_component(unittest_file_directory "${unittest_file_to_run}" DIRECTORY) | |
get_filename_component(unittest_file_to_run_name "${unittest_file_to_run}" NAME_WE) | |
set(concat_string '${unittest_file_directory}') | |
foreach(s IN LISTS additional_paths) | |
if(NOT "${s}" STREQUAL "") | |
string(APPEND concat_string ", '${s}'") | |
endif() | |
endforeach() | |
if(custom_Matlab_test_command) | |
set(unittest_to_run "${custom_Matlab_test_command}") | |
else() | |
set(unittest_to_run "runtests('${unittest_file_to_run_name}'), exit(max([ans(1,:).Failed]))") | |
endif() | |
if(no_unittest_framework) | |
set(unittest_to_run "try, ${unittest_file_to_run_name}, catch err, disp('An exception has been thrown during the execution'), disp(err), disp(err.stack), exit(1), end, exit(0)") | |
endif() | |
set(Matlab_SCRIPT_TO_RUN | |
"addpath(${concat_string}); ${cmd_to_run_before_test}; ${unittest_to_run}" | |
) | |
# if the working directory is not specified then default | |
# to the output_directory because the log file will go there | |
# if the working_directory is specified it will override the | |
# output_directory | |
if(NOT working_directory) | |
set(working_directory "${output_directory}") | |
endif() | |
string(REPLACE "/" "_" log_file_name "${test_name}.log") | |
set(Matlab_LOG_FILE "${working_directory}/${log_file_name}") | |
set(devnull) | |
if(UNIX) | |
set(devnull INPUT_FILE /dev/null) | |
elseif(WIN32) | |
set(devnull INPUT_FILE NUL) | |
endif() | |
execute_process( | |
# Do not use a full path to log file. Depend on the fact that the log file | |
# is always going to go in the working_directory. This is because matlab | |
# on unix is a shell script that does not handle spaces in the logfile path. | |
COMMAND "${Matlab_PROGRAM}" ${Matlab_UNIT_TESTS_CMD} -logfile "${log_file_name}" -r "${Matlab_SCRIPT_TO_RUN}" | |
RESULT_VARIABLE res | |
${test_timeout} | |
OUTPUT_QUIET # we do not want the output twice | |
WORKING_DIRECTORY "${working_directory}" | |
${devnull} | |
) | |
if(NOT EXISTS ${Matlab_LOG_FILE}) | |
message( FATAL_ERROR "[MATLAB] ERROR: cannot find the log file ${Matlab_LOG_FILE}") | |
endif() | |
# print the output in any case. | |
file(READ ${Matlab_LOG_FILE} matlab_log_content) | |
message("Matlab test ${name_of_the_test} output:\n${matlab_log_content}") # if we put FATAL_ERROR here, the file is indented. | |
if(NOT (res EQUAL 0)) | |
message( FATAL_ERROR "[MATLAB] TEST FAILED Matlab returned ${res}" ) | |
endif() |