Fixes 'formatting error or buffer exceeded' error when outputting long failure messages in XML.

This commit is contained in:
vladlosev 2011-03-30 17:45:53 +00:00
parent 1d8c5af33b
commit 03062e2337

View File

@ -3032,7 +3032,7 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
static String EscapeXml(const char* str, bool is_attribute); static String EscapeXml(const char* str, bool is_attribute);
// Returns the given string with all characters invalid in XML removed. // Returns the given string with all characters invalid in XML removed.
static String RemoveInvalidXmlCharacters(const char* str); static string RemoveInvalidXmlCharacters(const string& str);
// Convenience wrapper around EscapeXml when str is an attribute value. // Convenience wrapper around EscapeXml when str is an attribute value.
static String EscapeXmlAttribute(const char* str) { static String EscapeXmlAttribute(const char* str) {
@ -3166,17 +3166,14 @@ String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
// Returns the given string with all characters invalid in XML removed. // Returns the given string with all characters invalid in XML removed.
// Currently invalid characters are dropped from the string. An // Currently invalid characters are dropped from the string. An
// alternative is to replace them with certain characters such as . or ?. // alternative is to replace them with certain characters such as . or ?.
String XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const char* str) { string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) {
char* const output = new char[strlen(str) + 1]; string output;
char* appender = output; output.reserve(str.size());
for (char ch = *str; ch != '\0'; ch = *++str) for (string::const_iterator it = str.begin(); it != str.end(); ++it)
if (IsValidXmlCharacter(ch)) if (IsValidXmlCharacter(*it))
*appender++ = ch; output.push_back(*it);
*appender = '\0';
String ret_value(output); return output;
delete[] output;
return ret_value;
} }
// The following routines generate an XML representation of a UnitTest // The following routines generate an XML representation of a UnitTest
@ -3256,12 +3253,11 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
*stream << " <failure message=\"" *stream << " <failure message=\""
<< EscapeXmlAttribute(part.summary()).c_str() << EscapeXmlAttribute(part.summary()).c_str()
<< "\" type=\"\">"; << "\" type=\"\">";
const String message = RemoveInvalidXmlCharacters(String::Format( const string location = internal::FormatCompilerIndependentFileLocation(
"%s\n%s", part.file_name(), part.line_number());
internal::FormatCompilerIndependentFileLocation( const string message = location + "\n" + part.message();
part.file_name(), part.line_number()).c_str(), OutputXmlCDataSection(stream,
part.message()).c_str()); RemoveInvalidXmlCharacters(message).c_str());
OutputXmlCDataSection(stream, message.c_str());
*stream << "</failure>\n"; *stream << "</failure>\n";
} }
} }