From 0501507d6b405d30afc7465e88f4128e30332ec4 Mon Sep 17 00:00:00 2001 From: antti Date: Wed, 7 Dec 2016 13:58:51 +0800 Subject: [PATCH] CI: add script for parsing unit test cases for CI from test files Add python script that parses list of unit test cases for CI from component test folder Modify .gitlab-ci.yml to run this script as part of build unit tests stage --- .gitlab-ci.yml | 24 +- .../CIConfigs/UT_Function_SYS_01.yml | 7 - components/idf_test/unit_test/TestCaseAll.yml | 461 ------------------ .../TestCaseScript/IDFUnitTest/UnitTest.py | 19 +- tools/unit-test-app/ModuleDefinition.yml | 127 +++++ tools/unit-test-app/UnitTestParser.py | 169 +++++++ 6 files changed, 325 insertions(+), 482 deletions(-) delete mode 100644 components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml delete mode 100644 components/idf_test/unit_test/TestCaseAll.yml create mode 100644 tools/unit-test-app/ModuleDefinition.yml create mode 100644 tools/unit-test-app/UnitTestParser.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8cb5c8bca..81a8fba4f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -87,6 +87,8 @@ build_esp_idf_tests: - ./tools/unit-test-app/build/*.elf - ./tools/unit-test-app/build/*.map - ./tools/unit-test-app/build/bootloader/*.bin + - ./components/idf_test/unit_test/TestCaseAll.yml + - ./components/idf_test/unit_test/CIConfigs/*.yml expire_in: 6 mos script: @@ -94,6 +96,7 @@ build_esp_idf_tests: - git checkout ${CI_BUILD_REF_NAME} || echo "Using default branch..." - make defconfig - make TESTS_ALL=1 + - python UnitTestParser.py build_examples: <<: *build_template @@ -160,6 +163,7 @@ test_report: LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF" TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test" REPORT_PATH: "$CI_PROJECT_DIR/CI_Test_Report" + MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/ModuleDefinition.yml" artifacts: when: always paths: @@ -180,8 +184,7 @@ test_report: - git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git - cd auto_test_script # generate report - - TEST_RESULT=Pass - - python CITestReport.py -l $LOG_PATH -t $TEST_CASE_FILE_PATH -p $REPORT_PATH -r $RESULT_PATH -a $ARTIFACTS_PATH || TEST_RESULT=Fail + - python CITestReport.py -l $LOG_PATH -t $TEST_CASE_FILE_PATH -p $REPORT_PATH -r $RESULT_PATH -a $ARTIFACTS_PATH -m $MODULE_UPDATE_FILE || FAIL=True # commit to CI-test-result project - git clone $GITLAB_SSH_SERVER/qa/CI-test-result.git - rm -rf CI-test-result/RawData/$RESULT_PATH @@ -263,6 +266,7 @@ deploy_docs: # append test level folder to TEST_CASE_FILE_PATH in before_script of test job TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test" # jobs MUST set CONFIG_FILE in before_script, and overwrite the variables above if necessary + MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/ModuleDefinition.yml" artifacts: when: always @@ -284,7 +288,7 @@ deploy_docs: - git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git - cd auto_test_script # run test - - python CIRunner.py -l $LOG_PATH -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH bin_path $APP_NAME $BIN_PATH + - python CIRunner.py -l $LOG_PATH -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH -m $MODULE_UPDATE_FILE bin_path $APP_NAME $BIN_PATH # template for overnight test jobs @@ -309,7 +313,7 @@ deploy_docs: - git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git - cd auto_test_script # run test - - python CIRunner.py -l $LOG_PATH -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH bin_path $APP_NAME $BIN_PATH + - python CIRunner.py -l $LOG_PATH -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH -m $MODULE_UPDATE_FILE bin_path $APP_NAME $BIN_PATH # template for unit test jobs .unit_test_template: &unit_test_template @@ -324,6 +328,10 @@ deploy_docs: LOG_PATH: "$CI_PROJECT_DIR/$CI_BUILD_REF" APP_NAME: "ut" TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/unit_test" + MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/ModuleDefinition.yml" + + dependencies: + - build_esp_idf_tests UT_Function_SYS_01: <<: *unit_test_template @@ -333,6 +341,14 @@ UT_Function_SYS_01: before_script: - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/UT_Function_SYS_01.yml +UT_Function_SYS_02: + <<: *unit_test_template + tags: + - ESP32_IDF + - UT_T1_1 + before_script: + - CONFIG_FILE=$TEST_CASE_FILE_PATH/CIConfigs/UT_Function_SYS_02.yml + IT_Function_SYS_01: <<: *test_template tags: diff --git a/components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml b/components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml deleted file mode 100644 index f4755dfec..000000000 --- a/components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml +++ /dev/null @@ -1,7 +0,0 @@ -Config: {execute count: 1, execute order: in order} -DUT: [UT1] -Filter: -- Add: - ID: [SYS_OS_0102, SYS_MISC_0102, SYS_MISC_0107, SYS_MISC_0106, SYS_MISC_0109, - SYS_MISC_0108, SYS_MISC_0112, SYS_MISC_0113, SYS_MISC_0110, SYS_MISC_0111, SYS_LIB_0103, - SYS_LIB_0102, SYS_LIB_0101, SYS_LIB_0106, SYS_LIB_0105, SYS_LIB_0104] diff --git a/components/idf_test/unit_test/TestCaseAll.yml b/components/idf_test/unit_test/TestCaseAll.yml deleted file mode 100644 index 4e5c01f21..000000000 --- a/components/idf_test/unit_test/TestCaseAll.yml +++ /dev/null @@ -1,461 +0,0 @@ -test cases: -- CI ready: 'Yes' - ID: SYS_LIB_0101 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "check if ROM or Flash is used for functions" - - [dummy] - comment: check if ROM or Flash is used for functions - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run lib test - sub module: Std Lib - summary: lib unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: lib - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_LIB_0102 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test time functions" - - [dummy] - comment: test time functions - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run lib test - sub module: Std Lib - summary: lib unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: lib - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_LIB_0103 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test sscanf function" - - [dummy] - comment: test sscanf function - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run lib test - sub module: Std Lib - summary: lib unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: lib - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_LIB_0104 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test sprintf function" - - [dummy] - comment: test sprintf function - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run lib test - sub module: Std Lib - summary: lib unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: lib - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_LIB_0105 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test atoX functions" - - [dummy] - comment: test atoX functions - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run lib test - sub module: Std Lib - summary: lib unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: lib - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_LIB_0106 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test ctype functions" - - [dummy] - comment: test ctype functions - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run lib test - sub module: Std Lib - summary: lib unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: lib - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0102 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "mbedtls MPI self-tests" - - [dummy] - comment: mbedtls MPI self-tests - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run bignum test - sub module: Misc - summary: bignum unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: bignum - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0103 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test AES thread safety" - - [dummy] - comment: test AES thread safety - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run hwcrypto test - sub module: Misc - summary: hwcrypto unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: hwcrypto - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0104 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test AES acceleration" - - [dummy] - comment: test AES acceleration - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run hwcrypto test - sub module: Misc - summary: hwcrypto unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: hwcrypto - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0105 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test SHA thread safety" - - [dummy] - comment: test SHA thread safety - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run hwcrypto test - sub module: Misc - summary: hwcrypto unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: hwcrypto - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0106 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "context switch saves FP registers" - - [dummy] - comment: context switch saves FP registers - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run fp test - sub module: Misc - summary: fp unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: fp - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0107 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test FP sqrt" - - [dummy] - comment: test FP sqrt - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run fp test - sub module: Misc - summary: fp unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: fp - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0108 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test FP div" - - [dummy] - comment: test FP div - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run fp test - sub module: Misc - summary: fp unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: fp - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0109 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test FP mul" - - [dummy] - comment: test FP mul - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run fp test - sub module: Misc - summary: fp unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: fp - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0110 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test FP add" - - [dummy] - comment: test FP add - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run fp test - sub module: Misc - summary: fp unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: fp - version: v1 (2016-10-26) -- CI ready: 'Yes' - ID: SYS_MISC_0111 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "Test JPEG decompression library" - - [dummy] - comment: Test JPEG decompression library - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run JPEG decompression test - sub module: Misc - summary: JPEG decompression library unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: tjpgd - version: v1 (2016-10-31) -- CI ready: 'Yes' - ID: SYS_MISC_0112 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "mbedtls AES self-tests" - - [dummy] - comment: mbedtls AES self-tests - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run mbedtls AES self-tests - sub module: Misc - summary: mbedtls AES unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: mbedtls AES - version: v1 (2016-10-31) -- CI ready: 'Yes' - ID: SYS_MISC_0113 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "mbedtls SHA self-tests" - - [dummy] - comment: mbedtls SHA self-tests - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run mbedtls SHA self-tests - sub module: Misc - summary: mbedtls SHA unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: mbedtls SHA - version: v1 (2016-10-31) -- CI ready: 'Yes' - ID: SYS_MISC_0115 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "test SHA acceleration" - - [dummy] - comment: test SHA acceleration - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run SHA acceleration test - sub module: Misc - summary: SHA acceleration unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: SHA acceleration - version: v1 (2016-10-31) -- CI ready: 'Yes' - ID: SYS_OS_0102 - SDK: ESP32_IDF - Test App: UT - auto test: 'Yes' - category: Function - cmd set: - - IDFUnitTest/UnitTest - - - test_case = "Freertos TLS delete cb" - - [dummy] - comment: Freertos TLS delete cb - execution time: 0 - expected result: 1. set succeed - initial condition: UTINIT1 - level: Unit - module: System - steps: 1. run Freertos TLS delete cb test - sub module: OS - summary: Freertos TLS delete cb unit test - test environment: UT_T1_1 - test point 1: basic function - test point 2: Freertos TLS delete cb - version: v1 (2016-10-31) diff --git a/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py b/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py index bfc8edeaa..1625e4e36 100644 --- a/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py +++ b/components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py @@ -9,41 +9,40 @@ class UnitTest(PerformanceTCBase.PerformanceTCBase): def __init__(self, name, test_env, cmd_set, timeout=30, log_path=TCActionBase.LOG_PATH): PerformanceTCBase.PerformanceTCBase.__init__(self, name, test_env, cmd_set=cmd_set, timeout=timeout, log_path=log_path) - + self.test_case = None self.test_timeout = 20 - + # load param from excel for i in range(1, len(cmd_set)): if cmd_set[i][0] != "dummy": - cmd_string = "self." + cmd_set[i][0] + cmd_string = "self.test_case = " + "\"" + cmd_set[i][0] + "\"" exec cmd_string self.result_cntx = TCActionBase.ResultCheckContext(self, test_env, self.tc_name) pass def send_commands(self): self.flush_data("UT1") - + try: - # add case select by name mark " before case name - self.serial_write_line("UT1", "\"" + self.test_case) + self.serial_write_line("UT1", "\"" + self.test_case + "\"") data = "" for _ in range(self.timeout): time.sleep(1) #wait for test to run before reading result data += self.serial_read_data("UT1") - if re.search('[^0] Tests 0 F', data): #check that number of tests run != 0 and number of tests failed == 0 + if re.search('[^0].* Tests 0 F', data): #check that number of tests run != 0 and number of tests failed == 0 self.set_result("Succeed") break else: self.set_result("Fail") - + except StandardError,e: NativeLog.add_exception_log(e) - + def execute(self): TCActionBase.TCActionBase.execute(self) self.send_commands() - + def main(): pass diff --git a/tools/unit-test-app/ModuleDefinition.yml b/tools/unit-test-app/ModuleDefinition.yml new file mode 100644 index 000000000..0f9a31f90 --- /dev/null +++ b/tools/unit-test-app/ModuleDefinition.yml @@ -0,0 +1,127 @@ +freertos: + module: System + module abbr: SYS + sub module: OS + sub module abbr: OS +nvs: + module: System + module abbr: SYS + sub module: NVS + sub module abbr: NVS +partition: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +ulp: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +fp: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +hw: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +tjpgd: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +miniz: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +mmap: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +bignum: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +newlib: + module: System + module abbr: SYS + sub module: Std Lib + sub module abbr: STD +aes: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +mbedtls: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +spi_flash: + module: Driver + module abbr: DRV + sub module: SPI + sub module abbr: SPI +spi_flash_read: + module: Driver + module abbr: DRV + sub module: SPI + sub module abbr: SPI +spi_flash_write: + module: Driver + module abbr: DRV + sub module: SPI + sub module abbr: SPI +esp32: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +deepsleep: + module: RTC + module abbr: RTC + sub module: Deep Sleep + sub module abbr: SLEEP +sd: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +cxx: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +fatfs: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +delay: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +spi: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +vfs: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC +misc: + module: System + module abbr: SYS + sub module: Misc + sub module abbr: MISC + + diff --git a/tools/unit-test-app/UnitTestParser.py b/tools/unit-test-app/UnitTestParser.py new file mode 100644 index 000000000..26f90a026 --- /dev/null +++ b/tools/unit-test-app/UnitTestParser.py @@ -0,0 +1,169 @@ +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()