Skip to content

Commit ca26b2e

Browse files
author
gcarq
committed
Lib/test/test_exception_hierarchy.py from CPython 3.8.3
1 parent 28ee6cd commit ca26b2e

File tree

1 file changed

+222
-0
lines changed

1 file changed

+222
-0
lines changed

Lib/test/test_exception_hierarchy.py

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
import builtins
2+
import os
3+
import select
4+
import socket
5+
import unittest
6+
import errno
7+
from errno import EEXIST
8+
9+
10+
class SubOSError(OSError):
11+
pass
12+
13+
class SubOSErrorWithInit(OSError):
14+
def __init__(self, message, bar):
15+
self.bar = bar
16+
super().__init__(message)
17+
18+
class SubOSErrorWithNew(OSError):
19+
def __new__(cls, message, baz):
20+
self = super().__new__(cls, message)
21+
self.baz = baz
22+
return self
23+
24+
class SubOSErrorCombinedInitFirst(SubOSErrorWithInit, SubOSErrorWithNew):
25+
pass
26+
27+
class SubOSErrorCombinedNewFirst(SubOSErrorWithNew, SubOSErrorWithInit):
28+
pass
29+
30+
class SubOSErrorWithStandaloneInit(OSError):
31+
def __init__(self):
32+
pass
33+
34+
35+
class HierarchyTest(unittest.TestCase):
36+
37+
# TODO: RUSTPYTHON
38+
@unittest.expectedFailure
39+
def test_builtin_errors(self):
40+
self.assertEqual(OSError.__name__, 'OSError')
41+
self.assertIs(IOError, OSError)
42+
self.assertIs(EnvironmentError, OSError)
43+
44+
# TODO: RUSTPYTHON
45+
@unittest.expectedFailure
46+
def test_socket_errors(self):
47+
self.assertIs(socket.error, IOError)
48+
self.assertIs(socket.gaierror.__base__, OSError)
49+
self.assertIs(socket.herror.__base__, OSError)
50+
self.assertIs(socket.timeout.__base__, OSError)
51+
52+
@unittest.skip("TODO: RUSTPYTHON")
53+
def test_select_error(self):
54+
self.assertIs(select.error, OSError)
55+
56+
# mmap.error is tested in test_mmap
57+
58+
_pep_map = """
59+
+-- BlockingIOError EAGAIN, EALREADY, EWOULDBLOCK, EINPROGRESS
60+
+-- ChildProcessError ECHILD
61+
+-- ConnectionError
62+
+-- BrokenPipeError EPIPE, ESHUTDOWN
63+
+-- ConnectionAbortedError ECONNABORTED
64+
+-- ConnectionRefusedError ECONNREFUSED
65+
+-- ConnectionResetError ECONNRESET
66+
+-- FileExistsError EEXIST
67+
+-- FileNotFoundError ENOENT
68+
+-- InterruptedError EINTR
69+
+-- IsADirectoryError EISDIR
70+
+-- NotADirectoryError ENOTDIR
71+
+-- PermissionError EACCES, EPERM
72+
+-- ProcessLookupError ESRCH
73+
+-- TimeoutError ETIMEDOUT
74+
"""
75+
def _make_map(s):
76+
_map = {}
77+
for line in s.splitlines():
78+
line = line.strip('+- ')
79+
if not line:
80+
continue
81+
excname, _, errnames = line.partition(' ')
82+
for errname in filter(None, errnames.strip().split(', ')):
83+
_map[getattr(errno, errname)] = getattr(builtins, excname)
84+
return _map
85+
_map = _make_map(_pep_map)
86+
87+
# TODO: RUSTPYTHON
88+
@unittest.expectedFailure
89+
def test_errno_mapping(self):
90+
# The OSError constructor maps errnos to subclasses
91+
# A sample test for the basic functionality
92+
e = OSError(EEXIST, "Bad file descriptor")
93+
self.assertIs(type(e), FileExistsError)
94+
# Exhaustive testing
95+
for errcode, exc in self._map.items():
96+
e = OSError(errcode, "Some message")
97+
self.assertIs(type(e), exc)
98+
othercodes = set(errno.errorcode) - set(self._map)
99+
for errcode in othercodes:
100+
e = OSError(errcode, "Some message")
101+
self.assertIs(type(e), OSError)
102+
103+
def test_try_except(self):
104+
filename = "some_hopefully_non_existing_file"
105+
106+
# This checks that try .. except checks the concrete exception
107+
# (FileNotFoundError) and not the base type specified when
108+
# PyErr_SetFromErrnoWithFilenameObject was called.
109+
# (it is therefore deliberate that it doesn't use assertRaises)
110+
try:
111+
open(filename)
112+
except FileNotFoundError:
113+
pass
114+
else:
115+
self.fail("should have raised a FileNotFoundError")
116+
117+
# Another test for PyErr_SetExcFromWindowsErrWithFilenameObject()
118+
self.assertFalse(os.path.exists(filename))
119+
try:
120+
os.unlink(filename)
121+
except FileNotFoundError:
122+
pass
123+
else:
124+
self.fail("should have raised a FileNotFoundError")
125+
126+
127+
class AttributesTest(unittest.TestCase):
128+
129+
def test_windows_error(self):
130+
if os.name == "nt":
131+
self.assertIn('winerror', dir(OSError))
132+
else:
133+
self.assertNotIn('winerror', dir(OSError))
134+
135+
# TODO: RUSTPYTHON
136+
@unittest.expectedFailure
137+
def test_posix_error(self):
138+
e = OSError(EEXIST, "File already exists", "foo.txt")
139+
self.assertEqual(e.errno, EEXIST)
140+
self.assertEqual(e.args[0], EEXIST)
141+
self.assertEqual(e.strerror, "File already exists")
142+
self.assertEqual(e.filename, "foo.txt")
143+
if os.name == "nt":
144+
self.assertEqual(e.winerror, None)
145+
146+
@unittest.skipUnless(os.name == "nt", "Windows-specific test")
147+
def test_errno_translation(self):
148+
# ERROR_ALREADY_EXISTS (183) -> EEXIST
149+
e = OSError(0, "File already exists", "foo.txt", 183)
150+
self.assertEqual(e.winerror, 183)
151+
self.assertEqual(e.errno, EEXIST)
152+
self.assertEqual(e.args[0], EEXIST)
153+
self.assertEqual(e.strerror, "File already exists")
154+
self.assertEqual(e.filename, "foo.txt")
155+
156+
# TODO: RUSTPYTHON
157+
@unittest.expectedFailure
158+
def test_blockingioerror(self):
159+
args = ("a", "b", "c", "d", "e")
160+
for n in range(6):
161+
e = BlockingIOError(*args[:n])
162+
with self.assertRaises(AttributeError):
163+
e.characters_written
164+
with self.assertRaises(AttributeError):
165+
del e.characters_written
166+
e = BlockingIOError("a", "b", 3)
167+
self.assertEqual(e.characters_written, 3)
168+
e.characters_written = 5
169+
self.assertEqual(e.characters_written, 5)
170+
del e.characters_written
171+
with self.assertRaises(AttributeError):
172+
e.characters_written
173+
174+
175+
class ExplicitSubclassingTest(unittest.TestCase):
176+
177+
def test_errno_mapping(self):
178+
# When constructing an OSError subclass, errno mapping isn't done
179+
e = SubOSError(EEXIST, "Bad file descriptor")
180+
self.assertIs(type(e), SubOSError)
181+
182+
def test_init_overridden(self):
183+
e = SubOSErrorWithInit("some message", "baz")
184+
self.assertEqual(e.bar, "baz")
185+
self.assertEqual(e.args, ("some message",))
186+
187+
def test_init_kwdargs(self):
188+
e = SubOSErrorWithInit("some message", bar="baz")
189+
self.assertEqual(e.bar, "baz")
190+
self.assertEqual(e.args, ("some message",))
191+
192+
# TODO: RUSTPYTHON
193+
@unittest.expectedFailure
194+
def test_new_overridden(self):
195+
e = SubOSErrorWithNew("some message", "baz")
196+
self.assertEqual(e.baz, "baz")
197+
self.assertEqual(e.args, ("some message",))
198+
199+
def test_new_kwdargs(self):
200+
e = SubOSErrorWithNew("some message", baz="baz")
201+
self.assertEqual(e.baz, "baz")
202+
self.assertEqual(e.args, ("some message",))
203+
204+
def test_init_new_overridden(self):
205+
e = SubOSErrorCombinedInitFirst("some message", "baz")
206+
self.assertEqual(e.bar, "baz")
207+
self.assertEqual(e.baz, "baz")
208+
self.assertEqual(e.args, ("some message",))
209+
e = SubOSErrorCombinedNewFirst("some message", "baz")
210+
self.assertEqual(e.bar, "baz")
211+
self.assertEqual(e.baz, "baz")
212+
self.assertEqual(e.args, ("some message",))
213+
214+
def test_init_standalone(self):
215+
# __init__ doesn't propagate to OSError.__init__ (see issue #15229)
216+
e = SubOSErrorWithStandaloneInit()
217+
self.assertEqual(e.args, ())
218+
self.assertEqual(str(e), '')
219+
220+
221+
if __name__ == "__main__":
222+
unittest.main()

0 commit comments

Comments
 (0)