Clone of official tools

Revision:
22:9e85236d8716
Parent:
13:ab47a20b66f0
--- a/test_exporters.py	Fri Jul 15 22:58:15 2016 +0100
+++ b/test_exporters.py	Sat Jul 16 00:34:03 2016 +0100
@@ -18,12 +18,14 @@
 """
 
 from tools.utils import construct_enum, mkdir
+from prettytable import PrettyTable
 import os
 
 ResultExporterType = construct_enum(HTML='Html_Exporter',
                                     JUNIT='JUnit_Exporter',
                                     JUNIT_OPER='JUnit_Exporter_Interoperability',
                                     BUILD='Build_Exporter',
+                                    TEXT='Text_Exporter',
                                     PRINT='Print_Exporter')
 
 
@@ -88,6 +90,8 @@
         elif self.result_exporter_type == ResultExporterType.PRINT:
             # JUNIT exporter for interoperability test
             return self.exporter_print(test_summary_ext, print_log_for_failures=print_log_for_failures)
+        elif self.result_exporter_type == ResultExporterType.TEXT:
+            return self.exporter_text(test_summary_ext)
         return None
 
     def report_to_file(self, test_summary_ext, file_name, test_suite_properties=None):
@@ -352,3 +356,59 @@
             return False
         else:
             return True
+
+    def exporter_text(self, test_result_ext):
+        """ Prints well-formed summary with results (SQL table like)
+            table shows target x test results matrix across
+        """
+        success_code = 0    # Success code that can be leter returned to
+        # Pretty table package is used to print results
+        pt = PrettyTable(["Result", "Target", "Toolchain", "Test ID", "Test Description",
+                          "Elapsed Time", "Timeout"])
+        pt.align["Result"] = "l" # Left align
+        pt.align["Target"] = "l" # Left align
+        pt.align["Toolchain"] = "l" # Left align
+        pt.align["Test ID"] = "l" # Left align
+        pt.align["Test Description"] = "l" # Left align
+        pt.padding_width = 1 # One space between column edges and contents (default)
+
+        result_dict = {"OK" : 0,
+                       "FAIL" : 0,
+                       "ERROR" : 0,
+                       "UNDEF" : 0,
+                       "IOERR_COPY" : 0,
+                       "IOERR_DISK" : 0,
+                       "IOERR_SERIAL" : 0,
+                       "TIMEOUT" : 0,
+                       "NO_IMAGE" : 0,
+                       "MBED_ASSERT" : 0,
+                       "BUILD_FAILED" : 0,
+                       "NOT_SUPPORTED" : 0
+        }
+        unique_test_ids = self.get_all_unique_test_ids(test_result_ext)
+        targets = sorted(test_result_ext.keys())
+        for target in targets:
+            toolchains = sorted(test_result_ext[target].keys())
+            for toolchain in toolchains:
+                test_cases = []
+                tests = sorted(test_result_ext[target][toolchain].keys())
+                for test in tests:
+                    test_results = test_result_ext[target][toolchain][test]
+                    for test_res in test_results:
+                        test_ids = sorted(test_res.keys())
+                        for test_no in test_ids:
+                            test_result = test_res[test_no]
+                            result_dict[test_result['result']] += 1
+                            pt.add_row([test_result['result'],
+                                        test_result['target_name'],
+                                        test_result['toolchain_name'],
+                                        test_result['id'],
+                                        test_result['description'],
+                                        test_result['elapsed_time'],
+                                        test_result['duration']])
+        result = pt.get_string()
+        result += "\n"
+
+        # Print result count
+        result += "Result: " + ' / '.join(['%s %s' % (value, key) for (key, value) in {k: v for k, v in result_dict.items() if v != 0}.iteritems()])
+        return result