summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-08-18 10:56:19 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-08-18 10:56:19 (GMT)
commitd91df1a7a961e15b0602cd19155ea9cdf08a9e07 (patch)
tree5f7d69bc9c2d5568f92cae3fa84ab78677c5478e /Lib/test
parent6c00c1464f03deaafbbd5fdd212514cbf36b9bd4 (diff)
downloadcpython-d91df1a7a961e15b0602cd19155ea9cdf08a9e07.zip
cpython-d91df1a7a961e15b0602cd19155ea9cdf08a9e07.tar.gz
cpython-d91df1a7a961e15b0602cd19155ea9cdf08a9e07.tar.bz2
Improve PEP 383 tests (in test_os)
* Use the current filesystem encoding instead of always using utf-8 * Enable the test on Mac OS X * Use TESTFN_UNENCODABLE and TESTFN_UNICODE instead of arbitrary filenames * To decode a filename, use strict error handler instead surrogateescape for mbcs encoding (on Windows) * Use TESTFN_UNENCODABLE (if available) for the directory name Skip the test if no non-ascii filename can be created.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/support.py6
-rw-r--r--Lib/test/test_os.py56
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):