diff --git a/Lib/test/support.py b/Lib/test/support.py index d0e84c72ab7..814d06198ef 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1277,3 +1277,11 @@ def strip_python_stderr(stderr): """ stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip() return stderr + +def workaroundIssue8611(): + try: + sys.executable.encode('ascii') + except UnicodeEncodeError: + raise unittest.SkipTest( + "Issue #8611: Python doesn't support ascii locale encoding " + "with an non-ascii path") diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 4ab6593812b..6ce0d5f42c7 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1175,15 +1175,12 @@ class FSEncodingTests(unittest.TestCase): self.assertEqual(decoded, repr(unicodefn)) check('utf-8', b'\xc3\xa9\x80', '\xe9\udc80') - try: - sys.executable.encode("ascii") - except UnicodeEncodeError: - # Python doesn't start with ASCII locale if its path is not ASCII, - # see issue #8611 - pass - else: - check('ascii', b'abc\xff', 'abc\udcff') - check('iso-8859-15', b'\xef\xa4', '\xef\u20ac') + + # Raise SkipTest() if sys.executable is not encodable to ascii + support.workaroundIssue8611() + + check('ascii', b'abc\xff', 'abc\udcff') + check('iso-8859-15', b'\xef\xa4', '\xef\u20ac') def test_main(): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index e09601fd0c9..294814da788 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -496,11 +496,16 @@ class SysModuleTest(unittest.TestCase): self.assertRaises(TypeError, sys.intern, S("abc")) def test_undecodable_code(self): - non_decodable = b"\xff" + # Raise SkipTest() if sys.executable is not encodable to ascii + test.support.workaroundIssue8611() + + undecodable = b"\xff" env = os.environ.copy() env['LANG'] = 'C' - code = b'import locale; ' - code += b'print(ascii("' + non_decodable + b'"), locale.getpreferredencoding())' + code = ( + b'import locale; ' + b'print(ascii("' + undecodable + b'"), ' + b'locale.getpreferredencoding())') p = subprocess.Popen( [sys.executable, "-c", code], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, @@ -587,28 +592,23 @@ class SysModuleTest(unittest.TestCase): env=env) return output.rstrip().decode('ascii') + # Raise SkipTest() if sys.executable is not encodable to ascii + test.support.workaroundIssue8611() + + # Even in C locale + env = os.environ.copy() + env['LANG'] = 'C' try: - sys.executable.encode('ascii') - except UnicodeEncodeError: - # Python doesn't start with ASCII locale if its path is not ASCII, - # see issue #8611 + del env['PYTHONFSENCODING'] + except KeyError: pass - else: - # Even in C locale + self.check_fsencoding(get_fsencoding(env), 'ascii') + + # Filesystem encoding is hardcoded on Windows and Mac OS X + for encoding in ('ascii', 'cp850', 'iso8859-1', 'utf-8'): env = os.environ.copy() - env['LANG'] = 'C' - try: - del env['PYTHONFSENCODING'] - except KeyError: - pass - self.check_fsencoding(get_fsencoding(env), 'ascii') - - # Filesystem encoding is hardcoded on Windows and Mac OS X - for encoding in ('ascii', 'cp850', 'iso8859-1', 'utf-8'): - env = os.environ.copy() - env['PYTHONFSENCODING'] = encoding - self.check_fsencoding(get_fsencoding(env), encoding) - + env['PYTHONFSENCODING'] = encoding + self.check_fsencoding(get_fsencoding(env), encoding) def test_setfilesystemencoding(self): old = sys.getfilesystemencoding()