summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_gc.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-04-04 17:52:56 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-04-04 17:52:56 (GMT)
commitd11f76f8b95435052f859b07b140b123c776b48f (patch)
tree4c6fb504558844ab18066a58ee713cf2def587a2 /Lib/test/test_gc.py
parentc800af41c909a9cd90ccabdf88ed4db96446fb4b (diff)
parente9b2a4cb59ff0046343ce292f9c5db7e5639635c (diff)
downloadcpython-d11f76f8b95435052f859b07b140b123c776b48f.zip
cpython-d11f76f8b95435052f859b07b140b123c776b48f.tar.gz
cpython-d11f76f8b95435052f859b07b140b123c776b48f.tar.bz2
Issue #11761: make tests for gc.get_count() less fragile
Diffstat (limited to 'Lib/test/test_gc.py')
-rw-r--r--Lib/test/test_gc.py43
1 files changed, 27 insertions, 16 deletions
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index f60d5d9..19313db 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -241,32 +241,43 @@ class GCTests(unittest.TestCase):
# The following two tests are fragile:
# They precisely count the number of allocations,
# which is highly implementation-dependent.
- # For example:
- # - disposed tuples are not freed, but reused
- # - the call to assertEqual somehow avoids building its args tuple
+ # For example, disposed tuples are not freed, but reused.
+ # To minimize variations, though, we first store the get_count() results
+ # and check them at the end.
@refcount_test
def test_get_count(self):
- # Avoid future allocation of method object
- assertEqual = self._baseAssertEqual
gc.collect()
- assertEqual(gc.get_count(), (0, 0, 0))
- a = dict()
- # since gc.collect(), we created two objects:
- # the dict, and the tuple returned by get_count()
- assertEqual(gc.get_count(), (2, 0, 0))
+ a, b, c = gc.get_count()
+ x = []
+ d, e, f = gc.get_count()
+ self.assertEqual((b, c), (0, 0))
+ self.assertEqual((e, f), (0, 0))
+ # This is less fragile than asserting that a equals 0.
+ self.assertLess(a, 5)
+ # Between the two calls to get_count(), at least one object was
+ # created (the list).
+ self.assertGreater(d, a)
@refcount_test
def test_collect_generations(self):
- # Avoid future allocation of method object
- assertEqual = self.assertEqual
gc.collect()
- a = dict()
+ # This object will "trickle" into generation N + 1 after
+ # each call to collect(N)
+ x = []
gc.collect(0)
- assertEqual(gc.get_count(), (0, 1, 0))
+ # x is now in gen 1
+ a, b, c = gc.get_count()
gc.collect(1)
- assertEqual(gc.get_count(), (0, 0, 1))
+ # x is now in gen 2
+ d, e, f = gc.get_count()
gc.collect(2)
- assertEqual(gc.get_count(), (0, 0, 0))
+ # x is now in gen 3
+ g, h, i = gc.get_count()
+ # We don't check a, d, g since their exact values depends on
+ # internal implementation details of the interpreter.
+ self.assertEqual((b, c), (1, 0))
+ self.assertEqual((e, f), (0, 1))
+ self.assertEqual((h, i), (0, 0))
def test_trashcan(self):
class Ouch: