def test_highly_nested_objects_encoding(self): # See #12051 l, d = [], {} for x in range(100000): l, d = [l], {'k':d} with self.assertRaises(RecursionError): with support.infinite_recursion(): self.dumps(l) with self.assertRaises(RecursionError): with support.infinite_recursion(): self.dumps(d)
def test_highly_nested_objects_decoding(self): # test that loading highly-nested objects doesn't segfault when C # accelerations are used. See #12017 with self.assertRaises(RecursionError): with support.infinite_recursion(): self.loads('{"a":' * 100000 + '1' + '}' * 100000) with self.assertRaises(RecursionError): with support.infinite_recursion(): self.loads('{"a":' * 100000 + '[1]' + '}' * 100000) with self.assertRaises(RecursionError): with support.infinite_recursion(): self.loads('[' * 100000 + '1' + ']' * 100000)
def test_infinite_cycle_in_bases(self): """Regression test for bpo-30570.""" class X: @property def __bases__(self): return (self, self, self) with support.infinite_recursion(): self.assertRaises(RecursionError, issubclass, X(), int)
def test_infinite_recursion_via_bases_tuple(self): """Regression test for bpo-30570.""" class Failure(object): def __getattr__(self, attr): return (self, None) with support.infinite_recursion(): with self.assertRaises(RecursionError): issubclass(Failure(), int)
def test_infinite_recursion_in_bases(self): class X: @property def __bases__(self): return self.__bases__ with support.infinite_recursion(): self.assertRaises(RecursionError, issubclass, X(), int) self.assertRaises(RecursionError, issubclass, int, X()) self.assertRaises(RecursionError, isinstance, 1, X())
def test_endless_recursion(self): # See #12051 class EndlessJSONEncoder(self.json.JSONEncoder): def default(self, o): """If check_circular is False, this will keep adding another list.""" return [o] with self.assertRaises(RecursionError): with support.infinite_recursion(): EndlessJSONEncoder(check_circular=False).encode(5j)
def test_infinitely_many_bases(self): """Regression test for bpo-30570.""" class X: def __getattr__(self, attr): self.assertEqual(attr, "__bases__") class A: pass class B: pass A.__getattr__ = B.__getattr__ = X.__getattr__ return (A(), B()) with support.infinite_recursion(): self.assertRaises(RecursionError, issubclass, X(), int)
def test_isinstance_recursion_limit(self): # make sure that issubclass raises RecursionError before the C stack is # blown with support.infinite_recursion(): self.assertRaises(RecursionError, blowstack, isinstance, '', str)