summaryrefslogtreecommitdiff
path: root/sys/lib/python/test/leakers
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
commit458120dd40db6b4df55a4e96b650e16798ef06a0 (patch)
tree8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/lib/python/test/leakers
parent3a742c699f6806c1145aea5149bf15de15a0afd7 (diff)
add hg and python
Diffstat (limited to 'sys/lib/python/test/leakers')
-rw-r--r--sys/lib/python/test/leakers/README.txt32
-rw-r--r--sys/lib/python/test/leakers/__init__.py0
-rw-r--r--sys/lib/python/test/leakers/test_ctypes.py16
-rw-r--r--sys/lib/python/test/leakers/test_gestalt.py14
-rw-r--r--sys/lib/python/test/leakers/test_selftype.py13
5 files changed, 75 insertions, 0 deletions
diff --git a/sys/lib/python/test/leakers/README.txt b/sys/lib/python/test/leakers/README.txt
new file mode 100644
index 000000000..beeee0e7f
--- /dev/null
+++ b/sys/lib/python/test/leakers/README.txt
@@ -0,0 +1,32 @@
+This directory contains test cases that are known to leak references.
+The idea is that you can import these modules while in the interpreter
+and call the leak function repeatedly. This will only be helpful if
+the interpreter was built in debug mode. If the total ref count
+doesn't increase, the bug has been fixed and the file should be removed
+from the repository.
+
+Note: be careful to check for cyclic garbage. Sometimes it may be helpful
+to define the leak function like:
+
+def leak():
+ def inner_leak():
+ # this is the function that leaks, but also creates cycles
+ inner_leak()
+ gc.collect() ; gc.collect() ; gc.collect()
+
+Here's an example interpreter session for test_gestalt which still leaks:
+
+>>> from test.leakers.test_gestalt import leak
+[24275 refs]
+>>> leak()
+[28936 refs]
+>>> leak()
+[28938 refs]
+>>> leak()
+[28940 refs]
+>>>
+
+Once the leak is fixed, the test case should be moved into an appropriate
+test (even if it was originally from the test suite). This ensures the
+regression doesn't happen again. And if it does, it should be easier
+to track down.
diff --git a/sys/lib/python/test/leakers/__init__.py b/sys/lib/python/test/leakers/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sys/lib/python/test/leakers/__init__.py
diff --git a/sys/lib/python/test/leakers/test_ctypes.py b/sys/lib/python/test/leakers/test_ctypes.py
new file mode 100644
index 000000000..0f9a2cdc9
--- /dev/null
+++ b/sys/lib/python/test/leakers/test_ctypes.py
@@ -0,0 +1,16 @@
+
+# Taken from Lib/ctypes/test/test_keeprefs.py, PointerToStructure.test().
+# When this leak is fixed, remember to remove from Misc/build.sh LEAKY_TESTS.
+
+from ctypes import Structure, c_int, POINTER
+import gc
+
+def leak_inner():
+ class POINT(Structure):
+ _fields_ = [("x", c_int)]
+ class RECT(Structure):
+ _fields_ = [("a", POINTER(POINT))]
+
+def leak():
+ leak_inner()
+ gc.collect()
diff --git a/sys/lib/python/test/leakers/test_gestalt.py b/sys/lib/python/test/leakers/test_gestalt.py
new file mode 100644
index 000000000..46bfcc806
--- /dev/null
+++ b/sys/lib/python/test/leakers/test_gestalt.py
@@ -0,0 +1,14 @@
+import sys
+
+if sys.platform != 'darwin':
+ raise ValueError, "This test only leaks on Mac OS X"
+
+def leak():
+ # taken from platform._mac_ver_lookup()
+ from gestalt import gestalt
+ import MacOS
+
+ try:
+ gestalt('sysu')
+ except MacOS.Error:
+ pass
diff --git a/sys/lib/python/test/leakers/test_selftype.py b/sys/lib/python/test/leakers/test_selftype.py
new file mode 100644
index 000000000..4207c328b
--- /dev/null
+++ b/sys/lib/python/test/leakers/test_selftype.py
@@ -0,0 +1,13 @@
+# Reference cycles involving only the ob_type field are rather uncommon
+# but possible. Inspired by SF bug 1469629.
+
+import gc
+
+def leak():
+ class T(type):
+ pass
+ class U(type):
+ __metaclass__ = T
+ U.__class__ = U
+ del U
+ gc.collect(); gc.collect(); gc.collect()