Skip to content

Commit 0bd1e9b

Browse files
committed
cmake: integrate Lua API tests
The commit 8ad443d ("cmake: introduce a module to build fuzzing tests") has added tests for LuaJIT. These tests are mostly written in C and test LuaJIT via the Lua C API. The patch integrates tests that are written in Lua and tests LuaJIT via the Lua API, see [1]. 1. ligurio/lua-c-api-tests#121 Closes tarantool#11401 NO_CHANGELOG=build NO_DOC=build NO_TEST=build
1 parent d324811 commit 0bd1e9b

File tree

3 files changed

+229
-6
lines changed

3 files changed

+229
-6
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,12 @@ include (cmake/rpm.cmake)
851851

852852
set(TARANTOOL_BIN $<TARGET_FILE:tarantool>)
853853

854+
if(ENABLE_FUZZER)
855+
add_compile_flags("C;CXX"
856+
"-fsanitize=fuzzer-no-link"
857+
)
858+
endif()
859+
854860
add_subdirectory(extra)
855861
add_subdirectory(test)
856862
add_subdirectory(proofs/tla/test)

cmake/BuildLuaTests.cmake

Lines changed: 169 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ set(LUA_TESTS_PREFIX
77
# The test `luaL_loadbuffer_proto_test` is not enabled, because
88
# it is quite similar to `luaL_loadbuffer_fuzzer` located in
99
# test/fuzz/luaL_loadbuffer/.
10-
string(JOIN ";" LUA_TESTS
10+
string(JOIN ";" CAPI_TESTS
1111
ffi_cdef_proto_test
1212
lua_dump_test
1313
luaL_gsub_test
@@ -43,7 +43,7 @@ endif()
4343

4444
include(ExternalProject)
4545

46-
set(GIT_REF "68e62715310f197f489f03a33dce501c0a2e4450")
46+
set(GIT_REF "51d08cf572256c9fbec8a23a551a05a901917518")
4747
# Git reference can be overridden with environment variable. It is
4848
# needed for checking build by project itself.
4949
if (DEFINED ENV{LUA_TESTS_GIT_REF})
@@ -64,10 +64,10 @@ ExternalProject_Add(${LUA_TESTS_TARGET_NAME}
6464
-B <BINARY_DIR>
6565
-G ${CMAKE_GENERATOR}
6666
"${LUA_TESTS_CMAKE_FLAGS}"
67-
BUILD_COMMAND cd <BINARY_DIR> && ${CMAKE_MAKE_PROGRAM} "${LUA_TESTS}"
67+
BUILD_COMMAND cd <BINARY_DIR> && ${CMAKE_MAKE_PROGRAM} "${CAPI_TESTS}"
6868
INSTALL_COMMAND ""
6969
CMAKE_GENERATOR ${CMAKE_GENERATOR}
70-
BUILD_BYPRODUCTS "${LUA_TESTS}"
70+
BUILD_BYPRODUCTS "${CAPI_TESTS}"
7171
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
7272
)
7373

@@ -81,7 +81,7 @@ add_dependencies(${LUA_TESTS_TARGET_NAME} libluajit_static)
8181
# environment variable `RUNS`.
8282
#
8383
# 1. https://github.com/ligurio/lua-c-api-tests/blob/ef74f0558bb913edef85e7a774fada4ecc82247b/tests/capi/CMakeLists.txt#L46-L58
84-
foreach(test ${LUA_TESTS})
84+
foreach(test ${CAPI_TESTS})
8585
set(test_title test/fuzz/${test})
8686
add_test(NAME ${test_title}
8787
COMMAND ${CMAKE_CTEST_COMMAND}
@@ -96,8 +96,171 @@ foreach(test ${LUA_TESTS})
9696
)
9797
endforeach()
9898

99+
set(DEFAULT_RUNS_NUMBER 5)
100+
101+
string(JOIN " " LIBFUZZER_OPTS
102+
-print_final_stats=1
103+
-print_pcs=1
104+
-reduce_inputs=1
105+
-reload=1
106+
-report_slow_units=5
107+
# Shell parameter expansion,
108+
# https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
109+
-runs=\${RUNS:-${DEFAULT_RUNS_NUMBER}}
110+
)
111+
112+
make_lua_path(LUA_PATH
113+
PATHS
114+
${LUZER_LUA_PATH}
115+
${CMAKE_CURRENT_SOURCE_DIR}/?.lua
116+
)
117+
118+
include(BuildLuzer)
119+
120+
list(APPEND LAPI_TEST_ENV
121+
"LUA_PATH=${LUA_PATH};"
122+
"LUA_CPATH=${LUZER_LUA_CPATH};"
123+
"ASAN_OPTIONS=detect_odr_violation=0;"
124+
"LD_DYNAMIC_WEAK=1"
125+
)
126+
127+
string(JOIN ";" LAPI_TESTS
128+
bitop_arshift_test.lua
129+
bitop_band_test.lua
130+
bitop_bnot_test.lua
131+
bitop_bor_test.lua
132+
bitop_bswap_test.lua
133+
bitop_bxor_test.lua
134+
bitop_lshift_test.lua
135+
bitop_rol_test.lua
136+
bitop_ror_test.lua
137+
bitop_rshift_test.lua
138+
bitop_tobit_test.lua
139+
bitop_tohex_test.lua
140+
builtin_assert_test.lua
141+
builtin_collectgarbage_test.lua
142+
builtin_concat_test.lua
143+
builtin_dofile_test.lua
144+
builtin_dostring_test.lua
145+
builtin_error_test.lua
146+
builtin_getfenv_test.lua
147+
builtin_getmetatable_test.lua
148+
builtin_ipairs_test.lua
149+
builtin_length_test.lua
150+
builtin_loadfile_test.lua
151+
builtin_loadstring_test.lua
152+
builtin_load_test.lua
153+
builtin_next_test.lua
154+
builtin_pairs_test.lua
155+
builtin_rawequal_test.lua
156+
builtin_rawget_test.lua
157+
builtin_rawset_test.lua
158+
builtin_select_test.lua
159+
builtin_setmetatable_test.lua
160+
builtin_tonumber_test.lua
161+
builtin_tostring_test.lua
162+
builtin_unpack_test.lua
163+
coroutine_torture_test.lua
164+
debug_torture_test.lua
165+
math_abs_test.lua
166+
math_acos_test.lua
167+
math_asin_test.lua
168+
math_atan_test.lua
169+
math_ceil_test.lua
170+
math_cos_test.lua
171+
math_deg_test.lua
172+
math_exp_test.lua
173+
math_floor_test.lua
174+
math_fmod_test.lua
175+
math_log_test.lua
176+
math_modf_test.lua
177+
math_pow_test.lua
178+
math_rad_test.lua
179+
math_randomseed_test.lua
180+
math_sin_test.lua
181+
math_sqrt_test.lua
182+
math_tan_test.lua
183+
math_tointeger_test.lua
184+
math_ult_test.lua
185+
os_date_test.lua
186+
os_difftime_test.lua
187+
os_getenv_test.lua
188+
os_setlocale_test.lua
189+
os_time_test.lua
190+
package_require_test.lua
191+
string_byte_test.lua
192+
string_char_test.lua
193+
string_dump_test.lua
194+
string_find_test.lua
195+
string_format_test.lua
196+
string_gmatch_test.lua
197+
string_gsub_test.lua
198+
string_len_test.lua
199+
string_lower_test.lua
200+
string_match_test.lua
201+
string_packsize_test.lua
202+
string_pack_test.lua
203+
string_rep_test.lua
204+
string_reverse_test.lua
205+
string_sub_test.lua
206+
string_unpack_test.lua
207+
string_upper_test.lua
208+
table_concat_test.lua
209+
table_create_test.lua
210+
table_foreachi_test.lua
211+
table_foreach_test.lua
212+
table_insert_test.lua
213+
table_maxn_test.lua
214+
table_move_test.lua
215+
table_pack_test.lua
216+
table_remove_test.lua
217+
table_sort_test.lua
218+
utf8_char_test.lua
219+
utf8_codepoint_test.lua
220+
utf8_codes_test.lua
221+
utf8_len_test.lua
222+
utf8_offset_test.lua
223+
)
224+
225+
function(create_lapi_test)
226+
cmake_parse_arguments(
227+
FUZZ
228+
""
229+
"FILENAME"
230+
""
231+
${ARGN}
232+
)
233+
get_filename_component(test_name ${FUZZ_FILENAME} NAME_WE)
234+
string(REPLACE "_test" "" test_prefix ${test_name})
235+
set(dict_path ${PROJECT_SOURCE_DIR}/corpus/${test_prefix}.dict)
236+
set(corpus_path ${PROJECT_SOURCE_DIR}/corpus/${test_prefix})
237+
if (EXISTS ${dict_path})
238+
set(LIBFUZZER_OPTS "${LIBFUZZER_OPTS} -dict=${dict_path}")
239+
endif ()
240+
if (EXISTS ${corpus_path})
241+
set(LIBFUZZER_OPTS "${LIBFUZZER_OPTS} ${corpus_path}")
242+
endif ()
243+
244+
add_test(NAME ${test_name}
245+
COMMAND ${BASH} -c "${LUAJIT_TEST_BINARY} ${FUZZ_FILENAME} ${LIBFUZZER_OPTS}"
246+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
247+
)
248+
set_tests_properties(${test_name} PROPERTIES
249+
LABELS "lapi"
250+
ENVIRONMENT "${LAPI_TEST_ENV}"
251+
DEPENDS ${LUAJIT_TEST_BINARY}
252+
)
253+
endfunction()
254+
255+
foreach(test_name ${LAPI_TESTS})
256+
create_lapi_test(FILENAME ${LUA_TESTS_PREFIX}/src/tests/lapi/${test_name})
257+
endforeach()
258+
259+
add_dependencies(lua-tests luzer-library)
260+
99261
unset(GIT_REF)
100-
unset(LUA_TESTS)
262+
unset(CAPI_TESTS)
263+
unset(LAPI_TESTS)
101264
unset(LUA_TESTS_CMAKE_FLAGS)
102265
unset(LUA_TESTS_PREFIX)
103266
unset(LUA_TESTS_TARGET_NAME)

cmake/BuildLuzer.cmake

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
set(LUZER_DIR ${PROJECT_BINARY_DIR}/luzer)
2+
set(LUZER_BUILD_DIR ${LUZER_DIR}/build)
3+
set(LUZER_LIBRARY_PATH ${LUZER_BUILD_DIR}/luzer)
4+
list(APPEND LUZER_LIBRARIES
5+
${LUZER_LIBRARY_PATH}/luzer/luzer.so
6+
${LUZER_LIBRARY_PATH}/luzer/libcustom_mutator.so
7+
)
8+
9+
include(ExternalProject)
10+
11+
list(APPEND LUZER_CMAKE_FLAGS
12+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
13+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
14+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
15+
-DLUA_INCLUDE_DIR=${PROJECT_SOURCE_DIR}/third_party/luajit/src/
16+
-DLUA_LIBRARIES=${LUA_LIBRARIES}
17+
-DLUAJIT_FRIENDLY_MODE=ON
18+
-DLUA_HAS_JIT=ON
19+
)
20+
21+
ExternalProject_Add(bundled-luzer
22+
GIT_REPOSITORY https://github.com/ligurio/luzer
23+
GIT_TAG 6e4d95a834a9c74f8a77acb4b2bf482add70f185
24+
GIT_PROGRESS TRUE
25+
GIT_SHALLOW FALSE
26+
SOURCE_DIR ${LUZER_DIR}/source
27+
BINARY_DIR ${LUZER_BUILD_DIR}
28+
TMP_DIR ${LUZER_DIR}/tmp
29+
STAMP_DIR ${LUZER_DIR}/stamp
30+
CONFIGURE_COMMAND
31+
${CMAKE_COMMAND} -B <BINARY_DIR> -S <SOURCE_DIR>
32+
-G ${CMAKE_GENERATOR} ${LUZER_CMAKE_FLAGS}
33+
BUILD_COMMAND cd <BINARY_DIR> && ${CMAKE_MAKE_PROGRAM}
34+
INSTALL_COMMAND ""
35+
CMAKE_GENERATOR ${CMAKE_GENERATOR}
36+
BUILD_BYPRODUCTS ${LUZER_LIBRARIES}
37+
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
38+
)
39+
40+
add_library(luzer-library STATIC IMPORTED GLOBAL)
41+
set_target_properties(luzer-library PROPERTIES
42+
IMPORTED_LOCATION "${LUZER_LIBRARIES}")
43+
add_dependencies(luzer-library bundled-luzer)
44+
45+
set(LUZER_LUA_PATH ${LUZER_DIR}/source/?/init.lua)
46+
set(LUZER_LUA_PATH ${LUZER_LUA_PATH} PARENT_SCOPE)
47+
48+
set(LUZER_LUA_CPATH ${LUZER_LIBRARY_PATH}/?${CMAKE_SHARED_LIBRARY_SUFFIX})
49+
set(LUZER_LUA_CPATH ${LUZER_LUA_CPATH} PARENT_SCOPE)
50+
51+
set(LUZER_LIBRARY luzer-library PARENT_SCOPE)
52+
53+
unset(LUZER_DIR)
54+
unset(LUZER_BUILD_DIR)

0 commit comments

Comments
 (0)