summaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-14 14:40:28 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-14 14:40:28 -0400
commit4a4cccfee5a2eb78380e56eb9476e91658656676 (patch)
tree86d8727dfa51538906b57f2872741642b1435b0c /test/base
parentc0c6aaa58ad1bf01345189a917029c40edc3c8eb (diff)
downloadsqlalchemy-4a4cccfee5a2eb78380e56eb9476e91658656676.tar.gz
- Removing (or adding) an event listener at the same time that the event
is being run itself, either from inside the listener or from a concurrent thread, now raises a RuntimeError, as the collection used is now an instance of ``colletions.deque()`` and does not support changes while being iterated. Previously, a plain Python list was used where removal from inside the event itself would produce silent failures. fixes #3163
Diffstat (limited to 'test/base')
-rw-r--r--test/base/test_events.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/base/test_events.py b/test/base/test_events.py
index 41ccfbc35..30b728cd3 100644
--- a/test/base/test_events.py
+++ b/test/base/test_events.py
@@ -1160,3 +1160,37 @@ class RemovalTest(fixtures.TestBase):
)
event.remove(t1, "event_three", m1)
+
+ def test_no_remove_in_event(self):
+ Target = self._fixture()
+
+ t1 = Target()
+
+ def evt():
+ event.remove(t1, "event_one", evt)
+
+ event.listen(t1, "event_one", evt)
+
+ assert_raises_message(
+ Exception,
+ "deque mutated during iteration",
+ t1.dispatch.event_one
+ )
+
+ def test_no_add_in_event(self):
+ Target = self._fixture()
+
+ t1 = Target()
+
+ m1 = Mock()
+
+ def evt():
+ event.listen(t1, "event_one", m1)
+
+ event.listen(t1, "event_one", evt)
+
+ assert_raises_message(
+ Exception,
+ "deque mutated during iteration",
+ t1.dispatch.event_one
+ )