"requires_gil_enabled", "requires_linux_version", "requires_mac_ver",
"check_syntax_error",
"requires_gzip", "requires_bz2", "requires_lzma",
- "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute",
+ "bigmemtest", "nomemtest", "bigaddrspacetest", "cpython_only", "get_attribute",
"requires_IEEE_754", "requires_zlib",
"has_fork_support", "requires_fork",
"has_subprocess_support", "requires_subprocess",
return wrapper
return decorator
+def nomemtest(f):
+ """Check that we can use this test with `_testcapi.set_nomemory`."""
+ from .import_helper import import_module
+
+ @functools.wraps(f)
+ def internal(*args, **kwargs):
+ import_module('_testcapi')
+ return f(*args, **kwargs)
+
+ return unittest.skipIf(
+ # Python built with Py_TRACE_REFS fail with a fatal error in
+ # _PyRefchain_Trace() on memory allocation error.
+ Py_TRACE_REFS,
+ 'cannot test Py_TRACE_REFS build',
+ )(cpython_only(internal))
+
def bigaddrspacetest(f):
"""Decorator for tests that fill the address space."""
def wrapper(self):
def test_pyobject_freed_is_freed(self):
self.check_pyobject_is_freed('check_pyobject_freed_is_freed')
- # Python built with Py_TRACE_REFS fail with a fatal error in
- # _PyRefchain_Trace() on memory allocation error.
- @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build')
+ @support.nomemtest
def test_set_nomemory(self):
code = """if 1:
import _testcapi
"Test the functionality of Python classes implementing operators."
import unittest
+from test import support
from test.support import cpython_only, import_helper, script_helper
testmeths = [
def testHasAttrString(self):
import sys
- from test.support import import_helper
_testlimitedcapi = import_helper.import_module('_testlimitedcapi')
class A:
C.a = X()
C.a = X()
- @cpython_only
+ @support.nomemtest
def test_detach_materialized_dict_no_memory(self):
- # Skip test if _testcapi is not available:
- import_helper.import_module('_testcapi')
-
code = """if 1:
import test.support
import _testcapi
sys.setrecursionlimit(recursionlimit)
- @cpython_only
- # Python built with Py_TRACE_REFS fail with a fatal error in
- # _PyRefchain_Trace() on memory allocation error.
- @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build')
- @unittest.skipIf(_testcapi is None, "requires _testcapi")
+ @support.nomemtest
def test_recursion_normalizing_with_no_memory(self):
# Issue #30697. Test that in the abort that occurs when there is no
# memory left and the size of the Python frames stack is greater than
self.assertIn("test message", report)
self.assertTrue(report.endswith("\n"))
- @cpython_only
- # Python built with Py_TRACE_REFS fail with a fatal error in
- # _PyRefchain_Trace() on memory allocation error.
- @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build')
- @unittest.skipIf(_testcapi is None, "requires _testcapi")
+ @support.nomemtest
def test_memory_error_in_PyErr_PrintEx(self):
code = """if 1:
import _testcapi
rc, _, err = script_helper.assert_python_ok("-c", code)
self.assertIn(b'MemoryError', err)
- @cpython_only
- # Python built with Py_TRACE_REFS fail with a fatal error in
- # _PyRefchain_Trace() on memory allocation error.
- @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build')
+ @support.nomemtest
def test_exec_set_nomemory_hang(self):
- import_module("_testcapi")
# gh-134163: A MemoryError inside code that was wrapped by a try/except
# block would lead to an infinite loop.
from test.support import import_helper
from test.support import threading_helper
# Raise SkipTest if subinterpreters not supported.
-import_helper.import_module('_interpreters')
+_interpreters = import_helper.import_module('_interpreters')
from test.support import interpreters
from test.support.interpreters import InterpreterError
from .utils import TestBase
start.set()
support.gc_collect()
+ @support.nomemtest
def test_create_interpreter_no_memory(self):
- import _interpreters
- _testcapi = import_helper.import_module("_testcapi")
+ import _testcapi
with self.assertRaises(InterpreterError):
_testcapi.set_nomemory(0, 1)
SHORT_TIMEOUT,
)
from test.support.script_helper import kill_python
-from test.support.import_helper import import_module
try:
import pty
@support.force_not_colorized_test_class
class TestInteractiveInterpreter(unittest.TestCase):
- @cpython_only
- # Python built with Py_TRACE_REFS fail with a fatal error in
- # _PyRefchain_Trace() on memory allocation error.
- @unittest.skipIf(support.Py_TRACE_REFS, 'cannot test Py_TRACE_REFS build')
+ @support.nomemtest
def test_no_memory(self):
- import_module("_testcapi")
# Issue #30696: Fix the interactive interpreter looping endlessly when
# no memory. Check also that the fix does not break the interactive
# loop when an exception is raised.
del x
support.gc_collect()
- @support.cpython_only
+ @support.nomemtest
def test_no_memory_when_clearing(self):
# gh-118331: Make sure we do not raise an exception from the destructor
# when clearing weakrefs if allocating the intermediate tuple fails.