summaryrefslogtreecommitdiffstatshomepage
path: root/cmake/RunTests.cmake
blob: c5c15bb08c53afd9475d33e948ea2d8866f1dc5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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)

# TODO(dundargoc): The CIRRUS_CI environment variable isn't passed to here from
# the main CMakeLists.txt, so we have to manually pass it to this script and
# re-set the environment variable. Investigate if we can avoid manually setting
# it like with the GITHUB_CI environment variable.
set(ENV{CIRRUS_CI} ${CIRRUS_CI})

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(
  # Note: because of "-ll" (low-level interpreter mode), some modules like
  # _core/editor.lua are not loaded.
  COMMAND ${NVIM_PRG} -ll ${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()