On Wed, 30 Jul 2025 at 03:37, Marie Zhussupova marievic@google.com wrote:
To enable more complex parameterized test scenarios, the `generate_params` function sometimes needs additional context beyond just the previously generated parameter. This patch modifies the `generate_params` function signature to include an extra `struct kunit *test` argument, giving users access to the parent kunit test's context when generating subsequent parameters.
The `struct kunit *test` argument was added as the first parameter to the function signature as it aligns with the convention of other KUnit functions that accept `struct kunit *test` first. This also mirrors the "this" or "self" reference found in object-oriented programming languages.
This matches my prejudices well. :-)
Signed-off-by: Marie Zhussupova marievic@google.com
At last! This will be very useful as a way of having more complicated generator functions (or, indeed, any generator function which wants state without hacking it into an enormously complicated parameter object).
The only thing worth noting is that this breaks the existing tests until the next two patches are accepted, which could be a pain for bisecting. I can live with it, since the breakage is obvious and confined to the span of a couple of patches in the same series and to test-only code, but if others prefer, we can squash these together.
Reviewed-by: David Gow davidgow@google.com
Cheers, -- David
include/kunit/test.h | 9 ++++++--- lib/kunit/test.c | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/include/kunit/test.h b/include/kunit/test.h index d8dac7efd745..4ba65dc35710 100644 --- a/include/kunit/test.h +++ b/include/kunit/test.h @@ -128,7 +128,8 @@ struct kunit_attributes { struct kunit_case { void (*run_case)(struct kunit *test); const char *name;
const void* (*generate_params)(const void *prev, char *desc);
const void* (*generate_params)(struct kunit *test,
const void *prev, char *desc); struct kunit_attributes attr; /*
@@ -1701,7 +1702,8 @@ do { \
- Define function @name_gen_params which uses @array to generate parameters.
*/ #define KUNIT_ARRAY_PARAM(name, array, get_desc) \
static const void *name##_gen_params(const void *prev, char *desc) \
static const void *name##_gen_params(struct kunit *test, \
const void *prev, char *desc) \ { \ typeof((array)[0]) *__next = prev ? ((typeof(__next)) prev) + 1 : (array); \ if (__next - (array) < ARRAY_SIZE((array))) { \
@@ -1722,7 +1724,8 @@ do { \
- Define function @name_gen_params which uses @array to generate parameters.
*/ #define KUNIT_ARRAY_PARAM_DESC(name, array, desc_member) \
static const void *name##_gen_params(const void *prev, char *desc) \
static const void *name##_gen_params(struct kunit *test, \
const void *prev, char *desc) \ { \ typeof((array)[0]) *__next = prev ? ((typeof(__next)) prev) + 1 : (array); \ if (__next - (array) < ARRAY_SIZE((array))) { \
diff --git a/lib/kunit/test.c b/lib/kunit/test.c index d80b5990d85d..f50ef82179c4 100644 --- a/lib/kunit/test.c +++ b/lib/kunit/test.c @@ -696,7 +696,7 @@ int kunit_run_tests(struct kunit_suite *suite) /* Get initial param. */ param_desc[0] = '\0'; /* TODO: Make generate_params try-catch */
curr_param = test_case->generate_params(NULL, param_desc);
curr_param = test_case->generate_params(&test, NULL, param_desc); test_case->status = KUNIT_SKIPPED; kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT "KTAP version 1\n");
@@ -727,7 +727,8 @@ int kunit_run_tests(struct kunit_suite *suite)
/* Get next param. */ param_desc[0] = '\0';
curr_param = test_case->generate_params(curr_param, param_desc);
curr_param = test_case->generate_params(&test, curr_param,
param_desc); } }
-- 2.50.1.552.g942d659e1b-goog