2020-08-05 04:47:42 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
2021-05-27 05:24:04 +08:00
|
|
|
#include <linux/reboot.h>
|
2020-08-05 04:47:42 +08:00
|
|
|
#include <kunit/test.h>
|
2023-07-26 05:25:12 +08:00
|
|
|
#include <kunit/attributes.h>
|
2021-02-06 08:08:52 +08:00
|
|
|
#include <linux/glob.h>
|
|
|
|
#include <linux/moduleparam.h>
|
2020-08-05 04:47:42 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* These symbols point to the .kunit_test_suites section and are defined in
|
|
|
|
* include/asm-generic/vmlinux.lds.h, and consequently must be extern.
|
|
|
|
*/
|
2022-07-09 11:19:58 +08:00
|
|
|
extern struct kunit_suite * const __kunit_suites_start[];
|
|
|
|
extern struct kunit_suite * const __kunit_suites_end[];
|
2020-08-05 04:47:42 +08:00
|
|
|
|
|
|
|
#if IS_BUILTIN(CONFIG_KUNIT)
|
|
|
|
|
2021-04-21 10:04:27 +08:00
|
|
|
static char *filter_glob_param;
|
2021-10-01 06:20:45 +08:00
|
|
|
static char *action_param;
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
static char *filter_param;
|
|
|
|
static char *filter_action_param;
|
2021-10-01 06:20:45 +08:00
|
|
|
|
2021-04-21 10:04:27 +08:00
|
|
|
module_param_named(filter_glob, filter_glob_param, charp, 0);
|
2021-02-06 08:08:52 +08:00
|
|
|
MODULE_PARM_DESC(filter_glob,
|
2021-09-15 05:03:48 +08:00
|
|
|
"Filter which KUnit test suites/tests run at boot-time, e.g. list* or list*.*del_test");
|
2021-10-01 06:20:45 +08:00
|
|
|
module_param_named(action, action_param, charp, 0);
|
|
|
|
MODULE_PARM_DESC(action,
|
|
|
|
"Changes KUnit executor behavior, valid values are:\n"
|
|
|
|
"<none>: run the tests like normal\n"
|
2023-07-26 05:25:12 +08:00
|
|
|
"'list' to list test names instead of running them.\n"
|
|
|
|
"'list_attr' to list test names and attributes instead of running them.\n");
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
module_param_named(filter, filter_param, charp, 0);
|
|
|
|
MODULE_PARM_DESC(filter,
|
|
|
|
"Filter which KUnit test suites/tests run at boot-time using attributes, e.g. speed>slow");
|
|
|
|
module_param_named(filter_action, filter_action_param, charp, 0);
|
|
|
|
MODULE_PARM_DESC(filter_action,
|
|
|
|
"Changes behavior of filtered tests using attributes, valid values are:\n"
|
|
|
|
"<none>: do not run filtered tests as normal\n"
|
|
|
|
"'skip': skip all filtered tests instead so tests will appear in output\n");
|
2021-09-15 05:03:48 +08:00
|
|
|
|
|
|
|
/* glob_match() needs NULL terminated strings, so we need a copy of filter_glob_param. */
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
struct kunit_glob_filter {
|
2021-09-15 05:03:48 +08:00
|
|
|
char *suite_glob;
|
|
|
|
char *test_glob;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Split "suite_glob.test_glob" into two. Assumes filter_glob is not empty. */
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
static void kunit_parse_glob_filter(struct kunit_glob_filter *parsed,
|
2021-09-15 05:03:48 +08:00
|
|
|
const char *filter_glob)
|
|
|
|
{
|
|
|
|
const int len = strlen(filter_glob);
|
|
|
|
const char *period = strchr(filter_glob, '.');
|
|
|
|
|
|
|
|
if (!period) {
|
2021-10-02 09:36:35 +08:00
|
|
|
parsed->suite_glob = kzalloc(len + 1, GFP_KERNEL);
|
2021-09-15 05:03:48 +08:00
|
|
|
parsed->test_glob = NULL;
|
|
|
|
strcpy(parsed->suite_glob, filter_glob);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
parsed->suite_glob = kzalloc(period - filter_glob + 1, GFP_KERNEL);
|
|
|
|
parsed->test_glob = kzalloc(len - (period - filter_glob) + 1, GFP_KERNEL);
|
|
|
|
|
|
|
|
strncpy(parsed->suite_glob, filter_glob, period - filter_glob);
|
|
|
|
strncpy(parsed->test_glob, period + 1, len - (period - filter_glob));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Create a copy of suite with only tests that match test_glob. */
|
|
|
|
static struct kunit_suite *
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
kunit_filter_glob_tests(const struct kunit_suite *const suite, const char *test_glob)
|
2021-09-15 05:03:48 +08:00
|
|
|
{
|
|
|
|
int n = 0;
|
|
|
|
struct kunit_case *filtered, *test_case;
|
|
|
|
struct kunit_suite *copy;
|
|
|
|
|
|
|
|
kunit_suite_for_each_test_case(suite, test_case) {
|
|
|
|
if (!test_glob || glob_match(test_glob, test_case->name))
|
|
|
|
++n;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (n == 0)
|
|
|
|
return NULL;
|
|
|
|
|
2022-05-17 00:54:46 +08:00
|
|
|
copy = kmemdup(suite, sizeof(*copy), GFP_KERNEL);
|
2022-05-12 05:16:26 +08:00
|
|
|
if (!copy)
|
|
|
|
return ERR_PTR(-ENOMEM);
|
2021-09-15 05:03:48 +08:00
|
|
|
|
|
|
|
filtered = kcalloc(n + 1, sizeof(*filtered), GFP_KERNEL);
|
2022-07-13 07:25:27 +08:00
|
|
|
if (!filtered) {
|
|
|
|
kfree(copy);
|
2022-05-12 05:16:26 +08:00
|
|
|
return ERR_PTR(-ENOMEM);
|
2022-07-13 07:25:27 +08:00
|
|
|
}
|
2021-09-15 05:03:48 +08:00
|
|
|
|
|
|
|
n = 0;
|
|
|
|
kunit_suite_for_each_test_case(suite, test_case) {
|
|
|
|
if (!test_glob || glob_match(test_glob, test_case->name))
|
|
|
|
filtered[n++] = *test_case;
|
|
|
|
}
|
|
|
|
|
|
|
|
copy->test_cases = filtered;
|
|
|
|
return copy;
|
|
|
|
}
|
2021-02-06 08:08:52 +08:00
|
|
|
|
2021-05-27 05:24:04 +08:00
|
|
|
static char *kunit_shutdown;
|
|
|
|
core_param(kunit_shutdown, kunit_shutdown, charp, 0644);
|
|
|
|
|
2022-07-09 11:19:58 +08:00
|
|
|
/* Stores an array of suites, end points one past the end */
|
2021-02-06 08:08:52 +08:00
|
|
|
struct suite_set {
|
2022-07-09 11:19:58 +08:00
|
|
|
struct kunit_suite * const *start;
|
|
|
|
struct kunit_suite * const *end;
|
2021-02-06 08:08:52 +08:00
|
|
|
};
|
|
|
|
|
2021-09-15 05:03:48 +08:00
|
|
|
static void kunit_free_suite_set(struct suite_set suite_set)
|
|
|
|
{
|
2022-07-09 11:19:58 +08:00
|
|
|
struct kunit_suite * const *suites;
|
2021-09-15 05:03:48 +08:00
|
|
|
|
|
|
|
for (suites = suite_set.start; suites < suite_set.end; suites++)
|
2022-07-09 11:19:58 +08:00
|
|
|
kfree(*suites);
|
2021-09-15 05:03:48 +08:00
|
|
|
kfree(suite_set.start);
|
|
|
|
}
|
|
|
|
|
2021-04-21 10:04:27 +08:00
|
|
|
static struct suite_set kunit_filter_suites(const struct suite_set *suite_set,
|
2022-05-12 05:16:26 +08:00
|
|
|
const char *filter_glob,
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
char *filters,
|
|
|
|
char *filter_action,
|
2022-05-12 05:16:26 +08:00
|
|
|
int *err)
|
2021-02-06 08:08:52 +08:00
|
|
|
{
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
int i, j, k, filter_count;
|
|
|
|
struct kunit_suite **copy, *filtered_suite, *new_filtered_suite;
|
2021-02-06 08:08:52 +08:00
|
|
|
struct suite_set filtered;
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
struct kunit_glob_filter parsed_glob;
|
|
|
|
struct kunit_attr_filter *parsed_filters;
|
2021-02-06 08:08:52 +08:00
|
|
|
|
2021-04-21 10:04:27 +08:00
|
|
|
const size_t max = suite_set->end - suite_set->start;
|
2021-02-06 08:08:52 +08:00
|
|
|
|
|
|
|
copy = kmalloc_array(max, sizeof(*filtered.start), GFP_KERNEL);
|
|
|
|
filtered.start = copy;
|
|
|
|
if (!copy) { /* won't be able to run anything, return an empty set */
|
|
|
|
filtered.end = copy;
|
|
|
|
return filtered;
|
|
|
|
}
|
|
|
|
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
if (filter_glob)
|
|
|
|
kunit_parse_glob_filter(&parsed_glob, filter_glob);
|
2021-09-15 05:03:48 +08:00
|
|
|
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
/* Parse attribute filters */
|
|
|
|
if (filters) {
|
|
|
|
filter_count = kunit_get_filter_count(filters);
|
|
|
|
parsed_filters = kcalloc(filter_count + 1, sizeof(*parsed_filters), GFP_KERNEL);
|
|
|
|
for (j = 0; j < filter_count; j++)
|
|
|
|
parsed_filters[j] = kunit_next_attr_filter(&filters, err);
|
|
|
|
if (*err)
|
2022-05-12 05:16:26 +08:00
|
|
|
return filtered;
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; &suite_set->start[i] != suite_set->end; i++) {
|
|
|
|
filtered_suite = suite_set->start[i];
|
|
|
|
if (filter_glob) {
|
|
|
|
if (!glob_match(parsed_glob.suite_glob, filtered_suite->name))
|
|
|
|
continue;
|
|
|
|
filtered_suite = kunit_filter_glob_tests(filtered_suite,
|
|
|
|
parsed_glob.test_glob);
|
|
|
|
if (IS_ERR(filtered_suite)) {
|
|
|
|
*err = PTR_ERR(filtered_suite);
|
|
|
|
return filtered;
|
|
|
|
}
|
2022-05-12 05:16:26 +08:00
|
|
|
}
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
if (filter_count) {
|
|
|
|
for (k = 0; k < filter_count; k++) {
|
|
|
|
new_filtered_suite = kunit_filter_attr_tests(filtered_suite,
|
|
|
|
parsed_filters[k], filter_action, err);
|
|
|
|
|
|
|
|
/* Free previous copy of suite */
|
|
|
|
if (k > 0 || filter_glob)
|
|
|
|
kfree(filtered_suite);
|
|
|
|
filtered_suite = new_filtered_suite;
|
|
|
|
|
|
|
|
if (*err)
|
|
|
|
return filtered;
|
|
|
|
if (IS_ERR(filtered_suite)) {
|
|
|
|
*err = PTR_ERR(filtered_suite);
|
|
|
|
return filtered;
|
|
|
|
}
|
|
|
|
if (!filtered_suite)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-09 11:19:58 +08:00
|
|
|
if (!filtered_suite)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
*copy++ = filtered_suite;
|
2021-02-06 08:08:52 +08:00
|
|
|
}
|
|
|
|
filtered.end = copy;
|
2021-09-15 05:03:48 +08:00
|
|
|
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
if (filter_glob) {
|
|
|
|
kfree(parsed_glob.suite_glob);
|
|
|
|
kfree(parsed_glob.test_glob);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filter_count)
|
|
|
|
kfree(parsed_filters);
|
|
|
|
|
2021-02-06 08:08:52 +08:00
|
|
|
return filtered;
|
|
|
|
}
|
|
|
|
|
2021-05-27 05:24:04 +08:00
|
|
|
static void kunit_handle_shutdown(void)
|
|
|
|
{
|
|
|
|
if (!kunit_shutdown)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!strcmp(kunit_shutdown, "poweroff"))
|
|
|
|
kernel_power_off();
|
|
|
|
else if (!strcmp(kunit_shutdown, "halt"))
|
|
|
|
kernel_halt();
|
|
|
|
else if (!strcmp(kunit_shutdown, "reboot"))
|
|
|
|
kernel_restart(NULL);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-10-01 06:20:45 +08:00
|
|
|
static void kunit_exec_run_tests(struct suite_set *suite_set)
|
2020-08-05 04:47:42 +08:00
|
|
|
{
|
2022-07-09 11:19:58 +08:00
|
|
|
size_t num_suites = suite_set->end - suite_set->start;
|
2021-10-01 06:20:45 +08:00
|
|
|
|
2022-11-24 02:25:58 +08:00
|
|
|
pr_info("KTAP version 1\n");
|
2022-07-09 11:19:58 +08:00
|
|
|
pr_info("1..%zu\n", num_suites);
|
2021-10-01 06:20:45 +08:00
|
|
|
|
2022-07-09 11:19:58 +08:00
|
|
|
__kunit_test_suites_init(suite_set->start, num_suites);
|
2021-10-01 06:20:45 +08:00
|
|
|
}
|
|
|
|
|
2023-07-26 05:25:12 +08:00
|
|
|
static void kunit_exec_list_tests(struct suite_set *suite_set, bool include_attr)
|
2021-10-01 06:20:45 +08:00
|
|
|
{
|
2022-07-09 11:19:58 +08:00
|
|
|
struct kunit_suite * const *suites;
|
2021-10-01 06:20:45 +08:00
|
|
|
struct kunit_case *test_case;
|
|
|
|
|
2022-11-24 02:25:58 +08:00
|
|
|
/* Hack: print a ktap header so kunit.py can find the start of KUnit output. */
|
|
|
|
pr_info("KTAP version 1\n");
|
2021-10-01 06:20:45 +08:00
|
|
|
|
2023-07-26 05:25:12 +08:00
|
|
|
for (suites = suite_set->start; suites < suite_set->end; suites++) {
|
|
|
|
/* Print suite name and suite attributes */
|
|
|
|
pr_info("%s\n", (*suites)->name);
|
|
|
|
if (include_attr)
|
|
|
|
kunit_print_attr((void *)(*suites), false, 0);
|
|
|
|
|
|
|
|
/* Print test case name and attributes in suite */
|
2022-07-09 11:19:58 +08:00
|
|
|
kunit_suite_for_each_test_case((*suites), test_case) {
|
|
|
|
pr_info("%s.%s\n", (*suites)->name, test_case->name);
|
2023-07-26 05:25:12 +08:00
|
|
|
if (include_attr)
|
|
|
|
kunit_print_attr((void *)test_case, true, 0);
|
2021-10-01 06:20:45 +08:00
|
|
|
}
|
2023-07-26 05:25:12 +08:00
|
|
|
}
|
2021-10-01 06:20:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int kunit_run_all_tests(void)
|
|
|
|
{
|
2022-07-09 11:19:58 +08:00
|
|
|
struct suite_set suite_set = {__kunit_suites_start, __kunit_suites_end};
|
2022-05-14 02:37:07 +08:00
|
|
|
int err = 0;
|
2022-08-23 22:24:54 +08:00
|
|
|
if (!kunit_enabled()) {
|
|
|
|
pr_info("kunit: disabled\n");
|
|
|
|
goto out;
|
|
|
|
}
|
2020-08-05 04:47:42 +08:00
|
|
|
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
if (filter_glob_param || filter_param) {
|
|
|
|
suite_set = kunit_filter_suites(&suite_set, filter_glob_param,
|
|
|
|
filter_param, filter_action_param, &err);
|
2022-05-12 05:16:26 +08:00
|
|
|
if (err) {
|
|
|
|
pr_err("kunit executor: error filtering suites: %d\n", err);
|
2022-05-14 02:37:07 +08:00
|
|
|
goto out;
|
2022-05-12 05:16:26 +08:00
|
|
|
}
|
|
|
|
}
|
2021-02-06 08:08:52 +08:00
|
|
|
|
2021-10-01 06:20:45 +08:00
|
|
|
if (!action_param)
|
|
|
|
kunit_exec_run_tests(&suite_set);
|
|
|
|
else if (strcmp(action_param, "list") == 0)
|
2023-07-26 05:25:12 +08:00
|
|
|
kunit_exec_list_tests(&suite_set, false);
|
|
|
|
else if (strcmp(action_param, "list_attr") == 0)
|
|
|
|
kunit_exec_list_tests(&suite_set, true);
|
2021-10-01 06:20:45 +08:00
|
|
|
else
|
|
|
|
pr_err("kunit executor: unknown action '%s'\n", action_param);
|
2020-08-05 04:47:44 +08:00
|
|
|
|
kunit: Add ability to filter attributes
Add filtering of test attributes. Users can filter tests using the
module_param called "filter".
Filters are imputed in the format: <attribute_name><operation><value>
Example: kunit.filter="speed>slow"
Operations include: >, <, >=, <=, !=, and =. These operations will act the
same for attributes of the same type but may not between types.
Note multiple filters can be inputted by separating them with a comma.
Example: kunit.filter="speed=slow, module!=example"
Since both suites and test cases can have attributes, there may be
conflicts. The process of filtering follows these rules:
- Filtering always operates at a per-test level.
- If a test has an attribute set, then the test's value is filtered on.
- Otherwise, the value falls back to the suite's value.
- If neither are set, the attribute has a global "default" value, which
is used.
Filtered tests will not be run or show in output. The tests can instead be
skipped using the configurable option "kunit.filter_action=skip".
Note the default settings for running tests remains unfiltered.
Finally, add "filter" methods for the speed and module attributes to parse
and compare attribute values.
Note this filtering functionality will be added to kunit.py in the next
patch.
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2023-07-26 05:25:15 +08:00
|
|
|
if (filter_glob_param || filter_param) { /* a copy was made of each suite */
|
2021-09-15 05:03:48 +08:00
|
|
|
kunit_free_suite_set(suite_set);
|
2021-02-06 08:08:52 +08:00
|
|
|
}
|
2020-08-05 04:47:42 +08:00
|
|
|
|
2022-05-14 02:37:07 +08:00
|
|
|
out:
|
|
|
|
kunit_handle_shutdown();
|
|
|
|
return err;
|
2020-08-05 04:47:42 +08:00
|
|
|
}
|
|
|
|
|
2021-04-21 10:04:27 +08:00
|
|
|
#if IS_BUILTIN(CONFIG_KUNIT_TEST)
|
|
|
|
#include "executor_test.c"
|
|
|
|
#endif
|
|
|
|
|
2020-08-05 04:47:42 +08:00
|
|
|
#endif /* IS_BUILTIN(CONFIG_KUNIT) */
|