git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v6 02/13] t: import the clar unit testing framework

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Aug 28, 2024, 13:16 UTC
Message-ID
<435e3840-ee46-4ca3-a525-747848da9930@gmail.com>
In-Reply-To
<1710e9f9ff75cee76be6d5c1311344c6564e3801.1724159966.git.ps@pks.im>
Hi Patrick
On 20/08/2024 15:02, Patrick Steinhardt wrote:
> Import the clar unit testing framework at commit 1516124 (Merge pull
> request #97 from pks-t/pks-whitespace-fixes, 2024-08-15). The framework
> will be wired up in subsequent commits.

I would be good to explain why we're doing this so we have a record in the project history. A summary of the advantages and disadvantages of using clar vs our current unit test framework would be helpful as well.

 > diff --git a/t/unit-tests/clar/clar.c b/t/unit-tests/clar/clar.c
 > [...]
 > +static void
 > +clar_parse_args(int argc, char **argv)
 > +{
 > [...]
> +		case 'q':
> +			_clar.report_errors_only = 1;
> +			break;
I think this option is incompatible with TAP output as when TAP output 
is selected the first error is printed as part of clar_print_ontest() 
and clar_print_errors() is a no-op. We should error out if it is given 
with '-t'
  > +void clar__fail(
Show 8 quoted lines
> +	const char *file,
> +	const char *function,
> +	size_t line,
> +	const char *error_msg,
> +	const char *description,
> +	int should_abort)
> +{
> +	struct clar_error *error = calloc(1, sizeof(struct clar_error));

clar seems to take an inconsistent approach to memory allocation errors. Here "error" is de-referenced without checking if it is NULL and yet in other places there are checks for NULL after calling calloc() or strdup().

Show 27 quoted lines
> +void clar__assert_equal(
> +	const char *file,
> +	const char *function,
> +	size_t line,
> +	const char *err,
> +	int should_abort,
> +	const char *fmt,
> +	...)
> +{
> +	va_list args;
> +	char buf[4096];
> +	int is_equal = 1;
> +
> +	va_start(args, fmt);
> +
> +	if (!strcmp("%s", fmt)) {
> +		const char *s1 = va_arg(args, const char *);
> +		const char *s2 = va_arg(args, const char *);
> +		is_equal = (!s1 || !s2) ? (s1 == s2) : !strcmp(s1, s2);
> +
> +		if (!is_equal) {
> +			if (s1 && s2) {
> +				int pos;
> +				for (pos = 0; s1[pos] == s2[pos] && s1[pos] && s2[pos]; ++pos)
> +					/* find differing byte offset */;
> +				p_snprintf(buf, sizeof(buf), "'%s' != '%s' (at byte %d)",
> +					s1, s2, pos);

s1 and s2 are passed to snprintf without checking if they are NULL. As 'snprintf(buf, sizeof(buf), "%s", NULL)' is undefined we should check for NULL here. The use of variadic arguments means there is no type checking so if one is checking the contents of an strbuf and writes

     cl_assert_equal_s(buf, "expect");
instead of
     cl_assert_equal_s(buf->buf, "expect");

the compiler does not warn you. This is a regression compared to check_str(). We can address this by having cl_assert_equal_s() wrap a function that takes two strings. Another regression is that if the string contains control characters they are printed verbatim.

> diff --git a/t/unit-tests/clar/clar.h b/t/unit-tests/clar/clar.h
 > [...]
> +#define cl_assert_equal_i(i1,i2) clar__assert_equal(__FILE__,__func__,__LINE__,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2))

The (int) casts here mean that we'll silently truncate longer arguments and suppress any compiler warnings about comparing incompatible types.

 > diff --git a/t/unit-tests/clar/clar/print.h 
b/t/unit-tests/clar/clar/print.h
 > [...]
Show 26 quoted lines
> +static void clar_print_tap_ontest(const char *suite_name, const char *test_name, int test_number, enum cl_test_status status)
> +{
> +	const struct clar_error *error = _clar.last_report->errors;
> +
> +	(void)test_name;
> +	(void)test_number;
> +
> +	switch(status) {
> +	case CL_TEST_OK:
> +		printf("ok %d - %s::%s\n", test_number, suite_name, test_name);
> +		break;
> +	case CL_TEST_FAILURE:
> +		printf("not ok %d - %s::%s\n", test_number, suite_name, test_name);
> +
> +		printf("    ---\n");
> +		printf("    reason: |\n");
> +		printf("      %s\n", error->error_msg);
> +
> +		if (error->description)
> +			printf("      %s\n", error->description);
> +
> +		printf("    at:\n");
> +		printf("      file: '"); print_escaped(error->file); printf("'\n");
> +		printf("      line: %" PRIuZ "\n", error->line_number);
> +		printf("      function: '%s'\n", error->function);
> +		printf("    ---\n");

If a test calls cl_warning() only the message from the first call to that function is printed and any message from later calls to cl_warning() or clar__fail() is suppressed when TAP output is selected.

Best Wishes
Phillip
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 110 of 172 in “Introduce clar testing framework”
  1. 0/3 Introduce clar testing frameworkPatrick Steinhardt, Jul 31, 2024
  2. 1/3 t: import the clar unit testing frameworkPatrick Steinhardt, Jul 31, 2024
  3. Josh SteadmonJul 31, 2024
  4. Junio C HamanoJul 31, 2024
  5. Patrick SteinhardtAug 1, 2024
  6. rsbecker@nexbridge.comJul 31, 2024
  7. Patrick SteinhardtAug 1, 2024
  8. rsbecker@nexbridge.comAug 1, 2024
  9. rsbecker@nexbridge.comAug 1, 2024
  10. Patrick SteinhardtAug 1, 2024
  11. rsbecker@nexbridge.comAug 1, 2024
  12. Patrick SteinhardtAug 1, 2024
  13. rsbecker@nexbridge.comAug 1, 2024
  14. Patrick SteinhardtAug 1, 2024
  15. rsbecker@nexbridge.comAug 1, 2024
  16. Patrick SteinhardtAug 1, 2024
  17. rsbecker@nexbridge.comAug 1, 2024
  18. rsbecker@nexbridge.comAug 1, 2024
  19. rsbecker@nexbridge.comAug 1, 2024
  20. René ScharfeAug 1, 2024
  21. rsbecker@nexbridge.comAug 1, 2024
  22. 2/3 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Jul 31, 2024
  23. René ScharfeJul 31, 2024
  24. Patrick SteinhardtAug 1, 2024
  25. Junio C HamanoJul 31, 2024
  26. Junio C HamanoJul 31, 2024
  27. Patrick SteinhardtAug 1, 2024
  28. 3/3 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Jul 31, 2024
  29. Junio C HamanoJul 31, 2024
  30. rsbecker@nexbridge.comJul 31, 2024
  31. Junio C HamanoJul 31, 2024
  32. rsbecker@nexbridge.comJul 31, 2024
  33. rsbecker@nexbridge.comJul 31, 2024
  34. Patrick SteinhardtAug 1, 2024
  35. Patrick SteinhardtAug 1, 2024
  36. Josh SteadmonJul 31, 2024
  37. Patrick SteinhardtAug 1, 2024
  38. 0/7 Introduce clar testing frameworkPatrick Steinhardt, Aug 6, 2024
  39. 1/7 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Aug 6, 2024
  40. 2/7 t: import the clar unit testing frameworkPatrick Steinhardt, Aug 6, 2024
  41. Josh SteadmonAug 6, 2024
  42. Patrick SteinhardtAug 7, 2024
  43. 3/7 t/clar: fix whitespace errorsPatrick Steinhardt, Aug 6, 2024
  44. 4/7 t/clar: fix compatibility with NonStopPatrick Steinhardt, Aug 6, 2024
  45. 5/7 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Aug 6, 2024
  46. 6/7 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Aug 6, 2024
  47. Josh SteadmonAug 6, 2024
  48. Patrick SteinhardtAug 7, 2024
  49. 7/7 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Aug 6, 2024
  50. 0/7 Introduce clar testing frameworkPatrick Steinhardt, Aug 8, 2024
  51. 1/7 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Aug 8, 2024
  52. 2/7 t: import the clar unit testing frameworkPatrick Steinhardt, Aug 8, 2024
  53. 3/7 t/clar: fix whitespace errorsPatrick Steinhardt, Aug 8, 2024
  54. Junio C HamanoAug 13, 2024
  55. rsbecker@nexbridge.comAug 13, 2024
  56. Junio C HamanoAug 13, 2024
  57. rsbecker@nexbridge.comAug 13, 2024
  58. Junio C HamanoAug 13, 2024
  59. Patrick SteinhardtAug 14, 2024
  60. 4/7 t/clar: fix compatibility with NonStopPatrick Steinhardt, Aug 8, 2024
  61. 5/7 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Aug 8, 2024
  62. 6/7 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Aug 8, 2024
  63. 7/7 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Aug 8, 2024
  64. Josh SteadmonAug 12, 2024
  65. rsbecker@nexbridge.comAug 12, 2024
  66. Junio C HamanoAug 12, 2024
  67. rsbecker@nexbridge.comAug 12, 2024
  68. Junio C HamanoAug 12, 2024
  69. Patrick SteinhardtAug 13, 2024
  70. 0/7 Introduce clar testing frameworkPatrick Steinhardt, Aug 15, 2024
  71. 4/7 t/clar: fix compatibility with NonStopPatrick Steinhardt, Aug 15, 2024
  72. 7/7 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Aug 15, 2024
  73. 6/7 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Aug 15, 2024
  74. 2/7 t: import the clar unit testing frameworkPatrick Steinhardt, Aug 15, 2024
  75. 1/7 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Aug 15, 2024
  76. 3/7 t/clar: fix whitespace errorsPatrick Steinhardt, Aug 15, 2024
  77. 5/7 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Aug 15, 2024
  78. Junio C HamanoAug 15, 2024
  79. Patrick SteinhardtAug 16, 2024
  80. 0/9 Introduce clar testing frameworkPatrick Steinhardt, Aug 16, 2024
  81. 5/9 Makefile: make hdr-check depend on generated headersPatrick Steinhardt, Aug 16, 2024
  82. 4/9 Makefile: fix sparse dependency on GENERATED_HPatrick Steinhardt, Aug 16, 2024
  83. 1/9 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Aug 16, 2024
  84. 8/9 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Aug 16, 2024
  85. Phillip WoodAug 16, 2024
  86. Junio C HamanoAug 16, 2024
  87. Patrick SteinhardtAug 20, 2024
  88. 9/9 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Aug 16, 2024
  89. Phillip WoodAug 16, 2024
  90. Patrick SteinhardtAug 20, 2024
  91. Junio C HamanoAug 18, 2024
  92. 2/9 t: import the clar unit testing frameworkPatrick Steinhardt, Aug 16, 2024
  93. Phillip WoodAug 16, 2024
  94. Johannes SchindelinAug 23, 2024
  95. Phillip WoodAug 28, 2024
  96. Junio C HamanoAug 19, 2024
  97. rsbecker@nexbridge.comAug 19, 2024
  98. Junio C HamanoAug 19, 2024
  99. rsbecker@nexbridge.comAug 19, 2024
  100. Patrick SteinhardtAug 20, 2024
  101. 6/9 Makefile: do not use sparse on third-party sourcesPatrick Steinhardt, Aug 16, 2024
  102. 7/9 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Aug 16, 2024
  103. 3/9 t/clar: fix compatibility with NonStopPatrick Steinhardt, Aug 16, 2024
  104. Phillip WoodAug 16, 2024
  105. Patrick SteinhardtAug 20, 2024
  106. phillip.wood123@gmail.comAug 28, 2024
  107. 00/13 Introduce clar testing frameworkPatrick Steinhardt, Aug 20, 2024
  108. 01/13 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Aug 20, 2024
  109. 02/13 t: import the clar unit testing frameworkPatrick Steinhardt, Aug 20, 2024
  110. Phillip WoodAug 28, 2024
  111. Patrick SteinhardtSep 3, 2024
  112. 03/13 t/clar: fix compatibility with NonStopPatrick Steinhardt, Aug 20, 2024
  113. 04/13 clar: avoid compile error with mingw-w64Patrick Steinhardt, Aug 20, 2024
  114. 05/13 clar(win32): avoid compile error due to unused `fs_copy()`Patrick Steinhardt, Aug 20, 2024
  115. 06/13 clar: stop including `shellapi.h` unnecessarilyPatrick Steinhardt, Aug 20, 2024
  116. 07/13 Makefile: fix sparse dependency on GENERATED_HPatrick Steinhardt, Aug 20, 2024
  117. 08/13 Makefile: make hdr-check depend on generated headersPatrick Steinhardt, Aug 20, 2024
  118. 09/13 Makefile: do not use sparse on third-party sourcesPatrick Steinhardt, Aug 20, 2024
  119. 10/13 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Aug 20, 2024
  120. 11/13 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Aug 20, 2024
  121. Phillip WoodAug 28, 2024
  122. Patrick SteinhardtSep 3, 2024
  123. phillip.wood123@gmail.comSep 3, 2024
  124. Patrick SteinhardtSep 4, 2024
  125. phillip.wood123@gmail.comSep 4, 2024
  126. 12/13 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Aug 20, 2024
  127. Phillip WoodAug 28, 2024
  128. Patrick SteinhardtSep 3, 2024
  129. 13/13 clar: add CMake supportPatrick Steinhardt, Aug 20, 2024
  130. Phillip WoodAug 28, 2024
  131. Patrick SteinhardtAug 28, 2024
  132. phillip.wood123@gmail.comAug 28, 2024
  133. 00/14 Introduce clar testing frameworkPatrick Steinhardt, Sep 3, 2024
  134. 01/14 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Sep 3, 2024
  135. 02/14 t: import the clar unit testing frameworkPatrick Steinhardt, Sep 3, 2024
  136. Eric SunshineSep 3, 2024
  137. Patrick SteinhardtSep 4, 2024
  138. 03/14 t/clar: fix compatibility with NonStopPatrick Steinhardt, Sep 3, 2024
  139. 04/14 clar: avoid compile error with mingw-w64Patrick Steinhardt, Sep 3, 2024
  140. 05/14 clar(win32): avoid compile error due to unused `fs_copy()`Patrick Steinhardt, Sep 3, 2024
  141. 06/14 clar: stop including `shellapi.h` unnecessarilyPatrick Steinhardt, Sep 3, 2024
  142. 07/14 Makefile: fix sparse dependency on GENERATED_HPatrick Steinhardt, Sep 3, 2024
  143. 08/14 Makefile: make hdr-check depend on generated headersPatrick Steinhardt, Sep 3, 2024
  144. 09/14 Makefile: do not use sparse on third-party sourcesPatrick Steinhardt, Sep 3, 2024
  145. 10/14 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Sep 3, 2024
  146. 11/14 t/unit-tests: implement test driverPatrick Steinhardt, Sep 3, 2024
  147. Phillip WoodSep 4, 2024
  148. Patrick SteinhardtSep 4, 2024
  149. phillip.wood123@gmail.comSep 4, 2024
  150. 12/14 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Sep 3, 2024
  151. 13/14 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Sep 3, 2024
  152. 14/14 clar: add CMake supportPatrick Steinhardt, Sep 3, 2024
  153. Phillip WoodSep 4, 2024
  154. Patrick SteinhardtSep 4, 2024
  155. 00/14 Introduce clar testing frameworkPatrick Steinhardt, Sep 4, 2024
  156. 01/14 t: do not pass GIT_TEST_OPTS to unit tests with provePatrick Steinhardt, Sep 4, 2024
  157. 02/14 t: import the clar unit testing frameworkPatrick Steinhardt, Sep 4, 2024
  158. 03/14 t/clar: fix compatibility with NonStopPatrick Steinhardt, Sep 4, 2024
  159. 04/14 clar: avoid compile error with mingw-w64Patrick Steinhardt, Sep 4, 2024
  160. 05/14 clar(win32): avoid compile error due to unused `fs_copy()`Patrick Steinhardt, Sep 4, 2024
  161. 06/14 clar: stop including `shellapi.h` unnecessarilyPatrick Steinhardt, Sep 4, 2024
  162. 07/14 Makefile: fix sparse dependency on GENERATED_HPatrick Steinhardt, Sep 4, 2024
  163. 08/14 Makefile: make hdr-check depend on generated headersPatrick Steinhardt, Sep 4, 2024
  164. 09/14 Makefile: do not use sparse on third-party sourcesPatrick Steinhardt, Sep 4, 2024
  165. 10/14 Makefile: wire up the clar unit testing frameworkPatrick Steinhardt, Sep 4, 2024
  166. Junio C HamanoSep 9, 2024
  167. Patrick SteinhardtSep 10, 2024
  168. 11/14 t/unit-tests: implement test driverPatrick Steinhardt, Sep 4, 2024
  169. 12/14 t/unit-tests: convert strvec tests to use clarPatrick Steinhardt, Sep 4, 2024
  170. 13/14 t/unit-tests: convert ctype tests to use clarPatrick Steinhardt, Sep 4, 2024
  171. 14/14 clar: add CMake supportPatrick Steinhardt, Sep 4, 2024
  172. phillip.wood123@gmail.comSep 4, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.