diff -r 9e54def97a5e Lib/test/test_sys.py --- a/Lib/test/test_sys.py Sat Sep 28 21:24:43 2013 +0300 +++ b/Lib/test/test_sys.py Sat Sep 28 23:51:24 2013 +0300 @@ -9,6 +9,7 @@ import gc import sysconfig + # count the number of test runs, used to create unique # strings to intern in test_intern() numruns = 0 @@ -525,60 +526,44 @@ def test_clear_type_cache(self): sys._clear_type_cache() + def check_ioencoding(self, env, expected_enc, expected_err): + cmd = ('import sys; print(sys.stdin.encoding, sys.stdin.errors, ' + 'sys.stdout.encoding, sys.stdout.errors, ' + 'sys.stderr.encoding, sys.stderr.errors)') + p = subprocess.Popen([sys.executable, '-c', cmd], + stdout=subprocess.PIPE, + env=env) + expected = ' '.join((expected_enc, expected_err, + expected_enc, expected_err, + expected_enc, 'backslashreplace')) + os.linesep + self.assertEqual(p.communicate()[0].strip(), + (expected.encode(expected_enc, expected_err).strip())) + def test_ioencoding(self): env = dict(os.environ) - # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424, - # not representable in ASCII. - env["PYTHONIOENCODING"] = "cp424" - p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xa2))'], - stdout = subprocess.PIPE, env=env) - out = p.communicate()[0].strip() - expected = ("\xa2" + os.linesep).encode("cp424") - self.assertEqual(out, expected) + self.check_ioencoding(env, 'cp424', 'strict') env["PYTHONIOENCODING"] = "ascii:replace" - p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xa2))'], - stdout = subprocess.PIPE, env=env) - out = p.communicate()[0].strip() - self.assertEqual(out, b'?') + self.check_ioencoding(env, 'ascii', 'replace') env["PYTHONIOENCODING"] = "ascii" - p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xa2))'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - env=env) - out, err = p.communicate() - self.assertEqual(out, b'') - self.assertIn(b'UnicodeEncodeError:', err) - self.assertIn(rb"'\xa2'", err) + self.check_ioencoding(env, 'ascii', 'strict') env["PYTHONIOENCODING"] = "ascii:" - p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xa2))'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE, - env=env) - out, err = p.communicate() - self.assertEqual(out, b'') - self.assertIn(b'UnicodeEncodeError:', err) - self.assertIn(rb"'\xa2'", err) + self.check_ioencoding(env, 'ascii', 'strict') + import locale + encoding = locale.getpreferredencoding() env["PYTHONIOENCODING"] = ":surrogateescape" - p = subprocess.Popen([sys.executable, "-c", 'print(chr(0xdcbd))'], - stdout=subprocess.PIPE, env=env) - out = p.communicate()[0].strip() - self.assertEqual(out, b'\xbd') - - @unittest.skipUnless(test.support.FS_NONASCII, - 'requires OS support of non-ASCII encodings') - def test_ioencoding_nonascii(self): - env = dict(os.environ) + self.check_ioencoding(env, encoding, 'surrogateescape') env["PYTHONIOENCODING"] = "" - p = subprocess.Popen([sys.executable, "-c", - 'print(%a)' % test.support.FS_NONASCII], - stdout=subprocess.PIPE, env=env) - out = p.communicate()[0].strip() - self.assertEqual(out, os.fsencode(test.support.FS_NONASCII)) + self.check_ioencoding(env, encoding, 'strict') + + del env["PYTHONIOENCODING"] + self.check_ioencoding(env, encoding, 'strict') @unittest.skipIf(sys.base_prefix != sys.prefix, 'Test is not venv-compatible')