git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Patrick Steinhardt <ps@pks.im>
To: phillip.wood@dunelm.org.uk
Cc: git@vger.kernel.org, "René Scharfe" <l.s.r@web.de>,
	"Junio C Hamano" <gitster@pobox.com>,
	"Kyle Lippincott" <spectral@google.com>,
	"Josh Steadmon" <steadmon@google.com>,
	rsbecker@nexbridge.com,
	"Edward Thomson" <ethomson@edwardthomson.com>
Subject: Re: [PATCH v5 0/9] Introduce clar testing framework
Date: Tue, 20 Aug 2024 14:59:37 +0200	[thread overview]
Message-ID: <ZsSTOczuGhT5zwoV@tanuki> (raw)
In-Reply-To: <b87700d2-0c9a-4d0c-9ee4-e6a91278d596@gmail.com>

On Fri, Aug 16, 2024 at 02:37:34PM +0100, Phillip Wood wrote:
> Hi Patrick
> 
> On 16/08/2024 08:04, Patrick Steinhardt wrote:
> > Hi,
> > 
> > this is the fifth version of my patch series that introduces the clar
> > testing framework for our unit tests.
> 
> Thanks for working on this, I'm broadly in favor of this change. I
> like the way it keeps each test as a function and adds automatic test
> registration with support for setup and teardown functions. I am keen
> though to keep an emphasis on good diagnostic messages when tests
> fail. Looking at the conversions in this series all of the test_msg()
> lines that provide useful debugging context are removed. I'm not sure
> using yaml to report errors rather than human readable messages is an
> improvement either.
> 
> I wonder if we want to either improve the assertions offered by clar
> or write our own. I find the names of the cl_assert_equal_?()
> functions are a bit cumbersome. The aim of the check_* names was to
> try and be both concise and descriptive. Adding our own check_* macros
> on top of clar would also make it easier to port our existing tests.
> 
> Here are some thought having read through the assertion and error
> reporting code:
> 
>  - As I think you've pointed out elsewhere there are no equivalents
>    for check_int(a, <|<=|>|>=, b) so we're forced to use cl_assert()
>    and forego the better diagnostic messages that come from a
>    dedicated comparison macro. We should fix this as a priority.

Agreed, this one also feels rather limiting to me. Are you okay with me
doing this as a follow-up in case this series lands?

>  - cl_assert_equal_i() casts its arguments to int whereas check_int()
>    and check_uint() are careful to avoid truncation and keep the
>    original signedness (if that's a word). I think that's unlikely to
>    be a problem with our current test but could trip us up in the
>    future.

Yeah. If it ever becomes a problem we can likely just introduce
something like `cl_assert_equal_u()` to achieve the same for unsigned.
Both should probably end up casting to `intmax_t` and `uintmax_t`,
respectively.

>  - cl_assert_equal_s() prints each argument as-is. This means
>    that it passes NULL arguments through to snprintf() which is
>    undefined according to the C standard. Compare this to check_str()
>    that is NULL safe and is careful to escape control characters and
>    add delimiters to the beginning and end of the string to make it
>    obvious when a string contains leading or trailing whitespace.

Good point indeed, and something I'm happy to fix upstream.

>  - The cl_assert_equal_?() macros lack type safety for the arguments
>    being compared as they are wrappers around a variadic function.
>    That could be fixed by having each macros wrap a dedicated
>    function that wraps clar__fail().

Some of them do indeed, others generate issues. I don't think we have to
have dedicated functions, but could do something about this with
`__attribute__((format (printf, ...)))`.

>  - There is no equivalent of test_todo() to mark assertions that are
>    expected to fail. We're not using that yet in our tests but our
>    experience with the integration tests suggests that we are likely
>    to want this in the future.

Heh, funny that you mention this. I had this discussion some 6 years ago
I think, where I also mentioned that this should exist as a feature. In
any case, I agree.

>  - To me the "sandbox" feature is mis-named as it does not provide any
>    confinement. It is instead a useful mechanism for running a test in
>    a temporary directory created from a template.

I guess we'll either just have to not use it or ignore that it's named a
bit awkwardly. Changing this in clar probably wouldn't work well because
other projects may depend on it.

>  - There are no checks for failing memory allocations - the return
>    value of calloc() and strdup() are used without checking for NULL.

I'll commit to fixing this upstream if this lands.

>  - The use of longjmp is a bit of a double edged sword as it makes it
>    easy to leak resources on test failures.

I have to say that this is one of the best features of the clar to me.
The current test framework we use doesn't, which in theory requires you
to always `return` whenever there was an error. But that results in code
that is both awful to read and write, so for most of the tests simply
don't bother at all. And consequently, the tests are quite likely to
cause segfaults once one of the checks fails because we didn't abort
running the testcase, but things are broken.

In practice, I'd claim that you don't typically care all that much about
memory leaks once your basic assertions start to fail.

So, things that need addressing and that I'm happy to do as follow ups:

  - Introduce functions that compare integers.

  - Improve type safety of the `cl_assert_equal_?()` macros.

  - Adapt `cl_assert_equal_s()` to handle NULL pointers.

  - Introduce checks for failing memory allocations.

Nice to have would be support for known-failing tests.

Patrick

  reply	other threads:[~2024-08-20 12:59 UTC|newest]

Thread overview: 172+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-31  9:04 [RFC PATCH 0/3] Introduce clar testing framework Patrick Steinhardt
2024-07-31  9:04 ` [RFC PATCH 1/3] t: import the clar unit " Patrick Steinhardt
2024-07-31 18:27   ` Josh Steadmon
2024-07-31 19:36     ` Junio C Hamano
2024-08-01  9:32       ` Patrick Steinhardt
2024-07-31 20:04     ` rsbecker
2024-08-01  9:31       ` Patrick Steinhardt
2024-08-01 12:15         ` rsbecker
2024-08-01 12:54           ` rsbecker
2024-08-01 13:37             ` Patrick Steinhardt
2024-08-01 13:47               ` rsbecker
2024-08-01 13:50                 ` Patrick Steinhardt
2024-08-01 13:53                   ` rsbecker
2024-08-01 13:55                     ` Patrick Steinhardt
2024-08-01 14:04                       ` rsbecker
2024-08-01 14:43                         ` Patrick Steinhardt
2024-08-01 16:31                           ` rsbecker
2024-08-01 17:06                           ` rsbecker
2024-08-01 17:43                           ` [RFC PATCH 1/3] t: import the clar unit testing framework (better one) rsbecker
2024-08-01 18:12                             ` René Scharfe
2024-08-01 18:33                               ` rsbecker
2024-07-31  9:04 ` [RFC PATCH 2/3] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-07-31 16:48   ` René Scharfe
2024-08-01  9:32     ` Patrick Steinhardt
2024-07-31 17:01   ` Junio C Hamano
2024-07-31 21:39     ` Junio C Hamano
2024-08-01  9:32       ` Patrick Steinhardt
2024-07-31  9:04 ` [RFC PATCH 3/3] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-07-31 15:51 ` [RFC PATCH 0/3] Introduce clar testing framework Junio C Hamano
2024-07-31 15:56   ` rsbecker
2024-07-31 16:52     ` Junio C Hamano
2024-07-31 20:25       ` rsbecker
2024-07-31 20:37         ` rsbecker
2024-08-01  9:31           ` Patrick Steinhardt
2024-08-01  9:31   ` Patrick Steinhardt
2024-07-31 18:33 ` Josh Steadmon
2024-08-01  9:31   ` Patrick Steinhardt
2024-08-06 14:14 ` [RFC PATCH v2 0/7] " Patrick Steinhardt
2024-08-06 14:14   ` [RFC PATCH v2 1/7] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-08-06 14:14   ` [RFC PATCH v2 2/7] t: import the clar unit testing framework Patrick Steinhardt
2024-08-06 22:18     ` Josh Steadmon
2024-08-07  5:52       ` Patrick Steinhardt
2024-08-06 14:14   ` [RFC PATCH v2 3/7] t/clar: fix whitespace errors Patrick Steinhardt
2024-08-06 14:14   ` [RFC PATCH v2 4/7] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-08-06 14:14   ` [RFC PATCH v2 5/7] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-08-06 14:14   ` [RFC PATCH v2 6/7] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-08-06 23:05     ` Josh Steadmon
2024-08-07  5:52       ` Patrick Steinhardt
2024-08-06 14:15   ` [RFC PATCH v2 7/7] t/unit-tests: convert ctype " Patrick Steinhardt
2024-08-08  5:38 ` [RFC PATCH v3 0/7] Introduce clar testing framework Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 1/7] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 2/7] t: import the clar unit testing framework Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 3/7] t/clar: fix whitespace errors Patrick Steinhardt
2024-08-13 15:25     ` Junio C Hamano
2024-08-13 15:31       ` rsbecker
2024-08-13 18:43         ` Junio C Hamano
2024-08-13 19:14           ` rsbecker
2024-08-13 20:42       ` Junio C Hamano
2024-08-14  5:58         ` Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 4/7] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 5/7] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 6/7] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-08-08  5:38   ` [RFC PATCH v3 7/7] t/unit-tests: convert ctype " Patrick Steinhardt
2024-08-12 18:10   ` [RFC PATCH v3 0/7] Introduce clar testing framework Josh Steadmon
2024-08-12 18:13     ` rsbecker
2024-08-12 20:50     ` Junio C Hamano
2024-08-12 20:58       ` rsbecker
2024-08-12 22:13         ` Junio C Hamano
2024-08-13  7:23           ` Patrick Steinhardt
2024-08-15  9:47 ` [PATCH v4 " Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 1/7] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 2/7] t: import the clar unit testing framework Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 3/7] t/clar: fix whitespace errors Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 4/7] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 5/7] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 6/7] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-08-15  9:47   ` [PATCH v4 7/7] t/unit-tests: convert ctype " Patrick Steinhardt
2024-08-15 16:21   ` [PATCH v4 0/7] Introduce clar testing framework Junio C Hamano
2024-08-16  5:10     ` Patrick Steinhardt
2024-08-16  7:04 ` [PATCH v5 0/9] " Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 1/9] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 2/9] t: import the clar unit testing framework Patrick Steinhardt
2024-08-16 13:37     ` Phillip Wood
2024-08-23 12:16       ` Johannes Schindelin
2024-08-28 13:20         ` Phillip Wood
2024-08-19 21:21     ` Junio C Hamano
2024-08-19 21:50       ` rsbecker
2024-08-19 22:13         ` Junio C Hamano
2024-08-19 22:38           ` rsbecker
2024-08-20 12:59       ` Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 3/9] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 4/9] Makefile: fix sparse dependency on GENERATED_H Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 5/9] Makefile: make hdr-check depend on generated headers Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 6/9] Makefile: do not use sparse on third-party sources Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 7/9] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-08-16  7:04   ` [PATCH v5 8/9] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-08-16 13:38     ` Phillip Wood
2024-08-16 16:11       ` Junio C Hamano
2024-08-20 12:59         ` Patrick Steinhardt
2024-08-16  7:05   ` [PATCH v5 9/9] t/unit-tests: convert ctype " Patrick Steinhardt
2024-08-16 13:38     ` Phillip Wood
2024-08-20 12:59       ` Patrick Steinhardt
2024-08-18  6:39     ` Junio C Hamano
2024-08-16 13:37   ` [PATCH v5 0/9] Introduce clar testing framework Phillip Wood
2024-08-20 12:59     ` Patrick Steinhardt [this message]
2024-08-28 15:15       ` phillip.wood123
2024-08-20 14:02 ` [PATCH v6 00/13] " Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 01/13] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 02/13] t: import the clar unit testing framework Patrick Steinhardt
2024-08-28 13:16     ` Phillip Wood
2024-09-03  7:45       ` Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 03/13] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 04/13] clar: avoid compile error with mingw-w64 Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 05/13] clar(win32): avoid compile error due to unused `fs_copy()` Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 06/13] clar: stop including `shellapi.h` unnecessarily Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 07/13] Makefile: fix sparse dependency on GENERATED_H Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 08/13] Makefile: make hdr-check depend on generated headers Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 09/13] Makefile: do not use sparse on third-party sources Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 10/13] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 11/13] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-08-28 13:17     ` Phillip Wood
2024-09-03  7:45       ` Patrick Steinhardt
2024-09-03  9:48         ` phillip.wood123
2024-09-04  6:37           ` Patrick Steinhardt
2024-09-04  9:31             ` phillip.wood123
2024-08-20 14:02   ` [PATCH v6 12/13] t/unit-tests: convert ctype " Patrick Steinhardt
2024-08-28 13:18     ` Phillip Wood
2024-09-03  7:45       ` Patrick Steinhardt
2024-08-20 14:02   ` [PATCH v6 13/13] clar: add CMake support Patrick Steinhardt
2024-08-28 13:18   ` [PATCH v6 00/13] Introduce clar testing framework Phillip Wood
2024-08-28 14:03     ` Patrick Steinhardt
2024-08-28 14:58       ` phillip.wood123
2024-09-03  9:14 ` [PATCH v7 00/14] " Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 01/14] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 02/14] t: import the clar unit testing framework Patrick Steinhardt
2024-09-03  9:47     ` Eric Sunshine
2024-09-04  6:38       ` Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 03/14] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 04/14] clar: avoid compile error with mingw-w64 Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 05/14] clar(win32): avoid compile error due to unused `fs_copy()` Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 06/14] clar: stop including `shellapi.h` unnecessarily Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 07/14] Makefile: fix sparse dependency on GENERATED_H Patrick Steinhardt
2024-09-03  9:14   ` [PATCH v7 08/14] Makefile: make hdr-check depend on generated headers Patrick Steinhardt
2024-09-03  9:15   ` [PATCH v7 09/14] Makefile: do not use sparse on third-party sources Patrick Steinhardt
2024-09-03  9:15   ` [PATCH v7 10/14] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-09-03  9:15   ` [PATCH v7 11/14] t/unit-tests: implement test driver Patrick Steinhardt
2024-09-04 13:35     ` Phillip Wood
2024-09-04 14:12       ` Patrick Steinhardt
2024-09-04 14:35         ` phillip.wood123
2024-09-03  9:15   ` [PATCH v7 12/14] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-09-03  9:15   ` [PATCH v7 13/14] t/unit-tests: convert ctype " Patrick Steinhardt
2024-09-03  9:15   ` [PATCH v7 14/14] clar: add CMake support Patrick Steinhardt
2024-09-04 13:35   ` [PATCH v7 00/14] Introduce clar testing framework Phillip Wood
2024-09-04 14:12     ` Patrick Steinhardt
2024-09-04 14:16 ` [PATCH v8 " Patrick Steinhardt
2024-09-04 14:16   ` [PATCH v8 01/14] t: do not pass GIT_TEST_OPTS to unit tests with prove Patrick Steinhardt
2024-09-04 14:16   ` [PATCH v8 02/14] t: import the clar unit testing framework Patrick Steinhardt
2024-09-04 14:16   ` [PATCH v8 03/14] t/clar: fix compatibility with NonStop Patrick Steinhardt
2024-09-04 14:16   ` [PATCH v8 04/14] clar: avoid compile error with mingw-w64 Patrick Steinhardt
2024-09-04 14:16   ` [PATCH v8 05/14] clar(win32): avoid compile error due to unused `fs_copy()` Patrick Steinhardt
2024-09-04 14:16   ` [PATCH v8 06/14] clar: stop including `shellapi.h` unnecessarily Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 07/14] Makefile: fix sparse dependency on GENERATED_H Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 08/14] Makefile: make hdr-check depend on generated headers Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 09/14] Makefile: do not use sparse on third-party sources Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 10/14] Makefile: wire up the clar unit testing framework Patrick Steinhardt
2024-09-09 18:17     ` Junio C Hamano
2024-09-10  6:20       ` Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 11/14] t/unit-tests: implement test driver Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 12/14] t/unit-tests: convert strvec tests to use clar Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 13/14] t/unit-tests: convert ctype " Patrick Steinhardt
2024-09-04 14:17   ` [PATCH v8 14/14] clar: add CMake support Patrick Steinhardt
2024-09-04 14:32   ` [PATCH v8 00/14] Introduce clar testing framework phillip.wood123

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=ZsSTOczuGhT5zwoV@tanuki \
    --to=ps@pks.im \
    --cc=ethomson@edwardthomson.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=l.s.r@web.de \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=rsbecker@nexbridge.com \
    --cc=spectral@google.com \
    --cc=steadmon@google.com \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).