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