[Tarantool-patches] [PATCH v1 luajit 3/5] test: introduce utils.h helper for C tests

Sergey Kaplun skaplun at tarantool.org
Wed Mar 15 19:11:03 MSK 2023


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 <limits.h>
+#include <string.h>
+
+#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 <filename-script.lua>.
+ * 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



More information about the Tarantool-patches mailing list