Merge lp:~jml/testtools/trial-hang into lp:~testtools-committers/testtools/trunk

Proposed by Jonathan Lange
Status: Merged
Merged at revision: 241
Proposed branch: lp:~jml/testtools/trial-hang
Merge into: lp:~testtools-committers/testtools/trunk
Diff against target: 43 lines (+14/-1)
2 files modified
testtools/deferredruntest.py (+1/-1)
testtools/tests/test_deferredruntest.py (+13/-0)
To merge this branch: bzr merge lp:~jml/testtools/trial-hang
Reviewer Review Type Date Requested Status
testtools committers Pending
Review via email: mp+91470@code.launchpad.net

Description of the change

Turns out that running testtools Twisted tests can cause hangs in Trial. That really sucks.

Looking into it, it was caused by a logic bug in run_with_log_observers. It stored 'real_observers', which it treated as a snapshot of the Twisted log observers at the start of the method. We use it to restore the observers when our function is done.

However, 'real_observers' was just a reference to the maintained list of current observers. That meant that when we added a log observer, the list of real_observers expanded, which made the 'for observer in real_observers' loop keep expanding.

The fix is very simple, as is the test.

To post a comment you must log in.
Revision history for this message
Robert Collins (lifeless) wrote :

+1

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'testtools/deferredruntest.py'
2--- testtools/deferredruntest.py 2011-07-20 16:39:27 +0000
3+++ testtools/deferredruntest.py 2012-02-03 18:04:24 +0000
4@@ -57,7 +57,7 @@
5
6 def run_with_log_observers(observers, function, *args, **kwargs):
7 """Run 'function' with the given Twisted log observers."""
8- real_observers = log.theLogPublisher.observers
9+ real_observers = list(log.theLogPublisher.observers)
10 for observer in real_observers:
11 log.theLogPublisher.removeObserver(observer)
12 for observer in observers:
13
14=== modified file 'testtools/tests/test_deferredruntest.py'
15--- testtools/tests/test_deferredruntest.py 2011-07-27 09:39:08 +0000
16+++ testtools/tests/test_deferredruntest.py 2012-02-03 18:04:24 +0000
17@@ -13,6 +13,7 @@
18 from testtools.content import (
19 text_content,
20 )
21+from testtools.deferredruntest import run_with_log_observers
22 from testtools.helpers import try_import
23 from testtools.matchers import (
24 Equals,
25@@ -746,6 +747,18 @@
26 lambda x: self.fail("Should not have succeeded"), check_result)
27
28
29+class TestRunWithLogObservers(TestCase):
30+
31+ def test_restores_observers(self):
32+ from twisted.python import log
33+ # Make sure there's at least one observer. This reproduces bug
34+ # #926189.
35+ log.addObserver(lambda *args: None)
36+ observers = list(log.theLogPublisher.observers)
37+ run_with_log_observers([], lambda: None)
38+ self.assertEqual(observers, log.theLogPublisher.observers)
39+
40+
41 def test_suite():
42 from unittest import TestLoader, TestSuite
43 return TestSuite(

Subscribers

People subscribed via source and target branches