summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_support.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-09-06 15:34:31 (GMT)
committerGitHub <noreply@github.com>2023-09-06 15:34:31 (GMT)
commit8ff11425783806f8cb78e99f667546b1f7f3428e (patch)
tree0c4d2006d833d74a59a809fd2447fc6a91ceabd7 /Lib/test/test_support.py
parent2cd170db40ffba357848672ff3d2f8c1e0e74f2c (diff)
downloadcpython-8ff11425783806f8cb78e99f667546b1f7f3428e.zip
cpython-8ff11425783806f8cb78e99f667546b1f7f3428e.tar.gz
cpython-8ff11425783806f8cb78e99f667546b1f7f3428e.tar.bz2
gh-108851: Fix tomllib recursion tests (#108853)
* Add get_recursion_available() and get_recursion_depth() functions to the test.support module. * Change infinite_recursion() default max_depth from 75 to 100. * Fix test_tomllib recursion tests for WASI buildbots: reduce the recursion limit and compute the maximum nested array/dict depending on the current available recursion limit. * test.pythoninfo logs sys.getrecursionlimit(). * Enhance test_sys tests on sys.getrecursionlimit() and sys.setrecursionlimit().
Diffstat (limited to 'Lib/test/test_support.py')
-rw-r--r--Lib/test/test_support.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index 86d26b7..6428073 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -685,6 +685,83 @@ class TestSupport(unittest.TestCase):
else:
self.assertTrue(support.has_strftime_extensions)
+ def test_get_recursion_depth(self):
+ # test support.get_recursion_depth()
+ code = textwrap.dedent("""
+ from test import support
+ import sys
+
+ def check(cond):
+ if not cond:
+ raise AssertionError("test failed")
+
+ # depth 1
+ check(support.get_recursion_depth() == 1)
+
+ # depth 2
+ def test_func():
+ check(support.get_recursion_depth() == 2)
+ test_func()
+
+ def test_recursive(depth, limit):
+ if depth >= limit:
+ # cannot call get_recursion_depth() at this depth,
+ # it can raise RecursionError
+ return
+ get_depth = support.get_recursion_depth()
+ print(f"test_recursive: {depth}/{limit}: "
+ f"get_recursion_depth() says {get_depth}")
+ check(get_depth == depth)
+ test_recursive(depth + 1, limit)
+
+ # depth up to 25
+ with support.infinite_recursion(max_depth=25):
+ limit = sys.getrecursionlimit()
+ print(f"test with sys.getrecursionlimit()={limit}")
+ test_recursive(2, limit)
+
+ # depth up to 500
+ with support.infinite_recursion(max_depth=500):
+ limit = sys.getrecursionlimit()
+ print(f"test with sys.getrecursionlimit()={limit}")
+ test_recursive(2, limit)
+ """)
+ script_helper.assert_python_ok("-c", code)
+
+ def test_recursion(self):
+ # Test infinite_recursion() and get_recursion_available() functions.
+ def recursive_function(depth):
+ if depth:
+ recursive_function(depth - 1)
+
+ for max_depth in (5, 25, 250):
+ with support.infinite_recursion(max_depth):
+ available = support.get_recursion_available()
+
+ # Recursion up to 'available' additional frames should be OK.
+ recursive_function(available)
+
+ # Recursion up to 'available+1' additional frames must raise
+ # RecursionError. Avoid self.assertRaises(RecursionError) which
+ # can consume more than 3 frames and so raises RecursionError.
+ try:
+ recursive_function(available + 1)
+ except RecursionError:
+ pass
+ else:
+ self.fail("RecursionError was not raised")
+
+ # Test the bare minimumum: max_depth=3
+ with support.infinite_recursion(3):
+ try:
+ recursive_function(3)
+ except RecursionError:
+ pass
+ else:
+ self.fail("RecursionError was not raised")
+
+ #self.assertEqual(available, 2)
+
# XXX -follows a list of untested API
# make_legacy_pyc
# is_resource_enabled