[igt-dev] [PATCH i-g-t 1/1] scripts/igt_doc.py: rewrite intelci testlist logic

Kamil Konieczny kamil.konieczny at linux.intel.com
Thu Nov 30 10:47:15 UTC 2023


Hi Mauro,
On 2023-11-30 at 08:11:50 +0100, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> Cleanup the block/accept testlist code, reducing one step on it,
> and fixing some issues at testlist generation.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>

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

Btw could you add in separate patch documentation for this new option?
I am afraid it wil be lost in patchwork but should be in code
or in one of commit description. Alternativly, write it somewhere,
what about igt_doc_examples.txt with examples?

Regards,
Kamil

> ---
>  scripts/igt_doc.py | 181 +++++++++++++++++++++++++--------------------
>  1 file changed, 99 insertions(+), 82 deletions(-)
> 
> diff --git a/scripts/igt_doc.py b/scripts/igt_doc.py
> index 0ec6e3e5ec97..df3f72c8d69f 100755
> --- a/scripts/igt_doc.py
> +++ b/scripts/igt_doc.py
> @@ -1,5 +1,5 @@
>  #!/usr/bin/env python3
> -# pylint: disable=C0301,C0201,C0206
> +# pylint: disable=C0301,R0914,R0915,R1702
>  # SPDX-License-Identifier: (GPL-2.0 OR MIT)
>  
>  ## Copyright (C) 2023    Intel Corporation                 ##
> @@ -56,7 +56,7 @@ class IgtTestList(TestList):
>          subtest_dict = self.expand_dictionary(True)
>  
>          # Create a tests_per_list dict
> -        gpus = set()
> +        gpu_set = set()
>          tests_per_list = {}
>          split_regex = re.compile(r",\s*")
>  
> @@ -68,115 +68,126 @@ class IgtTestList(TestList):
>              for run_type in set(split_regex.split(run_types)):
>                  run_type = run_type.lower()
>  
> -                if run_type.startswith(tuple(self.drivers)):
> -                    run_type_set.add(run_type)
> -                else:
> -                    for driver in self.drivers:
> -                        run_type = f"{driver.lower()}_{run_type}"
> -                        run_type_set.add(run_type)
> +                drivers = set(self.drivers)
>  
> -            for run_type in run_type_set:
> -                if run_type not in tests_per_list:
> -                    tests_per_list[run_type] = {}
> +                for driver in self.drivers:
> +                    driver = driver.lower()
>  
> -                if subname not in tests_per_list[run_type]:
> -                    tests_per_list[run_type][subname] = {}
> -
> -                if "GPU" in subtest:
> -                    for gpu_list in split_regex.split(subtest["GPU"]):
> -                        gpus.add(gpu_list)
> -                        tests_per_list[run_type][subname][gpu_list] = True
> -
> -                if "GPU excluded platform" in subtest:
> -                    for gpu_list in split_regex.split(subtest["GPU excluded platform"]):
> -                        gpus.add(gpu_list)
> -                        tests_per_list[run_type][subname][gpu_list] = False
> -
> -        # Handle block and permit lists
> -
> -        for run_type in tests_per_list.keys():
> -            for subname, gpu in tests_per_list[run_type].items():
> -
> -                # Trivial case: fields not defined
> -                if not gpus:
> -                    tests_per_list[run_type][subname]["default"] = True
> -                    continue
> -
> -                if not gpu:
> -                    tests_per_list[run_type][subname] = {}
> -                    for gpu in gpus:
> -                        tests_per_list[run_type][subname][gpu] = True
> -                    continue
> -
> -                default_gpu_value = True
> -                for gpu, value in tests_per_list[run_type][subname].items():
> -                    if value:
> -                        default_gpu_value = False
> +                    if run_type.startswith(driver):
> +                        run_type = re.sub(r"^" + driver + r"[\W_]*", "", run_type)
> +                        drivers = set([driver])
>                          break
> -                    if not gpu in tests_per_list[run_type][subname]:
> -                        for gpu in gpus:
> -                            tests_per_list[run_type][subname][gpu] = default_gpu_value
>  
> -                if "all" in tests_per_list[run_type][subname]:
> -                    if not tests_per_list[run_type][subname]["all"]:
> -                        for gpu in gpus:
> -                            tests_per_list[run_type][subname][gpu] = False
> +                run_type_set.add(run_type)
>  
> -                if default_gpu_value:
> -                    tests_per_list[run_type][subname]["default"] = True
> +            for driver in drivers:
> +                if driver not in tests_per_list:
> +                    tests_per_list[driver] = {}
>  
> -        return (gpus, tests_per_list)
> +                for run_type in run_type_set:
> +                    if run_type not in tests_per_list[driver]:
> +                        tests_per_list[driver][run_type] = {}
>  
> -    def write_intelci_testlist(self, directory):
> -        '''Create testlist directory (if needed) and files'''
> +                    if subname not in tests_per_list[driver][run_type]:
> +                        tests_per_list[driver][run_type][subname] = {}
>  
> -        if not os.path.exists(directory):
> -            os.makedirs(directory)
> +                    if "GPU" in subtest:
> +                        for gpu in split_regex.split(subtest["GPU"]):
> +                            gpu_set.add(gpu)
> +                            tests_per_list[driver][run_type][subname][gpu] = True
> +
> +                    if "GPU excluded platform" in subtest:
> +                        for gpu in split_regex.split(subtest["GPU excluded platform"]):
> +                            gpu_set.add(gpu)
> +                            tests_per_list[driver][run_type][subname][gpu] = False
> +
> +        # Create a testlist dictionary
>  
> -        (gpus, tests_per_list)  = self.gen_intelci_testlist()
>          testlists = {}
>  
> -        for run_type in tests_per_list.keys():
> -            for subname, gpu_dict in tests_per_list[run_type].items():
> -                for gpu, value in gpu_dict.items():
> -                    if gpu == "all":
> +        for driver, run_types in tests_per_list.items():
> +            testlists[driver] = {}
> +            for run_type, subnames in run_types.items():
> +                for subname, gpus in subnames.items():
> +                    if not gpu_set:
> +                        gpu = "default"
> +
> +                    if gpu not in testlists[driver]:
> +                        testlists[driver][gpu] = {}
> +
> +                    if run_type not in testlists[driver][gpu]:
> +                        testlists[driver][gpu][run_type] = set()
> +
> +                    # Trivial case: fields not defined
> +                    if not gpu_set:
> +                        testlists[driver][gpu][run_type].add(subname)
> +                        continue
> +
> +                    # Globally blocklisted values
> +                    if "all" in tests_per_list[driver][run_type][subname]:
>                          continue
>  
> -                    gpu = re.sub(r"[\W_]+", "-", gpu).lower()
> -                    name = re.sub(r"[\W_]+", "-", run_type).lower()
> -                    name = re.sub(r"_+", "_", name)
> +                    # Nothing blocked of explicitly added.
> +                    # It means that test should be on testlists
> +                    if not gpus:
> +                        for gpu in gpu_set:
> +                            if gpu == "all":
> +                                continue
> +
> +                            if gpu not in testlists[driver]:
> +                                testlists[driver][gpu] = {}
>  
> -                    drivers = set(self.drivers)
> +                            if run_type not in testlists[driver][gpu]:
> +                                testlists[driver][gpu][run_type] = set()
> +
> +                            testlists[driver][gpu][run_type].add(subname)
> +                        continue
>  
> -                    for driver in self.drivers:
> -                        driver = driver.lower()
> +                    default_gpu_value = True
>  
> -                        if name.startswith(driver):
> -                            all_drivers = False
> -                            name = re.sub(r"^" + driver + r"[\W_]*", "", name)
> -                            drivers = set([driver])
> +                    # If GPU field is used, default is to block list
> +                    for gpu, value in gpus.items():
> +                        if value:
> +                            default_gpu_value = False
>                              break
>  
> -                    for driver in drivers:
> -                        if driver not in testlists:
> -                            testlists[driver] = {}
> -
> +                    for gpu, value in gpus.items():
>                          if gpu not in testlists[driver]:
>                              testlists[driver][gpu] = {}
>  
> -                        if name not in testlists[driver][gpu]:
> -                            testlists[driver][gpu][name] = set()
> +                        if run_type not in testlists[driver][gpu]:
> +                            testlists[driver][gpu][run_type] = set()
>  
> -                        testlists[driver][gpu][name].add(subname)
> +                        value = default_gpu_value
> +                        if gpu in tests_per_list[driver][run_type][subname]:
> +                            value = tests_per_list[driver][run_type][subname]
>  
> -        for driver in testlists.keys():
> +                        if value:
> +                            testlists[driver][gpu][run_type].add(subname)
> +
> +                    if default_gpu_value:
> +                        testlists[driver][gpu][run_type].add(subname)
> +
> +        return (testlists, gpu_set)
> +
> +    def write_intelci_testlist(self, directory):
> +        '''Create testlist directory (if needed) and files'''
> +
> +        if not os.path.exists(directory):
> +            os.makedirs(directory)
> +
> +        testlists = self.gen_intelci_testlist()
> +
> +        for driver, gpus in testlists[0].items():
>              driver_path = os.path.join(directory, driver)
>              try:
>                  os.makedirs(driver_path)
>              except FileExistsError:
>                  pass
>  
> -            for gpu, names in testlists[driver].items():
> +            for gpu, names in gpus.items():
> +                gpu = re.sub(r"[\W_]+", "-", gpu).lower()
> +
>                  dname = os.path.join(driver_path, gpu)
>                  try:
>                      os.makedirs(dname)
> @@ -185,7 +196,13 @@ class IgtTestList(TestList):
>  
>                  for testlist, subtests in names.items():
>                      if testlist == "":
> +                        if not subtests:
> +                            continue
> +
>                          testlist = "other"
> +                    else:
> +                        testlist = re.sub(r"[\W_]+", "-", testlist).lower()
> +                        testlist = re.sub(r"_+", "_", testlist)
>  
>                      if not subtests:
>                          print(f"Warning: empty testlist: {testlist}")
> -- 
> 2.42.0
> 


More information about the igt-dev mailing list