diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2021-08-29 11:04:40 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-29 11:04:40 (GMT) |
commit | 2a8127cafe1d196f858a3ecabf5f1df3eebf9a12 (patch) | |
tree | ddf073f1752e1dd20aba534964da961aeecf8c95 /Lib/test | |
parent | 07d3d54f4e84b1259b800884b202701f69e408d8 (diff) | |
download | cpython-2a8127cafe1d196f858a3ecabf5f1df3eebf9a12.zip cpython-2a8127cafe1d196f858a3ecabf5f1df3eebf9a12.tar.gz cpython-2a8127cafe1d196f858a3ecabf5f1df3eebf9a12.tar.bz2 |
bpo-25130: Add calls of gc.collect() in tests to support PyPy (GH-28005)
Diffstat (limited to 'Lib/test')
29 files changed, 121 insertions, 11 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 4c4da24..7e0b757 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -611,6 +611,7 @@ class _TestProcess(BaseTestCase): del c p.start() p.join() + gc.collect() # For PyPy or other GCs. self.assertIs(wr(), None) self.assertEqual(q.get(), 5) close_queue(q) @@ -2667,6 +2668,7 @@ class _TestPool(BaseTestCase): self.pool.map(identity, objs) del objs + gc.collect() # For PyPy or other GCs. time.sleep(DELTA) # let threaded cleanup code run self.assertEqual(set(wr() for wr in refs), {None}) # With a process pool, copies of the objects are returned, check @@ -4198,6 +4200,7 @@ class _TestFinalize(BaseTestCase): util._finalizer_registry.clear() def tearDown(self): + gc.collect() # For PyPy or other GCs. self.assertFalse(util._finalizer_registry) util._finalizer_registry.update(self.registry_backup) @@ -4209,12 +4212,14 @@ class _TestFinalize(BaseTestCase): a = Foo() util.Finalize(a, conn.send, args=('a',)) del a # triggers callback for a + gc.collect() # For PyPy or other GCs. b = Foo() close_b = util.Finalize(b, conn.send, args=('b',)) close_b() # triggers callback for b close_b() # does nothing because callback has already been called del b # does nothing because callback has already been called + gc.collect() # For PyPy or other GCs. c = Foo() util.Finalize(c, conn.send, args=('c',)) diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index d69bcc9..dffb7d4 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -3,6 +3,7 @@ Various tests for synchronization primitives. """ import os +import gc import sys import time from _thread import start_new_thread, TIMEOUT_MAX @@ -221,6 +222,7 @@ class BaseLockTests(BaseTestCase): lock = self.locktype() ref = weakref.ref(lock) del lock + gc.collect() # For PyPy or other GCs. self.assertIsNone(ref()) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 18f78d5..6a48c1c 100644..100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1097,6 +1097,7 @@ class BaseTest: p = weakref.proxy(s) self.assertEqual(p.tobytes(), s.tobytes()) s = None + support.gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, len, p) @unittest.skipUnless(hasattr(sys, 'getrefcount'), diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 77c15c0..a557cb5 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -3,6 +3,7 @@ import types import unittest from test.support.import_helper import import_module +from test.support import gc_collect asyncio = import_module("asyncio") @@ -871,6 +872,7 @@ class AsyncGenAsyncioTest(unittest.TestCase): await g.__anext__() await g.__anext__() del g + gc_collect() # For PyPy or other GCs. await asyncio.sleep(0.1) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index de00373..92b1a43 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -2307,6 +2307,7 @@ class BaseTaskTests: self.new_task(self.loop, gen) finally: gen.close() + gc.collect() # For PyPy or other GCs. self.assertTrue(m_log.error.called) message = m_log.error.call_args[0][0] diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 66c84a9..64fd10d 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -137,7 +137,8 @@ try: except ImportError: ctypes = None from test.support import (run_doctest, run_unittest, cpython_only, - check_impl_detail, requires_debug_ranges) + check_impl_detail, requires_debug_ranges, + gc_collect) from test.support.script_helper import assert_python_ok @@ -510,6 +511,7 @@ class CodeWeakRefTest(unittest.TestCase): coderef = weakref.ref(f.__code__, callback) self.assertTrue(bool(coderef())) del f + gc_collect() # For PyPy or other GCs. self.assertFalse(bool(coderef())) self.assertTrue(self.called) diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 99651f5..eae98d6 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -463,6 +463,7 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase executor.map(abs, range(-5, 5)) threads = executor._threads del executor + support.gc_collect() # For PyPy or other GCs. for t in threads: self.assertRegex(t.name, r'^SpecialPool_[0-4]$') @@ -473,6 +474,7 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase executor.map(abs, range(-5, 5)) threads = executor._threads del executor + support.gc_collect() # For PyPy or other GCs. for t in threads: # Ensure that our default name is reasonably sane and unique when @@ -535,6 +537,7 @@ class ProcessPoolShutdownTest(ExecutorShutdownTest): call_queue = executor._call_queue executor_manager_thread = executor._executor_manager_thread del executor + support.gc_collect() # For PyPy or other GCs. # Make sure that all the executor resources were properly cleaned by # the shutdown process @@ -759,6 +762,7 @@ class AsCompletedTests: futures_list.remove(future) wr = weakref.ref(future) del future + support.gc_collect() # For PyPy or other GCs. self.assertIsNone(wr()) futures_list[0].set_result("test") @@ -766,6 +770,7 @@ class AsCompletedTests: futures_list.remove(future) wr = weakref.ref(future) del future + support.gc_collect() # For PyPy or other GCs. self.assertIsNone(wr()) if futures_list: futures_list[0].set_result("test") @@ -865,6 +870,7 @@ class ExecutorTest: for obj in self.executor.map(make_dummy_object, range(10)): wr = weakref.ref(obj) del obj + support.gc_collect() # For PyPy or other GCs. self.assertIsNone(wr()) diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index ba3d233..f1ca8cb 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -7,6 +7,7 @@ import abc from operator import le, lt, ge, gt, eq, ne import unittest +from test import support order_comparisons = le, lt, ge, gt equality_comparisons = eq, ne @@ -805,6 +806,7 @@ class TestCopy(unittest.TestCase): self.assertEqual(v[c], d) self.assertEqual(len(v), 2) del c, d + support.gc_collect() # For PyPy or other GCs. self.assertEqual(len(v), 1) x, y = C(), C() # The underlying containers are decoupled @@ -834,6 +836,7 @@ class TestCopy(unittest.TestCase): self.assertEqual(v[a].i, b.i) self.assertEqual(v[c].i, d.i) del c + support.gc_collect() # For PyPy or other GCs. self.assertEqual(len(v), 1) def test_deepcopy_weakvaluedict(self): @@ -857,6 +860,7 @@ class TestCopy(unittest.TestCase): self.assertIs(t, d) del x, y, z, t del d + support.gc_collect() # For PyPy or other GCs. self.assertEqual(len(v), 1) def test_deepcopy_bound_method(self): diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index ffe0e20..20cfc88 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -870,6 +870,7 @@ class TestSubclass(unittest.TestCase): p = weakref.proxy(d) self.assertEqual(str(p), str(d)) d = None + support.gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, str, p) def test_strange_subclass(self): diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 52d7756..7d22087 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2044,6 +2044,7 @@ class TestEnum(unittest.TestCase): raise Exception('Exception not raised.') def test_missing_exceptions_reset(self): + import gc import weakref # class TestEnum(enum.Enum): @@ -2070,8 +2071,9 @@ class TestEnum(unittest.TestCase): class_2_ref = weakref.ref(Class2()) # # The exception raised by Enum creates a reference loop and thus - # Class2 instances will stick around until the next gargage collection + # Class2 instances will stick around until the next garbage collection # cycle, unlike Class1. + gc.collect() # For PyPy or other GCs. self.assertIs(class_1_ref(), None) self.assertIs(class_2_ref(), None) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index ce7b868..6141f2e 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -656,6 +656,7 @@ class ExceptionTests(unittest.TestCase): except MyException as e: pass obj = None + gc_collect() # For PyPy or other GCs. obj = wr() self.assertIsNone(obj) @@ -667,6 +668,7 @@ class ExceptionTests(unittest.TestCase): except MyException: pass obj = None + gc_collect() # For PyPy or other GCs. obj = wr() self.assertIsNone(obj) @@ -678,6 +680,7 @@ class ExceptionTests(unittest.TestCase): except: pass obj = None + gc_collect() # For PyPy or other GCs. obj = wr() self.assertIsNone(obj) @@ -690,6 +693,7 @@ class ExceptionTests(unittest.TestCase): except: break obj = None + gc_collect() # For PyPy or other GCs. obj = wr() self.assertIsNone(obj) @@ -708,6 +712,7 @@ class ExceptionTests(unittest.TestCase): # must clear the latter manually for our test to succeed. e.__context__ = None obj = None + gc_collect() # For PyPy or other GCs. obj = wr() # guarantee no ref cycles on CPython (don't gc_collect) if check_impl_detail(cpython=False): @@ -898,6 +903,7 @@ class ExceptionTests(unittest.TestCase): next(g) testfunc(g) g = obj = None + gc_collect() # For PyPy or other GCs. obj = wr() self.assertIsNone(obj) @@ -951,6 +957,7 @@ class ExceptionTests(unittest.TestCase): raise Exception(MyObject()) except: pass + gc_collect() # For PyPy or other GCs. self.assertEqual(e, (None, None, None)) def test_raise_does_not_create_context_chain_cycle(self): @@ -1413,6 +1420,7 @@ class ExceptionTests(unittest.TestCase): self.assertNotEqual(wr(), None) else: self.fail("MemoryError not raised") + gc_collect() # For PyPy or other GCs. self.assertEqual(wr(), None) @no_tracing @@ -1433,6 +1441,7 @@ class ExceptionTests(unittest.TestCase): self.assertNotEqual(wr(), None) else: self.fail("RecursionError not raised") + gc_collect() # For PyPy or other GCs. self.assertEqual(wr(), None) def test_errno_ENOTDIR(self): @@ -1453,6 +1462,7 @@ class ExceptionTests(unittest.TestCase): with support.catch_unraisable_exception() as cm: del obj + gc_collect() # For PyPy or other GCs. self.assertEqual(cm.unraisable.object, BrokenDel.__del__) self.assertIsNotNone(cm.unraisable.exc_traceback) diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py index 1ec756f..1146a373 100644 --- a/Lib/test/test_file.py +++ b/Lib/test/test_file.py @@ -7,6 +7,7 @@ from weakref import proxy import io import _pyio as pyio +from test.support import gc_collect from test.support.os_helper import TESTFN from test.support import os_helper from test.support import warnings_helper @@ -30,6 +31,7 @@ class AutoFileTests: self.assertEqual(self.f.tell(), p.tell()) self.f.close() self.f = None + gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, getattr, p, 'tell') def testAttributes(self): diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index ff611a9..cdca5a8 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -9,7 +9,7 @@ from array import array from weakref import proxy from functools import wraps -from test.support import (run_unittest, cpython_only, swap_attr) +from test.support import run_unittest, cpython_only, swap_attr, gc_collect from test.support.os_helper import (TESTFN, TESTFN_UNICODE, make_bad_fd) from test.support.warnings_helper import check_warnings from collections import UserList @@ -36,6 +36,7 @@ class AutoFileTests: self.assertEqual(self.f.tell(), p.tell()) self.f.close() self.f = None + gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, getattr, p, 'tell') def testSeekTell(self): diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index fbf5578..fece825 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -167,6 +167,7 @@ class TestPartial: p = proxy(f) self.assertEqual(f.func, p.func) f = None + support.gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, getattr, p, 'func') def test_with_bound_and_unbound_methods(self): diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 53d579e..d14c757 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -1966,6 +1966,8 @@ True """ coroutine_tests = """\ +>>> from test.support import gc_collect + Sending a value into a started generator: >>> def f(): @@ -2189,7 +2191,7 @@ And finalization: >>> g = f() >>> next(g) ->>> del g +>>> del g; gc_collect() # For PyPy or other GCs. exiting @@ -2204,7 +2206,7 @@ GeneratorExit is not caught by except Exception: >>> g = f() >>> next(g) ->>> del g +>>> del g; gc_collect() # For PyPy or other GCs. finally diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 32c29ea..273545a 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -4372,6 +4372,31 @@ class SignalsTest(unittest.TestCase): """Check that a partial write, when it gets interrupted, properly invokes the signal handler, and bubbles up the exception raised in the latter.""" + + # XXX This test has three flaws that appear when objects are + # XXX not reference counted. + + # - if wio.write() happens to trigger a garbage collection, + # the signal exception may be raised when some __del__ + # method is running; it will not reach the assertRaises() + # call. + + # - more subtle, if the wio object is not destroyed at once + # and survives this function, the next opened file is likely + # to have the same fileno (since the file descriptor was + # actively closed). When wio.__del__ is finally called, it + # will close the other's test file... To trigger this with + # CPython, try adding "global wio" in this function. + + # - This happens only for streams created by the _pyio module, + # because a wio.close() that fails still consider that the + # file needs to be closed again. You can try adding an + # "assert wio.closed" at the end of the function. + + # Fortunately, a little gc.collect() seems to be enough to + # work around all these issues. + support.gc_collect() # For PyPy or other GCs. + read_results = [] def _read(): s = os.read(r, 1) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index a99b5e2..4019af0 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -1442,6 +1442,7 @@ class TestBasicOps(unittest.TestCase): p = weakref.proxy(a) self.assertEqual(getattr(p, '__class__'), type(b)) del a + support.gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, getattr, p, '__class__') ans = list('abc') diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py index 508b739..9bb5181 100644 --- a/Lib/test/test_queue.py +++ b/Lib/test/test_queue.py @@ -6,6 +6,7 @@ import threading import time import unittest import weakref +from test.support import gc_collect from test.support import import_helper from test.support import threading_helper @@ -590,6 +591,7 @@ class BaseSimpleQueueTest: q.put(C()) for i in range(N): wr = weakref.ref(q.get()) + gc_collect() # For PyPy or other GCs. self.assertIsNone(wr()) diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py index 57da0e1..8dc62a9 100644 --- a/Lib/test/test_raise.py +++ b/Lib/test/test_raise.py @@ -438,6 +438,7 @@ class TestContext(unittest.TestCase): f() def test_3611(self): + import gc # A re-raised exception in a __del__ caused the __context__ # to be cleared class C: @@ -451,9 +452,11 @@ class TestContext(unittest.TestCase): x = C() try: try: - x.x + f.x except AttributeError: + # make x.__del__ trigger del x + gc.collect() # For PyPy or other GCs. raise TypeError except Exception as e: self.assertNotEqual(e.__context__, None) diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 29d60ff..6e46dfa 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -2,6 +2,7 @@ import unittest import weakref from test.support import check_syntax_error, cpython_only +from test.support import gc_collect class ScopeTests(unittest.TestCase): @@ -473,6 +474,7 @@ class ScopeTests(unittest.TestCase): for i in range(100): f1() + gc_collect() # For PyPy or other GCs. self.assertEqual(Foo.count, 0) def testClassAndGlobal(self): @@ -805,6 +807,7 @@ class ScopeTests(unittest.TestCase): tester.dig() ref = weakref.ref(tester) del tester + gc_collect() # For PyPy or other GCs. self.assertIsNone(ref()) diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index b1fab0f..29bb39d 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -593,6 +593,7 @@ class TestSet(TestJointOps, unittest.TestCase): p = weakref.proxy(s) self.assertEqual(str(p), str(s)) s = None + support.gc_collect() # For PyPy or other GCs. self.assertRaises(ReferenceError, str, p) def test_rich_compare(self): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index c09f11e..7ac9260 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -870,6 +870,7 @@ class GeneralModuleTests(unittest.TestCase): p = proxy(s) self.assertEqual(p.fileno(), s.fileno()) s = None + support.gc_collect() # For PyPy or other GCs. try: p.fileno() except ReferenceError: diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 94a95c7..87967ca 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -3026,6 +3026,7 @@ class POSIXProcessTestCase(BaseTestCase): pid = p.pid with warnings_helper.check_warnings(('', ResourceWarning)): p = None + support.gc_collect() # For PyPy or other GCs. os.kill(pid, signal.SIGKILL) if mswindows: diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 3a3f6a9..f1d4837 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -430,6 +430,7 @@ class TestMkstempInner(TestBadTempdir, BaseTestCase): self.do_create(dir=dir).write(b"blat") self.do_create(dir=pathlib.Path(dir)).write(b"blat") finally: + support.gc_collect() # For PyPy or other GCs. os.rmdir(dir) def test_file_mode(self): @@ -880,6 +881,8 @@ class TestMktemp(BaseTestCase): extant = list(range(TEST_FILES)) for i in extant: extant[i] = self.do_create(pre="aa") + del extant + support.gc_collect() # For PyPy or other GCs. ## def test_warning(self): ## # mktemp issues a warning when used diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index 62b57fa..4ae8a83 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -132,6 +132,7 @@ class ThreadRunningTests(BasicThreadTest): del task while not done: time.sleep(POLL_SLEEP) + support.gc_collect() # For PyPy or other GCs. self.assertEqual(thread._count(), orig) def test_unraisable_exception(self): diff --git a/Lib/test/test_threading_local.py b/Lib/test/test_threading_local.py index 9862094..13facb5 100644 --- a/Lib/test/test_threading_local.py +++ b/Lib/test/test_threading_local.py @@ -37,7 +37,7 @@ class BaseLocalTest: t.join() del t - gc.collect() + support.gc_collect() # For PyPy or other GCs. self.assertEqual(len(weaklist), n) # XXX _threading_local keeps the local of the last stopped thread alive. @@ -46,7 +46,7 @@ class BaseLocalTest: # Assignment to the same thread local frees it sometimes (!) local.someothervar = None - gc.collect() + support.gc_collect() # For PyPy or other GCs. deadlist = [weak for weak in weaklist if weak() is None] self.assertIn(len(deadlist), (n-1, n), (n, len(deadlist))) @@ -89,7 +89,7 @@ class BaseLocalTest: # 2) GC the cycle (triggers threadmodule.c::local_clear # before local_dealloc) del cycle - gc.collect() + support.gc_collect() # For PyPy or other GCs. e1.set() e2.wait() @@ -190,7 +190,7 @@ class BaseLocalTest: x.local.x = x wr = weakref.ref(x) del x - gc.collect() + support.gc_collect() # For PyPy or other GCs. self.assertIsNone(wr()) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 1a5314c..5a3e59c 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -12,6 +12,7 @@ import random from test import support from test.support import script_helper, ALWAYS_EQ +from test.support import gc_collect # Used in ReferencesTestCase.test_ref_created_during_del() . ref_from_del = None @@ -135,6 +136,7 @@ class ReferencesTestCase(TestBase): ref1 = weakref.ref(o, self.callback) ref2 = weakref.ref(o, self.callback) del o + gc_collect() # For PyPy or other GCs. self.assertIsNone(ref1(), "expected reference to be invalidated") self.assertIsNone(ref2(), "expected reference to be invalidated") self.assertEqual(self.cbcalled, 2, @@ -168,13 +170,16 @@ class ReferencesTestCase(TestBase): ref1 = weakref.proxy(o, self.callback) ref2 = weakref.proxy(o, self.callback) del o + gc_collect() # For PyPy or other GCs. def check(proxy): proxy.bar self.assertRaises(ReferenceError, check, ref1) self.assertRaises(ReferenceError, check, ref2) - self.assertRaises(ReferenceError, bool, weakref.proxy(C())) + ref3 = weakref.proxy(C()) + gc_collect() # For PyPy or other GCs. + self.assertRaises(ReferenceError, bool, ref3) self.assertEqual(self.cbcalled, 2) def check_basic_ref(self, factory): @@ -191,6 +196,7 @@ class ReferencesTestCase(TestBase): o = factory() ref = weakref.ref(o, self.callback) del o + gc_collect() # For PyPy or other GCs. self.assertEqual(self.cbcalled, 1, "callback did not properly set 'cbcalled'") self.assertIsNone(ref(), @@ -215,6 +221,7 @@ class ReferencesTestCase(TestBase): self.assertEqual(weakref.getweakrefcount(o), 2, "wrong weak ref count for object") del proxy + gc_collect() # For PyPy or other GCs. self.assertEqual(weakref.getweakrefcount(o), 1, "wrong weak ref count for object after deleting proxy") @@ -480,6 +487,7 @@ class ReferencesTestCase(TestBase): "got wrong number of weak reference objects") del ref1, ref2, proxy1, proxy2 + gc_collect() # For PyPy or other GCs. self.assertEqual(weakref.getweakrefcount(o), 0, "weak reference objects not unlinked from" " referent when discarded.") @@ -493,6 +501,7 @@ class ReferencesTestCase(TestBase): ref1 = weakref.ref(o, self.callback) ref2 = weakref.ref(o, self.callback) del ref1 + gc_collect() # For PyPy or other GCs. self.assertEqual(weakref.getweakrefs(o), [ref2], "list of refs does not match") @@ -500,10 +509,12 @@ class ReferencesTestCase(TestBase): ref1 = weakref.ref(o, self.callback) ref2 = weakref.ref(o, self.callback) del ref2 + gc_collect() # For PyPy or other GCs. self.assertEqual(weakref.getweakrefs(o), [ref1], "list of refs does not match") del ref1 + gc_collect() # For PyPy or other GCs. self.assertEqual(weakref.getweakrefs(o), [], "list of refs not cleared") @@ -989,6 +1000,7 @@ class SubclassableWeakrefTestCase(TestBase): self.assertTrue(mr.called) self.assertEqual(mr.value, 24) del o + gc_collect() # For PyPy or other GCs. self.assertIsNone(mr()) self.assertTrue(mr.called) @@ -1291,15 +1303,18 @@ class MappingTestCase(TestBase): del items1, items2 self.assertEqual(len(dict), self.COUNT) del objects[0] + gc_collect() # For PyPy or other GCs. self.assertEqual(len(dict), self.COUNT - 1, "deleting object did not cause dictionary update") del objects, o + gc_collect() # For PyPy or other GCs. self.assertEqual(len(dict), 0, "deleting the values did not clear the dictionary") # regression on SF bug #447152: dict = weakref.WeakValueDictionary() self.assertRaises(KeyError, dict.__getitem__, 1) dict[2] = C() + gc_collect() # For PyPy or other GCs. self.assertRaises(KeyError, dict.__getitem__, 2) def test_weak_keys(self): @@ -1320,9 +1335,11 @@ class MappingTestCase(TestBase): del items1, items2 self.assertEqual(len(dict), self.COUNT) del objects[0] + gc_collect() # For PyPy or other GCs. self.assertEqual(len(dict), (self.COUNT - 1), "deleting object did not cause dictionary update") del objects, o + gc_collect() # For PyPy or other GCs. self.assertEqual(len(dict), 0, "deleting the keys did not clear the dictionary") o = Object(42) @@ -1821,6 +1838,7 @@ class MappingTestCase(TestBase): for o in objs: count += 1 del d[o] + gc_collect() # For PyPy or other GCs. self.assertEqual(len(d), 0) self.assertEqual(count, 2) @@ -2129,6 +2147,7 @@ class FinalizeTestCase(unittest.TestCase): libreftest = """ Doctest for examples in the library reference: weakref.rst +>>> from test.support import gc_collect >>> import weakref >>> class Dict(dict): ... pass @@ -2148,6 +2167,7 @@ True >>> o is o2 True >>> del o, o2 +>>> gc_collect() # For PyPy or other GCs. >>> print(r()) None @@ -2200,6 +2220,7 @@ True >>> id2obj(a_id) is a True >>> del a +>>> gc_collect() # For PyPy or other GCs. >>> try: ... id2obj(a_id) ... except KeyError: diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 49a9b5c..9b31d5f 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -5,6 +5,7 @@ from collections import UserString as ustr from collections.abc import Set, MutableSet import gc import contextlib +from test import support class Foo: @@ -48,6 +49,7 @@ class TestWeakSet(unittest.TestCase): self.assertEqual(len(self.s), len(self.d)) self.assertEqual(len(self.fs), 1) del self.obj + support.gc_collect() # For PyPy or other GCs. self.assertEqual(len(self.fs), 0) def test_contains(self): @@ -57,6 +59,7 @@ class TestWeakSet(unittest.TestCase): self.assertNotIn(1, self.s) self.assertIn(self.obj, self.fs) del self.obj + support.gc_collect() # For PyPy or other GCs. self.assertNotIn(ustr('F'), self.fs) def test_union(self): @@ -215,6 +218,7 @@ class TestWeakSet(unittest.TestCase): self.assertEqual(self.s, dup) self.assertRaises(TypeError, self.s.add, []) self.fs.add(Foo()) + support.gc_collect() # For PyPy or other GCs. self.assertTrue(len(self.fs) == 1) self.fs.add(self.obj) self.assertTrue(len(self.fs) == 1) @@ -406,6 +410,7 @@ class TestWeakSet(unittest.TestCase): n1 = len(s) del it gc.collect() + gc.collect() # For PyPy or other GCs. n2 = len(s) # one item may be kept alive inside the iterator self.assertIn(n1, (0, 1)) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 553529a..c79b546 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -2480,6 +2480,7 @@ class BasicElementTest(ElementTestCase, unittest.TestCase): wref = weakref.ref(e, wref_cb) self.assertEqual(wref().tag, 'e') del e + gc_collect() # For PyPy or other GCs. self.assertEqual(flag, True) self.assertEqual(wref(), None) |