Skip to content

Commit 2720c13

Browse files
ehborisovsseliverstov
authored andcommitted
escape non-unicode symbols in messages and stacktraces (fixes #186 via #256)
1 parent b7720d0 commit 2720c13

File tree

4 files changed

+43
-4
lines changed

4 files changed

+43
-4
lines changed

allure-pytest/src/listener.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22
import allure_commons
3+
from allure_commons.utils import escape_non_unicode_symbols
34
from allure_commons.utils import now
45
from allure_commons.utils import md5
56
from allure_commons.utils import uuid4
@@ -158,7 +159,9 @@ def pytest_runtest_makereport(self, item, call):
158159
status_details = None
159160

160161
if call.excinfo:
161-
status_details = StatusDetails(message=call.excinfo.exconly(), trace=report.longreprtext)
162+
status_details = StatusDetails(
163+
message=escape_non_unicode_symbols(call.excinfo.exconly()),
164+
trace=escape_non_unicode_symbols(report.longreprtext))
162165
if (status != Status.SKIPPED
163166
and not (call.excinfo.errisinstance(AssertionError)
164167
or call.excinfo.errisinstance(pytest.fail.Exception))):

allure-pytest/src/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import six
55
import pytest
66
from allure_commons.utils import represent
7-
from allure_commons.utils import format_exception, format_traceback
7+
from allure_commons.utils import format_exception, format_traceback, escape_non_unicode_symbols
88
from allure_commons.model2 import Status
99
from allure_commons.model2 import StatusDetails
1010

@@ -130,8 +130,8 @@ def get_status(exception):
130130

131131

132132
def get_status_details(exception_type, exception, exception_traceback):
133-
message = format_exception(exception_type, exception)
134-
trace = format_traceback(exception_traceback)
133+
message = escape_non_unicode_symbols(format_exception(exception_type, exception))
134+
trace = escape_non_unicode_symbols(format_traceback(exception_traceback))
135135
return StatusDetails(message=message, trace=trace) if message or trace else None
136136

137137

allure-pytest/test/status/base_step_status_test.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
import pytest
23

34

@@ -43,3 +44,25 @@ def test_pytest_fail_in_step():
4344
"""
4445
with pytest.allure.step('Step'):
4546
pytest.fail()
47+
48+
49+
def test_pytest_bytes_data_in_assert():
50+
"""
51+
>>> allure_report = getfixture('allure_report')
52+
>>> assert_that(allure_report,
53+
... has_test_case('test_pytest_bytes_data_in_assert',
54+
... with_status('failed'),
55+
... has_status_details(with_message_contains("AssertionError: assert '0\\\\x82' == 1"),
56+
... with_trace_contains("def test_pytest_bytes_data_in_assert():")
57+
... ),
58+
... has_step('Step',
59+
... with_status('failed'),
60+
... has_status_details(with_message_contains("AssertionError: assert '0\\\\x82' == 1"),
61+
... with_trace_contains("test_pytest_bytes_data_in_assert")
62+
... )
63+
... )
64+
... )
65+
... )
66+
"""
67+
with pytest.allure.step('Step'):
68+
assert '0\x82' == 1

allure-python-commons/src/utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ def host_tag():
4848
return socket.gethostname()
4949

5050

51+
def escape_non_unicode_symbols(item):
52+
if not (six.PY2 and isinstance(item, str)):
53+
return item
54+
55+
def escape_symbol(s):
56+
try:
57+
s.decode(encoding='UTF-8')
58+
return s
59+
except UnicodeDecodeError:
60+
return repr(s)[1:-1]
61+
return ''.join(map(escape_symbol, item))
62+
63+
5164
def represent(item):
5265
"""
5366
>>> represent(None)

0 commit comments

Comments
 (0)