def makeClient(self): self.clientSocket = TCPSocket( host="localhost", port=Port, stateCallback=self.clientState, readCallback=self.clientRead, name="client", )
def makeClient(self): self.clientSocket = TCPSocket( host = "localhost", port = Port, stateCallback = self.clientState, readCallback = self.clientRead, name = "client", )
def startClient(): global clientSocket clientSocket = TCPSocket( host = "localhost", port = port, stateCallback = clientState, readCallback = clientRead, name = "client", )
def _tryConnection(self): """Attempt a connection """ self._sock = TCPSocket(host=self.host, port=self.port, stateCallback=self._sockStateCallback)
class WaitForTCPServer(object): """Wait for a TCP server to accept a connection """ def __init__(self, host, port, callFunc, timeLim=5, pollInterval=0.2): """Start waiting for a TCP server to accept a connection @param[in] host host address of server @param[in] port port number of server @param[in] callFunc function to call when server ready or wait times out; receives one parameter: this object @param[in] timeLim approximate maximum wait time (sec); the actual wait time may be up to pollInterval longer @param[in] pollInterval interval at which to poll (sec) Useful attributes: - isDone: the wait is over - didFail: the wait failed """ self.host = host self.port = port self.isDone = False self.didFail = False self._callFunc = callFunc self._pollInterval = float(pollInterval) self._timeLim = float(timeLim) self._pollTimer = Timer() self._startTime = time.time() self._tryConnection() self._timeoutTimer = Timer(timeLim, self._finish) def _tryConnection(self): """Attempt a connection """ self._sock = TCPSocket(host=self.host, port=self.port, stateCallback=self._sockStateCallback) def _sockStateCallback(self, sock): """Socket state callback """ if sock.isReady: # success self._finish() elif sock.isDone: # connection failed; try again self._pollTimer.start(self._pollInterval, self._tryConnection) def _finish(self): """Set _isReady and call the callback function """ self._pollTimer.cancel() self._timeoutTimer.cancel() self.didFail = not self._sock.isReady self.isDone = True if not self._sock.isDone: self._sock.setStateCallback() self._sock.close() self._sock = None if self._callFunc: callFunc = self._callFunc self._callFunc = None safeCall2("%s._finish" % (self,), callFunc, self) def __repr__(self): return "%s(host=%s, port=%s)" % (type(self).__name__, self.host, self.port)
class TestRunner(object): def __init__(self, sendRcvList, binaryServer=False): self.binaryServer = bool(binaryServer) self.sendRcvListIter = iter(sendRcvList) self.deferred = Deferred() self.endState = None self.clientSocket = None self.serverSocket = None self.echoServer = TCPServer( port = Port, stateCallback = self.echoState, sockReadCallback = self.echoSocketRead, sockStateCallback = self.echoSocketState, name = "echo", ) @property def isDone(self): return self.endState is not None def close(self): if self.clientSocket: self.clientSocket.close() if self.serverSocket: self.serverSocket.close() self.echoServer.close() def endIfDone(self): if self.endState is not None: if self.clientSocket and self.clientSocket.isDone \ and self.serverSocket and self.serverSocket.isDone \ and self.echoServer.isDone: isOK, reason = self.endState # remove reference to deferred, for paranoia deferred, self.deferred = self.deferred, None if isOK: deferred.callback(reason) else: deferred.errback(reason) def clientState(self, sock): if sock.isReady: self.writeNext() elif sock.isDone and not self.isDone: self.end(False, "Client socket failed") self.endIfDone() def clientRead(self, sock): if self.readLine: data = sock.readLine() else: data = sock.read() if data != self.readData: self.deferred.errback( "Expected %r but read %r; readLine=%r" % (self.readData, data, self.readLine), ) else: self.writeNext() def echoState(self, server): if server.isReady: self.makeClient() elif server.isDone and not self.isDone: self.end(False, "Echo server failed") self.endIfDone() def echoSocketState(self, sock): self.serverSocket = sock self.endIfDone() def echoSocketRead(self, sock): if self.binaryServer: data = sock.read() if data is not None: sock.write(data) else: data = sock.readLine(default=None) if data is not None: sock.writeLine(data) def end(self, isOK, reason=None): self.endState = (isOK, reason) self.close() def makeClient(self): self.clientSocket = TCPSocket( host = "localhost", port = Port, stateCallback = self.clientState, readCallback = self.clientRead, name = "client", ) def writeNext(self): try: writeData, writeLine, self.readData, self.readLine = next(self.sendRcvListIter) except StopIteration: self.end(isOK=True) return if writeData is not None: if writeLine: self.clientSocket.writeLine(writeData) else: self.clientSocket.write(writeData) if self.readData is None: self.writeNext()
class WaitForTCPServer(object): """Wait for a TCP server to accept a connection """ def __init__(self, host, port, callFunc, timeLim=5, pollInterval=0.2): """Start waiting for a TCP server to accept a connection @param[in] host: host address of server @param[in] port: port number of server @param[in] callFunc: function to call when server ready or wait times out; receives one parameter: this object @param[in] timeLim: approximate maximum wait time (sec); the actual wait time may be up to pollInterval longer @param[in] pollInterval: interval at which to poll (sec) Useful attributes: - isDone: the wait is over - didFail: the wait failed """ self.host = host self.port = port self.isDone = False self.didFail = False self._callFunc = callFunc self._pollInterval = float(pollInterval) self._timeLim = float(timeLim) self._pollTimer = Timer() self._startTime = time.time() self._tryConnection() self._timeoutTimer = Timer(timeLim, self._finish) def _tryConnection(self): """Attempt a connection """ self._sock = TCPSocket(host=self.host, port=self.port, stateCallback=self._sockStateCallback) def _sockStateCallback(self, sock): """Socket state callback """ if sock.isReady: # success self._finish() elif sock.isDone: # connection failed; try again self._pollTimer.start(self._pollInterval, self._tryConnection) def _finish(self): """Set _isReady and call the callback function """ self._pollTimer.cancel() self._timeoutTimer.cancel() self.didFail = not self._sock.isReady self.isDone = True if not self._sock.isDone: self._sock.setStateCallback() self._sock.close() self._sock = None if self._callFunc: callFunc = self._callFunc self._callFunc = None safeCall2("%s._finish" % (self,), callFunc, self) def __repr__(self): return "%s(host=%s, port=%s)" % (type(self).__name__, self.host, self.port)
def _tryConnection(self): """Attempt a connection """ self._sock = TCPSocket(host=self.host, port=self.port, stateCallback=self._sockStateCallback)
class TestRunner(object): def __init__(self, sendRcvList, binaryServer=False): self.binaryServer = bool(binaryServer) self.sendRcvListIter = iter(sendRcvList) self.deferred = Deferred() self.endState = None self.clientSocket = None self.serverSocket = None self.echoServer = TCPServer( port=Port, stateCallback=self.echoState, sockReadCallback=self.echoSocketRead, sockStateCallback=self.echoSocketState, name="echo", ) @property def isDone(self): return self.endState is not None def close(self): if self.clientSocket: self.clientSocket.close() if self.serverSocket: self.serverSocket.close() self.echoServer.close() def endIfDone(self): if self.endState is not None: if self.clientSocket and self.clientSocket.isDone \ and self.serverSocket and self.serverSocket.isDone \ and self.echoServer.isDone: isOK, reason = self.endState # remove reference to deferred, for paranoia deferred, self.deferred = self.deferred, None if isOK: deferred.callback(reason) else: deferred.errback(reason) def clientState(self, sock): if sock.isReady: self.writeNext() elif sock.isDone and not self.isDone: self.end(False, "Client socket failed") self.endIfDone() def clientRead(self, sock): if self.readLine: data = sock.readLine() else: data = sock.read() if data != self.readData: self.deferred.errback( "Expected %r but read %r; readLine=%r" % (self.readData, data, self.readLine), ) else: self.writeNext() def echoState(self, server): if server.isReady: self.makeClient() elif server.isDone and not self.isDone: self.end(False, "Echo server failed") self.endIfDone() def echoSocketState(self, sock): self.serverSocket = sock self.endIfDone() def echoSocketRead(self, sock): if self.binaryServer: data = sock.read() if data is not None: sock.write(data) else: data = sock.readLine(default=None) if data is not None: sock.writeLine(data) def end(self, isOK, reason=None): self.endState = (isOK, reason) self.close() def makeClient(self): self.clientSocket = TCPSocket( host="localhost", port=Port, stateCallback=self.clientState, readCallback=self.clientRead, name="client", ) def writeNext(self): try: writeData, writeLine, self.readData, self.readLine = next( self.sendRcvListIter) except StopIteration: self.end(isOK=True) return if writeData is not None: if writeLine: self.clientSocket.writeLine(writeData) else: self.clientSocket.write(writeData) if self.readData is None: self.writeNext()