1 # Test suite for SocketServer.py
3 from test
import test_support
4 from test
.test_support
import verbose
, verify
, TESTFN
, TestSkipped
5 test_support
.requires('network')
7 from SocketServer
import *
20 line
= self
.rfile
.readline()
22 self
.wfile
.write(line
)
24 class MyStreamHandler(MyMixinHandler
, StreamRequestHandler
):
27 class MyDatagramHandler(MyMixinHandler
, DatagramRequestHandler
):
31 def serve_a_few(self
):
34 def handle_error(self
, request
, client_address
):
35 self
.close_request(request
)
39 teststring
= "hello world\n"
41 def receive(sock
, n
, timeout
=20):
42 r
, w
, x
= select
.select([sock
], [], [], timeout
)
46 raise RuntimeError, "timed out on %s" % `sock`
48 def testdgram(proto
, addr
):
49 s
= socket
.socket(proto
, socket
.SOCK_DGRAM
)
50 s
.sendto(teststring
, addr
)
51 buf
= data
= receive(s
, 100)
52 while data
and '\n' not in buf
:
53 data
= receive(s
, 100)
55 verify(buf
== teststring
)
58 def teststream(proto
, addr
):
59 s
= socket
.socket(proto
, socket
.SOCK_STREAM
)
62 buf
= data
= receive(s
, 100)
63 while data
and '\n' not in buf
:
64 data
= receive(s
, 100)
66 verify(buf
== teststring
)
69 class ServerThread(threading
.Thread
):
70 def __init__(self
, addr
, svrcls
, hdlrcls
):
71 threading
.Thread
.__init
__(self
)
73 self
.__svrcls
= svrcls
74 self
.__hdlrcls
= hdlrcls
76 class svrcls(MyMixinServer
, self
.__svrcls
):
78 if verbose
: print "thread: creating server"
79 svr
= svrcls(self
.__addr
, self
.__hdlrcls
)
80 if verbose
: print "thread: serving three times"
82 if verbose
: print "thread: done"
88 return 10000 + (os
.getpid() % 1000)*10 + seed
93 if proto
== socket
.AF_INET
:
94 return (host
, pickport())
96 fn
= TESTFN
+ str(pickport())
108 def testloop(proto
, servers
, hdlrcls
, testfunc
):
109 for svrcls
in servers
:
110 addr
= pickaddr(proto
)
113 print "CLASS =", svrcls
114 t
= ServerThread(addr
, svrcls
, hdlrcls
)
115 if verbose
: print "server created"
117 if verbose
: print "server running"
118 for i
in range(NREQ
):
120 if verbose
: print "test client", i
121 testfunc(proto
, addr
)
122 if verbose
: print "waiting for server"
124 if verbose
: print "done"
126 tcpservers
= [TCPServer
, ThreadingTCPServer
]
127 if hasattr(os
, 'fork'):
128 tcpservers
.append(ForkingTCPServer
)
129 udpservers
= [UDPServer
, ThreadingUDPServer
]
130 if hasattr(os
, 'fork'):
131 udpservers
.append(ForkingUDPServer
)
133 if not hasattr(socket
, 'AF_UNIX'):
137 class ForkingUnixStreamServer(ForkingMixIn
, UnixStreamServer
): pass
138 streamservers
= [UnixStreamServer
, ThreadingUnixStreamServer
,
139 ForkingUnixStreamServer
]
140 class ForkingUnixDatagramServer(ForkingMixIn
, UnixDatagramServer
): pass
141 dgramservers
= [UnixDatagramServer
, ThreadingUnixDatagramServer
,
142 ForkingUnixDatagramServer
]
145 testloop(socket
.AF_INET
, tcpservers
, MyStreamHandler
, teststream
)
146 testloop(socket
.AF_INET
, udpservers
, MyDatagramHandler
, testdgram
)
147 if hasattr(socket
, 'AF_UNIX'):
148 testloop(socket
.AF_UNIX
, streamservers
, MyStreamHandler
, teststream
)
149 # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
150 # client address so this cannot work:
151 ##testloop(socket.AF_UNIX, dgramservers, MyDatagramHandler, testdgram)
156 # If the import lock is held, the threads will hang.
157 raise TestSkipped("can't run when import lock is held")
164 if __name__
== "__main__":