test_socketserver.py
来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 166 行
PY
166 行
# Test suite for SocketServer.pyimport test_supportfrom test_support import verbose, verify, TESTFN, TestSkippedtest_support.requires('network')from SocketServer import *import socketimport selectimport timeimport threadingimport osNREQ = 3DELAY = 0.5class MyMixinHandler: def handle(self): time.sleep(DELAY) line = self.rfile.readline() time.sleep(DELAY) self.wfile.write(line)class MyStreamHandler(MyMixinHandler, StreamRequestHandler): passclass MyDatagramHandler(MyMixinHandler, DatagramRequestHandler): passclass MyMixinServer: def serve_a_few(self): for i in range(NREQ): self.handle_request() def handle_error(self, request, client_address): self.close_request(request) self.server_close() raiseteststring = "hello world\n"def receive(sock, n, timeout=20): r, w, x = select.select([sock], [], [], timeout) if sock in r: return sock.recv(n) else: raise RuntimeError, "timed out on %s" % `sock`def testdgram(proto, addr): s = socket.socket(proto, socket.SOCK_DGRAM) s.sendto(teststring, addr) buf = data = receive(s, 100) while data and '\n' not in buf: data = receive(s, 100) buf += data verify(buf == teststring) s.close()def teststream(proto, addr): s = socket.socket(proto, socket.SOCK_STREAM) s.connect(addr) s.sendall(teststring) buf = data = receive(s, 100) while data and '\n' not in buf: data = receive(s, 100) buf += data verify(buf == teststring) s.close()class ServerThread(threading.Thread): def __init__(self, addr, svrcls, hdlrcls): threading.Thread.__init__(self) self.__addr = addr self.__svrcls = svrcls self.__hdlrcls = hdlrcls def run(self): class svrcls(MyMixinServer, self.__svrcls): pass if verbose: print "thread: creating server" svr = svrcls(self.__addr, self.__hdlrcls) if verbose: print "thread: serving three times" svr.serve_a_few() if verbose: print "thread: done"seed = 0def pickport(): global seed seed += 1 return 10000 + (os.getpid() % 1000)*10 + seedhost = "localhost"testfiles = []def pickaddr(proto): if proto == socket.AF_INET: return (host, pickport()) else: fn = TESTFN + str(pickport()) testfiles.append(fn) return fndef cleanup(): for fn in testfiles: try: os.remove(fn) except os.error: pass testfiles[:] = []def testloop(proto, servers, hdlrcls, testfunc): for svrcls in servers: addr = pickaddr(proto) if verbose: print "ADDR =", addr print "CLASS =", svrcls t = ServerThread(addr, svrcls, hdlrcls) if verbose: print "server created" t.start() if verbose: print "server running" for i in range(NREQ): time.sleep(DELAY) if verbose: print "test client", i testfunc(proto, addr) if verbose: print "waiting for server" t.join() if verbose: print "done"tcpservers = [TCPServer, ThreadingTCPServer]if hasattr(os, 'fork'): tcpservers.append(ForkingTCPServer)udpservers = [UDPServer, ThreadingUDPServer]if hasattr(os, 'fork'): udpservers.append(ForkingUDPServer)if not hasattr(socket, 'AF_UNIX'): streamservers = [] dgramservers = []else: class ForkingUnixStreamServer(ForkingMixIn, UnixStreamServer): pass streamservers = [UnixStreamServer, ThreadingUnixStreamServer, ForkingUnixStreamServer] class ForkingUnixDatagramServer(ForkingMixIn, UnixDatagramServer): pass dgramservers = [UnixDatagramServer, ThreadingUnixDatagramServer, ForkingUnixDatagramServer]def testall(): testloop(socket.AF_INET, tcpservers, MyStreamHandler, teststream) testloop(socket.AF_INET, udpservers, MyDatagramHandler, testdgram) if hasattr(socket, 'AF_UNIX'): testloop(socket.AF_UNIX, streamservers, MyStreamHandler, teststream) # Alas, on Linux (at least) recvfrom() doesn't return a meaningful # client address so this cannot work: ##testloop(socket.AF_UNIX, dgramservers, MyDatagramHandler, testdgram)def test_main(): import imp if imp.lock_held(): # If the import lock is held, the threads will hang. raise TestSkipped("can't run when import lock is held") try: testall() finally: cleanup()if __name__ == "__main__": test_main()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?