From a3788aca531e52aedc2682b6071db9fb77a6472f Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 18 Oct 2023 15:32:00 -0400 Subject: [PATCH] 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/+/10379 Reviewed-by: Philippe Proulx --- tests/bindings/python/bt2/test_message_iterator.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/bindings/python/bt2/test_message_iterator.py b/tests/bindings/python/bt2/test_message_iterator.py index 81aa10e1..e121c973 100644 --- a/tests/bindings/python/bt2/test_message_iterator.py +++ b/tests/bindings/python/bt2/test_message_iterator.py @@ -380,6 +380,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 -- 2.34.1