[igt-dev] [PATCH i-g-t] scripts/test_list.py: better handle list of tests

Kamil Konieczny kamil.konieczny at linux.intel.com
Wed Oct 25 07:44:37 UTC 2023


Hi Mauro,
On 2023-10-20 at 16:11:22 +0200, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> Not all test lists are regular expressions. Some are just
> names. That's the case of IGT runner testlist files.
> 
> Add support for that.
> 
> In practice, this change will produce the same testlists
> as before, but using a logic closer to what igt_runner()
> does.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>

Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

> ---
>  scripts/test_list.py             | 54 +++++++++++++++++++++++---------
>  tests/intel/kms_test_config.json |  2 +-
>  tests/intel/xe_test_config.json  |  1 +
>  3 files changed, 41 insertions(+), 16 deletions(-)
> 
> diff --git a/scripts/test_list.py b/scripts/test_list.py
> index e54873f07e20..06215242107a 100644
> --- a/scripts/test_list.py
> +++ b/scripts/test_list.py
> @@ -319,10 +319,6 @@ class TestList:
>              self.props["Class"]["_properties_"]["level"] = 1
>              self.props["Class"]["_properties_"]["sublevel"] = sublevel_count[0] + 1
>  
> -        flags = 0
> -        if self.config.get("case_insensitive_testlist", False):
> -            flags |= re.IGNORECASE
> -
>          # Remove non-multilevel items, as we're only interested on
>          # hierarchical item levels here
>          for field, item in self.props.items():
> @@ -337,7 +333,7 @@ class TestList:
>                  testlist = {}
>                  for value in item["_properties_"]["include"]:
>                      for name in value.keys():
> -                        self.read_testlist(testlist, name, cfg_path + value[name], flags)
> +                        self.read_testlist(field, item, testlist, name, cfg_path + value[name])
>  
>                  item["_properties_"]["include"] = testlist
>  
> @@ -346,7 +342,7 @@ class TestList:
>                  testlist = {}
>                  for value in item["_properties_"]["exclude"]:
>                      for name in value.keys():
> -                        self.read_testlist(testlist, name, cfg_path + value[name], flags)
> +                        self.read_testlist(field, item, testlist, name, cfg_path + value[name])
>  
>                  item["_properties_"]["exclude"] = testlist
>  
> @@ -450,7 +446,22 @@ class TestList:
>  
>              self.__add_field(key, sublevel, hierarchy_level, field[key])
>  
> -    def read_testlist(self, testlist, name, filename, flags):
> +    def read_testlist(self, field, item, testlist, name, filename):
> +
> +        match_type = item["_properties_"].get("match-type", "subtest-match")
> +
> +        match_type_regex = set(["regex", "regex-ignorecase"])
> +        match_type_str = set(["subtest-match"])
> +        match_types = match_type_regex | match_type_str
> +
> +        if match_type not in match_types:
> +            sys.exit(f"Error: invalid match type '{match_type}' for {field}")
> +
> +        if match_type == "regex":
> +            flags = 0
> +        elif match_type == "regex-ignorecase":
> +            flags = re.IGNORECASE
> +
>          base = r"^\s*({}[^\s\{}]+)(\S*)\s*(\#.*)?$"
>          regex = re.compile(base.format(self.main_name, self.subtest_separator))
>  
> @@ -459,12 +470,25 @@ class TestList:
>          with open(filename, 'r', newline = '', encoding = 'utf8') as fp:
>              for line in fp:
>                  match = regex.match(line)
> -                if match:
> -                    test = match.group(1)
> -                    subtest = match.group(2)
> -                    if not subtest.endswith("$"):
> -                        subtest += r"(\@.*)?$"
> -                    testlist[name].append(re.compile(f"{test}{subtest}", flags))
> +                if not match:
> +                    continue
> +
> +                test = match.group(1)
> +                subtest = match.group(2)
> +                test_name = f"{test}{subtest}"
> +
> +                if match_type in match_type_regex:
> +                    testlist[name].append(re.compile(test_name, flags))
> +                    continue
> +
> +                subtests = test_name.split(self.subtest_separator)[:3]
> +
> +                prefix=""
> +                for subtest in subtests:
> +                    subtest = prefix + subtest
> +                    prefix = subtest + self.subtest_separator
> +
> +                testlist[name].append(re.compile(f"{subtest}(@.*)?"))
>  
>      def __filter_subtest(self, test, subtest, field_not_found_value):
>  
> @@ -504,7 +528,7 @@ class TestList:
>              for names, regex_array in self.props[field]["_properties_"]["include"].items():
>                  name = set(re.split(",\s*", names))
>                  for regex in regex_array:
> -                    if regex.match(testname):
> +                    if regex.fullmatch(testname):
>                          values.update(name)
>                          break
>  
> @@ -514,7 +538,7 @@ class TestList:
>                  for names, regex_array in self.props[field]["_properties_"]["exclude"].items():
>                      deleted_names = set(re.split(",\s*", names))
>                      for regex in regex_array:
> -                        if regex.match(testname):
> +                        if regex.fullmatch(testname):
>                              if sorted(deleted_names) == sorted(values):
>                                  set_full_if_empty = False
>                              values.discard(deleted_names)
> diff --git a/tests/intel/kms_test_config.json b/tests/intel/kms_test_config.json
> index 40cf69dd0904..837380ee7fae 100644
> --- a/tests/intel/kms_test_config.json
> +++ b/tests/intel/kms_test_config.json
> @@ -4,7 +4,6 @@
>      "files": [ "../chamelium/kms_*.c", "../kms_*.c", "../testdisplay.c", "kms_*.c" ],
>      "exclude_files": [ "../chamelium/kms_chamelium_helper.c", "../kms_color_helper.c",
>                         "kms_dsc_helper.c" ],
> -    "case_insensitive_testlist": true,
>      "fields": {
>          "Category": {
>              "_properties_": {
> @@ -24,6 +23,7 @@
>                  "_properties_": {
>                      "description": "Defines what category of testlist it belongs",
>                      "default-testlist": "FULL",
> +                    "match-type": "subtest-match",
>                      "include": [
>                          { "i915 BAT": "../intel-ci/fast-feedback.testlist" },
>                          { "i915 BAT chamelium": "../intel-ci/fast-feedback-chamelium-only.testlist" },
> diff --git a/tests/intel/xe_test_config.json b/tests/intel/xe_test_config.json
> index 20faf73b7270..5fd7c888f274 100644
> --- a/tests/intel/xe_test_config.json
> +++ b/tests/intel/xe_test_config.json
> @@ -33,6 +33,7 @@
>                              "mandatory": true,
>                              "description": "Defines what category of testlist it belongs",
>                              "default-testlist": "FULL",
> +                            "match-type": "subtest-match",
>                              "include": [
>                                  { "Xe BAT": "../intel-ci/xe-fast-feedback.testlist" }
>                              ],
> -- 
> 2.41.0
> 


More information about the igt-dev mailing list