diff options
| -rw-r--r-- | src/gtest-internal-inl.h | 2 | ||||
| -rw-r--r-- | src/gtest.cc | 15 | ||||
| -rwxr-xr-x | test/gtest_xml_output_unittest.py | 10 | ||||
| -rwxr-xr-x | test/gtest_xml_test_utils.py | 13 | 
4 files changed, 23 insertions, 17 deletions
| diff --git a/src/gtest-internal-inl.h b/src/gtest-internal-inl.h index 4e9805d1..350ade07 100644 --- a/src/gtest-internal-inl.h +++ b/src/gtest-internal-inl.h @@ -620,7 +620,7 @@ class GTEST_API_ UnitTestImpl {    // For example, if Foo() calls Bar(), which in turn calls    // CurrentOsStackTraceExceptTop(1), Foo() will be included in the    // trace but Bar() and CurrentOsStackTraceExceptTop() won't. -  String CurrentOsStackTraceExceptTop(int skip_count); +  String CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;    // Finds and returns a TestCase with the given name.  If one doesn't    // exist, creates one and returns it. diff --git a/src/gtest.cc b/src/gtest.cc index f2e84af7..56af6469 100644 --- a/src/gtest.cc +++ b/src/gtest.cc @@ -3271,16 +3271,17 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,    for (int i = 0; i < result.total_part_count(); ++i) {      const TestPartResult& part = result.GetTestPartResult(i);      if (part.failed()) { -      if (++failures == 1) +      if (++failures == 1) {          *stream << ">\n"; -      *stream << "      <failure message=\"" -              << EscapeXmlAttribute(part.summary()).c_str() -              << "\" type=\"\">"; +      }        const string location = internal::FormatCompilerIndependentFileLocation(            part.file_name(), part.line_number()); -      const string message = location + "\n" + part.message(); -      OutputXmlCDataSection(stream, -                            RemoveInvalidXmlCharacters(message).c_str()); +      const string summary = location + "\n" + part.summary(); +      *stream << "      <failure message=\"" +              << EscapeXmlAttribute(summary.c_str()) +              << "\" type=\"\">"; +      const string detail = location + "\n" + part.message(); +      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());        *stream << "</failure>\n";      }    } diff --git a/test/gtest_xml_output_unittest.py b/test/gtest_xml_output_unittest.py index 83903002..1bcd4187 100755 --- a/test/gtest_xml_output_unittest.py +++ b/test/gtest_xml_output_unittest.py @@ -63,7 +63,7 @@ EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>    </testsuite>    <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">      <testcase name="Fails" status="run" time="*" classname="FailedTest"> -      <failure message="Value of: 2
Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:* +      <failure message="gtest_xml_output_unittest_.cc:*
Value of: 2
Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*  Value of: 2  Expected: 1%(stack)s]]></failure>      </testcase> @@ -71,10 +71,10 @@ Expected: 1%(stack)s]]></failure>    <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">      <testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>      <testcase name="Fails" status="run" time="*" classname="MixedResultTest"> -      <failure message="Value of: 2
Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:* +      <failure message="gtest_xml_output_unittest_.cc:*
Value of: 2
Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*  Value of: 2  Expected: 1%(stack)s]]></failure> -      <failure message="Value of: 3
Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:* +      <failure message="gtest_xml_output_unittest_.cc:*
Value of: 3
Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*  Value of: 3  Expected: 2%(stack)s]]></failure>      </testcase> @@ -82,14 +82,14 @@ Expected: 2%(stack)s]]></failure>    </testsuite>    <testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">      <testcase name="OutputsCData" status="run" time="*" classname="XmlQuotingTest"> -      <failure message="Failed
XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]></top>" type=""><![CDATA[gtest_xml_output_unittest_.cc:* +      <failure message="gtest_xml_output_unittest_.cc:*
Failed
XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]></top>" type=""><![CDATA[gtest_xml_output_unittest_.cc:*  Failed  XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>      </testcase>    </testsuite>    <testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">      <testcase name="InvalidCharactersInMessage" status="run" time="*" classname="InvalidCharactersTest"> -      <failure message="Failed
Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:* +      <failure message="gtest_xml_output_unittest_.cc:*
Failed
Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:*  Failed  Invalid characters in brackets []%(stack)s]]></failure>      </testcase> diff --git a/test/gtest_xml_test_utils.py b/test/gtest_xml_test_utils.py index f94d634b..0e5a1089 100755 --- a/test/gtest_xml_test_utils.py +++ b/test/gtest_xml_test_utils.py @@ -156,8 +156,9 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):      *  The "type_param" attribute of <testcase> elements is replaced with a         single asterisk (if it sn non-empty) as it is the type name returned         by the compiler and is platform dependent. -    *  The line number reported in the first line of the "message" -       attribute of <failure> elements is replaced with a single asterisk. +    *  The line info reported in the first line of the "message" +       attribute and CDATA section of <failure> elements is replaced with the +       file's basename and a single asterisk for the line number.      *  The directory names in file paths are removed.      *  The stack traces are removed.      """ @@ -173,10 +174,14 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):        if type_param and type_param.value:          type_param.value = '*'      elif element.tagName == 'failure': +      source_line_pat = r'^.*[/\\](.*:)\d+\n' +      # Replaces the source line information with a normalized form. +      message = element.getAttributeNode('message') +      message.value = re.sub(source_line_pat, '\\1*\n', message.value)        for child in element.childNodes:          if child.nodeType == Node.CDATA_SECTION_NODE: -          # Removes the source line number. -          cdata = re.sub(r'^.*[/\\](.*:)\d+\n', '\\1*\n', child.nodeValue) +          # Replaces the source line information with a normalized form. +          cdata = re.sub(source_line_pat, '\\1*\n', child.nodeValue)            # Removes the actual stack trace.            child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',                                     '', cdata) | 
