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",
     )
class TestRunner(object):
    def __init__(self, sendRcvList, binaryServer=False):
        self.sendRcvListIter = iter(sendRcvList)
        self.binaryServer = bool(binaryServer)
        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 TestRunner(object):
    def __init__(self, sendRcvList, binaryServer=False):
        self.sendRcvListIter = iter(sendRcvList)
        self.binaryServer = bool(binaryServer)
        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()