Parse Build Result Summary into CSV Format

TF-M has transferred to a new build system.
Params have been changed.

Function to parse build result summary
also needs to be adjusted.

Change-Id: Ib4dacc2f8179f24c9ff82a9bb2614d63f6a20d27
Signed-off-by: Xinyu Zhang <xinyu.zhang@arm.com>
diff --git a/jenkins/ci.jpl b/jenkins/ci.jpl
index dee4fd1..4b49b72 100644
--- a/jenkins/ci.jpl
+++ b/jenkins/ci.jpl
@@ -33,6 +33,61 @@
                  "INITIAL_ATTESTATION":      "Attest",
                  "IPC":                      "FF"]
 
+// BL2, NS, PSA_API, ISOLATION_LEVEL, TEST_REG, TEST_PSA_API, PROFILE, PARTITION_PS, OTP
+mapConfigs = [
+  ["True", "True", "False", "1", "False", "OFF",                      "N.A",            "Default"],
+  ["True", "True", "True",  "1", "False", "OFF",                      "N.A",            "CoreIPC"],
+  ["True", "True", "True",  "2", "False", "OFF",                      "N.A",            "CoreIPCTfmLevel2"],
+  ["True", "True", "True",  "3", "False", "OFF",                      "N.A",            "CoreIPCTfmLevel3"],
+  ["True", "True", "False", "1", "False", "OFF",                      "profile_small",  "DefaultProfileS"],
+  ["True", "True", "True",  "2", "False", "OFF",                      "profile_medium", "DefaultProfileM"],
+  ["True", "True", "False", "1", "True",  "OFF",                      "N.A",            "Regression"],
+  ["True", "True", "True",  "1", "True",  "OFF",                      "N.A",            "RegressionIPC"],
+  ["True", "True", "True",  "2", "True",  "OFF",                      "N.A",            "RegressionIPCTfmLevel2"],
+  ["True", "True", "True",  "3", "True",  "OFF",                      "N.A",            "RegressionIPCTfmLevel3"],
+  ["True", "True", "False", "1", "True",  "OFF",                      "profile_small",  "RegressionProfileS"],
+  ["True", "True", "True",  "2", "True",  "OFF",                      "profile_medium", "RegressionProfileM"],
+  ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTest (ITS)"],
+  ["True", "True", "False", "1", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTest (PS)"],
+  ["True", "True", "False", "1", "False", "CRYPTO",                   "N.A",            "PsaApiTest (Crypto)"],
+  ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTest (Attest)"],
+  ["True", "True", "False", "1", "False", "IPC",                      "N.A",            "PsaApiTest (FF)"],
+  ["True", "True", "True",  "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTestIPC (ITS)"],
+  ["True", "True", "True",  "1", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTestIPC (PS)"],
+  ["True", "True", "True",  "1", "False", "CRYPTO",                   "N.A",            "PsaApiTestIPC (Crypto)"],
+  ["True", "True", "True",  "1", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTestIPC (Attest)"],
+  ["True", "True", "True",  "1", "False", "IPC",                      "N.A",            "PsaApiTestIPC (FF)"],
+  ["True", "True", "True",  "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTestIPCTfmLevel2 (ITS)"],
+  ["True", "True", "True",  "2", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTestIPCTfmLevel2 (PS)"],
+  ["True", "True", "True",  "2", "False", "CRYPTO",                   "N.A",            "PsaApiTestIPCTfmLevel2 (Crypto)"],
+  ["True", "True", "True",  "2", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTestIPCTfmLevel2 (Attest)"],
+  ["True", "True", "True",  "2", "False", "IPC",                      "N.A",            "PsaApiTestIPCTfmLevel2 (FF)"],
+  ["True", "True", "True",  "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTestIPCTfmLevel3 (ITS)"],
+  ["True", "True", "True",  "3", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTestIPCTfmLevel3 (PS)"],
+  ["True", "True", "True",  "3", "False", "CRYPTO",                   "N.A",            "PsaApiTestIPCTfmLevel3 (Crypto)"],
+  ["True", "True", "True",  "3", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTestIPCTfmLevel3 (Attest)"],
+  ["True", "True", "True",  "3", "False", "IPC",                      "N.A",            "PsaApiTestIPCTfmLevel3 (FF)"],
+]
+
+cfgs = ["Default", "CoreIPC", "CoreIPCTfmLevel2", "CoreIPCTfmLevel3",
+        "Regression", "RegressionIPC",
+        "RegressionIPCTfmLevel2", "RegressionIPCTfmLevel3",
+        "DefaultProfileS", "RegressionProfileS",
+        "DefaultProfileM", "RegressionProfileM", "RegressionProfileM PSOFF",
+        "PsaApiTest (Attest)", "PsaApiTestIPC (Attest)",
+        "PsaApiTestIPCTfmLevel2 (Attest)",
+        "PsaApiTest (Crypto)", "PsaApiTestIPC (Crypto)",
+        "PsaApiTestIPCTfmLevel2 (Crypto)",
+        "PsaApiTest (PS)", "PsaApiTestIPC (PS)",
+        "PsaApiTestIPCTfmLevel2 (PS)",
+        "PsaApiTest (ITS)", "PsaApiTestIPC (ITS)",
+        "PsaApiTestIPCTfmLevel2 (ITS)",
+        "PsaApiTestIPC (FF)",
+        "PsaApiTestIPCTfmLevel2 (FF)",
+        "PsaApiTestIPCTfmLevel3 (ITS)", "PsaApiTestIPCTfmLevel3 (PS)",
+        "PsaApiTestIPCTfmLevel3 (Crypto)", "PsaApiTestIPCTfmLevel3 (Attest)",
+        "PsaApiTestIPCTfmLevel3 (FF)"]
+
 def generateLavaParam(build_params) {
   def params = []
   params += string(name: "TARGET_PLATFORM", \
@@ -306,97 +361,88 @@
 def generateCsvContent(results) {
   def resultsParam = []
   results.each { result ->
-    resultsParam.add([result.value[1], \
-                      result.value[0].getResult(), \
-                      result.value[2]['TARGET_PLATFORM'], \
-                      result.value[2]['COMPILER'], \
-                      result.value[2]['PROJ_CONFIG'], \
-                      result.value[2]['CMAKE_BUILD_TYPE'], \
-                      result.value[2]['BL2'], \
-                      result.value[2]['PSA_API_SUITE']])
+    if (result.value[2]['BL2'] == "True") {
+      resultsParam.add([result.value[1], \
+                        result.value[0].getResult(), \
+                        result.value[2]['TFM_PLATFORM'], \
+                        result.value[2]['TOOLCHAIN_FILE'], \
+                        result.value[2]['CMAKE_BUILD_TYPE'], \
+                        result.value[2]['BL2'], \
+                        result.value[2]['NS'], \
+                        result.value[2]['PSA_API'], \
+                        result.value[2]['ISOLATION_LEVEL'], \
+                        result.value[2]['TEST_REGRESSION'], \
+                        result.value[2]['TEST_PSA_API'], \
+                        result.value[2]['PROFILE'], \
+                        result.value[2]['PARTITION_PS'], \
+                        result.value[2]['OTP']])
+    }
   }
-  def configs = [] as Set
   resultsParam.each { result ->
-    if (result[2] == 'MUSCA_B1') {
-      if (result[0].contains('_OTP_')) {
-        result[2] += '_OTP'
+    if (result[2] == 'musca_b1') {
+      if (result[13] != 'off') {
+        result[2] = 'musca_b1_OTP'
       }
     }
-    if (result[6] == 'True') {
-      result[6] = 'BL2'
+    result[3] = mapCompiler[result[3]]
+    build_params = result[5..12]
+    configName = ""
+    for (map_cfg in mapConfigs) {
+      if (build_params[0..6] == map_cfg[0..6]) {
+        configName = map_cfg[7]
+        break
+      }
     }
-    else {
-      result[6] = 'NOBL2'
+    if (configName == "") {
+      configName = "Default"
     }
-    config = result[4]
-    if (result[7] != "''") {
-      config += ' (' + result[7] + ') '
+    else if (configName == "RegressionProfileM") {
+      if (build_params[7] == "OFF") {
+        configName = "RegressionProfileM PSOFF"
+      }
     }
-    configs.add(config)
-    result.add(config)
+    result.add(configName)
   }
-  configs.sort()
   def csvContent = []
   resultsParam.each { result ->
-    def configExists = false
-    for (csvLine in csvContent) {
-      if (csvLine[0] == result[2] && \
-          csvLine[1] == result[3] && \
-          csvLine[2] == result[5] && \
-          csvLine[3] == result[6]) {
-            csvLine[4][result[8]] = result[1]
-            configExists = true
-            break
+    current_row = result[2..4]
+    cfgs.each {cfg ->
+      if (cfg == result[14]) {
+        current_row.add(cfg)
+        current_row.add(result[1])
+      }
+    }
+    csvContent.add(current_row)
+  }
+  csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2]}
+  build_summary = []
+  current_platform = ""
+  current_compiler = ""
+  current_build_type = ""
+  csvContent.each { build_cfg ->
+    if (current_platform != build_cfg[0] || \
+        current_compiler != build_cfg[1] || \
+        current_build_type != build_cfg[2]) {
+          current_platform = build_cfg[0]
+          current_compiler = build_cfg[1]
+          current_build_type = build_cfg[2]
+          csv_line = [current_platform, current_compiler, current_build_type]
+          cfgs.each {
+            csv_line.add("N.A.")
           }
-    }
-    if (!configExists) {
-      csvContent.add([result[2], result[3], result[5], result[6], [:]])
-      csvContent.last()[4][result[8]] = result[1]
+          build_summary.add(csv_line)
+        }
+    i = 0
+    cfgs.each { cfg ->
+      if (cfg == build_cfg[3]) {
+        build_summary[-1][3+i] = build_cfg[4]
+      }
+      i += 1
     }
   }
-  csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] ?: a[3] <=> b[3]}
-  def csvTable = [['Platform', 'Compiler', 'Cmake Build Type', 'BL2']]
-  csvTable[0] += configs
-  def currentPlatform = ''
-  def currentCompiler = ''
-  def currentBuild = ''
-  csvContent.each { csvLine ->
-    // Modify CSV output format for a better layout
-    if (currentPlatform == csvLine[0]) {
-      csvTable.add([''])
-    }
-    else {
-      csvTable.add([csvLine[0]])
-      currentPlatform = csvLine[0]
-      currentCompiler = ''
-      currentBuild = ''
-    }
-    if (currentCompiler == csvLine[1]) {
-      csvTable.last().add('')
-    }
-    else {
-      csvTable.last().add(csvLine[1])
-      currentCompiler = csvLine[1]
-      currentBuild = ''
-    }
-    if (currentBuild == csvLine[2]) {
-      csvTable.last().add('')
-    }
-    else {
-      csvTable.last().add(csvLine[2])
-      currentBuild = csvLine[2]
-    }
-    csvTable.last().add(csvLine[3])
-    configs.each { config ->
-      if (csvLine[4].containsKey(config)) {
-        csvTable.last().add(csvLine[4][config])
-      }
-      else {
-        csvTable.last().add('N/A')
-      }
-    }
-  }
-  return csvTable
+  build_summary.add(0, ['Platform', 'Compiler', 'Cmake Build Type'])
+  build_summary[0] += cfgs
+  return build_summary
 }
 
 def generateBuildCsv(results) {