first draft
[tests.git] / system / tcptest.py
1 #!/usr/bin/env python
2
3 import sys
4 import time
5 from optparse import OptionParser    
6 import socket
7 import SocketServer
8
9 def myprint(message):
10     now=time.strftime("%H:%M:%S", time.localtime())
11     print "*",now,'--',message
12
13 class EchoRequestHandler(SocketServer.StreamRequestHandler):
14     def handle(self):
15         line = self.rfile.readline()
16         self.wfile.write(line)
17
18 class UppercaseRequestHandler(SocketServer.StreamRequestHandler):
19     def handle(self):
20         line = self.rfile.readline()
21         self.wfile.write(line.upper())
22
23 class Server:
24
25     def main(self):
26         import threading
27
28         parser=OptionParser()
29         parser.add_option("-p","--port", action="store", dest="port", type="int",
30                           default=10000, help="port number")
31         parser.add_option("-a","--address", action="store", dest="address", 
32                           default=socket.gethostname(), help="address")
33         parser.add_option("-t","--timeout", action="store", dest="timeout", type="int",
34                           default="0")
35         
36         (options, args) = parser.parse_args()
37         if len(args) != 0:
38             parser.print_help()
39             sys.exit(1)
40
41         server = SocketServer.TCPServer((options.address, options.port),
42                                         UppercaseRequestHandler)
43
44         try:
45             if options.timeout:
46                 t = threading.Thread(target=server.serve_forever)
47                 t.setDaemon(True) # don't hang on exit
48                 t.start()
49                 time.sleep(options.timeout)
50                 sys.exit(0)
51             else:
52                 server.serve_forever()        
53         except KeyboardInterrupt:
54             print 'Bailing out'
55             sys.exit(1)
56
57 class Client:
58     def main(self):
59         from optparse import OptionParser    
60
61         parser=OptionParser()
62         parser.add_option("-p","--port", action="store", dest="port", type="int",
63                           default=10000, help="port number")
64         parser.add_option("-a","--address", action="store", dest="address", 
65                           default=socket.gethostname(), help="address")
66         parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
67                           default=1, help="sleep seconds")
68         parser.add_option("-l","--loops", action="store", dest="loops", type="int",
69                           default=1, help="iteration loops")
70         
71         (options, args) = parser.parse_args()
72         if len(args) != 0:
73             parser.print_help()
74             sys.exit(1)
75
76         result=True
77         for i in range(1,options.loops+1):
78             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
79             s.connect((options.address , options.port))
80             mout=i*'ping ' + '\n'
81             min=mout.upper()
82             if s.send(mout) != len(mout):
83                 myprint("cannot send %s"%mout.strip())
84                 result=False
85                 break
86             line=s.recv(len(min))
87             if line is not line:
88                 myprint("unexpected reception\ngot:%s\nexpected: %s",line,min)
89                 result=False
90             else:
91                 myprint("OK:%s"%mout.strip())
92             # leave the connection open, but the last one (so 1 iter returns fast)
93             if i != options.loops:
94                 time.sleep(options.sleep)
95             myprint("disconnecting")
96             s.close()
97         myprint("Done")
98         exit_return=0
99         if not result: exit_return=1
100         sys.exit(exit_return)
101
102 if __name__ == '__main__':
103     for argv in sys.argv[1:]:
104         if argv.find("client") >= 0:
105             sys.argv.remove(argv)
106             Client().main()
107         elif argv.find("server") >= 0:
108             sys.argv.remove(argv)
109             Server().main()
110     print 'you must specify either --client or --server'
111     sys.exit(1)