summaryrefslogtreecommitdiff
path: root/cherrypy/test/test_refleaks.py
diff options
context:
space:
mode:
authorRobert Brewer <fumanchu@aminus.org>2007-09-27 20:11:24 +0000
committerRobert Brewer <fumanchu@aminus.org>2007-09-27 20:11:24 +0000
commit8f108b080c2d3dc3ab857641ea16aa017a44626c (patch)
tree86ad86c6b841f6d159126674de15e033deaa498a /cherrypy/test/test_refleaks.py
parent1725dec4ad6bc1adbbe239290d8ea62041c6fd2c (diff)
downloadcherrypy-git-8f108b080c2d3dc3ab857641ea16aa017a44626c.tar.gz
Copied [1711] to trunk.
Diffstat (limited to 'cherrypy/test/test_refleaks.py')
-rw-r--r--cherrypy/test/test_refleaks.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/cherrypy/test/test_refleaks.py b/cherrypy/test/test_refleaks.py
new file mode 100644
index 00000000..52da0b12
--- /dev/null
+++ b/cherrypy/test/test_refleaks.py
@@ -0,0 +1,76 @@
+"""Tests for refleaks."""
+
+from cherrypy.test import test
+test.prefer_parent_path()
+
+import gc
+import threading
+import cherrypy
+from cherrypy import _cprequest
+
+
+data = object()
+
+def get_instances(cls):
+ return [x for x in gc.get_objects() if isinstance(x, cls)]
+
+def setup_server():
+
+ class Root:
+ def index(self, *args, **kwargs):
+ cherrypy.request.thing = data
+ return "Hello world!"
+ index.exposed = True
+
+ def gc_stats(self):
+ return "%s %s %s %s" % (gc.collect(),
+ len(get_instances(_cprequest.Request)),
+ len(get_instances(_cprequest.Response)),
+ len(gc.get_referrers(data)))
+ gc_stats.exposed = True
+
+ def gc_objtypes(self):
+ data = {}
+ for x in gc.get_objects():
+ data[type(x)] = data.get(type(x), 0) + 1
+
+ data = [(v, k) for k, v in data.iteritems()]
+ data.sort()
+ return "\n".join([repr(pair) for pair in data])
+ gc_objtypes.exposed = True
+
+ cherrypy.tree.mount(Root())
+ cherrypy.config.update({'environment': 'test_suite'})
+
+
+from cherrypy.test import helper
+
+
+class ReferenceTests(helper.CPWebCase):
+
+ def test_threadlocal_garbage(self):
+ def getpage():
+ self.getPage('/')
+ self.assertBody("Hello world!")
+
+ ts = []
+ for _ in range(25):
+ t = threading.Thread(target=getpage)
+ ts.append(t)
+ t.start()
+
+ for t in ts:
+ t.join()
+
+ self.getPage("/gc_stats")
+ self.assertBody("0 1 1 1")
+
+ # If gc_stats fails, choose "ignore" to see the type counts for
+ # all the unreachable objects in this body.
+ self.getPage("/gc_objtypes")
+ self.assertBody("")
+
+
+if __name__ == '__main__':
+ setup_server()
+ helper.testmain()