mirror of
https://github.com/python/cpython.git
synced 2025-12-04 16:43:27 +00:00
Move test_undecodable_code() from test_sys to test_cmd_line
This commit is contained in:
parent
6722b5f7f1
commit
f6211eda71
2 changed files with 38 additions and 38 deletions
|
|
@ -108,6 +108,44 @@ class CmdLineTest(unittest.TestCase):
|
||||||
command = "assert(ord('\xe9') == 0xe9)"
|
command = "assert(ord('\xe9') == 0xe9)"
|
||||||
assert_python_ok('-c', command)
|
assert_python_ok('-c', command)
|
||||||
|
|
||||||
|
# On Windows, pass bytes to subprocess doesn't test how Python decodes the
|
||||||
|
# command line, but how subprocess does decode bytes to unicode. Python
|
||||||
|
# doesn't decode the command line because Windows provides directly the
|
||||||
|
# arguments as unicode (using wmain() instead of main()).
|
||||||
|
@unittest.skipIf(sys.platform == 'win32',
|
||||||
|
'Windows has a native unicode API')
|
||||||
|
def test_undecodable_code(self):
|
||||||
|
undecodable = b"\xff"
|
||||||
|
env = os.environ.copy()
|
||||||
|
# Use C locale to get ascii for the locale encoding
|
||||||
|
env['LC_ALL'] = 'C'
|
||||||
|
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,
|
||||||
|
env=env)
|
||||||
|
stdout, stderr = p.communicate()
|
||||||
|
if p.returncode == 1:
|
||||||
|
# _Py_char2wchar() decoded b'\xff' as '\udcff' (b'\xff' is not
|
||||||
|
# decodable from ASCII) and run_command() failed on
|
||||||
|
# PyUnicode_AsUTF8String(). This is the expected behaviour on
|
||||||
|
# Linux.
|
||||||
|
pattern = b"Unable to decode the command from the command line:"
|
||||||
|
elif p.returncode == 0:
|
||||||
|
# _Py_char2wchar() decoded b'\xff' as '\xff' even if the locale is
|
||||||
|
# C and the locale encoding is ASCII. It occurs on FreeBSD, Solaris
|
||||||
|
# and Mac OS X.
|
||||||
|
pattern = b"'\\xff' "
|
||||||
|
# The output is followed by the encoding name, an alias to ASCII.
|
||||||
|
# Examples: "US-ASCII" or "646" (ISO 646, on Solaris).
|
||||||
|
else:
|
||||||
|
raise AssertionError("Unknown exit code: %s, output=%a" % (p.returncode, stdout))
|
||||||
|
if not stdout.startswith(pattern):
|
||||||
|
raise AssertionError("%a doesn't start with %a" % (stdout, pattern))
|
||||||
|
|
||||||
def test_unbuffered_output(self):
|
def test_unbuffered_output(self):
|
||||||
# Test expected operation of the '-u' switch
|
# Test expected operation of the '-u' switch
|
||||||
for stream in ('stdout', 'stderr'):
|
for stream in ('stdout', 'stderr'):
|
||||||
|
|
|
||||||
|
|
@ -496,44 +496,6 @@ class SysModuleTest(unittest.TestCase):
|
||||||
|
|
||||||
self.assertRaises(TypeError, sys.intern, S("abc"))
|
self.assertRaises(TypeError, sys.intern, S("abc"))
|
||||||
|
|
||||||
# On Windows, pass bytes to subprocess doesn't test how Python decodes the
|
|
||||||
# command line, but how subprocess does decode bytes to unicode. Python
|
|
||||||
# doesn't decode the command line because Windows provides directly the
|
|
||||||
# arguments as unicode (using wmain() instead of main()).
|
|
||||||
@unittest.skipIf(sys.platform == 'win32',
|
|
||||||
'Windows has a native unicode API')
|
|
||||||
def test_undecodable_code(self):
|
|
||||||
undecodable = b"\xff"
|
|
||||||
env = os.environ.copy()
|
|
||||||
# Use C locale to get ascii for the locale encoding
|
|
||||||
env['LC_ALL'] = 'C'
|
|
||||||
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,
|
|
||||||
env=env)
|
|
||||||
stdout, stderr = p.communicate()
|
|
||||||
if p.returncode == 1:
|
|
||||||
# _Py_char2wchar() decoded b'\xff' as '\udcff' (b'\xff' is not
|
|
||||||
# decodable from ASCII) and run_command() failed on
|
|
||||||
# PyUnicode_AsUTF8String(). This is the expected behaviour on
|
|
||||||
# Linux.
|
|
||||||
pattern = b"Unable to decode the command from the command line:"
|
|
||||||
elif p.returncode == 0:
|
|
||||||
# _Py_char2wchar() decoded b'\xff' as '\xff' even if the locale is
|
|
||||||
# C and the locale encoding is ASCII. It occurs on FreeBSD, Solaris
|
|
||||||
# and Mac OS X.
|
|
||||||
pattern = b"'\\xff' "
|
|
||||||
# The output is followed by the encoding name, an alias to ASCII.
|
|
||||||
# Examples: "US-ASCII" or "646" (ISO 646, on Solaris).
|
|
||||||
else:
|
|
||||||
raise AssertionError("Unknown exit code: %s, output=%a" % (p.returncode, stdout))
|
|
||||||
if not stdout.startswith(pattern):
|
|
||||||
raise AssertionError("%a doesn't start with %a" % (stdout, pattern))
|
|
||||||
|
|
||||||
def test_sys_flags(self):
|
def test_sys_flags(self):
|
||||||
self.assertTrue(sys.flags)
|
self.assertTrue(sys.flags)
|
||||||
attrs = ("debug", "division_warning",
|
attrs = ("debug", "division_warning",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue