bpo-34421: Improve distutils logging for non-ASCII strings. (GH-9126)… · python/cpython@c73df53 (original) (raw)

1

1

`"""Tests for distutils.log"""

`

2

2

``

``

3

`+

import io

`

3

4

`import sys

`

4

5

`import unittest

`

5

``

`-

from tempfile import NamedTemporaryFile

`

6

``

`-

from test.support import run_unittest

`

``

6

`+

from test.support import swap_attr, run_unittest

`

7

7

``

8

8

`from distutils import log

`

9

9

``

10

10

`class TestLog(unittest.TestCase):

`

11

11

`def test_non_ascii(self):

`

12

``

`-

Issue #8663: test that non-ASCII text is escaped with

`

13

``

`-

backslashreplace error handler (stream use ASCII encoding and strict

`

14

``

`-

error handler)

`

15

``

`-

old_stdout = sys.stdout

`

16

``

`-

old_stderr = sys.stderr

`

17

``

`-

old_threshold = log.set_threshold(log.DEBUG)

`

18

``

`-

try:

`

19

``

`-

with NamedTemporaryFile(mode="w+", encoding='ascii') as stdout, \

`

20

``

`-

NamedTemporaryFile(mode="w+", encoding='ascii') as stderr:

`

21

``

`-

sys.stdout = stdout

`

22

``

`-

sys.stderr = stderr

`

23

``

`-

log.debug("debug:\xe9")

`

24

``

`-

log.fatal("fatal:\xe9")

`

``

12

`+

Issues #8663, #34421: test that non-encodable text is escaped with

`

``

13

`+

backslashreplace error handler and encodable non-ASCII text is

`

``

14

`+

output as is.

`

``

15

`+

for errors in ('strict', 'backslashreplace', 'surrogateescape',

`

``

16

`+

'replace', 'ignore'):

`

``

17

`+

with self.subTest(errors=errors):

`

``

18

`+

stdout = io.TextIOWrapper(io.BytesIO(),

`

``

19

`+

encoding='cp437', errors=errors)

`

``

20

`+

stderr = io.TextIOWrapper(io.BytesIO(),

`

``

21

`+

encoding='cp437', errors=errors)

`

``

22

`+

old_threshold = log.set_threshold(log.DEBUG)

`

``

23

`+

try:

`

``

24

`+

with swap_attr(sys, 'stdout', stdout), \

`

``

25

`+

swap_attr(sys, 'stderr', stderr):

`

``

26

`+

log.debug('Dεbug\tMėssãge')

`

``

27

`+

log.fatal('Fαtal\tÈrrōr')

`

``

28

`+

finally:

`

``

29

`+

log.set_threshold(old_threshold)

`

``

30

+

25

31

`stdout.seek(0)

`

26

``

`-

self.assertEqual(stdout.read().rstrip(), "debug:\xe9")

`

``

32

`+

self.assertEqual(stdout.read().rstrip(),

`

``

33

`+

'Dεbug\tM?ss?ge' if errors == 'replace' else

`

``

34

`+

'Dεbug\tMssge' if errors == 'ignore' else

`

``

35

`+

'Dεbug\tM\u0117ss\xe3ge')

`

27

36

`stderr.seek(0)

`

28

``

`-

self.assertEqual(stderr.read().rstrip(), "fatal:\xe9")

`

29

``

`-

finally:

`

30

``

`-

log.set_threshold(old_threshold)

`

31

``

`-

sys.stdout = old_stdout

`

32

``

`-

sys.stderr = old_stderr

`

``

37

`+

self.assertEqual(stderr.read().rstrip(),

`

``

38

`+

'Fαtal\t?rr?r' if errors == 'replace' else

`

``

39

`+

'Fαtal\trrr' if errors == 'ignore' else

`

``

40

`+

'Fαtal\t\xc8rr\u014dr')

`

33

41

``

34

42

`def test_suite():

`

35

43

`return unittest.makeSuite(TestLog)

`