Adds file and line information to the "message", which is used as the summary
of a failure.
This commit is contained in:
		| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 jgm
					jgm