From 4a4cccfee5a2eb78380e56eb9476e91658656676 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 14 Aug 2014 14:40:28 -0400 Subject: - 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 --- test/base/test_events.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'test/base') 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 + ) -- cgit v1.2.1