Hi! Thanks for the patch! It, generally, LGTM, but with concerns about the skipcond-like implementation, I mentioned in review for the previous commit. -- Best regards, Maxim Kokryashkin     >Среда, 15 марта 2023, 19:14 +03:00 от Sergey Kaplun : >  >This header contains generic init and close for tests and helpers for >loading auxiliary Lua script with functions to run inside a C test. > >It will be properly used in the next commit. > >Part of tarantool/tarantool#7900 >--- > >Those introduced utils macros assume that we have the table on the top >of the Lua stack. So, after each test the stack should be stayed >"untouched". But if we push helper function or some value of the Lua >stack and them assertion fails, we exit from function without stack >cleaning. So we should try to avoid such situation whenever appropriate, >but don't be fanatical at this point -- if some assertion fails, we are >in troubles anyway. > >Don't use __FILE__ here, because it may contain relative path to the >file depending on CMake version or -fmacro-prefix-map= flag. > > test/tarantool-c-tests/utils.h | 63 ++++++++++++++++++++++++++++++++++ > 1 file changed, 63 insertions(+) > create mode 100644 test/tarantool-c-tests/utils.h > >diff --git a/test/tarantool-c-tests/utils.h b/test/tarantool-c-tests/utils.h >new file mode 100644 >index 00000000..cf668006 >--- /dev/null >+++ b/test/tarantool-c-tests/utils.h >@@ -0,0 +1,63 @@ >+#include >+#include >+ >+#include "lauxlib.h" >+#include "lua.h" >+#include "luajit.h" >+#include "lualib.h" >+ >+#include "test.h" >+ >+/* Generic init for our tests. */ >+static lua_State *utils_lua_init(void) >+{ >+ lua_State *L = luaL_newstate(); >+ if (!L) >+ bail_out("Can't init Lua state"); >+ /* Stop collector during library initialization. */ >+ lua_gc(L, LUA_GCSTOP, 0); >+ luaL_openlibs(L); >+ lua_gc(L, LUA_GCRESTART, -1); >+ return L; >+} >+ >+/* Generic close for our tests. */ >+static void utils_lua_close(lua_State *L) >+{ >+ lua_close(L); >+} >+ >+/* >+ * Load the pair to the test file . >+ * Each file should return the table with functions (named the >+ * same as the corresponding unit tests) to call in unit tests. >+ * Push the table with those functions on the Lua stack. >+ */ >+#define utils_load_aux_script(L) do { \ >+ /* \ >+ * Format script name. \ >+ * `__ABS_FILENAME__` is set via CMake. \ >+ */ \ >+ char script[PATH_MAX] = __ABS_FILENAME__; \ >+ char *file_suffix = strstr(script, ".test.c"); \ >+ strcpy(file_suffix, "-script.lua"); \ >+ \ >+ if (luaL_dofile((L), script) != LUA_OK) { \ >+ test_comment("Can't load %s: '%s'", script, \ >+ lua_tostring((L), -1)); \ >+ bail_out("Can't load auxiliary script"); \ >+ } \ >+ \ >+ if (!lua_istable((L), -1)) \ >+ bail_out("Returned value from script is not a table"); \ >+} while (0) >+ >+/* >+ * Accept a table on top of the Lua stack which containing the >+ * function named as the unit test we currently executing. >+ */ >+#define utils_get_aux_lfunc(L) do { \ >+ lua_getfield((L), -1, __func__); \ >+ if (!lua_isfunction((L), -1)) \ >+ bail_out("Can't get auxiliary test function"); \ >+} while (0) >-- >2.34.1