summaryrefslogtreecommitdiff
path: root/tests
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 02:12:50 -0400
commitf0bc2865ff9d85c952fa86ae19aee062a5e883cd (patch)
treec29b25ca440dc1b984d1e8508c938cc8d75ca96b /tests
parente7a6eaf5fee9c5854e0d2d86f21132ac4a1415f6 (diff)
Fixed #20943 -- Weakly reference senders when caching their associated receivers
Backport of e55ca60903 from master.
Diffstat (limited to 'tests')
-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 a1d4c7e176..2586aeee62 100644
--- a/tests/dispatch/tests/test_dispatcher.py
+++ b/tests/dispatch/tests/test_dispatcher.py
@@ -1,6 +1,7 @@
import gc
import sys
import time
+import weakref
from django.dispatch import Signal, receiver
from django.utils import unittest
@@ -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)