first draft
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 13 Feb 2008 18:42:49 +0000 (18:42 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 13 Feb 2008 18:42:49 +0000 (18:42 +0000)
system/tcptest.py [new file with mode: 0755]

diff --git a/system/tcptest.py b/system/tcptest.py
new file mode 100755 (executable)
index 0000000..975bc16
--- /dev/null
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+
+import sys
+import time
+from optparse import OptionParser    
+import socket
+import SocketServer
+
+def myprint(message):
+    now=time.strftime("%H:%M:%S", time.localtime())
+    print "*",now,'--',message
+
+class EchoRequestHandler(SocketServer.StreamRequestHandler):
+    def handle(self):
+        line = self.rfile.readline()
+        self.wfile.write(line)
+
+class UppercaseRequestHandler(SocketServer.StreamRequestHandler):
+    def handle(self):
+        line = self.rfile.readline()
+        self.wfile.write(line.upper())
+
+class Server:
+
+    def main(self):
+        import threading
+
+        parser=OptionParser()
+        parser.add_option("-p","--port", action="store", dest="port", type="int",
+                          default=10000, help="port number")
+        parser.add_option("-a","--address", action="store", dest="address", 
+                          default=socket.gethostname(), help="address")
+        parser.add_option("-t","--timeout", action="store", dest="timeout", type="int",
+                          default="0")
+        
+        (options, args) = parser.parse_args()
+        if len(args) != 0:
+            parser.print_help()
+            sys.exit(1)
+
+        server = SocketServer.TCPServer((options.address, options.port),
+                                        UppercaseRequestHandler)
+
+        try:
+            if options.timeout:
+                t = threading.Thread(target=server.serve_forever)
+                t.setDaemon(True) # don't hang on exit
+                t.start()
+                time.sleep(options.timeout)
+                sys.exit(0)
+            else:
+                server.serve_forever()        
+        except KeyboardInterrupt:
+            print 'Bailing out'
+            sys.exit(1)
+
+class Client:
+    def main(self):
+        from optparse import OptionParser    
+
+        parser=OptionParser()
+        parser.add_option("-p","--port", action="store", dest="port", type="int",
+                          default=10000, help="port number")
+        parser.add_option("-a","--address", action="store", dest="address", 
+                          default=socket.gethostname(), help="address")
+        parser.add_option("-s","--sleep", action="store", dest="sleep", type="int",
+                          default=1, help="sleep seconds")
+        parser.add_option("-l","--loops", action="store", dest="loops", type="int",
+                          default=1, help="iteration loops")
+        
+        (options, args) = parser.parse_args()
+        if len(args) != 0:
+            parser.print_help()
+            sys.exit(1)
+
+        result=True
+        for i in range(1,options.loops+1):
+            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            s.connect((options.address , options.port))
+            mout=i*'ping ' + '\n'
+            min=mout.upper()
+            if s.send(mout) != len(mout):
+                myprint("cannot send %s"%mout.strip())
+                result=False
+                break
+            line=s.recv(len(min))
+            if line is not line:
+                myprint("unexpected reception\ngot:%s\nexpected: %s",line,min)
+                result=False
+            else:
+                myprint("OK:%s"%mout.strip())
+            # leave the connection open, but the last one (so 1 iter returns fast)
+            if i != options.loops:
+                time.sleep(options.sleep)
+            myprint("disconnecting")
+            s.close()
+        myprint("Done")
+        exit_return=0
+        if not result: exit_return=1
+        sys.exit(exit_return)
+
+if __name__ == '__main__':
+    for argv in sys.argv[1:]:
+        if argv.find("client") >= 0:
+            sys.argv.remove(argv)
+            Client().main()
+        elif argv.find("server") >= 0:
+            sys.argv.remove(argv)
+            Server().main()
+    print 'you must specify either --client or --server'
+    sys.exit(1)