Hi. I've heard recently that there are some tests that ideally would need
to run under the Twisted reactor, in order to properly exercise the
functionality under test. However, there are a number of issues including
the possible need for multiple uses of run/stop, dependency on external
servers, test duration, etc.
There is, however, a relatively straightforward solution: use a mock
reactor. I've successfully used this approach in the past to test
event-driven libraries, although it was only with a subset of the full
Twisted reactor capabilities. A mock reactor can be stopped, reset, and
started as many times as you like, because it doesn't rely on hooking a GUI
event loop, running in a separate thread, or anything like that.
A mock reactor can run in "simulated time", which means that it uses a
time() function that runs faster than "real" time. For example, if you
schedule a callback, and there's no pending simulated I/O or other
scheduled calls, the simulated time jumps ahead to the next scheduled callback.
One additional side benefit of simulated time is that it's deterministic
and therefore can be reliably reproduced in repeated tests. In PEAK, for
example, I once wrote tests for some components that might be compared to
WakeupCallers in Chandler. I had several scheduled to wake up on various
intervals, and the test then verified that they had run at all the times
they should have. Since the time is simulated, there were no rounding
errors or clock precision to take into account, and the tests could
instantaneously whether they were simulating seconds, minutes, or even
hours of scheduling operations.
A mock reactor for Chandler tests could also use my "mockets" (fake
sockets) library in order to avoid doing any "real" network I/O, allowing
servers to listen and clients to connect to addresses on a virtual network
that exists only in the process' memory, thereby avoiding the complexity of
using external processes to set up and tear down servers or depending on
other servers being up and having connectivity to them.
Although I don't have a complete mock reactor implementation, I do have
most of the prerequisites and experience that would be needed to implement
one, if anybody is interested. So, if you have things (like Zanshin,
Chandler client protocols, etc.) that need reactor-based testing, and would
be interested in helping me test a mock reactor for your test cases, let me
know. It's also possible that this could be a joint project with the
Twisted folks; as early as last year, Itamar expressed an interest in
allowing test reactors to run using simulated time:
http://twistedmatrix.com/pipermail/twisted-python/2004-January/006982.html
And I would be surprised if they're not interested in having a mocket-based
reactor as well. The last hacking I did on Twisted was around 1.1, so it
might take me some time to get familiar with the 2.0 reactor
interfaces. However, unless there are major differences I don't expect it
to be difficult to do; Twisted is designed to isolate code from the
underlying transport mechanism in use. About the only "interesting" part
would likely be SSL/TLS, since I doubt M2Crypto and OpenSSL will want to
talk to mocket objects instead of real sockets. It might be necessary to
create mock SSL "Transport" objects as well as a mock reactor.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Open Source Applications Foundation "Dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/dev