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

Re: [PATCH 2/6] unit-tests: add TEST_RUN

From
Pphillip.wood123@gmail.com <phillip.wood123@gmail.com>
Date
Jul 5, 2024, 09:42 UTC
Message-ID
<8802b3ab-9986-47bd-be80-51ac599b2892@gmail.com>
In-Reply-To
<97390954-49bc-48c4-bab1-95be10717aca@web.de>
Hi René
On 02/07/2024 21:55, René Scharfe wrote:
Show 25 quoted lines
> Am 02.07.24 um 17:13 schrieb phillip.wood123@gmail.com:
>> On 29/06/2024 16:43, René Scharfe wrote:
>>> The macro TEST only allows defining a test that consists of a
>>> single expression.  Add the new macro, TEST_RUN, which provides a
>>> way to define unit tests that are made up of one or more
>>> statements.  A test started with it implicitly ends when the next
>>> test is started or test_done() is called.
>>>
>>> TEST_RUN allows defining self-contained tests en bloc, a bit like
>>> test_expect_success does for regular tests.  Unlike TEST it does
>>> not require defining wrapper functions for test statements.
>>
>> There are pros and cons to not requiring one function per test. It
>> can be a pain to have to write separate functions but it keeps each
>> test self contained which hopefully makes it harder to have
>> accidental dependencies between tests. Having separate functions for
>> each test makes it easy to initialize and free resources for every
>> test by writing a setup() function that initializes the resources,
>> calls the test function and then frees the resources.
> 
> Right.  We should use TEST and TEST_RUN when appropriate.
> 
>> The changes in patch 6 to use TEST_RUN() mean that each test now has
>> more boilerplate to initialize and free the strbuf. > This makes them more similar to strbuf usage in the wild.  Using
> the API idiomatically just makes more sense to me.

I see what you mean. I think it only looks idiomatic if you're already familiar with the api though as the test bodies call wrappers rather than using the strbuf api directly. I think that reduces its value as an example of idomatic usage for someone who is not familiar with the strbuf api.

Show 15 quoted lines
>  Not hiding
> initialization and release makes the tests visibly independent.
> This is not enforced by TEST_RUN, but made possible by it.
> 
>> Having each test in its own function also makes main() shorter and
>> which means can quickly get an overview of all the test cases from
>> it.
> 
> That's true, now you need to grep for TEST_RUN to get such an
> overview.
> 
> On the other hand I find the start of the description in TEST
> invocations somewhat hard to locate, as they are not vertically
> aligned due to the preceding variable-length function name.  Just
> saying..

Yes I really wanted the first argument of TEST to be the description but that isn't easy to do while supporting printf style format strings.

Show 18 quoted lines
>>> +int test__run(const char *location, const char *format, ...)
>>> +{
>>> +    va_list ap;
>>> +    char *desc;
>>> +
>>> +    test__run_maybe_end();
>>> +
>>> +    va_start(ap, format);
>>> +    desc = xstrvfmt(format, ap);
>>
>> This uses an strbuf under the hood. So far we've avoided doing that
>> as we want to be able to test the strbuf implementation with this
>> test framework. We don't need to support arbitrary length strings
>> here so we could use a fixed array and xsnprinf() instead.
> 
> Fair point.  xsnprinf() might be a bit too strict, as it doesn't
> handle short buffers gracefully.  Perhaps that's OK; a developer
> getting hit by that could simply increase the buffer size.
I think so.
> We could also let xstrvfmt() call vsnprintf(3) directly.  The code
> duplication would be a bit grating, but perhaps there's some good
> base function hidden in there somewhere.
Oh, interesting - maybe something like
char* xstrvfmt(const char *fmt, ...)
{
	va_list ap, aq;
	va_start(ap, fmt);
	va_copy(aq, ap);
	len = vnsprintf(NULL, 0, fmt, ap);
	if (len < 0)
		BUG(...)
	buf = xmalloc(len + 1);
	if (vnsprintf(buf, len + 1, fmt, aq) != len)
		BUG(...)
	va_end(aq);
	va_end(ap);
	return buf;
}
Show 6 quoted lines
>> Looking ahead the plan seems to be to change most instances of TEST()
>> to TEST_RUN(). If we are going to go that way perhaps we should steal
>> TEST() for this macro and rename the existing TEST() macro.
> 
> Not my plan, at least -- I'm content with just having the *ability*
> to keep all parts of a test together.
That sounds sensible to me
Show 7 quoted lines
> +	if (TEST_RUN("static initialization works")) {
> +		struct strbuf buf = STRBUF_INIT;
> +		if (!check_uint(buf.len, ==, 0) ||
> +		    !check_uint(buf.alloc, ==, 0) ||
> +		    !check_char(buf.buf[0], ==, '\0'))
> +			test_skip_all("STRBUF_INIT is broken");
> +	}
that's a nice use of test_skip_all()
Show 7 quoted lines
>> I'm not very enthusiastic about requiring the test author to wrap
>> TEST_RUN() in an if() statement rather than just doing that for them.
>> It makes it explicit but from the test author's point of view it just
>> feels like pointless boilerplate.
> 
> Hmm.  We can add more magic, but I suspect that it might confuse
> developers and editors.

To me its confusing to have to wrap TEST_RUN() in an if() statement until one realizes that the test might be skipped. If we document that the test body should be enclosed in braces I don't think it should confuse developers or editors and will keep the tests a bit cleaner.

Best Wishes
Phillip
Previous: René ScharfeNext: René Scharfe
Message 15 of 115 in “unit-tests: add and use TEST_RUN to simplify tests”
  1. 0/6 unit-tests: add and use TEST_RUN to simplify testsRené Scharfe, Jun 29, 2024
  2. 1/6 t0080: move expected output to a fileRené Scharfe, Jun 29, 2024
  3. Jeff KingJul 1, 2024
  4. Junio C HamanoJul 1, 2024
  5. Jeff KingJul 1, 2024
  6. Junio C HamanoJul 1, 2024
  7. Jeff KingJul 2, 2024
  8. René ScharfeJul 1, 2024
  9. Jeff KingJul 1, 2024
  10. 2/6 unit-tests: add TEST_RUNRené Scharfe, Jun 29, 2024
  11. phillip.wood123@gmail.comJul 2, 2024
  12. Junio C HamanoJul 2, 2024
  13. René ScharfeJul 2, 2024
  14. René ScharfeJul 2, 2024
  15. phillip.wood123@gmail.comJul 5, 2024
  16. René ScharfeJul 5, 2024
  17. René ScharfeJul 7, 2024
  18. phillip.wood123@gmail.comJul 8, 2024
  19. Junio C HamanoJul 8, 2024
  20. Junio C HamanoJul 11, 2024
  21. Phillip WoodJul 13, 2024
  22. Junio C HamanoJul 13, 2024
  23. phillip.wood123@gmail.comJul 8, 2024
  24. 3/6 t-ctype: use TEST_RUNRené Scharfe, Jun 29, 2024
  25. Josh SteadmonJul 1, 2024
  26. René ScharfeJul 1, 2024
  27. phillip.wood123@gmail.comJul 2, 2024
  28. René ScharfeJul 2, 2024
  29. 4/6 t-reftable-basics: use TEST_RUNRené Scharfe, Jun 29, 2024
  30. 5/6 t-strvec: use TEST_RUNRené Scharfe, Jun 29, 2024
  31. phillip.wood123@gmail.comJul 2, 2024
  32. René ScharfeJul 2, 2024
  33. 6/6 t-strbuf: use TEST_RUNRené Scharfe, Jun 29, 2024
  34. Josh SteadmonJul 1, 2024
  35. René ScharfeJul 1, 2024
  36. phillip.wood123@gmail.comJul 2, 2024
  37. René ScharfeJul 2, 2024
  38. phillip.wood123@gmail.comJul 4, 2024
  39. Phillip WoodJul 10, 2024
  40. René ScharfeJul 14, 2024
  41. Ghanshyam ThakkarJul 15, 2024
  42. Ghanshyam ThakkarJul 2, 2024
  43. René ScharfeJul 2, 2024
  44. Ghanshyam ThakkarJul 3, 2024
  45. Josh SteadmonJul 8, 2024
  46. Ghanshyam ThakkarJul 8, 2024
  47. Josh SteadmonJul 1, 2024
  48. Junio C HamanoJul 10, 2024
  49. Phillip WoodJul 11, 2024
  50. Junio C HamanoJul 11, 2024
  51. René ScharfeJul 14, 2024
  52. 0/6 unit-tests: add and use for_test to simplify testsRené Scharfe, Jul 21, 2024
  53. 1/6 t0080: move expected output to a fileRené Scharfe, Jul 21, 2024
  54. Jeff KingJul 23, 2024
  55. 2/6 unit-tests: add for_testRené Scharfe, Jul 21, 2024
  56. Kyle LippincottJul 22, 2024
  57. Junio C HamanoJul 22, 2024
  58. René ScharfeJul 22, 2024
  59. Junio C HamanoJul 22, 2024
  60. Kyle LippincottJul 22, 2024
  61. René ScharfeJul 23, 2024
  62. unit-tests: show location of checks outside of testsRené Scharfe, Jul 23, 2024
  63. Phillip WoodJul 23, 2024
  64. Kyle LippincottJul 22, 2024
  65. René ScharfeJul 23, 2024
  66. Patrick SteinhardtJul 23, 2024
  67. René ScharfeJul 23, 2024
  68. Patrick SteinhardtJul 23, 2024
  69. René ScharfeJul 23, 2024
  70. Patrick SteinhardtJul 23, 2024
  71. Phillip WoodJul 23, 2024
  72. René ScharfeJul 23, 2024
  73. Phillip WoodJul 23, 2024
  74. Phillip WoodJul 25, 2024
  75. René ScharfeJul 30, 2024
  76. 3/6 t-ctype: use for_testRené Scharfe, Jul 21, 2024
  77. 4/6 t-reftable-basics: use for_testRené Scharfe, Jul 21, 2024
  78. 5/6 t-strvec: use for_testRené Scharfe, Jul 21, 2024
  79. 6/6 t-strbuf: use for_testRené Scharfe, Jul 21, 2024
  80. Phillip WoodJul 23, 2024
  81. 0/7 add and use for_test to simplify testsRené Scharfe, Jul 24, 2024
  82. 1/7 t0080: use here-doc test bodyRené Scharfe, Jul 24, 2024
  83. 2/7 unit-tests: show location of checks outside of testsRené Scharfe, Jul 24, 2024
  84. 3/7 unit-tests: add for_testRené Scharfe, Jul 24, 2024
  85. Kyle LippincottJul 24, 2024
  86. Phillip WoodJul 25, 2024
  87. Junio C HamanoJul 25, 2024
  88. Kyle LippincottJul 25, 2024
  89. Junio C HamanoJul 26, 2024
  90. Patrick SteinhardtJul 26, 2024
  91. Junio C HamanoJul 26, 2024
  92. Patrick SteinhardtJul 29, 2024
  93. Junio C HamanoJul 29, 2024
  94. Patrick SteinhardtJul 30, 2024
  95. René ScharfeJul 30, 2024
  96. Patrick SteinhardtJul 31, 2024
  97. René ScharfeJul 31, 2024
  98. Patrick SteinhardtAug 1, 2024
  99. 4/7 t-ctype: use for_testRené Scharfe, Jul 24, 2024
  100. 5/7 t-reftable-basics: use for_testRené Scharfe, Jul 24, 2024
  101. 6/7 t-strvec: use for_testRené Scharfe, Jul 24, 2024
  102. 7/7 t-strbuf: use for_testRené Scharfe, Jul 24, 2024
  103. 0/6 add and use if_test to simplify testsRené Scharfe, Jul 30, 2024
  104. 1/6 t0080: use here-doc test bodyRené Scharfe, Jul 30, 2024
  105. Kyle LippincottJul 31, 2024
  106. 2/6 unit-tests: show location of checks outside of testsRené Scharfe, Jul 30, 2024
  107. Kyle LippincottJul 31, 2024
  108. René ScharfeAug 1, 2024
  109. 3/6 unit-tests: add if_testRené Scharfe, Jul 30, 2024
  110. Kyle LippincottJul 31, 2024
  111. René ScharfeAug 1, 2024
  112. Kyle LippincottAug 2, 2024
  113. 4/6 t-ctype: use if_testRené Scharfe, Jul 30, 2024
  114. 5/6 t-reftable-basics: use if_testRené Scharfe, Jul 30, 2024
  115. 6/6 t-strvec: use if_testRené Scharfe, Jul 30, 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.