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 |
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 --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; } }
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(+)