blob: cc74374851e6a097cdfda9b4b8059529b36a709d [file] [log] [blame]
Marc-André Lemburg36619082001-01-17 19:11:13 +00001from test_support import verify, verbose, TestFailed
Neil Schemenauer88c761a2001-07-12 13:25:53 +00002import sys
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00003import gc
4
Neil Schemenauerfaae2662000-09-22 15:26:20 +00005def run_test(name, thunk):
6 if verbose:
7 print "testing %s..." % name,
8 try:
9 thunk()
10 except TestFailed:
11 if verbose:
12 print "failed (expected %s but got %s)" % (result,
13 test_result)
14 raise TestFailed, name
15 else:
16 if verbose:
17 print "ok"
18
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000019def test_list():
20 l = []
21 l.append(l)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000022 gc.collect()
23 del l
Neil Schemenauerfaae2662000-09-22 15:26:20 +000024 if gc.collect() != 1:
25 raise TestFailed
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000026
27def test_dict():
28 d = {}
29 d[1] = d
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000030 gc.collect()
31 del d
Neil Schemenauerfaae2662000-09-22 15:26:20 +000032 if gc.collect() != 1:
33 raise TestFailed
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000034
35def test_tuple():
Neil Schemenauera53cf792000-09-15 22:32:29 +000036 # since tuples are immutable we close the loop with a list
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000037 l = []
38 t = (l,)
39 l.append(t)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000040 gc.collect()
41 del t
42 del l
Neil Schemenauerfaae2662000-09-22 15:26:20 +000043 if gc.collect() != 2:
44 raise TestFailed
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000045
46def test_class():
47 class A:
48 pass
49 A.a = A
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000050 gc.collect()
51 del A
Neil Schemenauerfaae2662000-09-22 15:26:20 +000052 if gc.collect() == 0:
53 raise TestFailed
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000054
55def test_instance():
56 class A:
57 pass
58 a = A()
59 a.a = a
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000060 gc.collect()
61 del a
Neil Schemenauerfaae2662000-09-22 15:26:20 +000062 if gc.collect() == 0:
63 raise TestFailed
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000064
65def test_method():
Neil Schemenauera53cf792000-09-15 22:32:29 +000066 # Tricky: self.__init__ is a bound method, it references the instance.
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000067 class A:
68 def __init__(self):
69 self.init = self.__init__
70 a = A()
71 gc.collect()
72 del a
Neil Schemenauerfaae2662000-09-22 15:26:20 +000073 if gc.collect() == 0:
74 raise TestFailed
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000075
76def test_finalizer():
Neil Schemenauera53cf792000-09-15 22:32:29 +000077 # A() is uncollectable if it is part of a cycle, make sure it shows up
78 # in gc.garbage.
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000079 class A:
80 def __del__(self): pass
81 class B:
82 pass
83 a = A()
84 a.a = a
85 id_a = id(a)
86 b = B()
87 b.b = b
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000088 gc.collect()
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000089 del a
90 del b
Neil Schemenauerfaae2662000-09-22 15:26:20 +000091 if gc.collect() == 0:
92 raise TestFailed
93 for obj in gc.garbage:
94 if id(obj) == id_a:
95 del obj.a
96 break
97 else:
98 raise TestFailed
99 gc.garbage.remove(obj)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000100
101def test_function():
Neil Schemenauera53cf792000-09-15 22:32:29 +0000102 # Tricky: f -> d -> f, code should call d.clear() after the exec to
103 # break the cycle.
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000104 d = {}
105 exec("def f(): pass\n") in d
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000106 gc.collect()
107 del d
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000108 if gc.collect() != 2:
109 raise TestFailed
110
Neil Schemenauer88c761a2001-07-12 13:25:53 +0000111def test_frame():
112 def f():
113 frame = sys._getframe()
114 gc.collect()
115 f()
116 if gc.collect() != 1:
117 raise TestFailed
118
119
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000120def test_saveall():
121 # Verify that cyclic garbage like lists show up in gc.garbage if the
122 # SAVEALL option is enabled.
123 debug = gc.get_debug()
124 gc.set_debug(debug | gc.DEBUG_SAVEALL)
125 l = []
126 l.append(l)
127 id_l = id(l)
128 del l
129 gc.collect()
130 try:
131 for obj in gc.garbage:
132 if id(obj) == id_l:
133 del obj[:]
134 break
135 else:
136 raise TestFailed
137 gc.garbage.remove(obj)
138 finally:
139 gc.set_debug(debug)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000140
Neil Schemenauera53cf792000-09-15 22:32:29 +0000141def test_del():
142 # __del__ methods can trigger collection, make this to happen
143 thresholds = gc.get_threshold()
144 gc.enable()
145 gc.set_threshold(1)
146
Fred Drake004d5e62000-10-23 17:22:08 +0000147 class A:
148 def __del__(self):
149 dir(self)
Neil Schemenauera53cf792000-09-15 22:32:29 +0000150 a = A()
151 del a
152
153 gc.disable()
154 apply(gc.set_threshold, thresholds)
Fred Drake004d5e62000-10-23 17:22:08 +0000155
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000156
157def test_all():
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000158 run_test("lists", test_list)
159 run_test("dicts", test_dict)
160 run_test("tuples", test_tuple)
161 run_test("classes", test_class)
162 run_test("instances", test_instance)
163 run_test("methods", test_method)
164 run_test("functions", test_function)
Neil Schemenauer88c761a2001-07-12 13:25:53 +0000165 run_test("frames", test_frame)
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000166 run_test("finalizers", test_finalizer)
167 run_test("__del__", test_del)
168 run_test("saveall", test_saveall)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000169
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000170def test():
171 if verbose:
172 print "disabling automatic collection"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000173 enabled = gc.isenabled()
174 gc.disable()
Marc-André Lemburg36619082001-01-17 19:11:13 +0000175 verify(not gc.isenabled() )
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000176 debug = gc.get_debug()
177 gc.set_debug(debug & ~gc.DEBUG_LEAK) # this test is supposed to leak
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000178
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000179 try:
180 test_all()
181 finally:
182 gc.set_debug(debug)
183 # test gc.enable() even if GC is disabled by default
184 if verbose:
185 print "restoring automatic collection"
186 # make sure to always test gc.enable()
187 gc.enable()
Marc-André Lemburg36619082001-01-17 19:11:13 +0000188 verify(gc.isenabled())
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000189 if not enabled:
190 gc.disable()
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000191
192
Neil Schemenauerfaae2662000-09-22 15:26:20 +0000193test()