Adds file and line information to the "message", which is used as the summary
of a failure.
This commit is contained in:
parent
69a071bc0d
commit
4d6f296e8e
@ -620,7 +620,7 @@ class GTEST_API_ UnitTestImpl {
|
|||||||
// For example, if Foo() calls Bar(), which in turn calls
|
// For example, if Foo() calls Bar(), which in turn calls
|
||||||
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
||||||
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
|
// 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
|
// Finds and returns a TestCase with the given name. If one doesn't
|
||||||
// exist, creates one and returns it.
|
// exist, creates one and returns it.
|
||||||
|
15
src/gtest.cc
15
src/gtest.cc
@ -3271,16 +3271,17 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
|
|||||||
for (int i = 0; i < result.total_part_count(); ++i) {
|
for (int i = 0; i < result.total_part_count(); ++i) {
|
||||||
const TestPartResult& part = result.GetTestPartResult(i);
|
const TestPartResult& part = result.GetTestPartResult(i);
|
||||||
if (part.failed()) {
|
if (part.failed()) {
|
||||||
if (++failures == 1)
|
if (++failures == 1) {
|
||||||
*stream << ">\n";
|
*stream << ">\n";
|
||||||
*stream << " <failure message=\""
|
}
|
||||||
<< EscapeXmlAttribute(part.summary()).c_str()
|
|
||||||
<< "\" type=\"\">";
|
|
||||||
const string location = internal::FormatCompilerIndependentFileLocation(
|
const string location = internal::FormatCompilerIndependentFileLocation(
|
||||||
part.file_name(), part.line_number());
|
part.file_name(), part.line_number());
|
||||||
const string message = location + "\n" + part.message();
|
const string summary = location + "\n" + part.summary();
|
||||||
OutputXmlCDataSection(stream,
|
*stream << " <failure message=\""
|
||||||
RemoveInvalidXmlCharacters(message).c_str());
|
<< EscapeXmlAttribute(summary.c_str())
|
||||||
|
<< "\" type=\"\">";
|
||||||
|
const string detail = location + "\n" + part.message();
|
||||||
|
OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
|
||||||
*stream << "</failure>\n";
|
*stream << "</failure>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
|||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
<testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
||||||
<testcase name="Fails" status="run" time="*" classname="FailedTest">
|
<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
|
Value of: 2
|
||||||
Expected: 1%(stack)s]]></failure>
|
Expected: 1%(stack)s]]></failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
@ -71,10 +71,10 @@ Expected: 1%(stack)s]]></failure>
|
|||||||
<testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
|
<testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
|
||||||
<testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
|
<testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
|
||||||
<testcase name="Fails" 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
|
Value of: 2
|
||||||
Expected: 1%(stack)s]]></failure>
|
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
|
Value of: 3
|
||||||
Expected: 2%(stack)s]]></failure>
|
Expected: 2%(stack)s]]></failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
@ -82,14 +82,14 @@ Expected: 2%(stack)s]]></failure>
|
|||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
<testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
||||||
<testcase name="OutputsCData" status="run" time="*" classname="XmlQuotingTest">
|
<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
|
Failed
|
||||||
XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>
|
XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
<testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">
|
||||||
<testcase name="InvalidCharactersInMessage" status="run" time="*" classname="InvalidCharactersTest">
|
<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
|
Failed
|
||||||
Invalid characters in brackets []%(stack)s]]></failure>
|
Invalid characters in brackets []%(stack)s]]></failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
@ -156,8 +156,9 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
* The "type_param" attribute of <testcase> elements is replaced with a
|
* 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
|
single asterisk (if it sn non-empty) as it is the type name returned
|
||||||
by the compiler and is platform dependent.
|
by the compiler and is platform dependent.
|
||||||
* The line number reported in the first line of the "message"
|
* The line info reported in the first line of the "message"
|
||||||
attribute of <failure> elements is replaced with a single asterisk.
|
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 directory names in file paths are removed.
|
||||||
* The stack traces are removed.
|
* The stack traces are removed.
|
||||||
"""
|
"""
|
||||||
@ -173,10 +174,14 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||||||
if type_param and type_param.value:
|
if type_param and type_param.value:
|
||||||
type_param.value = '*'
|
type_param.value = '*'
|
||||||
elif element.tagName == 'failure':
|
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:
|
for child in element.childNodes:
|
||||||
if child.nodeType == Node.CDATA_SECTION_NODE:
|
if child.nodeType == Node.CDATA_SECTION_NODE:
|
||||||
# Removes the source line number.
|
# Replaces the source line information with a normalized form.
|
||||||
cdata = re.sub(r'^.*[/\\](.*:)\d+\n', '\\1*\n', child.nodeValue)
|
cdata = re.sub(source_line_pat, '\\1*\n', child.nodeValue)
|
||||||
# Removes the actual stack trace.
|
# Removes the actual stack trace.
|
||||||
child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
|
child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
|
||||||
'', cdata)
|
'', cdata)
|
||||||
|
Loading…
Reference in New Issue
Block a user