diff mbox series

[2/2] kunit: Reset test->priv after each param iteration

Message ID 20231215151327.1835-3-michal.wajdeczko@intel.com
State Accepted
Commit 342fb9789267ee3908959bfa136b82e88e2ce918
Headers show
Series kunit: Reset test->priv after each param iteration | expand

Commit Message

Michal Wajdeczko Dec. 15, 2023, 3:13 p.m. UTC
If we run parameterized test that uses test->priv to prepare some
custom data, then value of test->priv will leak to the next param
iteration and may be unexpected.  This could be easily seen if
we promote example_priv_test to parameterized test as then only
first test iteration will be successful:

$ ./tools/testing/kunit/kunit.py run \
	--kunitconfig ./lib/kunit/.kunitconfig *.example_priv*

[ ] Starting KUnit Kernel (1/1)...
[ ] ============================================================
[ ] =================== example (1 subtest) ====================
[ ] ==================== example_priv_test  ====================
[ ] [PASSED] example value 3
[ ] # example_priv_test: initializing
[ ] # example_priv_test: ASSERTION FAILED at lib/kunit/kunit-example-test.c:230
[ ] Expected test->priv == ((void *)0), but
[ ]     test->priv == 0000000060dfe290
[ ]     ((void *)0) == 0000000000000000
[ ] # example_priv_test: cleaning up
[ ] [FAILED] example value 2
[ ] # example_priv_test: initializing
[ ] # example_priv_test: ASSERTION FAILED at lib/kunit/kunit-example-test.c:230
[ ] Expected test->priv == ((void *)0), but
[ ]     test->priv == 0000000060dfe290
[ ]     ((void *)0) == 0000000000000000
[ ] # example_priv_test: cleaning up
[ ] [FAILED] example value 1
[ ] # example_priv_test: initializing
[ ] # example_priv_test: ASSERTION FAILED at lib/kunit/kunit-example-test.c:230
[ ] Expected test->priv == ((void *)0), but
[ ]     test->priv == 0000000060dfe290
[ ]     ((void *)0) == 0000000000000000
[ ] # example_priv_test: cleaning up
[ ] [FAILED] example value 0
[ ] # example_priv_test: initializing
[ ] # example_priv_test: cleaning up
[ ] # example_priv_test: pass:1 fail:3 skip:0 total:4
[ ] ================ [FAILED] example_priv_test ================
[ ]     # example: initializing suite
[ ]     # module: kunit_example_test
[ ]     # example: exiting suite
[ ] # Totals: pass:1 fail:3 skip:0 total:4
[ ] ===================== [FAILED] example =====================

Fix that by resetting test->priv after each param iteration, in
similar way what we did for the test->status.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: David Gow <davidgow@google.com>
Cc: Rae Moar <rmoar@google.com>
---
 lib/kunit/test.c | 1 +
 1 file changed, 1 insertion(+)

Comments

David Gow Dec. 16, 2023, 1:20 a.m. UTC | #1
On Fri, 15 Dec 2023 at 23:13, Michal Wajdeczko
<michal.wajdeczko@intel.com> wrote:
>
> If we run parameterized test that uses test->priv to prepare some
> custom data, then value of test->priv will leak to the next param
> iteration and may be unexpected.  This could be easily seen if
> we promote example_priv_test to parameterized test as then only
> first test iteration will be successful:
>
> $ ./tools/testing/kunit/kunit.py run \
>         --kunitconfig ./lib/kunit/.kunitconfig *.example_priv*
>
> [ ] Starting KUnit Kernel (1/1)...
> [ ] ============================================================
> [ ] =================== example (1 subtest) ====================
> [ ] ==================== example_priv_test  ====================
> [ ] [PASSED] example value 3
> [ ] # example_priv_test: initializing
> [ ] # example_priv_test: ASSERTION FAILED at lib/kunit/kunit-example-test.c:230
> [ ] Expected test->priv == ((void *)0), but
> [ ]     test->priv == 0000000060dfe290
> [ ]     ((void *)0) == 0000000000000000
> [ ] # example_priv_test: cleaning up
> [ ] [FAILED] example value 2
> [ ] # example_priv_test: initializing
> [ ] # example_priv_test: ASSERTION FAILED at lib/kunit/kunit-example-test.c:230
> [ ] Expected test->priv == ((void *)0), but
> [ ]     test->priv == 0000000060dfe290
> [ ]     ((void *)0) == 0000000000000000
> [ ] # example_priv_test: cleaning up
> [ ] [FAILED] example value 1
> [ ] # example_priv_test: initializing
> [ ] # example_priv_test: ASSERTION FAILED at lib/kunit/kunit-example-test.c:230
> [ ] Expected test->priv == ((void *)0), but
> [ ]     test->priv == 0000000060dfe290
> [ ]     ((void *)0) == 0000000000000000
> [ ] # example_priv_test: cleaning up
> [ ] [FAILED] example value 0
> [ ] # example_priv_test: initializing
> [ ] # example_priv_test: cleaning up
> [ ] # example_priv_test: pass:1 fail:3 skip:0 total:4
> [ ] ================ [FAILED] example_priv_test ================
> [ ]     # example: initializing suite
> [ ]     # module: kunit_example_test
> [ ]     # example: exiting suite
> [ ] # Totals: pass:1 fail:3 skip:0 total:4
> [ ] ===================== [FAILED] example =====================
>
> Fix that by resetting test->priv after each param iteration, in
> similar way what we did for the test->status.
>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: David Gow <davidgow@google.com>
> Cc: Rae Moar <rmoar@google.com>
> ---

Looks good to me. I'd vaguely assumed we'd treat test.priv as having
an undefined value on test start, but thinking about it, I like making
it explicitly NULL better.

Reviewed-by: David Gow <davidgow@google.com>

Cheers,
-- David
diff mbox series

Patch

diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index 0308865194bb..7255ca297399 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -622,6 +622,7 @@  int kunit_run_tests(struct kunit_suite *suite)
 				test.param_index++;
 				test.status = KUNIT_SUCCESS;
 				test.status_comment[0] = '\0';
+				test.priv = NULL;
 			}
 		}