diff -r 35da5d848ffd Lib/test/test_sys.py --- a/Lib/test/test_sys.py Mon Sep 23 23:24:38 2013 +0300 +++ b/Lib/test/test_sys.py Wed Sep 25 12:39:35 2013 +0300 @@ -525,60 +525,69 @@ def test_clear_type_cache(self): sys._clear_type_cache() + def check_ioencoding(self, env, string, expected): + p = subprocess.Popen([sys.executable, "-c", 'print(%a)' % string], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=env) + out, err = p.communicate() + if expected is not None: + self.assertEqual(out.strip(), expected) + else: + self.assertEqual(out, b'') + self.assertIn(b'UnicodeEncodeError:', err) + self.assertIn(ascii(string).encode(), err) + 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, '\xa2', ("\xa2" + os.linesep).encode("cp424")) 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, '\xa2', b'?') 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, '\xa2', None) 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, '\xa2', None) 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') + self.check_ioencoding(env, '\udcbd', b'\xbd') - @unittest.skipUnless(test.support.FS_NONASCII, - 'requires OS support of non-ASCII encodings') - def test_ioencoding_nonascii(self): + def test_ioencoding_locale(self): + encodable = unencodable = None + import locale + encoding = locale.getpreferredencoding() + if encoding: + for c in '\xe6\u0130\u0141\u03c6\u041a\u05d0'\ + '\u060c\u062a\u0e01\xa0\u20ac\udcbd': + try: + if c.encode(encoding).strip(): + encodable = c + except UnicodeEncodeError: + unencodable = c + if encodable and unencodable: + break + if not encodable: + raise unittest.SkipTest('requires non-ASCII locale') + env = dict(os.environ) 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, encodable, encodable.encode(encoding).strip()) + if unencodable: + self.check_ioencoding(env, unencodable, None) + + del env["PYTHONIOENCODING"] + self.check_ioencoding(env, encodable, encodable.encode(encoding).strip()) + if unencodable: + self.check_ioencoding(env, unencodable, None) + + + @unittest.skipIf(sys.base_prefix != sys.prefix, 'Test is not venv-compatible')