diff --git a/lib/ansible/plugins/callback/junit.py b/lib/ansible/plugins/callback/junit.py index 9ce0dfa172..7b804ada49 100644 --- a/lib/ansible/plugins/callback/junit.py +++ b/lib/ansible/plugins/callback/junit.py @@ -21,7 +21,7 @@ __metaclass__ = type import os import time -from ansible.module_utils._text import to_bytes +from ansible.module_utils._text import to_bytes, to_text from ansible.plugins.callback import CallbackBase try: @@ -142,6 +142,7 @@ class CallbackModule(CallbackBase): res = host_data.result._result rc = res.get('rc', 0) dump = self._dump_results(res, indent=0) + dump = self._cleanse_string(dump) if host_data.status == 'ok': return TestCase(name, task_data.path, duration, dump) @@ -167,6 +168,10 @@ class CallbackModule(CallbackBase): return test_case + def _cleanse_string(self, value): + """ convert surrogate escapes to the unicode replacement character to avoid XML encoding errors """ + return to_text(to_bytes(value, errors='surrogateescape'), errors='replace') + def _generate_report(self): """ generate a TestSuite report from the collected TaskData and HostData """