1"""Tests for distutils.log""" 2 3import io 4import sys 5import unittest 6from test.support import swap_attr, run_unittest 7 8from distutils import log 9 10class TestLog(unittest.TestCase): 11 def test_non_ascii(self): 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 31 stdout.seek(0) 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') 36 stderr.seek(0) 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') 41 42def test_suite(): 43 return unittest.makeSuite(TestLog) 44 45if __name__ == "__main__": 46 run_unittest(test_suite()) 47