]> granicus.if.org Git - esp-idf/commitdiff
CI: add script for parsing unit test cases for CI from test files
authorantti <antti@espressif.com>
Wed, 7 Dec 2016 05:58:51 +0000 (13:58 +0800)
committerantti <antti@espressif.com>
Wed, 18 Jan 2017 09:08:20 +0000 (17:08 +0800)
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
components/idf_test/unit_test/CIConfigs/UT_Function_SYS_01.yml [deleted file]
components/idf_test/unit_test/TestCaseAll.yml [deleted file]
components/idf_test/unit_test/TestCaseScript/IDFUnitTest/UnitTest.py
tools/unit-test-app/ModuleDefinition.yml [new file with mode: 0644]
tools/unit-test-app/UnitTestParser.py [new file with mode: 0644]

index 8cb5c8bcac53c11bfa5714583300d0e740e43fa2..81a8fba4fb17fe75ebd0632f97b7ddc8043f285c 100644 (file)
@@ -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 (file)
index f4755df..0000000
+++ /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 (file)
index 4e5c01f..0000000
+++ /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)
index bfc8edeaa9625f1caac1953006e2448bd4e69afe..1625e4e36ceba440af7d441201394fb72b97c4cb 100644 (file)
@@ -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 (file)
index 0000000..0f9a31f
--- /dev/null
@@ -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 (file)
index 0000000..26f90a0
--- /dev/null
@@ -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()