Search code examples
cmakectest

How to tell a test under cmake/ctest where to find its input data ... without changing hard-coded file names


Directory prj/test contains some test scripts t01.exe, t02.exe etc. Some of them need input data d01.dat etc, also provided in prj/test. The names of these data files are hard-coded in the tests, and I cannot easily change this. The control file CMakeLists.txt contains

enable_testing()
file(GLOB test_sources "t*")
foreach(test_src ${test_sources})
    string(REGEX REPLACE ".*/" "" test_name "${test_src}")
    string(REGEX REPLACE ".exe$" "" test_name "${test_name}")
    add_test(${test_name} "${test_src}")
endforeach(test_src)

I'm building the project in a subdirectory prj/build. ctest works fine ... until a test requires input data. Obviously, they are not found because they reside in prj/test whereas the test runs in prj/build/test.

Hence my questions:

  • What's the standard way to let the tests find their input data?
  • Is there a way that does not require copying the data (in case they are huge)?
  • True that symlinks don't work under Windows, and therefore are no acceptable solution?

Solution

  • add_test command accepts WORKING_DIRECTORY option. You can set this option to a directory where a test is located. So, the test will find its data file:

    add_test(NAME ${test_name} COMMAND "${test_src}"
             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    )