Files
neovim/cmake/RunTests.cmake
Lewis Russell 9432e6c1e2 test: run Lua harness with nvim -l
Problem:
The Lua test harness still ran through standalone -ll mode, so tests
depended on the low-level Lua path instead of the regular Nvim Lua
environment. That also meant os.exit() coverage had to carry an ASAN
workaround because Lua's raw process exit skipped Nvim teardown and let
LeakSanitizer interfere with the observed exit code.

Solution:
Run the harness and related fixtures with nvim -l. Patch os.exit() in
the main Lua state to exit through getout(), so scripts observe normal
Nvim shutdown while standalone -ll remains available for generator-style
scripts. As a consequence, the startup test can assert os.exit() without
disabling leak detection.

AI-assisted: Codex
2026-05-13 13:14:07 +01:00

137 lines
4.2 KiB
CMake

if(DEFINED TEST_PARALLEL_GROUP)
if(DEFINED ENV{TEST_FILE})
message(FATAL_ERROR "$TEST_FILE should not be used with parallel tests")
endif()
set(TEST_SUFFIX "_${TEST_PARALLEL_GROUP}")
string(REGEX REPLACE "[^A-Za-z0-9_]" "_" TEST_SUFFIX ${TEST_SUFFIX})
else()
set(TEST_SUFFIX "")
endif()
set(ENV{NVIM_TEST} "1")
# Set LC_ALL to meet expectations of some locale-sensitive tests.
set(ENV{LC_ALL} "en_US.UTF-8")
set(ENV{VIMRUNTIME} ${ROOT_DIR}/runtime)
set(TEST_XDG_PREFIX ${BUILD_DIR}/Xtest_xdg${TEST_SUFFIX})
set(ENV{XDG_CONFIG_HOME} ${TEST_XDG_PREFIX}/config)
set(ENV{XDG_DATA_HOME} ${TEST_XDG_PREFIX}/share)
set(ENV{XDG_STATE_HOME} ${TEST_XDG_PREFIX}/state)
set(ENV{NVIM_RPLUGIN_MANIFEST} ${BUILD_DIR}/Xtest_rplugin_manifest${TEST_SUFFIX})
unset(ENV{XDG_DATA_DIRS})
unset(ENV{NVIM}) # Clear $NVIM in case tests are running from Nvim. #11009
unset(ENV{TMUX}) # Nvim TUI shouldn't think it's running in tmux. #34173
# Prepare for running tests in ${TEST_XDG_PREFIX}.
file(MAKE_DIRECTORY ${TEST_XDG_PREFIX})
file(CREATE_LINK ${ROOT_DIR}/runtime ${TEST_XDG_PREFIX}/runtime SYMBOLIC)
file(CREATE_LINK ${ROOT_DIR}/src ${TEST_XDG_PREFIX}/src SYMBOLIC)
file(CREATE_LINK ${ROOT_DIR}/test ${TEST_XDG_PREFIX}/test SYMBOLIC)
file(CREATE_LINK ${ROOT_DIR}/README.md ${TEST_XDG_PREFIX}/README.md SYMBOLIC)
if(NOT DEFINED ENV{NVIM_LOG_FILE})
set(ENV{NVIM_LOG_FILE} ${BUILD_DIR}/nvim.log)
endif()
set(ENV{NVIM_LOG_FILE} "$ENV{NVIM_LOG_FILE}${TEST_SUFFIX}")
if(NVIM_PRG)
set(ENV{NVIM_PRG} "${NVIM_PRG}")
endif()
if(DEFINED ENV{TEST_FILE})
set(TEST_PATH "$ENV{TEST_FILE}")
elseif(DEFINED TEST_PARALLEL_GROUP)
set(TEST_PATH "${TEST_DIR}/${TEST_TYPE}/${TEST_PARALLEL_GROUP}")
else()
set(TEST_PATH "${TEST_DIR}/${TEST_TYPE}")
endif()
if(NOT DEFINED TEST_SUMMARY_FILE)
set(TEST_SUMMARY_FILE "-")
endif()
# Force $TEST_PATH to workdir-relative path ("test/…").
if(IS_ABSOLUTE ${TEST_PATH})
file(RELATIVE_PATH TEST_PATH "${ROOT_DIR}" "${TEST_PATH}")
endif()
separate_arguments(TEST_ARGS NATIVE_COMMAND $ENV{TEST_ARGS})
if(DEFINED ENV{TEST_TAG} AND NOT "$ENV{TEST_TAG}" STREQUAL "")
list(APPEND TEST_ARGS --tags $ENV{TEST_TAG})
endif()
if(DEFINED ENV{TEST_FILTER} AND NOT "$ENV{TEST_FILTER}" STREQUAL "")
list(APPEND TEST_ARGS --filter $ENV{TEST_FILTER})
endif()
if(DEFINED ENV{TEST_FILTER_OUT} AND NOT "$ENV{TEST_FILTER_OUT}" STREQUAL "")
list(APPEND TEST_ARGS --filter-out $ENV{TEST_FILTER_OUT})
endif()
# TMPDIR: for testutil.tmpname() and Nvim tempname().
set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir${TEST_SUFFIX}")
file(MAKE_DIRECTORY $ENV{TMPDIR})
# HISTFILE: do not write into user's ~/.bash_history
set(ENV{HISTFILE} "/dev/null")
if(NOT DEFINED ENV{TEST_TIMEOUT} OR "$ENV{TEST_TIMEOUT}" STREQUAL "")
set(ENV{TEST_TIMEOUT} 1200)
endif()
set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME}) # used by test/testutil.lua.
if(NOT WIN32)
# Tests assume POSIX "sh" and may fail if SHELL=fish. #24941 #6172
set(ENV{SHELL} sh)
endif()
execute_process(
COMMAND ${NVIM_PRG} -l ${ROOT_DIR}/test/runner.lua -v
--summary-file=${TEST_SUMMARY_FILE}
--helper=${TEST_DIR}/${TEST_TYPE}/preload.lua
--lpath=${BUILD_DIR}/?.lua
--lpath=${ROOT_DIR}/src/?.lua
--lpath=${ROOT_DIR}/runtime/lua/?.lua
--lpath=?.lua
${TEST_ARGS}
${TEST_PATH}
TIMEOUT $ENV{TEST_TIMEOUT}
WORKING_DIRECTORY ${TEST_XDG_PREFIX}
RESULT_VARIABLE res
${EXTRA_ARGS})
file(REMOVE_RECURSE ${TEST_XDG_PREFIX})
file(REMOVE_RECURSE $ENV{NVIM_RPLUGIN_MANIFEST})
file(REMOVE_RECURSE $ENV{TMPDIR})
macro(PRINT_NVIM_LOG)
file(READ $ENV{NVIM_LOG_FILE} out)
if(${TEST_SUMMARY_FILE} STREQUAL "-")
message(STATUS "$NVIM_LOG_FILE: $ENV{NVIM_LOG_FILE}\n${out}")
else()
file(APPEND ${TEST_SUMMARY_FILE} "$NVIM_LOG_FILE: $ENV{NVIM_LOG_FILE}\n${out}")
endif()
endmacro()
if(res)
message(STATUS "Tests exited non-zero: ${res}")
# Dump the logfile on CI (if not displayed and moved already).
if(CI_BUILD)
if(EXISTS $ENV{NVIM_LOG_FILE} AND NOT EXISTS $ENV{NVIM_LOG_FILE}.displayed)
PRINT_NVIM_LOG()
endif()
endif()
message(FATAL_ERROR "${TEST_TYPE} tests failed with error: ${res}")
endif()
if(CI_BUILD)
file(SIZE $ENV{NVIM_LOG_FILE} FILE_SIZE)
if(NOT ${FILE_SIZE} MATCHES "^0$")
PRINT_NVIM_LOG()
message(FATAL_ERROR "$NVIM_LOG_FILE is not empty")
endif()
endif()