Author: tfiala Date: Fri Sep 18 02:08:09 2015 New Revision: 247973 URL: http://llvm.org/viewvc/llvm-project?rev=247973&view=rev Log: xunit output: add backtraces; limit attribute
When pexpect errors occurred, the <error>/<failure> element's message attribute could get too long and contain invalid characters for xml attributes, even when quoted. Particularly for pexpect failures. Now <error> and <failure> entries truncate the message attribute to contain the first line of the message. <error> and <failure> blocks now contain both the complete message and the backtrace (finally!) in the text body of the error/failure element. Modified: lldb/trunk/test/test_results.py Modified: lldb/trunk/test/test_results.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/test_results.py?rev=247973&r1=247972&r2=247973&view=diff ============================================================================== --- lldb/trunk/test/test_results.py (original) +++ lldb/trunk/test/test_results.py Fri Sep 18 02:08:09 2015 @@ -15,6 +15,7 @@ import os import sys import threading import time +import traceback import xml.sax.saxutils @@ -78,6 +79,16 @@ class EventBuilder(object): return str(error_tuple[1]) @staticmethod + def _error_tuple_traceback(error_tuple): + """Returns the unittest error tuple's error message. + + @param error_tuple the error tuple provided by the test framework. + + @return the error message provided by the test framework. + """ + return error_tuple[2] + + @staticmethod def _event_dictionary_test_result(test, status): """Returns an event dictionary with common test result fields set. @@ -110,6 +121,9 @@ class EventBuilder(object): event = EventBuilder._event_dictionary_test_result(test, status) event["issue_class"] = EventBuilder._error_tuple_class(error_tuple) event["issue_message"] = EventBuilder._error_tuple_message(error_tuple) + tb = EventBuilder._error_tuple_traceback(error_tuple) + if tb is not None: + event["issue_backtrace"] = traceback.format_tb(tb) return event @staticmethod @@ -499,11 +513,17 @@ class XunitFormatter(ResultsFormatter): """Handles a test failure. @param test_event the test event to handle. """ + message_summary = test_event["issue_message"].splitlines()[0] + backtrace = "".join(test_event.get("issue_backtrace", [])) + result = self._common_add_testcase_entry( test_event, - inner_content='<failure type={} message={} />'.format( + inner_content=('<failure type={} message={}><![CDATA[message: {}\nbacktrace:\n{}]]></failure>'.format( XunitFormatter._quote_attribute(test_event["issue_class"]), - XunitFormatter._quote_attribute(test_event["issue_message"]))) + XunitFormatter._quote_attribute(message_summary), + test_event["issue_message"], + backtrace) + )) with self.lock: self.elements["failures"].append(result) @@ -511,11 +531,20 @@ class XunitFormatter(ResultsFormatter): """Handles a test error. @param test_event the test event to handle. """ + + # Limit the message summary attribute to the first line of the + # issue message. + message_summary = test_event["issue_message"].splitlines()[0] + backtrace = "".join(test_event.get("issue_backtrace", [])) + result = self._common_add_testcase_entry( test_event, - inner_content='<error type={} message={} />'.format( + inner_content=('<error type={} message={}><![CDATA[message: {}\nbacktrace:\n{}]]></error>'.format( XunitFormatter._quote_attribute(test_event["issue_class"]), - XunitFormatter._quote_attribute(test_event["issue_message"]))) + XunitFormatter._quote_attribute(message_summary), + test_event["issue_message"], + backtrace) + )) with self.lock: self.elements["errors"].append(result) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits