[Twisted-Python] Getting rid of "DirtyReactorWarning"
Itamar Turner-Trauring
itamar at itamarst.org
Tue May 15 04:26:24 MDT 2012
I have a ticket open for allowing tests that look like this, where each
run has a new reactor instance:
def test_somethingShouldHappen(self, reactor):
result = []
reactor.listenTCP(...)
self.runReactor(reactor)
self.assertEqual(result, ["hooray"])
Further thought suggests however that this doesn't add much,
necessarily, over the current "return a Deferred" idiom for most users.
Experience with ReactorBuilder framework that has similar testing
mechanism suggests it's far too easy to fail to stop the reactor.
Moreover, things like coiterate() don't work since they rely on
pre-imported global reactor, and given the "from twisted.internet import
reactor" idiom this testing style won't work well for many people's code.
But! ReactorBuilder tests are superior in one way: no
DirtyReactorWarning. You don't have to wait until all connections are
closed, which is difficult, or make sure to cancel every timeout. This
makes test writing simpler.
Perhaps we should get rid of DirtyReactorWarning for regular
Deferred-returning tests as well, then. We have all the infrastructure
we need, after all, for canceling scheduled events and disconnecting all
descriptors. We might want to log when we do so, to help debug things,
but we already have cleanup code mostly implemented in trial anyway, and
it seems like DirtyReactorWarning doesn't usually make future tests fail
anyway since we do run cleanup.
Threaded code might still be a problem, but that's the case for current
tests now, and even switching to a new style of tests as above would
only somewhat mitigate the issue.
Thoughts?
More information about the Twisted-Python
mailing list