[igt-dev] [PATCH i-g-t v2 02/13] scripts/test_list.py: make the class more generic
Kamil Konieczny
kamil.konieczny at linux.intel.com
Wed Jul 12 17:29:57 UTC 2023
Hi Mauro,
On 2023-07-12 at 15:58:43 +0200, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
>
> Currently, the class is meant to be used only on IGT. However, it
> could also be used on other projects. It actually makes sense to
> port it to the Kernel, in order to document KUnit and Kselftests.
>
> Make the class more generic by allowing the constructor to pass
> three additional arguments:
> - The tag name for the test group ("TEST");
> - The tag name for the subtest group ("SUBTEST");
> - the prefix name for the tests;
> - the separator between testa and subtests.
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>
> ---
> scripts/test_list.py | 43 ++++++++++++++++++++++++++++---------------
> 1 file changed, 28 insertions(+), 15 deletions(-)
>
> diff --git a/scripts/test_list.py b/scripts/test_list.py
> index 4f580fb3de58..18fdd619211a 100755
> --- a/scripts/test_list.py
> +++ b/scripts/test_list.py
> @@ -101,8 +101,8 @@ class TestList:
>
> """
> Parse and handle test lists with test/subtest documentation, in the
> - form of C comments, with two meta-tags (TEST and SUBTEST), and a set of
> - `field: value` items:
> + form of C comments, with two meta-tags (by default, TEST and SUBTEST),
> + and a set of `field: value` items:
>
> /**
> * TEST: Check if new IGT test documentation logic functionality is working
> @@ -246,7 +246,9 @@ class TestList:
> """
>
> def __init__(self, config_fname, include_plan = False, file_list = False,
> - igt_build_path = None):
> + igt_build_path = None,
> + test_tag = "TEST", subtest_tag = "SUBTESTS?",
> + main_name = "igt", subtest_separator = "@"):
> self.doc = {}
> self.test_number = 0
> self.config = None
> @@ -259,6 +261,11 @@ class TestList:
> self.field_list = {}
> self.title = None
> self.filters = {}
> + self.subtest_separator = subtest_separator
> + self.main_name = main_name
> +
> + if self.main_name:
> + self.main_name += subtest_separator
>
> driver_name = re.sub(r'(.*/)?([^\/]+)/.*', r'\2', config_fname).capitalize()
>
> @@ -355,11 +362,13 @@ class TestList:
> if fname == '':
> continue
>
> - self.__add_file_documentation(fname, implemented_class, field_re)
> + self.__add_file_documentation(fname, implemented_class, field_re,
> + test_tag, subtest_tag)
>
> if include_plan:
> for fname in self.plan_filenames:
> - self.__add_file_documentation(fname, planned_class, field_re)
> + self.__add_file_documentation(fname, planned_class, field_re,
> + test_tag, subtest_tag)
>
> #
> # ancillary methods
> @@ -421,7 +430,7 @@ class TestList:
> for subtest in self.doc[test]["subtest"].keys():
> summary = test_name
> if self.doc[test]["subtest"][subtest]["Summary"] != '':
> - summary += '@' + self.doc[test]["subtest"][subtest]["Summary"]
> + summary += self.subtest_separator + self.doc[test]["subtest"][subtest]["Summary"]
> if not summary:
> continue
>
> @@ -551,7 +560,7 @@ class TestList:
>
> name = re.sub(r'.*/', '', fname)
> name = re.sub(r'\.[\w+]$', '', name)
> - name = "igt@" + name
> + name = self.main_name + name
>
> if not subtest_only:
> test_dict[name] = {}
> @@ -606,7 +615,7 @@ class TestList:
>
> name = re.sub(r'.*/', '', fname)
> name = re.sub(r'\.[ch]', '', name)
> - name = "igt@" + name
> + name = self.main_name + name
>
> tmp_subtest = self.expand_subtest(fname, name, test, False)
>
> @@ -844,7 +853,7 @@ class TestList:
>
> test_name = re.sub(r'.*/', '', fname)
> test_name = re.sub(r'\.[ch]', '', test_name)
> - test_name = "igt@" + test_name
> + test_name = self.main_name + test_name
>
> subtest_array += self.expand_subtest(fname, test_name, test, True)
>
> @@ -941,8 +950,8 @@ class TestList:
> args_regex = re.compile(r'\<[^\>]+\>')
>
> for subtest in self.get_subtests()[""]:
> - subtest = "@".join(subtest.split("@")[:3])
> - subtest = args_regex.sub(r'\\d+', subtest)
> + subtest = self.subtest_separator.join(subtest.split(self.subtest_separator)[:3])
> + subtest = re.sub(r'\<[^\>]+\>', r'\\d+', subtest)
> doc_subtests.add(subtest)
>
> doc_subtests = list(sorted(doc_subtests))
> @@ -993,7 +1002,8 @@ class TestList:
> # File handling methods
> #
>
> - def __add_file_documentation(self, fname, implemented_class, field_re):
> + def __add_file_documentation(self, fname, implemented_class, field_re,
> + test_tag, subtest_tag):
>
> """Adds the contents of test/subtest documentation form a file"""
>
> @@ -1007,6 +1017,9 @@ class TestList:
> cur_arg_element = 0
> has_test_or_subtest = 0
>
> + test_regex = re.compile(test_tag + r':\s*(.*)')
--------------------------------------------- ^^^^
Too many spaces.
With that fixed you can add my r-b.
Regards,
Kamil
> + subtest_regex = re.compile('^' + subtest_tag + r':\s*(.*)')
> +
> with open(fname, 'r', encoding='utf8') as handle:
> arg_ref = None
> current_test = ''
> @@ -1041,7 +1054,7 @@ class TestList:
> current_field = ''
>
> # Check if it is a new TEST section
> - match = re.match(r'^TEST:\s*(.*)', file_line)
> + match = test_regex.match(file_line)
> if match:
> has_test_or_subtest = 1
> current_test = self.test_number
> @@ -1063,7 +1076,7 @@ class TestList:
> continue
>
> # Check if it is a new SUBTEST section
> - match = re.match(r'^SUBTESTS?:\s*(.*)', file_line)
> + match = subtest_regex.match(file_line)
> if match:
> has_test_or_subtest = 1
> current_subtest = subtest_number
> @@ -1228,7 +1241,7 @@ class TestList:
> """Generate testlists from the test documentation"""
>
> test_prefix = os.path.commonprefix(self.get_subtests()[""])
> - test_prefix = re.sub(r'^igt@', '', test_prefix)
> + test_prefix = re.sub(r'^' + self.main_name, '', test_prefix)
>
> # NOTE: currently, it uses a comma for multi-value delimitter
> test_subtests = self.get_subtests(sort_field, ",", with_order = True)
> --
> 2.40.1
>
More information about the igt-dev
mailing list