1# Define fish_tests. 2add_executable(fish_tests EXCLUDE_FROM_ALL 3 src/fish_tests.cpp) 4fish_link_deps_and_sign(fish_tests) 5 6# The "test" directory. 7set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test) 8 9# The directory into which fish is installed. 10set(TEST_INSTALL_DIR ${TEST_DIR}/buildroot) 11 12# The directory where the tests expect to find the fish root (./bin, etc) 13set(TEST_ROOT_DIR ${TEST_DIR}/root) 14 15# Copy tests files. 16file(GLOB TESTS_FILES tests/*) 17add_custom_target(tests_dir DEPENDS tests) 18 19if(NOT FISH_IN_TREE_BUILD) 20 add_custom_command(TARGET tests_dir 21 COMMAND ${CMAKE_COMMAND} -E copy_directory 22 ${CMAKE_SOURCE_DIR}/tests/ ${CMAKE_BINARY_DIR}/tests/ 23 COMMENT "Copying test files to binary dir" 24 VERBATIM) 25 26 add_dependencies(fish_tests tests_dir) 27endif() 28 29# Copy littlecheck.py 30configure_file(build_tools/littlecheck.py littlecheck.py COPYONLY) 31 32# Copy pexpect_helper.py 33configure_file(build_tools/pexpect_helper.py pexpect_helper.py COPYONLY) 34 35# Make the directory in which to run tests. 36# Also symlink fish to where the tests expect it to be. 37# Lastly put fish_test_helper there too. 38add_custom_target(tests_buildroot_target 39 COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_INSTALL_DIR} 40 COMMAND DESTDIR=${TEST_INSTALL_DIR} ${CMAKE_COMMAND} 41 --build ${CMAKE_CURRENT_BINARY_DIR} --target install 42 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/fish_test_helper 43 ${TEST_INSTALL_DIR}/${CMAKE_INSTALL_PREFIX}/bin 44 COMMAND ${CMAKE_COMMAND} -E create_symlink 45 ${TEST_INSTALL_DIR}/${CMAKE_INSTALL_PREFIX} 46 ${TEST_ROOT_DIR} 47 DEPENDS fish fish_test_helper) 48 49if(NOT FISH_IN_TREE_BUILD) 50 # We need to symlink share/functions for the tests. 51 # This should be simplified. 52 add_custom_target(symlink_functions 53 COMMAND ${CMAKE_COMMAND} -E create_symlink 54 ${CMAKE_CURRENT_SOURCE_DIR}/share/functions 55 ${CMAKE_CURRENT_BINARY_DIR}/share/functions) 56 add_dependencies(tests_buildroot_target symlink_functions) 57else() 58 add_custom_target(symlink_functions) 59endif() 60 61# Prep the environment for running the unit tests. 62add_custom_target(test_prep 63 # Add directories hard-coded into the tests 64 COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/data 65 COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/data 66 COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/temp 67 COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/temp 68 69 # Add the XDG_* directories 70 COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/xdg_data 71 COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/xdg_data 72 COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/xdg_config 73 COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/xdg_config 74 COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/xdg_runtime 75 COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_DIR}/xdg_runtime 76 77 DEPENDS tests_buildroot_target tests_dir 78 USES_TERMINAL) 79 80# Define our individual tests. 81# Each test is conceptually independent. 82# However when running all tests, we want to run them serially for sanity's sake. 83# So define both a normal target, and a serial variant which enforces ordering. 84foreach(TESTTYPE test serial_test) 85 add_custom_target(${TESTTYPE}_low_level 86 COMMAND env XDG_DATA_DIRS= 87 XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_data 88 XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_config 89 XDG_RUNTIME_DIR=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_runtime 90 ./fish_tests 91 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 92 DEPENDS fish_tests 93 USES_TERMINAL) 94 95 add_custom_target(${TESTTYPE}_fishscript 96 COMMAND 97 cd tests && 98 env XDG_DATA_DIRS= 99 XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_data 100 XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_config 101 XDG_RUNTIME_DIR=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_runtime 102 ${TEST_ROOT_DIR}/bin/fish test.fish 103 DEPENDS test_prep 104 USES_TERMINAL) 105 106 add_custom_target(${TESTTYPE}_interactive 107 COMMAND cd tests && 108 env XDG_DATA_DIRS= 109 XDG_DATA_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_data 110 XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_config 111 XDG_RUNTIME_DIR=${CMAKE_CURRENT_BINARY_DIR}/test/xdg_runtime 112 ${TEST_ROOT_DIR}/bin/fish interactive.fish 113 DEPENDS test_prep 114 USES_TERMINAL) 115endforeach(TESTTYPE) 116 117# Now add a dependency chain between the serial versions. 118# This ensures they run in order. 119add_dependencies(serial_test_low_level test_prep) 120add_dependencies(serial_test_fishscript serial_test_low_level) 121add_dependencies(serial_test_interactive serial_test_fishscript) 122 123 124add_custom_target(serial_test_high_level 125 DEPENDS serial_test_interactive serial_test_fishscript) 126 127# Create the 'test' target. 128# Set a policy so CMake stops complaining about the name 'test'. 129cmake_policy(PUSH) 130 131if(${CMAKE_VERSION} VERSION_LESS 3.11.0 AND POLICY CMP0037) 132 cmake_policy(SET CMP0037 OLD) 133endif() 134add_custom_target(test) 135cmake_policy(POP) 136add_dependencies(test serial_test_high_level) 137 138# Group test targets into a TestTargets folder 139set_property(TARGET test tests_dir 140 test_low_level 141 test_fishscript 142 test_interactive 143 test_fishscript test_prep 144 tests_buildroot_target 145 serial_test_high_level 146 serial_test_low_level 147 serial_test_fishscript 148 serial_test_interactive 149 symlink_functions 150 PROPERTY FOLDER cmake/TestTargets) 151