fix: test_message_iterator.py hangs on Python 3.12
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 18 Oct 2023 19:32:00 +0000 (15:32 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 19 Oct 2023 15:02:02 +0000 (11:02 -0400)
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 <mjeanson@debian.org>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/10379
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
tests/bindings/python/bt2/test_message_iterator.py

index 81aa10e16c88fe178ef7b982286579aea27efd8e..e121c973c4325e46f2398c1a38eed5a9140aa1b8 100644 (file)
@@ -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
This page took 0.028071 seconds and 4 git commands to generate.