Explorar el Código

ci: pass target from build stage to unit test

Michael (XIAO Xufeng) hace 6 años
padre
commit
3a9ae4acc6

+ 22 - 4
tools/tiny-test-fw/CIAssignUnitTest.py

@@ -19,13 +19,12 @@ except ImportError:
 
 
 class Group(CIAssignTest.Group):
-    SORT_KEYS = ["config", "SDK", "test environment", "multi_device", "multi_stage", "tags"]
+    SORT_KEYS = ["config", "test environment", "multi_device", "multi_stage", "tags", "chip_target"]
     MAX_CASE = 30
     ATTR_CONVERT_TABLE = {
         "execution_time": "execution time"
     }
-    # when IDF support multiple chips, SDK will be moved into tags, we can remove it
-    CI_JOB_MATCH_KEYS = ["test environment", "SDK"]
+    CI_JOB_MATCH_KEYS = ["test environment"]
 
     def __init__(self, case):
         super(Group, self).__init__(case)
@@ -84,6 +83,7 @@ class Group(CIAssignTest.Group):
         :return: {"Filter": case filter, "CaseConfig": list of case configs for cases in this group}
         """
         test_function = self._map_test_function()
+
         output_data = {
             # we don't need filter for test function, as UT uses a few test functions for all cases
             "CaseConfig": [
@@ -91,8 +91,26 @@ class Group(CIAssignTest.Group):
                     "name": test_function,
                     "extra_data": self._create_extra_data(test_function),
                 }
-            ]
+            ],
         }
+
+        target = self._get_case_attr(self.case_list[0], "chip_target")
+        if target is not None:
+            target_dut = {
+                "esp32": "ESP32DUT",
+                "esp32s2beta": "ESP32S2DUT",
+                "esp8266": "ESP8266DUT",
+            }[target]
+            output_data.update({
+                "Filter": {
+                    "overwrite": {
+                        "dut": {
+                            "path": "IDF/IDFDUT.py",
+                            "class": target_dut,
+                        }
+                    }
+                }
+            })
         return output_data
 
 

+ 4 - 4
tools/tiny-test-fw/Env.py

@@ -99,10 +99,10 @@ class Env(object):
                 except ValueError:
                     dut_config = dict()
                 dut_config.update(dut_init_args)
-                dut = self.default_dut_cls(dut_name, port,
-                                           os.path.join(self.log_path, dut_name + ".log"),
-                                           app_inst,
-                                           **dut_config)
+                dut = dut_class(dut_name, port,
+                                os.path.join(self.log_path, dut_name + ".log"),
+                                app_inst,
+                                **dut_config)
                 self.allocated_duts[dut_name] = {"port": port, "dut": dut}
             else:
                 raise ValueError("Failed to get DUT")

+ 1 - 1
tools/tiny-test-fw/Utility/CIAssignTest.py

@@ -233,7 +233,7 @@ class AssignTest(object):
             else:
                 failed_to_assign.append(group)
         if failed_to_assign:
-            console_log("Too many test cases vs jobs to run. Please add the following jobs to .gitlab-ci.yml with specific tags:", "R")
+            console_log("Too many test cases vs jobs to run. Please add the following jobs to tools/ci/config/target-test.yml with specific tags:", "R")
             for group in failed_to_assign:
                 console_log("* Add job with: " + ",".join(group.ci_job_match_keys), "R")
             raise RuntimeError("Failed to assign test case to CI jobs")

+ 16 - 4
tools/unit-test-app/tools/UnitTestParser.py

@@ -10,7 +10,7 @@ import CreateSectionTable
 
 TEST_CASE_PATTERN = {
     "initial condition": "UTINIT1",
-    "SDK": "ESP32_IDF",
+    "chip_target": "esp32",
     "level": "Unit",
     "execution time": 0,
     "auto test": "Yes",
@@ -73,6 +73,7 @@ class Parser(object):
 
         table = CreateSectionTable.SectionTable("section_table.tmp")
         tags = self.parse_tags(os.path.join(config_output_folder, self.SDKCONFIG_FILE))
+        print("Tags of config %s: %s" % (config_name, tags))
         test_cases = []
 
         # we could split cases of same config into multiple binaries as we have limited rom space
@@ -94,7 +95,17 @@ class Parser(object):
                 name = table.get_string("any", name_addr)
                 desc = table.get_string("any", desc_addr)
                 file_name = table.get_string("any", file_name_addr)
-                tc = self.parse_one_test_case(name, desc, file_name, config_name, stripped_config_name, tags)
+
+                # Search in tags to set the target
+                target_tag_dict = {"ESP32_IDF": "esp32", "7.2.2": "esp32s2beta"}
+                for tag in target_tag_dict:
+                    if tag in tags:
+                        target = target_tag_dict[tag]
+                        break
+                else:
+                    target = "esp32"
+
+                tc = self.parse_one_test_case(name, desc, file_name, config_name, stripped_config_name, tags, target)
 
                 # check if duplicated case names
                 # we need to use it to select case,
@@ -233,7 +244,7 @@ class Parser(object):
                     return match.group(1).split(' ')
         return None
 
-    def parse_one_test_case(self, name, description, file_name, config_name, stripped_config_name, tags):
+    def parse_one_test_case(self, name, description, file_name, config_name, stripped_config_name, tags, target):
         """
         parse one test case
         :param name: test case name (summary)
@@ -261,7 +272,8 @@ class Parser(object):
                           "multi_device": prop["multi_device"],
                           "multi_stage": prop["multi_stage"],
                           "timeout": int(prop["timeout"]),
-                          "tags": tags})
+                          "tags": tags,
+                          "chip_target": target})
         return test_case
 
     def dump_test_cases(self, test_cases):