On Wed, 13 Dec 2023 at 09:02, Rae Moar <rmoar@xxxxxxxxxx> wrote: > > 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. > > Signed-off-by: Rae Moar <rmoar@xxxxxxxxxx> > --- This looks much better, thanks. Maybe in the future, we'll want to collate several suite-level attributes (in a suite_attributes struct or a bitfield), but I think that should wait until after we have more examples. Reviewed-by: David Gow <davidgow@xxxxxxxxxx> Cheers, -- David > Changes since v3: > - Move the attribute from kunit_attributes to a suite field. > > .../dev-tools/kunit/running_tips.rst | 7 +++ > include/kunit/test.h | 1 + > lib/kunit/attributes.c | 60 +++++++++++++++++++ > lib/kunit/executor.c | 6 +- > 4 files changed, 73 insertions(+), 1 deletion(-) > > diff --git a/Documentation/dev-tools/kunit/running_tips.rst b/Documentation/dev-tools/kunit/running_tips.rst > index 766f9cdea0fa..024e9ad1d1e9 100644 > --- a/Documentation/dev-tools/kunit/running_tips.rst > +++ b/Documentation/dev-tools/kunit/running_tips.rst > @@ -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. > 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. > diff --git a/include/kunit/test.h b/include/kunit/test.h > index fe79cd736e94..b163b9984b33 100644 > --- a/include/kunit/test.h > +++ b/include/kunit/test.h > @@ -253,6 +253,7 @@ struct kunit_suite { > struct dentry *debugfs; > struct string_stream *log; > int suite_init_err; > + bool is_init; > }; > > /* Stores an array of suites, end points one past the end */ > diff --git a/lib/kunit/attributes.c b/lib/kunit/attributes.c > index 1b512f7e1838..2cf04cc09372 100644 > --- a/lib/kunit/attributes.c > +++ b/lib/kunit/attributes.c > @@ -58,6 +58,16 @@ static const char *attr_enum_to_string(void *attr, const char * const str_list[] > 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) > { > 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; > } > > +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 */ > > @@ -194,6 +235,17 @@ static void *attr_module_get(void *test_or_suite, bool is_test) > 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 */ > > static struct kunit_attr kunit_attr_list[] = { > @@ -212,6 +264,14 @@ static struct kunit_attr kunit_attr_list[] = { > .filter = attr_string_filter, > .attr_default = (void *)"", > .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, > } > }; > > diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c > index 847329c51e91..717b9599036b 100644 > --- a/lib/kunit/executor.c > +++ b/lib/kunit/executor.c > @@ -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 **total_suite_start = NULL; > size_t init_num_suites, num_suites, suite_size; > + int i = 0; > > init_num_suites = init_suite_set.end - init_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) > 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); > + 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); > > /* Set kunit suite set start and end */ > -- > 2.43.0.472.g3155946c3a-goog >
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature