diff options
-rw-r--r-- | Lib/test/support.py | 6 | ||||
-rw-r--r-- | Lib/test/test_os.py | 56 |
2 files changed, 43 insertions, 19 deletions
diff --git a/Lib/test/support.py b/Lib/test/support.py index 8a8e410..a70fee4 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -377,10 +377,8 @@ else: TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid()) -# Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding() -# TESTFN_UNICODE is a filename that can be encoded using the -# file system encoding, but *not* with the default (ascii) encoding -TESTFN_UNICODE = TESTFN + "-\xe0\xf2" +# TESTFN_UNICODE is a non-ascii filename +TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f" TESTFN_ENCODING = sys.getfilesystemencoding() # TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index da5dfd7..f56280a 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -895,29 +895,55 @@ if sys.platform != 'win32': sys.executable, '-c', 'import os,sys;os.setregid(-1,-1);sys.exit(0)']) - @unittest.skipIf(sys.platform == 'darwin', "tests don't apply to OS X") class Pep383Tests(unittest.TestCase): - filenames = [b'foo\xf6bar', 'foo\xf6bar'.encode("utf-8")] - def setUp(self): - self.fsencoding = sys.getfilesystemencoding() - sys.setfilesystemencoding("utf-8") - self.dir = support.TESTFN - self.bdir = self.dir.encode("utf-8", "surrogateescape") + def fsdecode(filename): + encoding = sys.getfilesystemencoding() + if encoding == 'mbcs': + errors = 'strict' + else: + errors = 'surrogateescape' + return filename.decode(encoding, errors) + + if support.TESTFN_UNENCODABLE: + self.dir = support.TESTFN_UNENCODABLE + else: + self.dir = support.TESTFN + self.bdir = os.fsencode(self.dir) + + bytesfn = [] + def add_filename(fn): + try: + fn = os.fsencode(fn) + except UnicodeEncodeError: + return + bytesfn.append(fn) + add_filename(support.TESTFN_UNICODE) + if support.TESTFN_UNENCODABLE: + add_filename(support.TESTFN_UNENCODABLE) + if not bytesfn: + self.skipTest("couldn't create any non-ascii filename") + + self.unicodefn = set() os.mkdir(self.dir) - self.unicodefn = [] - for fn in self.filenames: - f = open(os.path.join(self.bdir, fn), "w") - f.close() - self.unicodefn.append(fn.decode("utf-8", "surrogateescape")) + try: + for fn in bytesfn: + f = open(os.path.join(self.bdir, fn), "w") + f.close() + fn = fsdecode(fn) + if fn in self.unicodefn: + raise ValueError("duplicate filename") + self.unicodefn.add(fn) + except: + shutil.rmtree(self.dir) + raise def tearDown(self): shutil.rmtree(self.dir) - sys.setfilesystemencoding(self.fsencoding) def test_listdir(self): - expected = set(self.unicodefn) - found = set(os.listdir(support.TESTFN)) + expected = self.unicodefn + found = set(os.listdir(self.dir)) self.assertEquals(found, expected) def test_open(self): |