[igt-dev] [PATCH i-g-t v2 05/19] scripts/igt_doc.py: improve --show-subtests logic

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri Mar 10 19:41:11 UTC 2023


From: Mauro Carvalho Chehab <mchehab at kernel.org>

Add command line parameters to improve --show-subtests:
1) to sort results of --show-subtest based on the contents of a field.
   This is useful, for instance, to check if all subtests have
   proper values for a given field.
2) to filter for an specific field value. This is interesting to be
   able to compare testlists with the expected documented test list.

Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>
---
 scripts/igt_doc.py | 64 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 56 insertions(+), 8 deletions(-)

diff --git a/scripts/igt_doc.py b/scripts/igt_doc.py
index 643c7e7a7b..712e22c9d3 100755
--- a/scripts/igt_doc.py
+++ b/scripts/igt_doc.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# pylint: disable=C0301,R0902,R0914,R0912,R0915
+# pylint: disable=C0301,R0902,R0914,R0912,R0915,R1702,C0302
 # SPDX-License-Identifier: (GPL-2.0 OR MIT)
 
 ## Copyright (C) 2023    Intel Corporation                 ##
@@ -689,11 +689,27 @@ class TestList:
     # Subtest list methods
     #
 
-    def get_subtests(self):
+    def get_subtests(self, sort_field = None, filter_field_expr = None):
 
         """Return an array with all subtests"""
 
-        subtests = []
+        subtests = {}
+        subtests[""] = []
+
+        if sort_field:
+            if sort_field.lower() not in self.field_list:
+                sys.exit(f"Field '{sort_field}' is not defined")
+            sort_field = self.field_list[sort_field.lower()]
+
+        if filter_field_expr:
+            if not (match := re.match(r"(.*)=~\s*(.*)", filter_field_expr)):
+                sys.exit(f"Filter field {filter_field_expr} is not at <field> =~ <regex> syntax")
+
+            field = match.group(1).strip().lower()
+            if field not in self.field_list:
+                sys.exit(f"Field '{field}' is not defined")
+            filter_field = self.field_list[field]
+            regex = re.compile("{0}".format(match.group(2).strip()), re.I) # pylint: disable=C0209
 
         for test in sorted(self.doc.keys()):
             fname = self.doc[test]["File"]
@@ -702,10 +718,26 @@ class TestList:
             test_name = re.sub(r'\.[ch]', '', test_name)
             test_name = "igt@" + test_name
 
-            subtest_array = self.expand_subtest(fname, test_name, test)
+            subtest_array = self.expand_subtest(fname, test_name, test, True)
 
             for subtest in subtest_array:
-                subtests.append(subtest["Summary"])
+                if filter_field_expr:
+                    if filter_field not in subtest:
+                        continue
+                    if not re.match(regex, subtest[filter_field]):
+                        continue
+
+                if sort_field:
+                    if sort_field in subtest:
+                        if subtest[sort_field] not in subtests:
+                            subtests[subtest[sort_field]] = []
+
+                        subtests[subtest[sort_field]].append(subtest["Summary"])
+                    else:
+                        subtests[""].append(subtest["Summary"])
+
+                else:
+                    subtests[""].append(subtest["Summary"])
 
         return subtests
 
@@ -716,7 +748,7 @@ class TestList:
 
         """Compare documented subtests with the IGT test list"""
 
-        doc_subtests = sorted(self.get_subtests())
+        doc_subtests = sorted(self.get_subtests()[""])
 
         for i in range(0, len(doc_subtests)): # pylint: disable=C0200
             doc_subtests[i] = re.sub(r'\<[^\>]+\>', r'\\d+', doc_subtests[i])
@@ -990,6 +1022,10 @@ parser.add_argument("--to-json",
                     help="Output test documentation in JSON format as TO_JSON file")
 parser.add_argument("--show-subtests", action="store_true",
                     help="Shows the name of the documented subtests in alphabetical order.")
+parser.add_argument("--sort-field",
+                    help="modify --show-subtests to sort output based on SORT_FIELD value")
+parser.add_argument("--filter-field",
+                    help="modify --show-subtests to filter output based a regex given by FILTER_FIELD=~'regex'")
 parser.add_argument("--check-testlist", action="store_true",
                     help="Compare documentation against IGT runner testlist.")
 parser.add_argument("--include-plan", action="store_true",
@@ -1007,8 +1043,20 @@ tests = TestList(parse_args.config, parse_args.include_plan, parse_args.files)
 RUN = 0
 if parse_args.show_subtests:
     RUN = 1
-    for sub in tests.get_subtests():
-        print (sub)
+    if parse_args.sort_field:
+        test_subtests = tests.get_subtests(parse_args.sort_field, parse_args.filter_field)
+        for val_key in sorted(test_subtests.keys()):
+            if not test_subtests[val_key]:
+                continue
+            if val_key == "":
+                print("not defined:")
+            else:
+                print(f"{val_key}:")
+            for sub in test_subtests[val_key]:
+                print (f"  {sub}")
+    else:
+        for sub in tests.get_subtests(parse_args.sort_field, parse_args.filter_field)[""]:
+            print (sub)
 
 if parse_args.check_testlist:
     RUN = 1
-- 
2.34.1



More information about the igt-dev mailing list