Tarantool development patches archive
 help / color / mirror / Atom feed
From: Sergey Bronnikov via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: Sergey Kaplun <skaplun@tarantool.org>
Cc: Sergey Bronnikov <estetus@gmail.com>,
	max.kokryashkin@gmail.com, tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH luajit][v3] cmake: replace prove with CTest
Date: Fri, 22 Mar 2024 16:06:46 +0300	[thread overview]
Message-ID: <c3e4b7e9-bf6b-4490-8df8-dda89a1ef8ea@tarantool.org> (raw)
In-Reply-To: <ZfwXYQ3YXbHH6ZtA@root>

Sergey,

thanks for the answers. See my comments.


On 3/21/24 14:17, Sergey Kaplun wrote:
> Hi, Sergey!
> Thanks for the fixes!
> Please consider my concerns below.
> I suggest moving our conversation forward with the new patch version.
>
> On 20.03.24, Sergey Bronnikov wrote:
>> Sergey,
>>
>> thanks for review!
>>
>> see my comments below
>>
>> On 3/18/24 18:54, Sergey Kaplun wrote:
> <snipped>
>
>>>> 1. https://cmake.org/cmake/help/latest/manual/ctest.1.html
>>>> 2. https://cmake.org/cmake/help/book/mastering-cmake/chapter/Testing%20With%20CMake%20and%20CTest.html
>>>> 3. https://gitlab.kitware.com/cmake/cmake/-/issues/8774
>>>> 4. https://cmake.org/cmake/help/latest/prop_test/FIXTURES_REQUIRED.html
>>>> 5. https://cmake.org/cmake/help/latest/prop_test/FIXTURES_SETUP.html
>>>> ---
>>>> Changes v3:
>>>> - rebased to master
>>>> - applied fixes suggested by Igor Munkin
>>>>
>>>> PR: https://github.com/tarantool/tarantool/pull/9286
>>>> Branch: https://github.com/tarantool/luajit/tree/ligurio/enable_test_target
>>>>
>>>>    .gitignore                                |  2 +
>>>>    CMakeLists.txt                            | 11 ++++
>>>>    test/CMakeLists.txt                       | 78 +++++++++++++++--------
>>>>    test/LuaJIT-tests/CMakeLists.txt          | 40 +++++++-----
>>>>    test/LuaJIT-tests/src/CMakeLists.txt      |  2 +-
>>>>    test/PUC-Rio-Lua-5.1-tests/CMakeLists.txt | 25 +++++---
>>>>    test/lua-Harness-tests/CMakeLists.txt     | 48 ++++++++------
>>>>    test/tarantool-c-tests/CMakeLists.txt     | 56 ++++++++--------
>>>>    test/tarantool-tests/CMakeLists.txt       | 62 ++++++++----------
>>>>    9 files changed, 194 insertions(+), 130 deletions(-)
>>>>
>>>> diff --git a/.gitignore b/.gitignore
>>>> index dc5ea5fc..dd1f8888 100644
>>>> --- a/.gitignore
>>>> +++ b/.gitignore
>>> <snipped>
>>>
>>>> diff --git a/CMakeLists.txt b/CMakeLists.txt
>>>> index 7f5e2afb..6b2f855f 100644
>>>> --- a/CMakeLists.txt
>>>> +++ b/CMakeLists.txt
>>>> @@ -345,6 +345,13 @@ set(LUAJIT_TEST_BINARY ${LUAJIT_BINARY} CACHE STRING
>>>>      "Lua implementation to be used for tests. Default is 'luajit'."
>>>>    )
>>>>    
>>>> +# If LuaJIT is used in a parent project, provide an option
>>>> +# to choose what dependencies to be used for running and building
>>>> +# LuaJIT tests.
>>>> +set(LUAJIT_TEST_DEPS "luajit-main" CACHE STRING
>>>> +  "A list of target dependencies to be used for tests."
>>>> +)
>>> Why do we use luajit-main as a target dependency for tests?
>>> Why can't LUAJIT_TEST_BINARY be used instead where it is necessary (not
>>> in tarantool-c-tests)?
> See my comment below.
>
>>>> +
>>>>    # FIXME: If LuaJIT is used in parent project, provide an option
>>>>    # to pass Lua code to be run before tests are started.
>>>>    # XXX: Attentive reader might point to LUA_INIT environment
>>>> @@ -362,6 +369,10 @@ set(LUAJIT_TEST_INIT "${PROJECT_SOURCE_DIR}/test/luajit-test-init.lua" CACHE STR
>>>>      "Lua code need to be run before tests are started."
>>>>    )
>>>>    
>>>> +# XXX: Enable testing via CTest. Since CTest expects to find a
>>>> +# test file in the build directory root, this command should be in
>>> Nit: I suggest to mentioning that this command generates "test" target.
>>> Something like the following:
>>> | # XXX: Enable testing via CTest. This generates `test` target.
>> Added:
>>
>> --- a/CMakeLists.txt
>> +++ b/CMakeLists.txt
>> @@ -369,9 +369,10 @@ set(LUAJIT_TEST_INIT
>> "${PROJECT_SOURCE_DIR}/test/luajit-test-init.lua" CACHE STR
>>      "Lua code need to be run before tests are started."
>>    )
>>
>> -# XXX: Enable testing via CTest. Since CTest expects to find a
>> -# test file in the build directory root, this command should be in
>> -# the source directory root (hence, in this CMakeLists.txt).
>> +# XXX: Enable testing via CTest. This automatically generates
>> +# `test` target. Since CTest expects to find a test file in
> Typo: s/`test`/the `test`/

Fixed.


>
>> +# the build directory root, this command should be in the source
>> +# directory root (hence, in this CMakeLists.txt).
>>    enable_testing()
>>    add_subdirectory(test)
>>
>>
> <snipped>
>
>>> Unfortunately, this flag does nothing for `make test` command.
>>> Is there the way to fix it?
>> Yes, in CMake 3.17+. This version introduces CMAKE_CTEST_ARGUMENTS that
>> contains
>> CTest options and is used by `test` target. As a comment says.
>>
>> BTW you can fix it by using CMake workflows and specify any CTest
>> arguments you want in CMakePreset.json.
> I got it thanks for the clarification!
> May you please add a comment with the "FIXME:" mark and mention the
> CMake version and the CMAKE_CTEST_ARGUMENTS variable?

Already there, see v4.


>>> BTW `make LuaJIT-tests` or `make tarantool-tests` work fine.
>> Sure, these are our own targets and we pass desired CTest options to it.
>>>> +  --output-on-failure
>>>> +  --schedule-random
>>>> +  --parallel ${CMAKE_BUILD_PARALLEL_LEVEL}
>>> I suppose it will be good to add the `--timeout` option here too.
>>> 5 minutes as a timeout for the single test sounds more than enough.
>>>
>> Added.
> Unfortunately, as you mentioned offline, for some builds [1], even 5
> minutes is not enough:
> | 211/211 Test #109: test/tarantool-tests/lj-1034-tabov-error-frame.test.lua ........................***Timeout 300.54 sec
> I suggest increasing the timeout to 30 minutes.
>
Already updated and added comment with explanation.


>>>> +)
>>>> +if(CMAKE_VERBOSE_MAKEFILE)
>>>> +  list(APPEND TEST_FLAGS --verbose)
>>>> +endif()
>>>> +
>>>> +function(add_test_suite_target target)
>>>> +  set(prefix ARG)
>>>> +  set(noValues)
>>>> +  set(singleValues LABEL)
>>>> +  set(multiValues DEPENDS)
>>>> +
>>>> +  # FIXME: if we update to CMake >= 3.5, can remove this line.
>>>> +  include(CMakeParseArguments)
>>>> +  cmake_parse_arguments(${prefix}
>>>> +                        "${noValues}"
>>>> +                        "${singleValues}"
>>>> +                        "${multiValues}"
>>>> +                        ${ARGN})
>>>> +
>>>> +  set(_DEPS_TARGET ${target}-deps)
>>>> +
>>>> +  add_custom_target(${_DEPS_TARGET} DEPENDS ${ARG_DEPENDS})
>>>> +
>>>> +  add_test(${_DEPS_TARGET}
>>> Should the NAME parameter be ${target} instead?
>> Added.
> Sorry, I've misguided you with my comment. I thought that we should name
> the test as "${target}", not "${_DEPS_TARGET}" (I hadn't gotten the idea
> of proxy targets before, but I'm OK with it now).
> Please revert this change.
> My bad.

Actually nothing bad is happen.

Change below was made after your comment:


@@ -107,10 +114,10 @@ function(add_test_suite_target target)

    add_custom_target(${_DEPS_TARGET} DEPENDS ${ARG_DEPENDS})

-  add_test(${_DEPS_TARGET}
-           ${CMAKE_COMMAND}
-             --build ${CMAKE_BINARY_DIR}
-             --target ${_DEPS_TARGET}
+  add_test(NAME ${_DEPS_TARGET}
+    COMMAND ${CMAKE_COMMAND}
+            --build ${CMAKE_BINARY_DIR}
+            --target ${_DEPS_TARGET}
    )
    set_tests_properties(${_DEPS_TARGET} PROPERTIES
      LABELS ${target}

Seems according to BNF in [1] `NAME` is required before test name  in 
`add_test`.

But in fact `NAME` can be omitted. I would left `NAME` to be consistent 
with CMake documentation.


1. https://cmake.org/cmake/help/latest/command/add_test.html




> Also, please add the comment that this proxy test allows us to be sure that
> all prerequisites must be built or generated before the main test
> execution.

Added.

--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -96,6 +96,17 @@ if(CMAKE_VERBOSE_MAKEFILE)
    list(APPEND CTEST_FLAGS --verbose)
  endif()

+# It is not possible to add dependencies to `add_test()`
+# in CMake, see [1]. CMake 3.7 introduces FIXTURES_REQUIRED [2]
+# and FIXTURES_SETUP [3], but these test properties cannot be
+# used - it is unsupported in a current CMake version.
+# To workaround this a function `add_test_suite_target` is
+# introduced, it adds a CMake target that builds testsuite's
+# prerequisites and CMake test that executes that target.
+#
+# 1. https://gitlab.kitware.com/cmake/cmake/-/issues/8774
+# 2. https://cmake.org/cmake/help/latest/prop_test/FIXTURES_REQUIRED.html
+# 3. https://cmake.org/cmake/help/latest/prop_test/FIXTURES_SETUP.html
  function(add_test_suite_target target)
    set(prefix ARG)
    set(noValues)

>>
>>> Or, maybe this line
>>> should be ommitted since it is also used for normal test targets with
>>> several tests.
>> CMake test for a target with dependencies must be generated,
>>
>> otherwise dependencies will not be built.
>>
>>> For now `ctest -N` output looks a little bit inconsistent:
>>>
>>> | Test project /home/burii/reviews/luajit/ctest
>>> |   Test   #1: LuaJIT-tests-deps
>>> |   Test   #2: test/LuaJIT-tests
>>> |   Test   #3: PUC-Rio-Lua-5.1-tests-deps
>>> |   Test   #4: test/PUC-Rio-Lua-5.1
>>> |   Test   #5: lua-Harness-tests-deps
>>> |   Test   #6: test/lua-Harness-tests/000-sanity.t
>>> |   ...
>>> |   Test  #56: tarantool-c-tests-deps
>>> |   Test  #57: test/tarantool-c-tests/fix-yield-c-hook.c_test
>>> |   ...
>>> |   Test  #67: tarantool-tests-deps
>>> |   Test  #68: test/tarantool-tests/arm64-ccall-fp-convention.test.lua
>>> |   ...
>>>
>>> If tests like the following are needed to run tests, I suggest naming
>>> them like `LuaJIT-tests-build` to avoid confusion.
>> AFAIR this naming was suggested by Igor.
>>
>> What kind of confusion you observe? For me something like
> That we are really testing something with this strange name.
> OK, my bad ignore it.
>
>> `LuaJIT-tests-build`  much more confusing than "xxx-deps".
>>
>>> |   Test   #1: LuaJIT-tests-deps
> OK, let's leave it as it is.
>
> <snipped>
>
>>>> -add_custom_target(${PROJECT_NAME}-test DEPENDS
>>>> -  LuaJIT-tests
>>>> -  PUC-Rio-Lua-5.1-tests
>>>> -  lua-Harness-tests
>>>> -  tarantool-c-tests
>>>> -  tarantool-tests
>>>> +add_custom_target(${PROJECT_NAME}-test
>>>> +  COMMAND ${CMAKE_CTEST_COMMAND} ${TEST_FLAGS}
>>> Why do we need to use custom command for this test?
>>> IINM, all "subtargets" are used the same ${TEST_FLAGS}
>>> See also Igor's comment about this test.
>> Answered to Igor.
>>
>> because output will be ugly in that case,
>>
>> just change as you suggest and run LuaJIT-test.
> Please, mention the desired output format in the comment.
@@ -137,6 +148,13 @@ add_subdirectory(lua-Harness-tests)
  add_subdirectory(tarantool-c-tests)
  add_subdirectory(tarantool-tests)

+# Each testsuite has it's own CMake target, but combining these
+# target to a single one is not desired, because each target
+# runs it's own ctest command, that each time enumerates tests
+# from zero and prints test summary at the end of test run.
+# For common target this output looks inconvenient.
+# Therefore target below executes a single instance of ctest
+# command that runs all generated CMake tests.
  add_custom_target(${PROJECT_NAME}-test
    COMMAND ${CMAKE_CTEST_COMMAND} ${CTEST_FLAGS}
    DEPENDS tarantool-c-tests-deps

>
> <snipped>
>
>>>>    
>>>>    set(LD_LIBRARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/src/:")
>>>> @@ -50,10 +46,11 @@ if(LUAJIT_USE_ASAN)
>>>>      if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
>>>>        LibRealPath(LIB_ASAN libasan.so)
>>>>        # XXX: Don't use " " (separator in LD_PRELOAD) in `list()`.
>>>> -    # ";" will expand to " " as we want.
>>>> -    list(APPEND LUAJIT_TESTS_ENV LD_PRELOAD="${LIB_ASAN};${LIB_STDCPP}")
>>>> +    # ";" will expand to " " as we want after wrapping
>>> This is not true. After these changes the environment variable
>>> `LD_PRELOAD` is the following:
>>> | LD_PRELOAD=/usr/lib/gcc/x86_64-pc-linux-gnu/13/libasan.so.8.0.0;/usr/lib/gcc/x86_64-pc-linux-gnu/13/libstdc++.so.6.0.32
>>> But it should be:
>>> | LD_PRELOAD="/usr/lib/gcc/x86_64-pc-linux-gnu/13/libasan.so.8.0.0 /usr/lib/gcc/x86_64-pc-linux-gnu/13/libstdc++.so.6.0.32"
>>> This is why this quotes is used.
>>> For some reason, with the debug flags, paths are separated via \n:
>>> | 2:  LD_PRELOAD=/usr/lib/gcc/x86_64-pc-linux-gnu/13/libasan.so.8.0.0
>>> | 2:  /usr/lib/gcc/x86_64-pc-linux-gnu/13/libstdc++.so.6.0.32
>>>
>>> So, I got the following error, when I build LuaJIT with GCC and use the
>>> flag `-DLUAJIT_ENABLE_ASAN`:
>>> | AddressSanitizer: CHECK failed: asan_interceptors.cpp:335 "((__interception::real___cxa_throw)) != (0)" (0x0, 0x0) (tid=28264)
>>> |   #0 0x7f0c5d13b545 in CheckUnwind /var/tmp/portage/sys-devel/gcc-13.2.1_p20240113-r1/work/gcc-13-20240113/libsanitizer/asan/asan_rtl.cpp:69
>>>
>> Fixed.
>>
>> Unfortunately there is a yet another test that will never worked in
>> configuration GCC + ASAN.
>>
>> Currently it is disabled when LUAJIT_USE_ASAN is enabled. I can try to
>> fix it, but as
>>
>> it was never worked before we don't need to do it in scope of ctest support.
> It works in our CI, where we use the clang build.
>
> For now, we may just disable this test for GCC + clang build with the
> link to the issue.


Added:


--- a/test/tarantool-tests/CMakeLists.txt
+++ b/test/tarantool-tests/CMakeLists.txt
@@ -123,7 +123,8 @@ foreach(test_path ${tests})
    )
  endforeach()

-# Test is broken when GCC with enabled ASAN is used.
+# Test is broken when GCC with enabled ASAN is used,
+# see https://github.com/tarantool/tarantool/issues/9856.
  if (LUAJIT_USE_ASAN AND (CMAKE_C_COMPILER_ID STREQUAL "GNU"))
    set(test_title 
test/tarantool-tests/lj-802-panic-at-mcode-protfail.test.lua)
    set_tests_properties(${test_title} PROPERTIES

>
> On branch, you're using global LD_PRELOAD from the aforementioned test
> (lj-802-panic-at-mcode-protfail.test.lua). As a result, tons of tests
> fail with the following error:
> | got:  PANIC: unprotected error in call to Lua API (runtime code generation failed, restricted kernel?)
>
> May be it is better to proxy parent LD_PRELOAD to the test instead?
Ok
>
>> diff --git a/test/LuaJIT-tests/CMakeLists.txt
>> b/test/LuaJIT-tests/CMakeLists.txt
>> index 0c85f15c..4c9cf901 100644
>> --- a/test/LuaJIT-tests/CMakeLists.txt
>> +++ b/test/LuaJIT-tests/CMakeLists.txt
>> @@ -29,27 +29,39 @@ if(LUAJIT_USE_ASAN)
>>      # https://github.com/google/sanitizers/issues/934.
>>      macro(LibRealPath output lib)
>>        execute_process(
>> -      COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=${lib}
>> +      COMMAND ${CMAKE_C_COMPILER} -print-file-name=${lib}
> Please mention in the comment that the C++ and C compilers use the same
> tooling, so the returned library path is the same.

Already commented in v4:

        # CMAKE_C_COMPILER is used because it has the same behaviour
         # as CMAKE_CXX_COMPILER, but CMAKE_CXX_COMPILER is not required
         # for building LuaJIT and can be missed in GH Actions.
         COMMAND ${CMAKE_C_COMPILER} -print-file-name=${lib}
         OUTPUT_VARIABLE LIB_LINK
OUTPUT_STRIP_TRAILING_WHITESPACE
         RESULT_VARIABLE RES

>
>>          OUTPUT_VARIABLE LIB_LINK
>>          OUTPUT_STRIP_TRAILING_WHITESPACE
>> +      TIMEOUT 5
> Why do we need timeout here? (*)
Removed in v4.
>
>> +      RESULT_VARIABLE RES
>>        )
>> +    if (${LIB_LINK} STREQUAL ${lib})
>> +      message(FATAL_ERROR "library ${lib} is not found")
>> +    endif()
>> +    if (NOT RES EQUAL 0)
>> +      message(FATAL_ERROR "Executing ${CMAKE_C_COMPILER} has failed")
> Nit: the message is not very informative. I still don't know how to
> rewrite it, since compilers just print the input for unexisting files.
> Hence, I am not sure: do we really need this error message, since the
> given command is valid?

Discussed verbally and in v4 is the following message:


       if (NOT RES EQUAL 0)
         message(FATAL_ERROR "Executing '${CMAKE_C_COMPILER} \
                              -print-file-name=${lib}' has failed")
       endif()

>> +    endif()
>> +
>>        # Fortunately, we are not interested in macOS here, so we can
>>        # use realpath.
>> +    # Beware, builtin command returns exit code equal to 0,
>> +    # we cannot check is it failed or not.
>>        execute_process(
>>          COMMAND realpath ${LIB_LINK}
>>          OUTPUT_VARIABLE ${output}
>>          OUTPUT_STRIP_TRAILING_WHITESPACE
>> +      TIMEOUT 5
> (*) And here?
Removed in v4.
>
>>        )
>>      endmacro()
>>      LibRealPath(LIB_STDCPP libstdc++.so)
>> -  # XXX: GCC requires both. Clang requires only libstdc++.
>>      if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
>>        LibRealPath(LIB_ASAN libasan.so)
>> -    # XXX: Don't use " " (separator in LD_PRELOAD) in `list()`.
>> -    # ";" will expand to " " as we want.
>> -    list(APPEND LUAJIT_TESTS_ENV LD_PRELOAD="${LIB_ASAN};${LIB_STDCPP}")
>> +    # XXX: The items of the list in LD_PRELOAD can be separated
>> +    # by spaces or colons, and there is no support for escaping
>> +    # either separator, see ld.so(8).
>> +    list(APPEND LUAJIT_TESTS_ENV LD_PRELOAD=${LIB_ASAN}:${LIB_STDCPP})
>>      else()
>> -    list(APPEND LUAJIT_TESTS_ENV LD_PRELOAD="${LIB_STDCPP}")
>> +    list(APPEND LUAJIT_TESTS_ENV LD_PRELOAD=${LIB_STDCPP})
>>      endif()
>>    endif()
> Minor: Maybe it is better to move this change to a separate patch.
> Feel free to ignore.

Ignored. Before introducing CTest this worked, changes above fixes

behaviour broken by patch with CTest.

>
> <snipped>
>
>>>> +add_test_suite_target(LuaJIT-tests
>>>> +  LABEL ${TEST_SUITE_NAME}
>>>> +  DEPENDS ${LUAJIT_TEST_DEPS} LuaJIT-tests-deps-libs
>>> Why don't use `${LUAJIT_TEST_BINARY}` here?
>>
>> AFAIR we decided with Igor in a verbal conversation
>>
>> to use ${LUAJIT_TEST_DEPS} instead of ${LUAJIT_TEST_BINARY}.
>>
>> LUAJIT_TEST_BINARY is a single target that can be used as a command,
>>
>> see for example tests in test/tarantool-tests/. LUAJIT_TEST_DEPS is a
>> list of targets
>>
>> that should be build before running tests.
> Yes, but we are now setting LUAJIT_TEST_DEPS unconditionally.
> Also, as I mentioned above for tarantool-c-tests, there is no need to
> build the luajit-main target -- libluajit is enough. Hence, this change
> may be dropped.
> CC imun@ here.


>>>> +)
>>>> +
>>>> +# The test suite has its own test runner
>>>> +# (test/LuaJIT-tests/test.lua), it is not possible to run these
>>>> +# tests one-by-one by CTest.
>>>> +add_test(NAME "test/LuaJIT-tests"
>>> Why don't use just LuaJIT-tests as a test name here?
>> For consistency with other test titles.
> Side note: It looks inconsistent anyway (partially):
>
> |       Start   1: LuaJIT-tests-deps
> | 1/211 Test   #1: LuaJIT-tests-deps ..............................................................   Passed    0.29 sec
> |       Start   2: test/LuaJIT-tests
> | 2/211 Test   #2: test/LuaJIT-tests ..............................................................   Passed    3.56 sec
> |       Start   3: PUC-Rio-Lua-5.1-tests-deps
> | 3/211 Test   #3: PUC-Rio-Lua-5.1-tests-deps .....................................................   Passed    0.35 sec
> |       Start   4: test/PUC-Rio-Lua-5.1
>
> As you can see, *-deps targets have no test in their name.
> But I can't come up with something meaningful, so feel free to ignore
> it.


Okay, I left as is.

>>> The same question to the tests below.
>>>
>>>> +  COMMAND ${LUAJIT_TEST_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/test.lua
>>>> +                                 +slow +ffi +bit +jit ${LUAJIT_TEST_TAGS_EXTRA}
>>>>      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
>>>>    )
>>>> +set_tests_properties("test/LuaJIT-tests" PROPERTIES
>>>> +  LABELS ${TEST_SUITE_NAME}
>>>> +  ENVIRONMENT "${LUAJIT_TESTS_ENV}"
>>>> +  DEPENDS LuaJIT-tests-deps
>>>> +)
>>>> diff --git a/test/LuaJIT-tests/src/CMakeLists.txt b/test/LuaJIT-tests/src/CMakeLists.txt
>>>> index 2f90da86..f0e639e1 100644
>>>> --- a/test/LuaJIT-tests/src/CMakeLists.txt
>>>> +++ b/test/LuaJIT-tests/src/CMakeLists.txt
> <snipped>
>
>>>> +  set(test_title "test/${TEST_SUITE_NAME}/${test_name}")
>>> I suppose, that general part "test/" may be ommited from the title.
>> I would left as is. The main idea is to map test title to a file/dir on
>> the filesystem.
> It's kind of obvious to me that tests are placed in the directory
> "test". I'm not insisting, but the names of the tests are already long
> enough, it will be nicer to decrease their length with unnecessary
> information. The "test" directory is still the root directory for all
> tests.

It is not clear for me why you are care about test title length.

ctest accepts partial test titles too:

`ctest -R lj-802` 
(test/tarantool-tests/lj-802-panic-at-mcode-protfail.test.lua will be 
executed)

> OTOH, it is more convenient to copy-paste the filenames, but for sure, we
> must use the whole filename to be consistent with the prove's output we
> are replacing.
>
> <snipped>
>
>>>> +# To workaround this, we glob source files and generated tests
>>>> +# with paths to executable binaries.
>>>> +file(GLOB tests ${CMAKE_CURRENT_SOURCE_DIR} "*.test.c")
>>> Please use `${CTEST_SRC_SUFFIX}` instead of "*.test.c".
>>>
>>> You may use the cycle above, which adds build targets.
>> This is a good idea, but anyway we need two loops.
>>
>> First should build a list TESTS_COMPILED that is used in
>> add_test_suite_target.
>>
>> The second one should generate  CMake tests.
>>
>> If you are still want to have a single loop for everything then
>>
>> we need to build -deps target and CMake test for each tarantool C test.
> Shouldn't it be enough to set
> | DEPENDS ${LUAJIT_TEST_DEPS} libluajit libtest ${exe}
> for each test? But, yes, in this way, the order of compilation and
> execution isn't sequential...
> Maybe we should use the proxy target here. In the loop, we append a
> dependency for this target and set it as a dependency for each test
> target. May it work?


seems yes


diff --git a/test/tarantool-c-tests/CMakeLists.txt 
b/test/tarantool-c-tests/CMakeLists.txt
index a4bc3a76..abf44a46 100644
--- a/test/tarantool-c-tests/CMakeLists.txt
+++ b/test/tarantool-c-tests/CMakeLists.txt
@@ -19,6 +19,21 @@ AppendFlags(TESTS_C_FLAGS ${TARGET_C_FLAGS})
  # test binary can be run from any directory.
  AppendFlags(TESTS_C_FLAGS 
"-D__LJ_TEST_DIR__='\"${CMAKE_CURRENT_SOURCE_DIR}\"'")

+set(TEST_SUITE_NAME "tarantool-c-tests")
+
+# Proxy CMake target with all targets that builds C tests.
+# This is needed because targets for each C test are generated
+# at the same time with CMake tests, and all prerequisites must be
+# already exist at this moment.
+add_custom_target(tarantool-c-tests-build)
+
+# XXX: The call produces both test and target
+# <tarantool-c-tests-deps> as a side effect.
+add_test_suite_target(tarantool-c-tests
+  LABELS ${TEST_SUITE_NAME}
+  DEPENDS ${LUAJIT_TEST_DEPS} libluajit libtest tarantool-c-tests-build
+)
+
  set(CTEST_SRC_SUFFIX ".test.c")
  file(GLOB tests "${CMAKE_CURRENT_SOURCE_DIR}/*${CTEST_SRC_SUFFIX}")
  foreach(test_source ${tests})
@@ -36,27 +51,12 @@ foreach(test_source ${tests})
    )
    target_link_libraries(${exe} libtest ${LUAJIT_LIBRARY})
    LIST(APPEND TESTS_COMPILED ${exe})
-endforeach()
-
-set(TEST_SUITE_NAME "tarantool-c-tests")
-
-# XXX: The call produces both test and target
-# <tarantool-c-tests-deps> as a side effect.
-add_test_suite_target(tarantool-c-tests
-  LABELS ${TEST_SUITE_NAME}
-  DEPENDS ${LUAJIT_TEST_DEPS} libluajit libtest ${TESTS_COMPILED}
-)
+  add_dependencies(tarantool-c-tests-build ${exe})

-# XXX: Note that we cannot glob generated files in CMake, see
-# 
https://stackoverflow.com/questions/44076307/cmake-globbing-generated-files.
-# To workaround this, we glob source files and generated tests
-# with paths to executable binaries.
-file(GLOB_RECURSE tests ${CMAKE_CURRENT_SOURCE_DIR} "*${CTEST_SRC_SUFFIX}")
-foreach(test_path ${tests})
-  get_filename_component(test_name ${test_path} NAME_WE)
-  set(test_title "test/${TEST_SUITE_NAME}/${test_name}${C_TEST_SUFFIX}")
+  # Generate CMake tests.
+  set(test_title "test/${TEST_SUITE_NAME}/${exe}${C_TEST_SUFFIX}")
    add_test(NAME ${test_title}
-    COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${test_name}${C_TEST_SUFFIX}
+    COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${exe}${C_TEST_SUFFIX}
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    )
    set_tests_properties(${test_title} PROPERTIES

>
>> Left without changes.
> May you please add a comment about it to avoid confusion in the future?


patch is above


>
> <snipped>
>
>>>> +set(TEST_SUITE_NAME "tarantool-tests")
>>>> +
>>>> +# XXX: The call produces both test and target
>>>> +# <tarantool-tests-deps> as a side effect.
>>>> +add_test_suite_target(tarantool-tests
>>>> +  LABEL ${TEST_SUITE_NAME}
>>>> +  DEPENDS ${LUAJIT_TEST_DEPS} tarantool-tests-deps-libs
>>>>    )
>>>>    
>>>> +# LUA_CPATH and LD_LIBRARY_PATH variables and also TESTLIBS list
>>>> +# with dependencies are set in scope of BuildTestLib macro.
>>>> +set(TEST_ENV "LUA_PATH=${LUA_PATH};\;\;;LUA_CPATH=${LUA_CPATH}\;\;;${LUA_TEST_ENV_MORE}")
>>>> +file(GLOB_RECURSE tests ${CMAKE_CURRENT_SOURCE_DIR} "*${LUA_TEST_SUFFIX}")
>>> Why do we need GLOB_RECURSE here, instead of GLOB?
>>
>> it is better to search test files recursively, no one can guarantee that
>> files always will be in a top testsuite dir.
> Ok, thanks for the clarification.
>
> <snipped>
>

      reply	other threads:[~2024-03-22 13:06 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-12  7:06 Sergey Bronnikov via Tarantool-patches
2024-03-16 17:12 ` Igor Munkin via Tarantool-patches
2024-03-18 14:58   ` Sergey Bronnikov via Tarantool-patches
2024-03-18 15:54 ` Sergey Kaplun via Tarantool-patches
2024-03-20 19:44   ` Sergey Bronnikov via Tarantool-patches
2024-03-21 11:17     ` Sergey Kaplun via Tarantool-patches
2024-03-22 13:06       ` Sergey Bronnikov via Tarantool-patches [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c3e4b7e9-bf6b-4490-8df8-dda89a1ef8ea@tarantool.org \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=estetus@gmail.com \
    --cc=max.kokryashkin@gmail.com \
    --cc=sergeyb@tarantool.org \
    --cc=skaplun@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH luajit][v3] cmake: replace prove with CTest' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox