diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-14 14:40:28 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-14 14:40:28 -0400 |
| commit | 4a4cccfee5a2eb78380e56eb9476e91658656676 (patch) | |
| tree | 86d8727dfa51538906b57f2872741642b1435b0c /test/base | |
| parent | c0c6aaa58ad1bf01345189a917029c40edc3c8eb (diff) | |
| download | sqlalchemy-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.py | 34 |
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 + ) |
