gh-125942: Android: set stdout to `errors="backslashreplace"` (#125943)

Android stdout/err streams now use `backslashreplace` encoding to ensure readability of the Android log.
This commit is contained in:
Malcolm Smith 2024-10-25 01:35:41 +01:00 committed by GitHub
parent e68d4b08ff
commit b08570c90e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 10 additions and 8 deletions

View File

@ -31,16 +31,19 @@ def init_streams(android_log_write, stdout_prio, stderr_prio):
logcat = Logcat(android_log_write) logcat = Logcat(android_log_write)
sys.stdout = TextLogStream( sys.stdout = TextLogStream(
stdout_prio, "python.stdout", sys.stdout.fileno(), stdout_prio, "python.stdout", sys.stdout.fileno())
errors=sys.stdout.errors)
sys.stderr = TextLogStream( sys.stderr = TextLogStream(
stderr_prio, "python.stderr", sys.stderr.fileno(), stderr_prio, "python.stderr", sys.stderr.fileno())
errors=sys.stderr.errors)
class TextLogStream(io.TextIOWrapper): class TextLogStream(io.TextIOWrapper):
def __init__(self, prio, tag, fileno=None, **kwargs): def __init__(self, prio, tag, fileno=None, **kwargs):
# The default is surrogateescape for stdout and backslashreplace for
# stderr, but in the context of an Android log, readability is more
# important than reversibility.
kwargs.setdefault("encoding", "UTF-8") kwargs.setdefault("encoding", "UTF-8")
kwargs.setdefault("errors", "backslashreplace")
super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs) super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs)
self._lock = RLock() self._lock = RLock()
self._pending_bytes = [] self._pending_bytes = []

View File

@ -123,13 +123,10 @@ class TestAndroidOutput(unittest.TestCase):
self.assertIs(stream.readable(), False) self.assertIs(stream.readable(), False)
self.assertEqual(stream.fileno(), fileno) self.assertEqual(stream.fileno(), fileno)
self.assertEqual("UTF-8", stream.encoding) self.assertEqual("UTF-8", stream.encoding)
self.assertEqual("backslashreplace", stream.errors)
self.assertIs(stream.line_buffering, True) self.assertIs(stream.line_buffering, True)
self.assertIs(stream.write_through, False) self.assertIs(stream.write_through, False)
# stderr is backslashreplace by default; stdout is configured
# that way by libregrtest.main.
self.assertEqual("backslashreplace", stream.errors)
def write(s, lines=None, *, write_len=None): def write(s, lines=None, *, write_len=None):
if write_len is None: if write_len is None:
write_len = len(s) write_len = len(s)

View File

@ -0,0 +1,2 @@
On Android, the ``errors`` setting of :any:`sys.stdout` was changed from
``surrogateescape`` to ``backslashreplace``.