##// END OF EJS Templates
Add test for infinite looping on attribute access
Thomas Kluyver -
Show More
@@ -186,6 +186,23 b' class NoBoolCall:'
186 raise NotImplementedError('Must be implemented')
186 raise NotImplementedError('Must be implemented')
187
187
188
188
189 class SerialLiar(object):
190 """Attribute accesses always get another copy of the same class.
191
192 unittest.mock.call does something similar, but it's not ideal for testing
193 as the failure mode is to eat all your RAM. This gives up after 10k levels.
194 """
195 def __init__(self, max_fibbing_twig, lies_told=0):
196 if lies_told > 10000:
197 raise RuntimeError('Nose too long, honesty is the best policy')
198 self.max_fibbing_twig = max_fibbing_twig
199 self.lies_told = lies_told
200 max_fibbing_twig[0] = max(max_fibbing_twig[0], lies_told)
201
202 def __getattr__(self, item):
203 return SerialLiar(self.max_fibbing_twig, self.lies_told + 1)
204
205
189 def check_calltip(obj, name, call, docstring):
206 def check_calltip(obj, name, call, docstring):
190 """Generic check pattern all calltip tests will use"""
207 """Generic check pattern all calltip tests will use"""
191 info = inspector.info(obj, name)
208 info = inspector.info(obj, name)
@@ -297,6 +314,14 b' def test_info_awkward():'
297 def test_bool_raise():
314 def test_bool_raise():
298 inspector.info(NoBoolCall())
315 inspector.info(NoBoolCall())
299
316
317 def test_info_serialliar():
318 fib_tracker = [0]
319 i = inspector.info(SerialLiar(fib_tracker))
320
321 # Nested attribute access should be cut off at 100 levels deep to avoid
322 # infinite loops: https://github.com/ipython/ipython/issues/9122
323 nt.assert_less(fib_tracker[0], 9000)
324
300 def test_calldef_none():
325 def test_calldef_none():
301 # We should ignore __call__ for all of these.
326 # We should ignore __call__ for all of these.
302 for obj in [f, SimpleClass().method, any, str.upper]:
327 for obj in [f, SimpleClass().method, any, str.upper]:
General Comments 0
You need to be logged in to leave comments. Login now