Merge tag 'memblock-v5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt...
[linux-2.6-microblaze.git] / lib / kunit / test.c
index 750704a..ec9494e 100644 (file)
@@ -325,39 +325,72 @@ static void kunit_catch_run_case(void *data)
  * occur in a test case and reports them as failures.
  */
 static void kunit_run_case_catch_errors(struct kunit_suite *suite,
-                                       struct kunit_case *test_case)
+                                       struct kunit_case *test_case,
+                                       struct kunit *test)
 {
        struct kunit_try_catch_context context;
        struct kunit_try_catch *try_catch;
-       struct kunit test;
 
-       kunit_init_test(&test, test_case->name, test_case->log);
-       try_catch = &test.try_catch;
+       kunit_init_test(test, test_case->name, test_case->log);
+       try_catch = &test->try_catch;
 
        kunit_try_catch_init(try_catch,
-                            &test,
+                            test,
                             kunit_try_run_case,
                             kunit_catch_run_case);
-       context.test = &test;
+       context.test = test;
        context.suite = suite;
        context.test_case = test_case;
        kunit_try_catch_run(try_catch, &context);
 
-       test_case->success = test.success;
-
-       kunit_print_ok_not_ok(&test, true, test_case->success,
-                             kunit_test_case_num(suite, test_case),
-                             test_case->name);
+       test_case->success = test->success;
 }
 
 int kunit_run_tests(struct kunit_suite *suite)
 {
+       char param_desc[KUNIT_PARAM_DESC_SIZE];
        struct kunit_case *test_case;
 
        kunit_print_subtest_start(suite);
 
-       kunit_suite_for_each_test_case(suite, test_case)
-               kunit_run_case_catch_errors(suite, test_case);
+       kunit_suite_for_each_test_case(suite, test_case) {
+               struct kunit test = { .param_value = NULL, .param_index = 0 };
+               bool test_success = true;
+
+               if (test_case->generate_params) {
+                       /* Get initial param. */
+                       param_desc[0] = '\0';
+                       test.param_value = test_case->generate_params(NULL, param_desc);
+               }
+
+               do {
+                       kunit_run_case_catch_errors(suite, test_case, &test);
+                       test_success &= test_case->success;
+
+                       if (test_case->generate_params) {
+                               if (param_desc[0] == '\0') {
+                                       snprintf(param_desc, sizeof(param_desc),
+                                                "param-%d", test.param_index);
+                               }
+
+                               kunit_log(KERN_INFO, &test,
+                                         KUNIT_SUBTEST_INDENT
+                                         "# %s: %s %d - %s",
+                                         test_case->name,
+                                         kunit_status_to_string(test.success),
+                                         test.param_index + 1, param_desc);
+
+                               /* Get next param. */
+                               param_desc[0] = '\0';
+                               test.param_value = test_case->generate_params(test.param_value, param_desc);
+                               test.param_index++;
+                       }
+               } while (test.param_value);
+
+               kunit_print_ok_not_ok(&test, true, test_success,
+                                     kunit_test_case_num(suite, test_case),
+                                     test_case->name);
+       }
 
        kunit_print_subtest_end(suite);