[igt-dev] [PATCH i-g-t v2 1/4] scripts/test_list.py: add support for ordering testlists

Mauro Carvalho Chehab mauro.chehab at linux.intel.com
Tue Jun 20 08:55:19 UTC 2023


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

Testlists usually require an special order, like:
- an initial test which loads the driver;
- normal tests;
- dangerous tests (like KUnit ones).

Add support to handle order, by adding an "order" property at
the config file.

Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>
---
 scripts/test_list.py | 55 ++++++++++++++++++++++++++++++++++++++------
 1 file changed, 48 insertions(+), 7 deletions(-)

diff --git a/scripts/test_list.py b/scripts/test_list.py
index f676024c9571..76fdcf3dbb4f 100755
--- a/scripts/test_list.py
+++ b/scripts/test_list.py
@@ -819,18 +819,25 @@ class TestList:
     # Subtest list methods
     #
 
-    def get_subtests(self, sort_field = None, expand = None):
+    def get_subtests(self, sort_field = None, expand = None, with_order = False):
 
         """Return an array with all subtests"""
 
         subtests = {}
         subtests[""] = []
 
+        order = None
+
         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 with_order:
+                if "_properties_" in self.props[sort_field]:
+                    if "order" in self.props[sort_field]["_properties_"]:
+                        order = self.props[sort_field]["_properties_"]["order"]
+
         for test in sorted(self.doc.keys()):
             fname = self.doc[test]["File"]
 
@@ -848,20 +855,54 @@ class TestList:
                     if sort_field in subtest:
                         if expand:
                             test_list = subtest[sort_field].split(expand)
+                            test_list = [s.strip() for s in test_list]
+
                             for test_elem in test_list:
-                                test_elem = test_elem.strip()
                                 if test_elem not in subtests:
                                     subtests[test_elem] = []
-                                subtests[test_elem].append(subtest["Summary"])
+                                if order:
+                                    subtests[test_elem].append((subtest["Summary"], test_list))
+                                else:
+                                    subtests[test_elem].append(subtest["Summary"])
                         else:
                             if subtest[sort_field] not in subtests:
                                 subtests[subtest[sort_field]] = []
-                            subtests[subtest[sort_field]].append(subtest["Summary"])
+                                if order:
+                                    subtests[test_elem].append((subtest["Summary"], [subtest[sort_field]]))
+                                else:
+                                    subtests[subtest[sort_field]].append(subtest["Summary"])
+                    else:
+                        if order:
+                            subtests[test_elem].append((subtest["Summary"], [subtest[sort_field]]))
+                        else:
+                            subtests[""].append(subtest["Summary"])
+
+                else:
+                    if order:
+                        subtests[test_elem].append((subtest["Summary"], [subtest[sort_field]]))
                     else:
                         subtests[""].append(subtest["Summary"])
 
-                else:
-                    subtests[""].append(subtest["Summary"])
+        if order:
+            for group, tests in subtests.items():
+                prefix_tests = []
+                suffix_tests = []
+                middle_tests = []
+                is_prefix = True
+                for k in order:
+                    if k == "__all__":
+                        is_prefix = False
+                        continue
+                    for test in tests:
+                        if k in test[1]:
+                            if is_prefix:
+                                prefix_tests.append(test[0])
+                            else:
+                                suffix_tests.append(test[0])
+                for test in tests:
+                    if test[0] not in prefix_tests and test[0] not in suffix_tests:
+                        middle_tests.append(test[0])
+                subtests[group] = prefix_tests + middle_tests + suffix_tests
 
         return subtests
 
@@ -1203,7 +1244,7 @@ class TestList:
         test_prefix = re.sub(r'^igt@', '', test_prefix)
 
         # NOTE: currently, it uses a comma for multi-value delimitter
-        test_subtests = self.get_subtests(sort_field, ",")
+        test_subtests = self.get_subtests(sort_field, ",", with_order = True)
 
         if not os.path.exists(directory):
             os.makedirs(directory)
-- 
2.40.1



More information about the igt-dev mailing list