Ticket #4932: echotest_portable.py

File echotest_portable.py, 1.9 KB (added by detly, 4 years ago)
Line 
1import time
2from twisted.internet.protocol import ClientCreator, BaseProtocol
3from twisted.internet import defer
4
5DATA = "*"
6
7class SyncProtocol(BaseProtocol):
8
9    def __init__(self, number):
10        self.deferred = defer.Deferred()
11        self.total = number
12        self.number = 0
13
14    def check(self):
15        return self.deferred
16
17    def dataReceived(self, data):
18        for octet in data:
19            if data != DATA:
20                self.sessionError(Exception("Non-prompt character"))
21                break
22            else:
23                self.number += 1
24
25            if self.number >= self.total:
26                self.sessionComplete()
27                break
28
29            self.transport.write(DATA)
30
31    def connectionMade(self):
32        print "Connection made!"
33        self.start = time.time()
34        self.transport.write(DATA)
35
36    def sessionComplete(self):
37        self.finishSession()
38        self.deferred.callback(self.end - self.start)
39
40    def sessionError(self, err):
41        self.finishSession()
42        self.deferred.errback(err)
43
44    def finishSession(self):
45        self.end = time.time()
46        self.transport.loseConnection()
47
48    def connectionLost(self, reason):
49        pass
50
51
52def print_error(failure):
53    print failure.getErrorMessage()
54    return failure
55
56def print_time(duration):
57    print "Time: %f" % duration
58
59def go(reac):
60    print "Using reactor: %s" % type(reac).__name__
61    prc = ClientCreator(reactor, SyncProtocol, 500)
62    d = prc.connectTCP("localhost", 31415)
63    d.addCallback(lambda prot: prot.check())
64    d.addCallback(print_time)
65    d.addErrback(print_error)
66    d.addBoth(lambda _: reac.stop())
67    return d
68
69if __name__ == "__main__":
70    from twisted.internet import gtk2reactor
71    gtk2reactor.portableInstall()
72    from twisted.internet import reactor
73    reactor.callWhenRunning(go, reactor)
74    reactor.run()