From 03596c1e4e4b0a178e3f2295e071e6b1a9e917a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Doktor?= Date: Sat, 26 Mar 2016 13:24:22 +0100 Subject: [PATCH] avocado.core.xunit: Escape non-printable characters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Xunit/XML CDATA/attributes must not contain non-printable characters. This patch escapes such characters using hex value. Signed-off-by: Lukáš Doktor --- avocado/core/xunit.py | 16 +++++++++------- selftests/functional/test_output.py | 25 ++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/avocado/core/xunit.py b/avocado/core/xunit.py index e1dd7e82..2d850296 100644 --- a/avocado/core/xunit.py +++ b/avocado/core/xunit.py @@ -16,6 +16,7 @@ import datetime import logging +import string from xml.sax.saxutils import quoteattr from .result import TestResult @@ -24,6 +25,9 @@ from .result import TestResult # We use a subset of the XML format defined in this URL: # https://svn.jenkins-ci.org/trunk/hudson/dtkit/dtkit-format/dtkit-junit-model/src/main/resources/com/thalesgroup/dtkit/junit/model/xsd/junit-4.xsd +PRINTABLE = string.ascii_letters + string.digits + string.punctuation + '\n\r ' + + class XmlResult(object): """ @@ -34,16 +38,14 @@ class XmlResult(object): self.xml = [''] def _escape_attr(self, attrib): + attrib = ''.join(_ if _ in PRINTABLE else "\\x%02x" % ord(_) + for _ in str(attrib)) return quoteattr(attrib) def _escape_cdata(self, cdata): - try: - return cdata.replace(']]>', ']]>]]>', ']]>]]>', ']]>]]>