From: Michael Jeanson Date: Fri, 16 Jun 2023 16:12:52 +0000 (-0400) Subject: fix: test_message_iterator.py hangs on Python 3.12 X-Git-Tag: v2.0.6~11 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=da110483eccb522d3db135a903bb1366cd039207 fix: test_message_iterator.py hangs on Python 3.12 Starting with Python 3.12 'None' is immortal, its refcount operations are NO-OP and sys.getrefcount() will return a static value of UINT_MAX on 64-bit and UINT_MAX >> 2 on 32-bit. This basically transform 'test_try_again_many_times' in an almost infinite loop and hangs the testsuite. Detect this by checking if the refcount on 'None' is incremented after assigning to a variable and skip the test if it's not the case. See PEP-0683[1] for the gory details. [1] https://peps.python.org/pep-0683/ Change-Id: Id07658245d524288ce7606cb0a011ad97068dad1 Signed-off-by: Michael Jeanson Reviewed-on: https://review.lttng.org/c/babeltrace/+/10381 Tested-by: jenkins CI-Build: Michael Jeanson Reviewed-by: Philippe Proulx --- diff --git a/tests/bindings/python/bt2/test_message_iterator.py b/tests/bindings/python/bt2/test_message_iterator.py index 3cbe26f2..651a66b5 100644 --- a/tests/bindings/python/bt2/test_message_iterator.py +++ b/tests/bindings/python/bt2/test_message_iterator.py @@ -331,6 +331,14 @@ class UserMessageIteratorTestCase(unittest.TestCase): # This verifies that we are not missing an incref of Py_None, making the # refcount of Py_None reach 0. def test_try_again_many_times(self): + # Starting with Python 3.12, `None` is immortal: its reference + # count operations are no-op. Skip this test in that case. + before = sys.getrefcount(None) + dummy = None # noqa: F841 + + if before == sys.getrefcount(None): + raise unittest.SkipTest("`None` is immortal") + class MyIter(bt2._UserMessageIterator): def __next__(self): raise bt2.TryAgain