From f6211eda71085609f0c126e1c9422f10f9637170 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Oct 2010 21:52:33 +0000 Subject: Move test_undecodable_code() from test_sys to test_cmd_line --- Lib/test/test_cmd_line.py | 38 ++++++++++++++++++++++++++++++++++++++ Lib/test/test_sys.py | 38 -------------------------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index f7e8f24..35de813 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -108,6 +108,44 @@ class CmdLineTest(unittest.TestCase): command = "assert(ord('\xe9') == 0xe9)" 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): # Test expected operation of the '-u' switch for stream in ('stdout', 'stderr'): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index e008281..93eed03 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -496,44 +496,6 @@ class SysModuleTest(unittest.TestCase): 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): self.assertTrue(sys.flags) attrs = ("debug", "division_warning", -- cgit v0.12