Skip to content

Commit a2a0daa

Browse files
nablaadnozay
authored andcommitted
Fix crash when exceptions contain unicode in buffered output (#199)
When `xmlrunner.XMLTestRunner` is run in buffered mode, `sys.stdout` points to StringIO instance. It has `encoding` attribute, but it is set to `None` which causes a crash during the test run in Python 2: Traceback (most recent call last): File "/home/miika/apps/unittest-xml-reporting/tests/testsuite.py", line 376, in test_xmlrunner_non_ascii_failures_buffered_output self._xmlrunner_non_ascii_failures(buffer=True) File "/home/miika/apps/unittest-xml-reporting/tests/testsuite.py", line 398, in _xmlrunner_non_ascii_failures runner.run(suite) File "/home/miika/apps/unittest-xml-reporting/xmlrunner/runner.py", line 70, in run test(result) File "/usr/lib/python2.7/unittest/suite.py", line 70, in __call__ return self.run(*args, **kwds) File "/usr/lib/python2.7/unittest/suite.py", line 108, in run test(result) File "/usr/lib/python2.7/unittest/case.py", line 393, in __call__ return self.run(*args, **kwds) File "/usr/lib/python2.7/unittest/case.py", line 333, in run result.addFailure(self, sys.exc_info()) File "/usr/lib/python2.7/unittest/result.py", line 19, in inner return method(self, *args, **kw) File "/home/miika/apps/unittest-xml-reporting/xmlrunner/result.py", line 344, in addFailure self, test, self.infoclass.FAILURE, err) File "/home/miika/apps/unittest-xml-reporting/xmlrunner/result.py", line 163, in __init__ err, test_method) File "/home/miika/apps/unittest-xml-reporting/xmlrunner/result.py", line 703, in _exc_info_to_string line = line.encode(encoding) TypeError: encode() argument 1 must be string, not None
1 parent 0fde905 commit a2a0daa

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

tests/testsuite.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,13 +387,19 @@ def test_xmlrunner_unsafe_unicode(self):
387387
output)
388388

389389
def test_xmlrunner_non_ascii_failures(self):
390+
self._xmlrunner_non_ascii_failures()
391+
392+
def test_xmlrunner_non_ascii_failures_buffered_output(self):
393+
self._xmlrunner_non_ascii_failures(buffer=True)
394+
395+
def _xmlrunner_non_ascii_failures(self, buffer=False):
390396
suite = unittest.TestSuite()
391397
suite.addTest(self.DummyTest(
392398
'test_non_ascii_runner_buffer_output_fail'))
393399
outdir = BytesIO()
394400
runner = xmlrunner.XMLTestRunner(
395401
stream=self.stream, output=outdir, verbosity=self.verbosity,
396-
**self.runner_kwargs)
402+
buffer=buffer, **self.runner_kwargs)
397403

398404
# allow output non-ascii letters to stdout
399405
orig_stdout = sys.stdout

xmlrunner/result.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,9 @@ def _exc_info_to_string(self, err, test):
694694
msgLines.append(STDERR_LINE % error)
695695
# This is the extra magic to make sure all lines are str
696696
encoding = getattr(sys.stdout, 'encoding', 'utf-8')
697+
if encoding is None:
698+
encoding = 'utf-8'
699+
697700
lines = []
698701
for line in msgLines:
699702
if not isinstance(line, str):

0 commit comments

Comments
 (0)