From e843b028e654567af7171dc85a87d8dfda21fe23 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Fri, 13 Dec 2013 10:28:23 +0100 Subject: [PATCH] fix issue404 by more strict junitxml escape --- CHANGELOG | 5 +++++ _pytest/junitxml.py | 14 +++++++------- testing/test_junitxml.py | 14 +++++++++++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1b6db9259..6e4f40be1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Unreleased +----------------------------------- + +- fix issue404 by always using the binary xml escape in the junitxml plugin + 2.5.0 ----------------------------------- diff --git a/_pytest/junitxml.py b/_pytest/junitxml.py index 550ae24fd..2d330870f 100644 --- a/_pytest/junitxml.py +++ b/_pytest/junitxml.py @@ -130,36 +130,36 @@ class LogXML(object): self.skipped += 1 else: fail = Junit.failure(message="test failure") - fail.append(unicode(report.longrepr)) + fail.append(bin_xml_escape(report.longrepr)) self.append(fail) self.failed += 1 self._write_captured_output(report) def append_collect_failure(self, report): #msg = str(report.longrepr.reprtraceback.extraline) - self.append(Junit.failure(unicode(report.longrepr), + self.append(Junit.failure(bin_xml_escape(report.longrepr), message="collection failure")) self.errors += 1 def append_collect_skipped(self, report): #msg = str(report.longrepr.reprtraceback.extraline) - self.append(Junit.skipped(unicode(report.longrepr), + self.append(Junit.skipped(bin_xml_escape(report.longrepr), message="collection skipped")) self.skipped += 1 def append_error(self, report): - self.append(Junit.error(unicode(report.longrepr), + self.append(Junit.error(bin_xml_escape(report.longrepr), message="test setup failure")) self.errors += 1 def append_skipped(self, report): if hasattr(report, "wasxfail"): - self.append(Junit.skipped(unicode(report.wasxfail), + self.append(Junit.skipped(bin_xml_escape(report.wasxfail), message="expected test failure")) else: filename, lineno, skipreason = report.longrepr if skipreason.startswith("Skipped: "): - skipreason = skipreason[9:] + skipreason = bin_xml_escape(skipreason[9:]) self.append( Junit.skipped("%s:%s: %s" % report.longrepr, type="pytest.skip", @@ -193,7 +193,7 @@ class LogXML(object): def pytest_internalerror(self, excrepr): self.errors += 1 - data = py.xml.escape(excrepr) + data = bin_xml_escape(excrepr) self.tests.append( Junit.testcase( Junit.error(data, message="internal error"), diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 01e38b88c..57b5461c7 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -284,6 +284,19 @@ class TestPython: if not sys.platform.startswith("java"): assert "hx" in fnode.toxml() + def test_assertion_binchars(self, testdir): + """this test did fail when the escaping wasnt strict""" + testdir.makepyfile(""" + + M1 = '\x01\x02\x03\x04' + M2 = '\x01\x02\x03\x05' + + def test_str_compare(): + assert M1 == M2 + """) + result, dom = runandparse(testdir) + print dom.toxml() + def test_pass_captures_stdout(self, testdir): testdir.makepyfile(""" def test_pass(): @@ -392,7 +405,6 @@ def test_nullbyte_replace(testdir): text = xmlf.read() assert '#x0' in text - def test_invalid_xml_escape(): # Test some more invalid xml chars, the full range should be # tested really but let's just thest the edges of the ranges