diff -r c4b5dfcb4a01 Lib/test/support.py --- a/Lib/test/support.py Mon Nov 05 20:40:57 2012 +1000 +++ b/Lib/test/support.py Mon Nov 05 13:11:10 2012 +0100 @@ -603,6 +603,28 @@ else: # module name. TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid()) +# NONASCII: non-ASCII character encodable by os.fsencode(), +# or None if there is no such character. +NONASCII = None +for character in ( + # U+5927 (CJK unified ideograph-5927): cp932, utf8 + '\u5927', + # U+041A (Cyrillic capital letter KA): Encodable to cp932, utf8, koi8-r + '\u041A', + # U+0141 (Latin capital letter L with stroke): Encodable to UTF-8 + '\u0141', + # U+00E9 (Latin small letter E with acute): Encodable to latin1, cp1252, UTF-8 + '\xE9', + # U+00A2 (Cent sign): encodable to latin1, cp424, cp932, cp1252, utf8 + '\xA2', +): + try: + os.fsencode(character) + except UnicodeEncodeError: + pass + else: + NONASCII = character + break # TESTFN_UNICODE is a non-ascii filename TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f" @@ -658,6 +680,11 @@ for name in (b'abc\xff', b'\xe7w\xf0'): TESTFN_UNDECODABLE = name break +if NONASCII: + TESTFN_NONASCII = TESTFN + '- ' + NONASCII +else: + TESTFN_NONASCII = None + # Save the initial cwd SAVEDCWD = os.getcwd() diff -r c4b5dfcb4a01 Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py Mon Nov 05 20:40:57 2012 +1000 +++ b/Lib/test/test_cmd_line.py Mon Nov 05 13:11:10 2012 +0100 @@ -93,15 +93,15 @@ class CmdLineTest(unittest.TestCase): # All good if execution is successful assert_python_ok('-c', 'pass') - @unittest.skipIf(sys.getfilesystemencoding() == 'ascii', - 'need a filesystem encoding different than ASCII') + @unittest.skipUnless(test.support.NONASCII, 'need support.NONASCII') def test_non_ascii(self): # Test handling of non-ascii data if test.support.verbose: import locale print('locale encoding = %s, filesystem encoding = %s' % (locale.getpreferredencoding(), sys.getfilesystemencoding())) - command = "assert(ord('\xe9') == 0xe9)" + command = ("assert(ord(%r) == %s)" + % (test.support.NONASCII, ord(test.support.NONASCII))) assert_python_ok('-c', command) # On Windows, pass bytes to subprocess doesn't test how Python decodes the diff -r c4b5dfcb4a01 Lib/test/test_cmd_line_script.py --- a/Lib/test/test_cmd_line_script.py Mon Nov 05 20:40:57 2012 +1000 +++ b/Lib/test/test_cmd_line_script.py Mon Nov 05 13:11:10 2012 +0100 @@ -363,19 +363,12 @@ class CmdLineTest(unittest.TestCase): self.assertTrue(text[1].startswith(' File ')) self.assertTrue(text[3].startswith('NameError')) + @unittest.skipUnless(support.TESTFN_NONASCII, 'need support.TESTFN_NONASCII') def test_non_ascii(self): # Issue #16218 # non-ascii filename encodable to cp1252, cp932, latin1 and utf8 - filename = support.TESTFN + '\xa3' - try: - os.fsencode(filename) - except UnicodeEncodeError: - self.skipTest( - "Filesystem encoding %r cannot encode " - "the filename: %a" - % (sys.getfilesystemencoding(), filename)) source = 'print(ascii(__file__))\n' - script_name = _make_test_script(os.curdir, filename, source) + script_name = _make_test_script(os.curdir, support.TESTFN_NONASCII, source) self.addCleanup(support.unlink, script_name) rc, stdout, stderr = assert_python_ok(script_name) self.assertEqual( diff -r c4b5dfcb4a01 Lib/test/test_genericpath.py --- a/Lib/test/test_genericpath.py Mon Nov 05 20:40:57 2012 +1000 +++ b/Lib/test/test_genericpath.py Mon Nov 05 13:11:10 2012 +0100 @@ -313,6 +313,8 @@ class CommonTest(GenericTest): def test_nonascii_abspath(self): if support.TESTFN_UNDECODABLE: name = support.TESTFN_UNDECODABLE + elif support.TESTFN_NONASCII: + name = support.TESTFN_NONASCII else: name = b'a\xffb\xe7w\xf0' diff -r c4b5dfcb4a01 Lib/test/test_os.py --- a/Lib/test/test_os.py Mon Nov 05 20:40:57 2012 +1000 +++ b/Lib/test/test_os.py Mon Nov 05 13:11:10 2012 +0100 @@ -1243,6 +1243,8 @@ if sys.platform != 'win32': def setUp(self): if support.TESTFN_UNENCODABLE: self.dir = support.TESTFN_UNENCODABLE + elif support.TESTFN_NONASCII: + self.dir = support.TESTFN_NONASCII else: self.dir = support.TESTFN self.bdir = os.fsencode(self.dir) @@ -1257,6 +1259,8 @@ if sys.platform != 'win32': add_filename(support.TESTFN_UNICODE) if support.TESTFN_UNENCODABLE: add_filename(support.TESTFN_UNENCODABLE) + if support.TESTFN_NONASCII: + add_filename(support.TESTFN_NONASCII) if not bytesfn: self.skipTest("couldn't create any non-ascii filename")