| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- import yaml
- import os
- import re
- import sys
- import shutil
- MODULE_MAP = yaml.load(open("ModuleDefinition.yml", "r"))
- TEST_CASE_PATTERN = {
- "initial condition": "UTINIT1",
- "SDK": "ESP32_IDF",
- "level": "Unit",
- "execution time": 0,
- "Test App": "UT",
- "auto test": "Yes",
- "category": "Function",
- "test point 1": "basic function",
- "version": "v1 (2016-12-06)",
- "test environment": "UT_T1_1",
- "expected result": "1. set succeed"
- }
- CONFIG_FILE_PATTERN = {
- "Config": {"execute count": 1, "execute order": "in order"},
- "DUT": [],
- "Filter": [{"Add": {"ID": []}}]
- }
- test_cases = list()
- test_ids = {}
- test_ids_by_job = {}
- unit_jobs = {}
- os.chdir(os.path.join("..", ".."))
- IDF_PATH = os.getcwd()
- class Parser(object):
- @classmethod
- def parse_test_folders(cls):
- test_folder_paths = list()
- os.chdir(os.path.join(IDF_PATH, "components"))
- component_dirs = os.listdir(".")
- for dir in component_dirs:
- os.chdir(dir)
- if "test" in os.listdir("."):
- test_folder_paths.append(os.path.join(os.getcwd(), "test"))
- os.chdir("..")
- Parser.parse_test_files(test_folder_paths)
- @classmethod
- def parse_test_files(cls, test_folder_paths):
- for path in test_folder_paths:
- os.chdir(path)
- for file_path in os.listdir("."):
- if file_path[-2:] == ".c":
- Parser.read_test_file(os.path.join(os.getcwd(), file_path), len(test_cases)+1)
- os.chdir(os.path.join("..", ".."))
- Parser.dump_test_cases(test_cases)
- @classmethod
- def read_test_file(cls, test_file_path, file_index):
- test_index = 0
- with open(test_file_path, "r") as file:
- for line in file:
- if re.match("TEST_CASE", line):
- test_index += 1
- tags = re.split(r"[\[\]\"]", line)
- Parser.parse_test_cases(file_index, test_index, tags)
- @classmethod
- def parse_test_cases(cls, file_index, test_index, tags):
- ci_ready = "Yes"
- test_env = "UT_T1_1"
- for tag in tags:
- if tag == "ignore":
- ci_ready = "No"
- if re.match("test_env=", tag):
- test_env = tag[9:]
- module_name = tags[4]
- try:
- MODULE_MAP[module_name]
- except KeyError:
- module_name = "misc"
- id = "UT_%s_%s_%03d%02d" % (MODULE_MAP[module_name]['module abbr'],
- MODULE_MAP[module_name]['sub module abbr'],
- file_index, test_index)
- test_case = dict(TEST_CASE_PATTERN)
- test_case.update({"module": MODULE_MAP[module_name]['module'],
- "CI ready": ci_ready,
- "cmd set": ["IDFUnitTest/UnitTest", [tags[1]]],
- "ID": id,
- "test point 2": module_name,
- "steps": tags[1],
- "comment": tags[1],
- "test environment": test_env,
- "sub module": MODULE_MAP[module_name]['sub module'],
- "summary": tags[1]})
- if test_case["CI ready"] == "Yes":
- if test_ids.has_key(test_env):
- test_ids[test_env].append(id)
- else:
- test_ids.update({test_env: [id]})
- test_cases.append(test_case)
- @classmethod
- def dump_test_cases(cls, test_cases):
- os.chdir(os.path.join(IDF_PATH, "components", "idf_test", "unit_test"))
- with open ("TestCaseAll.yml", "wb+") as f:
- yaml.dump({"test cases": test_cases}, f, allow_unicode=True, default_flow_style=False)
- @classmethod
- def dump_ci_config(cls):
- Parser.split_test_cases()
- os.chdir(os.path.join(IDF_PATH, "components", "idf_test", "unit_test"))
- if not os.path.exists("CIConfigs"):
- os.makedirs("CIConfigs")
- os.chdir("CIConfigs")
- for unit_job in unit_jobs:
- job = dict(CONFIG_FILE_PATTERN)
- job.update({"DUT": ["UT1"]})
- job.update({"Filter": [{"Add": {"ID": test_ids_by_job[unit_job]}}]})
- with open (unit_job + ".yml", "wb+") as f:
- yaml.dump(job, f, allow_unicode=True, default_flow_style=False)
- @classmethod
- def split_test_cases(cls):
- for job in unit_jobs:
- test_ids_by_job.update({job: list()})
- for test_env in test_ids:
- available_jobs = list()
- for job in unit_jobs:
- if test_env in unit_jobs[job]:
- available_jobs.append(job)
- for idx, job in enumerate(available_jobs):
- test_ids_by_job[job] += (test_ids[test_env][idx*len(test_ids[test_env])/len(available_jobs):(idx+1)*len(test_ids[test_env])/len(available_jobs)])
- @classmethod
- def parse_gitlab_ci(cls):
- os.chdir(IDF_PATH)
- with open(".gitlab-ci.yml", "rb") as f:
- gitlab_ci = yaml.load(f)
- keys = gitlab_ci.keys()
- for key in keys:
- if re.match("UT_", key):
- test_env = gitlab_ci[key]["tags"]
- unit_job = key
- key = {}
- key.update({unit_job: test_env})
- unit_jobs.update(key)
- @classmethod
- def copy_module_def_file(cls):
- src = os.path.join(IDF_PATH, "tools", "unit-test-app", "ModuleDefinition.yml")
- dst = os.path.join(IDF_PATH, "components", "idf_test", "unit_test")
- shutil.copy(src, dst)
- def main():
- Parser.parse_test_folders()
- Parser.parse_gitlab_ci()
- Parser.dump_ci_config()
- Parser.copy_module_def_file()
- if __name__ == '__main__':
- main()
|