mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
kunit: add is_init test attribute
Add is_init test attribute of type bool. Add to_string, get, and filter methods to lib/kunit/attributes.c. Mark each of the tests in the init section with the is_init=true attribute. Add is_init to the attributes documentation. Reviewed-by: David Gow <davidgow@google.com> Signed-off-by: Rae Moar <rmoar@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
parent
2cf4528157
commit
6c4ea2f48d
4 changed files with 73 additions and 1 deletions
|
@ -428,3 +428,10 @@ This attribute indicates the name of the module associated with the test.
|
||||||
|
|
||||||
This attribute is automatically saved as a string and is printed for each suite.
|
This attribute is automatically saved as a string and is printed for each suite.
|
||||||
Tests can also be filtered using this attribute.
|
Tests can also be filtered using this attribute.
|
||||||
|
|
||||||
|
``is_init``
|
||||||
|
|
||||||
|
This attribute indicates whether the test uses init data or functions.
|
||||||
|
|
||||||
|
This attribute is automatically saved as a boolean and tests can also be
|
||||||
|
filtered using this attribute.
|
||||||
|
|
|
@ -253,6 +253,7 @@ struct kunit_suite {
|
||||||
struct dentry *debugfs;
|
struct dentry *debugfs;
|
||||||
struct string_stream *log;
|
struct string_stream *log;
|
||||||
int suite_init_err;
|
int suite_init_err;
|
||||||
|
bool is_init;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Stores an array of suites, end points one past the end */
|
/* Stores an array of suites, end points one past the end */
|
||||||
|
|
|
@ -58,6 +58,16 @@ static const char *attr_enum_to_string(void *attr, const char * const str_list[]
|
||||||
return str_list[val];
|
return str_list[val];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *attr_bool_to_string(void *attr, bool *to_free)
|
||||||
|
{
|
||||||
|
bool val = (bool)attr;
|
||||||
|
|
||||||
|
*to_free = false;
|
||||||
|
if (val)
|
||||||
|
return "true";
|
||||||
|
return "false";
|
||||||
|
}
|
||||||
|
|
||||||
static const char *attr_speed_to_string(void *attr, bool *to_free)
|
static const char *attr_speed_to_string(void *attr, bool *to_free)
|
||||||
{
|
{
|
||||||
return attr_enum_to_string(attr, speed_str_list, to_free);
|
return attr_enum_to_string(attr, speed_str_list, to_free);
|
||||||
|
@ -166,6 +176,37 @@ static int attr_string_filter(void *attr, const char *input, int *err)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int attr_bool_filter(void *attr, const char *input, int *err)
|
||||||
|
{
|
||||||
|
int i, input_int = -1;
|
||||||
|
long val = (long)attr;
|
||||||
|
const char *input_str = NULL;
|
||||||
|
|
||||||
|
for (i = 0; input[i]; i++) {
|
||||||
|
if (!strchr(op_list, input[i])) {
|
||||||
|
input_str = input + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!input_str) {
|
||||||
|
*err = -EINVAL;
|
||||||
|
pr_err("kunit executor: filter value not found: %s\n", input);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(input_str, "true"))
|
||||||
|
input_int = (int)true;
|
||||||
|
else if (!strcmp(input_str, "false"))
|
||||||
|
input_int = (int)false;
|
||||||
|
else {
|
||||||
|
*err = -EINVAL;
|
||||||
|
pr_err("kunit executor: invalid filter input: %s\n", input);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return int_filter(val, input, input_int, err);
|
||||||
|
}
|
||||||
|
|
||||||
/* Get Attribute Methods */
|
/* Get Attribute Methods */
|
||||||
|
|
||||||
|
@ -194,6 +235,17 @@ static void *attr_module_get(void *test_or_suite, bool is_test)
|
||||||
return (void *) "";
|
return (void *) "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *attr_is_init_get(void *test_or_suite, bool is_test)
|
||||||
|
{
|
||||||
|
struct kunit_suite *suite = is_test ? NULL : test_or_suite;
|
||||||
|
struct kunit_case *test = is_test ? test_or_suite : NULL;
|
||||||
|
|
||||||
|
if (test)
|
||||||
|
return ((void *) NULL);
|
||||||
|
else
|
||||||
|
return ((void *) suite->is_init);
|
||||||
|
}
|
||||||
|
|
||||||
/* List of all Test Attributes */
|
/* List of all Test Attributes */
|
||||||
|
|
||||||
static struct kunit_attr kunit_attr_list[] = {
|
static struct kunit_attr kunit_attr_list[] = {
|
||||||
|
@ -212,6 +264,14 @@ static struct kunit_attr kunit_attr_list[] = {
|
||||||
.filter = attr_string_filter,
|
.filter = attr_string_filter,
|
||||||
.attr_default = (void *)"",
|
.attr_default = (void *)"",
|
||||||
.print = PRINT_SUITE,
|
.print = PRINT_SUITE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "is_init",
|
||||||
|
.get_attr = attr_is_init_get,
|
||||||
|
.to_string = attr_bool_to_string,
|
||||||
|
.filter = attr_bool_filter,
|
||||||
|
.attr_default = (void *)false,
|
||||||
|
.print = PRINT_SUITE,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -300,6 +300,7 @@ struct kunit_suite_set kunit_merge_suite_sets(struct kunit_suite_set init_suite_
|
||||||
struct kunit_suite_set total_suite_set = {NULL, NULL};
|
struct kunit_suite_set total_suite_set = {NULL, NULL};
|
||||||
struct kunit_suite **total_suite_start = NULL;
|
struct kunit_suite **total_suite_start = NULL;
|
||||||
size_t init_num_suites, num_suites, suite_size;
|
size_t init_num_suites, num_suites, suite_size;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
init_num_suites = init_suite_set.end - init_suite_set.start;
|
init_num_suites = init_suite_set.end - init_suite_set.start;
|
||||||
num_suites = suite_set.end - suite_set.start;
|
num_suites = suite_set.end - suite_set.start;
|
||||||
|
@ -310,8 +311,11 @@ struct kunit_suite_set kunit_merge_suite_sets(struct kunit_suite_set init_suite_
|
||||||
if (!total_suite_start)
|
if (!total_suite_start)
|
||||||
return total_suite_set;
|
return total_suite_set;
|
||||||
|
|
||||||
/* Append init suites and then all other kunit suites */
|
/* Append and mark init suites and then append all other kunit suites */
|
||||||
memcpy(total_suite_start, init_suite_set.start, init_num_suites * suite_size);
|
memcpy(total_suite_start, init_suite_set.start, init_num_suites * suite_size);
|
||||||
|
for (i = 0; i < init_num_suites; i++)
|
||||||
|
total_suite_start[i]->is_init = true;
|
||||||
|
|
||||||
memcpy(total_suite_start + init_num_suites, suite_set.start, num_suites * suite_size);
|
memcpy(total_suite_start + init_num_suites, suite_set.start, num_suites * suite_size);
|
||||||
|
|
||||||
/* Set kunit suite set start and end */
|
/* Set kunit suite set start and end */
|
||||||
|
|
Loading…
Reference in a new issue