2
"""Utilities and helpers for simulating a network
5
from cStringIO import StringIO
7
from twisted.internet import error
9
from epsilon.test import utils
12
def readAndDestroy(iodata):
15
result = iodata.read()
19
print '<bug in FileTransport, early close>'
25
"""Utility to pump data between clients and servers for protocol testing.
27
Perhaps this is a utility worthy of being in protocol.py?
29
def __init__(self, client, server, clientIO, serverIO, debug):
32
self.clientIO = clientIO
33
self.serverIO = serverIO
36
def flush(self, debug=False):
37
"""Pump until there is no more input or output.
39
Returns whether any data was moved.
52
def pump(self, debug=False):
53
"""Move data back and forth.
55
Returns whether any data was moved.
57
if self.debug or debug:
59
sData = readAndDestroy(self.serverIO)
60
cData = readAndDestroy(self.clientIO)
61
self.client.transport._checkProducer()
62
self.server.transport._checkProducer()
63
if self.debug or debug:
65
# XXX slightly buggy in the face of incremental output
67
for line in cData.split('\r\n'):
70
for line in sData.split('\r\n'):
73
self.server.dataReceived(cData)
75
self.client.dataReceived(sData)
78
if self.server.transport.disconnecting and not self.server.transport.disconnected:
79
if self.debug or debug:
81
self.server.transport.disconnected = True
82
self.client.transport.disconnecting = True
83
self.client.connectionLost(error.ConnectionDone("Connection done"))
85
if self.client.transport.disconnecting and not self.client.transport.disconnected:
86
if self.debug or debug:
88
self.client.transport.disconnected = True
89
self.server.transport.disconnecting = True
90
self.server.connectionLost(error.ConnectionDone("Connection done"))
95
def connectedServerAndClient(ServerClass, ClientClass,
96
clientTransportWrapper=utils.FileWrapper,
97
serverTransportWrapper=utils.FileWrapper,
99
"""Returns a 3-tuple: (client, server, pump)
105
c.makeConnection(clientTransportWrapper(cio))
106
s.makeConnection(serverTransportWrapper(sio))
107
pump = IOPump(c, s, cio, sio, debug)
108
# kick off server greeting, etc