diff options
author | Brett Cannon <brett@python.org> | 2016-06-24 12:03:43 -0700 |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2016-06-24 12:03:43 -0700 |
commit | c78ca1e044b7ca4c1764bb3670196e72351d4467 (patch) | |
tree | 3435d7babe85991192e645d12c9ec2b24b4de04f /Lib/test/test_os.py | |
parent | 19b2a53a82c8f4d179efdc39fb39f766191cac2b (diff) | |
download | cpython-git-c78ca1e044b7ca4c1764bb3670196e72351d4467.tar.gz |
Issue #27186: Update os.fspath()/PyOS_FSPath() to check the return
type of __fspath__().
As part of this change, also make sure that the pure Python
implementation of os.fspath() is tested.
Diffstat (limited to 'Lib/test/test_os.py')
-rw-r--r-- | Lib/test/test_os.py | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index d34f6c6432..869985edf2 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3112,55 +3112,59 @@ class TestScandir(unittest.TestCase): class TestPEP519(unittest.TestCase): - "os.fspath()" + + # Abstracted so it can be overridden to test pure Python implementation + # if a C version is provided. + fspath = staticmethod(os.fspath) + + class PathLike: + def __init__(self, path=''): + self.path = path + def __fspath__(self): + return self.path def test_return_bytes(self): for b in b'hello', b'goodbye', b'some/path/and/file': - self.assertEqual(b, os.fspath(b)) + self.assertEqual(b, self.fspath(b)) def test_return_string(self): for s in 'hello', 'goodbye', 'some/path/and/file': - self.assertEqual(s, os.fspath(s)) - - def test_fsencode_fsdecode_return_pathlike(self): - class PathLike: - def __init__(self, path): - self.path = path - def __fspath__(self): - return self.path + self.assertEqual(s, self.fspath(s)) + def test_fsencode_fsdecode(self): for p in "path/like/object", b"path/like/object": - pathlike = PathLike(p) + pathlike = self.PathLike(p) - self.assertEqual(p, os.fspath(pathlike)) + self.assertEqual(p, self.fspath(pathlike)) self.assertEqual(b"path/like/object", os.fsencode(pathlike)) self.assertEqual("path/like/object", os.fsdecode(pathlike)) - def test_fspathlike(self): - class PathLike: - def __init__(self, path=''): - self.path = path - def __fspath__(self): - return self.path + def test_pathlike(self): + self.assertEqual('#feelthegil', self.fspath(self.PathLike('#feelthegil'))) + self.assertTrue(issubclass(self.PathLike, os.PathLike)) + self.assertTrue(isinstance(self.PathLike(), os.PathLike)) - self.assertEqual('#feelthegil', os.fspath(PathLike('#feelthegil'))) - self.assertTrue(issubclass(PathLike, os.PathLike)) - self.assertTrue(isinstance(PathLike(), os.PathLike)) - - message = 'expected str, bytes or os.PathLike object, not' - for fn in (os.fsencode, os.fsdecode): - for obj in PathLike(None), None: - with self.assertRaisesRegex(TypeError, message): - fn(obj) + with self.assertRaises(TypeError): + self.fspath(self.PathLike(42)) def test_garbage_in_exception_out(self): vapor = type('blah', (), {}) for o in int, type, os, vapor(): - self.assertRaises(TypeError, os.fspath, o) + self.assertRaises(TypeError, self.fspath, o) def test_argument_required(self): with self.assertRaises(TypeError): - os.fspath() + self.fspath() + + +# Only test if the C version is provided, otherwise TestPEP519 already tested +# the pure Python implementation. +if hasattr(os, "_fspath"): + class TestPEP519PurePython(TestPEP519): + + """Explicitly test the pure Python implementation of os.fspath().""" + + fspath = staticmethod(os._fspath) if __name__ == "__main__": |