提交 03596c1e 编写于 作者: L Lukáš Doktor

avocado.core.xunit: Escape non-printable characters

Xunit/XML CDATA/attributes must not contain non-printable characters.
This patch escapes such characters using hex value.
Signed-off-by: NLukáš Doktor <ldoktor@redhat.com>
上级 ea1f6221
......@@ -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 = ['<?xml version="1.0" encoding="UTF-8"?>']
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(']]>', ']]>]]&gt;<![CDATA[')
except AttributeError:
try:
str(cdata).replace(']]>', ']]>]]&gt;<![CDATA[')
except TypeError:
return 'ERROR: UnparsableObject'
cdata = ''.join(_ if _ in PRINTABLE else "\\x%02x" % ord(_)
for _ in str(cdata))
return cdata.replace(']]>', ']]>]]&gt;<![CDATA[')
def get_contents(self):
return '\n'.join(self.xml)
......
......@@ -63,7 +63,11 @@ class OutputPluginTest(unittest.TestCase):
json.load(fp)
xunit_output = os.path.join(base_dir, 'results.xml')
self.assertTrue(os.path.isfile(json_output))
minidom.parse(xunit_output)
try:
minidom.parse(xunit_output)
except Exception, details:
raise AssertionError("Unable to parse xunit output: %s\n\n%s"
% (details, open(xunit_output).read()))
def test_output_incompatible_setup(self):
os.chdir(basedir)
......@@ -198,6 +202,25 @@ class OutputPluginTest(unittest.TestCase):
except OSError:
pass
def test_nonprintable_chars(self):
cmd_line = ("./scripts/avocado run '/bin/ls "
"NON_EXISTING_FILE_WITH_NONPRINTABLE_CHARS_IN_HERE\x1b' "
"--job-results-dir %s --sysinfo=off" % self.tmpdir)
result = process.run(cmd_line, ignore_status=True)
output = result.stdout + result.stderr
expected_rc = exit_codes.AVOCADO_TESTS_FAIL
self.assertEqual(result.exit_status, expected_rc,
"Avocado did not return rc %d:\n%s" %
(expected_rc, result))
debug_log = None
for line in output.splitlines():
if "JOB LOG" in line:
debug_log = line.split(':', 1)[-1].strip()
break
self.assertTrue(debug_log, "Unable to get JOB LOG from output:\n%s"
% output)
self.check_output_files(debug_log)
def test_show_job_log(self):
os.chdir(basedir)
cmd_line = './scripts/avocado run --job-results-dir %s --sysinfo=off passtest --show-job-log' % self.tmpdir
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册