summaryrefslogtreecommitdiff
path: root/tests/dispatch
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2013-08-19 23:14:21 -0400
committerSimon Charette <charette.s@gmail.com>2013-08-20 01:53:58 -0400
commite55ca60903adcfd525938335b1ad9dbb6fd96c3e (patch)
treef501f11becc8c0c1bf7fdd56d4f270c3e0d336fd /tests/dispatch
parentfdbf492946a030bdf394aae8896bbad9a446e0fd (diff)
downloaddjango-e55ca60903adcfd525938335b1ad9dbb6fd96c3e.tar.gz
Fixed #20943 -- Weakly reference senders when caching their associated receivers
Diffstat (limited to 'tests/dispatch')
-rw-r--r--tests/dispatch/tests/test_dispatcher.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/tests/dispatch/tests/test_dispatcher.py b/tests/dispatch/tests/test_dispatcher.py
index 5f7dca87cc..e25f60b0c7 100644
--- a/tests/dispatch/tests/test_dispatcher.py
+++ b/tests/dispatch/tests/test_dispatcher.py
@@ -2,6 +2,7 @@ import gc
import sys
import time
import unittest
+import weakref
from django.dispatch import Signal, receiver
@@ -35,6 +36,8 @@ class Callable(object):
a_signal = Signal(providing_args=["val"])
b_signal = Signal(providing_args=["val"])
c_signal = Signal(providing_args=["val"])
+d_signal = Signal(providing_args=["val"], use_caching=True)
+
class DispatcherTests(unittest.TestCase):
"""Test suite for dispatcher (barely started)"""
@@ -72,6 +75,24 @@ class DispatcherTests(unittest.TestCase):
self.assertEqual(result, expected)
self._testIsClean(a_signal)
+ def testCachedGarbagedCollected(self):
+ """
+ Make sure signal caching sender receivers don't prevent garbage
+ collection of senders.
+ """
+ class sender:
+ pass
+ wref = weakref.ref(sender)
+ d_signal.connect(receiver_1_arg)
+ d_signal.send(sender, val='garbage')
+ del sender
+ garbage_collect()
+ try:
+ self.assertIsNone(wref())
+ finally:
+ # Disconnect after reference check since it flushes the tested cache.
+ d_signal.disconnect(receiver_1_arg)
+
def testMultipleRegistration(self):
a = Callable()
a_signal.connect(a)