[Tarantool-patches] [PATCH v2 luajit 0/6] Revorking C tests

Sergey Kaplun skaplun at tarantool.org
Thu May 18 23:44:47 MSK 2023

The whole idea of the patch-set introduce module for LuaJIT C tests. It
also, can be used for unit tests.
* The first patch is the prerequisite for the patch-set. It fixes
  LD_LIBRARY_PATH definition.
* The 2nd and 3d patches provides an API and helper for writing the tests.
* The last 3 patches rewrite existing tests that should be written in C in
  the proper way.

Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-noticket-tarantool-c-tests
PR: https://github.com/tarantool/tarantool/pull/8444
Related Issue:
* https://github.com/tarantool/tarantool/issues/7900
* https://github.com/tarantool/tarantool/issues/781

Thanks Maxim, for the review!

I've fixed some Maxim comments and suggestions for the previous series.
Some ignorable comments about wording are ignored:).

Also, see answers for your questions below:

> >+if(NOT PROVE)
> >+ message(WARNING "`prove' is not found, so tarantool-c-tests target is not generated")
> >+ return()
> >+endif()
> There is the same check in the test/tarantool-tests/CMakeLists.txt. Maybe
> we should move it to the higher-level CMake so the lower-level CMakeLists
> inherit it.

I agree it maybe done, but not within this particular patchsett, so
ignoring for now.

> >+#define test_run_group(t_arr, t_state) \
> >+ _test_run_group(__func__, t_arr, lengthof(t_arr), t_state)
> Is there any reason for it to be a macro and not a function wrapper?
> I believe it is better to use the functions when possible, since they are
> easier to support and debug.

Just for the convenience in usage of __func__ macro as a test group name.

> >+/* Need for `strchr()` in diagnostic parsing. */
> `strchr()` is not safe, despite the fact it searches till `\0`.
> We should at least replace it with `memchr()`, which has
> the explicit constraint for buffer length.
> >+#include <string.h>

Yes, but:
1) We use it only for our test code, where we set this `\0` directly to
mark EOL.
2) It's simplier than use several marks in buffer.
So, ignoring for now.

> >+# vim: ft=cmake expandtab shiftwidth=2: tabstop=2:
> That change is not necessary.

Yes, but more convenient to use in vim -- since our usual codestyle isn't 4
tabs as its default for CMake. :)
Still we don't use it anywhere (unfortunately), so removed.

> >+ bail_out("failed to translate Lua code snippet");
> Why `bail_out` and not an assertion? Here and below.

Assertion is for some thing we wnat to test and may fail.
Bail out usage is more specific:
| As an emergency measure a test script can decide that further tests are
| useless (e.g. missing dependencies) and testing should stop immediately.
| In that case the test script prints the magic words
See [1]. I think that loading Lua script helper (dependency) is
something like that.

> >+#include "lj_arch.h"
> Side note: I don't like the approach with private headers, but
> I couldn't find any better way to check that. Maybe it is a good
> idea to implement a public C API function to get the information
> about OS and ARCH, since it is a really common to check them?

I think, that this is the best option, espessialy if we want to write
some unit test for some specific module (I mean <src/lj_*>).

Changes in v2:
1) use

| int _test_run_group(const char *group_name, const struct test_unit tests[],
| 		    size_t n_tests, void *test_state);

instead of

| int _test_run_group(const char *group_name, const struct test_unit *tests,
| 		    size_t n_tests, void *test_state);

2) `skip()` `skip_all()` and `todo()` helpers now return values to be
return to runner.
i.e. change usage from
| if (cond)
| 	skip("NIY");
| if (cond)
| 	return skip("NIY");

`bail_out()` helper still just exits with error code, which corresponding
its standard specification.

But now some parts of the code start to look "alya cringe":
| return todo("Need to replace backtrace with libunwind first");
| lua_State *L = test_state;
| utils_get_aux_lfunc(L);
| (void)luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE | LUAJIT_MODE_OFF);
| check_profile_func(L);
| (void)luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE | LUAJIT_MODE_ON);

(Yes, we want to use unconditional `todo()`).
So I commented the similar code, helper `check_profile_func()`, etc.
with `#if 0`.

3) In 4th patch use subtest group for snap-related tests to skip all at
once with disabled JIT.

4) lj-49-bad-lightuserdata is moved in C tests, too.

Sergey Kaplun (6):
  test: fix setting of {DY}LD_LIBRARY_PATH variables
  test: introduce module for C tests
  test: introduce utils.h helper for C tests
  test: rewrite misclib-getmetrics-capi test in C
  test: rewrite misclib-sysprof-capi test in C
  test: rewrite lj-49-bad-lightuserdata test in C

 .gitignore                                    |   1 +
 src/CMakeLists.txt                            |   2 +
 test/CMakeLists.txt                           |   2 +
 test/tarantool-c-tests/CMakeLists.txt         |  65 ++++
 .../lj-49-bad-lightuserdata.test.c}           |  47 +--
 .../misclib-getmetrics-capi-script.lua}       |  83 ++---
 .../misclib-getmetrics-capi.test.c            | 343 ++++++++++++++++++
 .../misclib-sysprof-capi-script.lua           |  35 ++
 .../misclib-sysprof-capi.test.c               | 325 +++++++++++++++++
 test/tarantool-c-tests/test.c                 | 251 +++++++++++++
 test/tarantool-c-tests/test.h                 | 217 +++++++++++
 test/tarantool-c-tests/utils.h                |  63 ++++
 test/tarantool-tests/CMakeLists.txt           |  12 +-
 .../lj-49-bad-lightuserdata.test.lua          |  11 -
 .../lj-49-bad-lightuserdata/CMakeLists.txt    |   1 -
 .../misclib-getmetrics-capi/CMakeLists.txt    |   1 -
 .../misclib-getmetrics-capi/testgetmetrics.c  | 270 --------------
 .../misclib-sysprof-capi.test.lua             |  54 ---
 .../misclib-sysprof-capi/CMakeLists.txt       |   1 -
 .../misclib-sysprof-capi/testsysprof.c        | 260 -------------
 20 files changed, 1374 insertions(+), 670 deletions(-)
 create mode 100644 test/tarantool-c-tests/CMakeLists.txt
 rename test/{tarantool-tests/lj-49-bad-lightuserdata/testlightuserdata.c => tarantool-c-tests/lj-49-bad-lightuserdata.test.c} (55%)
 rename test/{tarantool-tests/misclib-getmetrics-capi.test.lua => tarantool-c-tests/misclib-getmetrics-capi-script.lua} (68%)
 create mode 100644 test/tarantool-c-tests/misclib-getmetrics-capi.test.c
 create mode 100644 test/tarantool-c-tests/misclib-sysprof-capi-script.lua
 create mode 100644 test/tarantool-c-tests/misclib-sysprof-capi.test.c
 create mode 100644 test/tarantool-c-tests/test.c
 create mode 100644 test/tarantool-c-tests/test.h
 create mode 100644 test/tarantool-c-tests/utils.h
 delete mode 100644 test/tarantool-tests/lj-49-bad-lightuserdata.test.lua
 delete mode 100644 test/tarantool-tests/lj-49-bad-lightuserdata/CMakeLists.txt
 delete mode 100644 test/tarantool-tests/misclib-getmetrics-capi/CMakeLists.txt
 delete mode 100644 test/tarantool-tests/misclib-getmetrics-capi/testgetmetrics.c
 delete mode 100644 test/tarantool-tests/misclib-sysprof-capi.test.lua
 delete mode 100644 test/tarantool-tests/misclib-sysprof-capi/CMakeLists.txt
 delete mode 100644 test/tarantool-tests/misclib-sysprof-capi/testsysprof.c


More information about the Tarantool-patches mailing list