aboutsummaryrefslogtreecommitdiff
path: root/lib/kunit
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kunit')
-rw-r--r--lib/kunit/Kconfig2
-rw-r--r--lib/kunit/assert.c12
-rw-r--r--lib/kunit/attributes.c2
-rw-r--r--lib/kunit/device.c9
-rw-r--r--lib/kunit/executor.c6
-rw-r--r--lib/kunit/executor_test.c2
-rw-r--r--lib/kunit/kunit-example-test.c2
-rw-r--r--lib/kunit/kunit-test.c3
-rw-r--r--lib/kunit/resource.c2
-rw-r--r--lib/kunit/static_stub.c2
-rw-r--r--lib/kunit/string-stream.c4
-rw-r--r--lib/kunit/test.c231
12 files changed, 147 insertions, 130 deletions
diff --git a/lib/kunit/Kconfig b/lib/kunit/Kconfig
index 50ecf55d2b9c..498cc51e493d 100644
--- a/lib/kunit/Kconfig
+++ b/lib/kunit/Kconfig
@@ -28,7 +28,7 @@ config KUNIT_FAULT_TEST
bool "Enable KUnit tests which print BUG stacktraces"
depends on KUNIT_TEST
depends on !UML
- default y
+ default !PANIC_ON_OOPS
help
Enables fault handling tests for the KUnit framework. These tests may
trigger a kernel BUG(), and the associated stack trace, even when they
diff --git a/lib/kunit/assert.c b/lib/kunit/assert.c
index 867aa5c4bccf..4c751ad8506a 100644
--- a/lib/kunit/assert.c
+++ b/lib/kunit/assert.c
@@ -51,7 +51,7 @@ void kunit_unary_assert_format(const struct kunit_assert *assert,
const struct va_format *message,
struct string_stream *stream)
{
- struct kunit_unary_assert *unary_assert;
+ const struct kunit_unary_assert *unary_assert;
unary_assert = container_of(assert, struct kunit_unary_assert, assert);
@@ -71,7 +71,7 @@ void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert,
const struct va_format *message,
struct string_stream *stream)
{
- struct kunit_ptr_not_err_assert *ptr_assert;
+ const struct kunit_ptr_not_err_assert *ptr_assert;
ptr_assert = container_of(assert, struct kunit_ptr_not_err_assert,
assert);
@@ -117,7 +117,7 @@ void kunit_binary_assert_format(const struct kunit_assert *assert,
const struct va_format *message,
struct string_stream *stream)
{
- struct kunit_binary_assert *binary_assert;
+ const struct kunit_binary_assert *binary_assert;
binary_assert = container_of(assert, struct kunit_binary_assert,
assert);
@@ -145,7 +145,7 @@ void kunit_binary_ptr_assert_format(const struct kunit_assert *assert,
const struct va_format *message,
struct string_stream *stream)
{
- struct kunit_binary_ptr_assert *binary_assert;
+ const struct kunit_binary_ptr_assert *binary_assert;
binary_assert = container_of(assert, struct kunit_binary_ptr_assert,
assert);
@@ -185,7 +185,7 @@ void kunit_binary_str_assert_format(const struct kunit_assert *assert,
const struct va_format *message,
struct string_stream *stream)
{
- struct kunit_binary_str_assert *binary_assert;
+ const struct kunit_binary_str_assert *binary_assert;
binary_assert = container_of(assert, struct kunit_binary_str_assert,
assert);
@@ -237,7 +237,7 @@ void kunit_mem_assert_format(const struct kunit_assert *assert,
const struct va_format *message,
struct string_stream *stream)
{
- struct kunit_mem_assert *mem_assert;
+ const struct kunit_mem_assert *mem_assert;
mem_assert = container_of(assert, struct kunit_mem_assert,
assert);
diff --git a/lib/kunit/attributes.c b/lib/kunit/attributes.c
index 2cf04cc09372..6d7a53af94a9 100644
--- a/lib/kunit/attributes.c
+++ b/lib/kunit/attributes.c
@@ -410,7 +410,7 @@ struct kunit_suite *kunit_filter_attr_tests(const struct kunit_suite *const suit
kunit_suite_for_each_test_case(suite, test_case) { n++; }
- filtered = kcalloc(n + 1, sizeof(*filtered), GFP_KERNEL);
+ filtered = kzalloc_objs(*filtered, n + 1);
if (!filtered) {
kfree(copy);
return ERR_PTR(-ENOMEM);
diff --git a/lib/kunit/device.c b/lib/kunit/device.c
index 520c1fccee8a..85d57ad34045 100644
--- a/lib/kunit/device.c
+++ b/lib/kunit/device.c
@@ -106,13 +106,12 @@ EXPORT_SYMBOL_GPL(kunit_driver_create);
/* Helper which creates a kunit_device, attaches it to the kunit_bus*/
static struct kunit_device *kunit_device_register_internal(struct kunit *test,
- const char *name,
- const struct device_driver *drv)
+ const char *name)
{
struct kunit_device *kunit_dev;
int err = -ENOMEM;
- kunit_dev = kzalloc(sizeof(*kunit_dev), GFP_KERNEL);
+ kunit_dev = kzalloc_obj(*kunit_dev);
if (!kunit_dev)
return ERR_PTR(err);
@@ -150,7 +149,7 @@ struct device *kunit_device_register_with_driver(struct kunit *test,
const char *name,
const struct device_driver *drv)
{
- struct kunit_device *kunit_dev = kunit_device_register_internal(test, name, drv);
+ struct kunit_device *kunit_dev = kunit_device_register_internal(test, name);
if (IS_ERR_OR_NULL(kunit_dev))
return ERR_CAST(kunit_dev);
@@ -172,7 +171,7 @@ struct device *kunit_device_register(struct kunit *test, const char *name)
if (IS_ERR(drv))
return ERR_CAST(drv);
- dev = kunit_device_register_internal(test, name, drv);
+ dev = kunit_device_register_internal(test, name);
if (IS_ERR(dev)) {
kunit_release_action(test, driver_unregister_wrapper, (void *)drv);
return ERR_CAST(dev);
diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c
index 02ff380ab793..1fef217de11d 100644
--- a/lib/kunit/executor.c
+++ b/lib/kunit/executor.c
@@ -131,7 +131,7 @@ kunit_filter_glob_tests(const struct kunit_suite *const suite, const char *test_
if (!copy)
return ERR_PTR(-ENOMEM);
- filtered = kcalloc(n + 1, sizeof(*filtered), GFP_KERNEL);
+ filtered = kzalloc_objs(*filtered, n + 1);
if (!filtered) {
kfree(copy);
return ERR_PTR(-ENOMEM);
@@ -179,7 +179,7 @@ kunit_filter_suites(const struct kunit_suite_set *suite_set,
const size_t max = suite_set->end - suite_set->start;
- copy = kcalloc(max, sizeof(*copy), GFP_KERNEL);
+ copy = kzalloc_objs(*copy, max);
if (!copy) { /* won't be able to run anything, return an empty set */
return filtered;
}
@@ -194,7 +194,7 @@ kunit_filter_suites(const struct kunit_suite_set *suite_set,
/* Parse attribute filters */
if (filters) {
filter_count = kunit_get_filter_count(filters);
- parsed_filters = kcalloc(filter_count, sizeof(*parsed_filters), GFP_KERNEL);
+ parsed_filters = kzalloc_objs(*parsed_filters, filter_count);
if (!parsed_filters) {
*err = -ENOMEM;
goto free_parsed_glob;
diff --git a/lib/kunit/executor_test.c b/lib/kunit/executor_test.c
index f0090c2729cd..4cb119ad8f64 100644
--- a/lib/kunit/executor_test.c
+++ b/lib/kunit/executor_test.c
@@ -272,7 +272,7 @@ static void free_suite_set_at_end(struct kunit *test, const void *to_free)
if (!((struct kunit_suite_set *)to_free)->start)
return;
- free = kzalloc(sizeof(struct kunit_suite_set), GFP_KERNEL);
+ free = kzalloc_obj(struct kunit_suite_set);
*free = *(struct kunit_suite_set *)to_free;
kunit_add_action(test, free_suite_set, (void *)free);
diff --git a/lib/kunit/kunit-example-test.c b/lib/kunit/kunit-example-test.c
index 9452b163956f..0bae7b7ca0b0 100644
--- a/lib/kunit/kunit-example-test.c
+++ b/lib/kunit/kunit-example-test.c
@@ -283,7 +283,7 @@ static void example_slow_test(struct kunit *test)
*/
static int example_resource_init(struct kunit_resource *res, void *context)
{
- int *info = kmalloc(sizeof(*info), GFP_KERNEL);
+ int *info = kmalloc_obj(*info);
if (!info)
return -ENOMEM;
diff --git a/lib/kunit/kunit-test.c b/lib/kunit/kunit-test.c
index 63130a48e237..126e30879dad 100644
--- a/lib/kunit/kunit-test.c
+++ b/lib/kunit/kunit-test.c
@@ -538,8 +538,7 @@ static void kunit_resource_test_action_ordering(struct kunit *test)
static int kunit_resource_test_init(struct kunit *test)
{
- struct kunit_test_resource_context *ctx =
- kzalloc(sizeof(*ctx), GFP_KERNEL);
+ struct kunit_test_resource_context *ctx = kzalloc_obj(*ctx);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
diff --git a/lib/kunit/resource.c b/lib/kunit/resource.c
index f0209252b179..45e55238ccf6 100644
--- a/lib/kunit/resource.c
+++ b/lib/kunit/resource.c
@@ -98,7 +98,7 @@ int kunit_add_action(struct kunit *test, void (*action)(void *), void *ctx)
KUNIT_ASSERT_NOT_NULL_MSG(test, action, "Tried to action a NULL function!");
- action_ctx = kzalloc(sizeof(*action_ctx), GFP_KERNEL);
+ action_ctx = kzalloc_obj(*action_ctx);
if (!action_ctx)
return -ENOMEM;
diff --git a/lib/kunit/static_stub.c b/lib/kunit/static_stub.c
index 484fd85251b4..d9dd6377aa38 100644
--- a/lib/kunit/static_stub.c
+++ b/lib/kunit/static_stub.c
@@ -111,7 +111,7 @@ void __kunit_activate_static_stub(struct kunit *test,
/* We got an extra reference from find_resource(), so put it. */
kunit_put_resource(res);
} else {
- ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
+ ctx = kmalloc_obj(*ctx);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
ctx->real_fn_addr = real_fn_addr;
ctx->replacement_addr = replacement_addr;
diff --git a/lib/kunit/string-stream.c b/lib/kunit/string-stream.c
index 54f4fdcbfac8..0d8f1b30559b 100644
--- a/lib/kunit/string-stream.c
+++ b/lib/kunit/string-stream.c
@@ -18,7 +18,7 @@ static struct string_stream_fragment *alloc_string_stream_fragment(int len, gfp_
{
struct string_stream_fragment *frag;
- frag = kzalloc(sizeof(*frag), gfp);
+ frag = kzalloc_obj(*frag, gfp);
if (!frag)
return ERR_PTR(-ENOMEM);
@@ -158,7 +158,7 @@ struct string_stream *alloc_string_stream(gfp_t gfp)
{
struct string_stream *stream;
- stream = kzalloc(sizeof(*stream), gfp);
+ stream = kzalloc_obj(*stream, gfp);
if (!stream)
return ERR_PTR(-ENOMEM);
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index 62eb529824c6..41e1c89799b6 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -94,7 +94,7 @@ struct kunit_result_stats {
unsigned long total;
};
-static bool kunit_should_print_stats(struct kunit_result_stats stats)
+static bool kunit_should_print_stats(struct kunit_result_stats *stats)
{
if (kunit_stats_enabled == 0)
return false;
@@ -102,11 +102,11 @@ static bool kunit_should_print_stats(struct kunit_result_stats stats)
if (kunit_stats_enabled == 2)
return true;
- return (stats.total > 1);
+ return (stats->total > 1);
}
static void kunit_print_test_stats(struct kunit *test,
- struct kunit_result_stats stats)
+ struct kunit_result_stats *stats)
{
if (!kunit_should_print_stats(stats))
return;
@@ -115,10 +115,10 @@ static void kunit_print_test_stats(struct kunit *test,
KUNIT_SUBTEST_INDENT
"# %s: pass:%lu fail:%lu skip:%lu total:%lu",
test->name,
- stats.passed,
- stats.failed,
- stats.skipped,
- stats.total);
+ stats->passed,
+ stats->failed,
+ stats->skipped,
+ stats->total);
}
/* Append formatted message to log. */
@@ -600,26 +600,26 @@ static void kunit_run_case_catch_errors(struct kunit_suite *suite,
}
static void kunit_print_suite_stats(struct kunit_suite *suite,
- struct kunit_result_stats suite_stats,
- struct kunit_result_stats param_stats)
+ struct kunit_result_stats *suite_stats,
+ struct kunit_result_stats *param_stats)
{
if (kunit_should_print_stats(suite_stats)) {
kunit_log(KERN_INFO, suite,
"# %s: pass:%lu fail:%lu skip:%lu total:%lu",
suite->name,
- suite_stats.passed,
- suite_stats.failed,
- suite_stats.skipped,
- suite_stats.total);
+ suite_stats->passed,
+ suite_stats->failed,
+ suite_stats->skipped,
+ suite_stats->total);
}
if (kunit_should_print_stats(param_stats)) {
kunit_log(KERN_INFO, suite,
"# Totals: pass:%lu fail:%lu skip:%lu total:%lu",
- param_stats.passed,
- param_stats.failed,
- param_stats.skipped,
- param_stats.total);
+ param_stats->passed,
+ param_stats->failed,
+ param_stats->skipped,
+ param_stats->total);
}
}
@@ -681,13 +681,116 @@ static void kunit_init_parent_param_test(struct kunit_case *test_case, struct ku
}
}
-int kunit_run_tests(struct kunit_suite *suite)
+static noinline_for_stack void
+kunit_run_param_test(struct kunit_suite *suite, struct kunit_case *test_case,
+ struct kunit *test,
+ struct kunit_result_stats *suite_stats,
+ struct kunit_result_stats *total_stats,
+ struct kunit_result_stats *param_stats)
{
char param_desc[KUNIT_PARAM_DESC_SIZE];
+ const void *curr_param;
+
+ kunit_init_parent_param_test(test_case, test);
+ if (test_case->status == KUNIT_FAILURE) {
+ kunit_update_stats(param_stats, test->status);
+ return;
+ }
+ /* Get initial param. */
+ param_desc[0] = '\0';
+ /* TODO: Make generate_params try-catch */
+ 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");
+ kunit_log(KERN_INFO, test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT
+ "# Subtest: %s", test_case->name);
+ if (test->params_array.params &&
+ test_case->generate_params == kunit_array_gen_params) {
+ kunit_log(KERN_INFO, test, KUNIT_SUBTEST_INDENT
+ KUNIT_SUBTEST_INDENT "1..%zd\n",
+ test->params_array.num_params);
+ }
+
+ while (curr_param) {
+ struct kunit param_test = {
+ .param_value = curr_param,
+ .param_index = ++test->param_index,
+ .parent = test,
+ };
+ kunit_init_test(&param_test, test_case->name, NULL);
+ param_test.log = test_case->log;
+ kunit_run_case_catch_errors(suite, test_case, &param_test);
+
+ if (param_desc[0] == '\0') {
+ snprintf(param_desc, sizeof(param_desc),
+ "param-%d", param_test.param_index);
+ }
+
+ kunit_print_ok_not_ok(&param_test, KUNIT_LEVEL_CASE_PARAM,
+ param_test.status,
+ param_test.param_index,
+ param_desc,
+ param_test.status_comment);
+
+ kunit_update_stats(param_stats, param_test.status);
+
+ /* Get next param. */
+ param_desc[0] = '\0';
+ curr_param = test_case->generate_params(test, curr_param,
+ param_desc);
+ }
+ /*
+ * TODO: Put into a try catch. Since we don't need suite->exit
+ * for it we can't reuse kunit_try_run_cleanup for this yet.
+ */
+ if (test_case->param_exit)
+ test_case->param_exit(test);
+ /* TODO: Put this kunit_cleanup into a try-catch. */
+ kunit_cleanup(test);
+}
+
+static noinline_for_stack void
+kunit_run_one_test(struct kunit_suite *suite, struct kunit_case *test_case,
+ struct kunit_result_stats *suite_stats,
+ struct kunit_result_stats *total_stats)
+{
+ struct kunit test = { .param_value = NULL, .param_index = 0 };
+ struct kunit_result_stats param_stats = { 0 };
+
+ kunit_init_test(&test, test_case->name, test_case->log);
+ if (test_case->status == KUNIT_SKIPPED) {
+ /* Test marked as skip */
+ test.status = KUNIT_SKIPPED;
+ kunit_update_stats(&param_stats, test.status);
+ } else if (!test_case->generate_params) {
+ /* Non-parameterised test. */
+ test_case->status = KUNIT_SKIPPED;
+ kunit_run_case_catch_errors(suite, test_case, &test);
+ kunit_update_stats(&param_stats, test.status);
+ } else {
+ kunit_run_param_test(suite, test_case, &test, suite_stats,
+ total_stats, &param_stats);
+ }
+ kunit_print_attr((void *)test_case, true, KUNIT_LEVEL_CASE);
+
+ kunit_print_test_stats(&test, &param_stats);
+
+ kunit_print_ok_not_ok(&test, KUNIT_LEVEL_CASE, test_case->status,
+ kunit_test_case_num(suite, test_case),
+ test_case->name,
+ test.status_comment);
+
+ kunit_update_stats(suite_stats, test_case->status);
+ kunit_accumulate_stats(total_stats, param_stats);
+}
+
+
+int kunit_run_tests(struct kunit_suite *suite)
+{
struct kunit_case *test_case;
struct kunit_result_stats suite_stats = { 0 };
struct kunit_result_stats total_stats = { 0 };
- const void *curr_param;
/* Taint the kernel so we know we've run tests. */
add_taint(TAINT_TEST, LOCKDEP_STILL_OK);
@@ -703,97 +806,13 @@ int kunit_run_tests(struct kunit_suite *suite)
kunit_print_suite_start(suite);
- kunit_suite_for_each_test_case(suite, test_case) {
- struct kunit test = { .param_value = NULL, .param_index = 0 };
- struct kunit_result_stats param_stats = { 0 };
-
- kunit_init_test(&test, test_case->name, test_case->log);
- if (test_case->status == KUNIT_SKIPPED) {
- /* Test marked as skip */
- test.status = KUNIT_SKIPPED;
- kunit_update_stats(&param_stats, test.status);
- } else if (!test_case->generate_params) {
- /* Non-parameterised test. */
- test_case->status = KUNIT_SKIPPED;
- kunit_run_case_catch_errors(suite, test_case, &test);
- kunit_update_stats(&param_stats, test.status);
- } else {
- kunit_init_parent_param_test(test_case, &test);
- if (test_case->status == KUNIT_FAILURE) {
- kunit_update_stats(&param_stats, test.status);
- goto test_case_end;
- }
- /* Get initial param. */
- param_desc[0] = '\0';
- /* TODO: Make generate_params try-catch */
- 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");
- kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT
- "# Subtest: %s", test_case->name);
- if (test.params_array.params &&
- test_case->generate_params == kunit_array_gen_params) {
- kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT
- KUNIT_SUBTEST_INDENT "1..%zd\n",
- test.params_array.num_params);
- }
-
- while (curr_param) {
- struct kunit param_test = {
- .param_value = curr_param,
- .param_index = ++test.param_index,
- .parent = &test,
- };
- kunit_init_test(&param_test, test_case->name, NULL);
- param_test.log = test_case->log;
- kunit_run_case_catch_errors(suite, test_case, &param_test);
-
- if (param_desc[0] == '\0') {
- snprintf(param_desc, sizeof(param_desc),
- "param-%d", param_test.param_index);
- }
-
- kunit_print_ok_not_ok(&param_test, KUNIT_LEVEL_CASE_PARAM,
- param_test.status,
- param_test.param_index,
- param_desc,
- param_test.status_comment);
-
- kunit_update_stats(&param_stats, param_test.status);
-
- /* Get next param. */
- param_desc[0] = '\0';
- curr_param = test_case->generate_params(&test, curr_param,
- param_desc);
- }
- /*
- * TODO: Put into a try catch. Since we don't need suite->exit
- * for it we can't reuse kunit_try_run_cleanup for this yet.
- */
- if (test_case->param_exit)
- test_case->param_exit(&test);
- /* TODO: Put this kunit_cleanup into a try-catch. */
- kunit_cleanup(&test);
- }
-test_case_end:
- kunit_print_attr((void *)test_case, true, KUNIT_LEVEL_CASE);
-
- kunit_print_test_stats(&test, param_stats);
-
- kunit_print_ok_not_ok(&test, KUNIT_LEVEL_CASE, test_case->status,
- kunit_test_case_num(suite, test_case),
- test_case->name,
- test.status_comment);
-
- kunit_update_stats(&suite_stats, test_case->status);
- kunit_accumulate_stats(&total_stats, param_stats);
- }
+ kunit_suite_for_each_test_case(suite, test_case)
+ kunit_run_one_test(suite, test_case, &suite_stats, &total_stats);
if (suite->suite_exit)
suite->suite_exit(suite);
- kunit_print_suite_stats(suite, suite_stats, total_stats);
+ kunit_print_suite_stats(suite, &suite_stats, &total_stats);
suite_end:
kunit_print_suite_end(suite);