blob: 11883a88575cf1e22cf46e8d6cfd646f87560d80 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001#!/usr/bin/env python
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import time
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
10import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Barry Warsawcf3d4b51997-01-03 20:03:32 +000012
Guido van Rossum24e4af82002-06-12 19:18:08 +000013PORT = 50007
14HOST = 'localhost'
15MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000016
Guido van Rossum24e4af82002-06-12 19:18:08 +000017class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Guido van Rossum24e4af82002-06-12 19:18:08 +000019 def setUp(self):
20 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
22 self.serv.bind((HOST, PORT))
23 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000024
Guido van Rossum24e4af82002-06-12 19:18:08 +000025 def tearDown(self):
26 self.serv.close()
27 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029class SocketUDPTest(unittest.TestCase):
30
31 def setUp(self):
32 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
33 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
34 self.serv.bind((HOST, PORT))
35
36 def tearDown(self):
37 self.serv.close()
38 self.serv = None
39
40class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000041 """Threadable Test class
42
43 The ThreadableTest class makes it easy to create a threaded
44 client/server pair from an existing unit test. To create a
45 new threaded class from an existing unit test, use multiple
46 inheritance:
47
48 class NewClass (OldClass, ThreadableTest):
49 pass
50
51 This class defines two new fixture functions with obvious
52 purposes for overriding:
53
54 clientSetUp ()
55 clientTearDown ()
56
57 Any new test functions within the class must then define
58 tests in pairs, where the test name is preceeded with a
59 '_' to indicate the client portion of the test. Ex:
60
61 def testFoo(self):
62 # Server portion
63
64 def _testFoo(self):
65 # Client portion
66
67 Any exceptions raised by the clients during their tests
68 are caught and transferred to the main thread to alert
69 the testing framework.
70
71 Note, the server setup function cannot call any blocking
72 functions that rely on the client thread during setup,
73 unless serverExplicityReady() is called just before
74 the blocking call (such as in setting up a client/server
75 connection and performing the accept() in setUp().
76 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000077
78 def __init__(self):
79 # Swap the true setup function
80 self.__setUp = self.setUp
81 self.__tearDown = self.tearDown
82 self.setUp = self._setUp
83 self.tearDown = self._tearDown
84
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000085 def serverExplicitReady(self):
86 """This method allows the server to explicitly indicate that
87 it wants the client thread to proceed. This is useful if the
88 server is about to execute a blocking routine that is
89 dependent upon the client thread during its setup routine."""
90 self.server_ready.set()
91
Guido van Rossum24e4af82002-06-12 19:18:08 +000092 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000093 self.server_ready = threading.Event()
94 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000095 self.done = threading.Event()
96 self.queue = Queue.Queue(1)
97
98 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +000099 methodname = self.id()
100 i = methodname.rfind('.')
101 methodname = methodname[i+1:]
102 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000103 self.client_thread = thread.start_new_thread(
104 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000105
106 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000107 if not self.server_ready.isSet():
108 self.server_ready.set()
109 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110
111 def _tearDown(self):
112 self.__tearDown()
113 self.done.wait()
114
115 if not self.queue.empty():
116 msg = self.queue.get()
117 self.fail(msg)
118
119 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000120 self.server_ready.wait()
121 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122 self.clientSetUp()
123 if not callable(test_func):
124 raise TypeError, "test_func must be a callable function"
125 try:
126 test_func()
127 except Exception, strerror:
128 self.queue.put(strerror)
129 self.clientTearDown()
130
131 def clientSetUp(self):
132 raise NotImplementedError, "clientSetUp must be implemented."
133
134 def clientTearDown(self):
135 self.done.set()
136 thread.exit()
137
138class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
139
140 def __init__(self, methodName='runTest'):
141 SocketTCPTest.__init__(self, methodName=methodName)
142 ThreadableTest.__init__(self)
143
144 def clientSetUp(self):
145 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
146
147 def clientTearDown(self):
148 self.cli.close()
149 self.cli = None
150 ThreadableTest.clientTearDown(self)
151
152class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
153
154 def __init__(self, methodName='runTest'):
155 SocketUDPTest.__init__(self, methodName=methodName)
156 ThreadableTest.__init__(self)
157
158 def clientSetUp(self):
159 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
160
161class SocketConnectedTest(ThreadedTCPSocketTest):
162
163 def __init__(self, methodName='runTest'):
164 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
165
166 def setUp(self):
167 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000168 # Indicate explicitly we're ready for the client thread to
169 # proceed and then perform the blocking call to accept
170 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000171 conn, addr = self.serv.accept()
172 self.cli_conn = conn
173
174 def tearDown(self):
175 self.cli_conn.close()
176 self.cli_conn = None
177 ThreadedTCPSocketTest.tearDown(self)
178
179 def clientSetUp(self):
180 ThreadedTCPSocketTest.clientSetUp(self)
181 self.cli.connect((HOST, PORT))
182 self.serv_conn = self.cli
183
184 def clientTearDown(self):
185 self.serv_conn.close()
186 self.serv_conn = None
187 ThreadedTCPSocketTest.clientTearDown(self)
188
189#######################################################################
190## Begin Tests
191
192class GeneralModuleTests(unittest.TestCase):
193
194 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000195 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000196 def raise_error(*args, **kwargs):
197 raise socket.error
198 def raise_herror(*args, **kwargs):
199 raise socket.herror
200 def raise_gaierror(*args, **kwargs):
201 raise socket.gaierror
202 self.failUnlessRaises(socket.error, raise_error,
203 "Error raising socket exception.")
204 self.failUnlessRaises(socket.error, raise_herror,
205 "Error raising socket exception.")
206 self.failUnlessRaises(socket.error, raise_gaierror,
207 "Error raising socket exception.")
208
209 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000210 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211 socket.AF_INET
212 socket.SOCK_STREAM
213 socket.SOCK_DGRAM
214 socket.SOCK_RAW
215 socket.SOCK_RDM
216 socket.SOCK_SEQPACKET
217 socket.SOL_SOCKET
218 socket.SO_REUSEADDR
219
Guido van Rossum654c11e2002-06-13 20:24:17 +0000220 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000221 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000222 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000223 try:
224 ip = socket.gethostbyname(hostname)
225 except socket.error:
226 # Probably name lookup wasn't set up right; skip this test
227 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000228 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
229 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
230 all_host_names = [hname] + aliases
231 fqhn = socket.getfqdn()
232 if not fqhn in all_host_names:
233 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000234
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000235 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000236 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000238 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 try:
240 # On some versions, this loses a reference
241 orig = sys.getrefcount(__name__)
242 socket.getnameinfo(__name__,0)
243 except SystemError:
244 if sys.getrefcount(__name__) <> orig:
245 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000248 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249 try:
250 # On some versions, this crashes the interpreter.
251 socket.getnameinfo(('x', 0, 0, 0), 0)
252 except socket.error:
253 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000254
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000255 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000256 # This just checks that htons etc. are their own inverse,
257 # when looking at the lower 16 or 32 bits.
258 sizes = {socket.htonl: 32, socket.ntohl: 32,
259 socket.htons: 16, socket.ntohs: 16}
260 for func, size in sizes.items():
261 mask = (1L<<size) - 1
262 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
263 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000264
Guido van Rossuma2627af2002-09-14 00:58:46 +0000265 swapped = func(mask)
266 self.assertEqual(swapped & mask, mask)
267 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000268
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 def testGetServByName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000270 # Testing getservbyname()
Skip Montanarof4433302002-08-02 15:52:30 +0000271 # try a few protocols - not everyone has telnet enabled
272 found = 0
273 for proto in ("telnet", "ssh", "www", "ftp"):
274 try:
275 socket.getservbyname(proto, 'tcp')
276 found = 1
277 break
278 except socket.error:
279 pass
280 try:
281 socket.getservbyname(proto, 'udp')
282 found = 1
283 break
284 except socket.error:
285 pass
286 if not found:
287 raise socket.error
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000289 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000290 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000291 # The default timeout should initially be None
292 self.assertEqual(socket.getdefaulttimeout(), None)
293 s = socket.socket()
294 self.assertEqual(s.gettimeout(), None)
295 s.close()
296
297 # Set the default timeout to 10, and see if it propagates
298 socket.setdefaulttimeout(10)
299 self.assertEqual(socket.getdefaulttimeout(), 10)
300 s = socket.socket()
301 self.assertEqual(s.gettimeout(), 10)
302 s.close()
303
304 # Reset the default timeout to None, and see if it propagates
305 socket.setdefaulttimeout(None)
306 self.assertEqual(socket.getdefaulttimeout(), None)
307 s = socket.socket()
308 self.assertEqual(s.gettimeout(), None)
309 s.close()
310
311 # Check that setting it to an invalid value raises ValueError
312 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
313
314 # Check that setting it to an invalid type raises TypeError
315 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
316
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000317 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000318
Guido van Rossum24e4af82002-06-12 19:18:08 +0000319 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000320 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000321 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000322 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000324 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325
326 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000327 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000328 # We know a socket should start without reuse==0
329 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
330 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000331 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332
333 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000334 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
336 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
337 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000338 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000339
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000340 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000341 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000342 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
343 sock.settimeout(1)
344 sock.close()
345 self.assertRaises(socket.error, sock.send, "spam")
346
Guido van Rossum24e4af82002-06-12 19:18:08 +0000347class BasicTCPTest(SocketConnectedTest):
348
349 def __init__(self, methodName='runTest'):
350 SocketConnectedTest.__init__(self, methodName=methodName)
351
352 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000353 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000354 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000355 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000356
357 def _testRecv(self):
358 self.serv_conn.send(MSG)
359
360 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000361 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362 seg1 = self.cli_conn.recv(len(MSG) - 3)
363 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000364 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000365 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366
367 def _testOverFlowRecv(self):
368 self.serv_conn.send(MSG)
369
370 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000371 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000372 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000373 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000374
375 def _testRecvFrom(self):
376 self.serv_conn.send(MSG)
377
378 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000379 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000380 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
381 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000382 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000383 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000384
385 def _testOverFlowRecvFrom(self):
386 self.serv_conn.send(MSG)
387
388 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000389 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000390 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000391 while 1:
392 read = self.cli_conn.recv(1024)
393 if not read:
394 break
Guido van Rossume531e292002-08-08 20:28:34 +0000395 msg += read
396 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000397
398 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000399 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000400 self.serv_conn.sendall(big_chunk)
401
402 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000403 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000404 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000405 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000406 fd = self.cli_conn.fileno()
407 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
408 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000409 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000410
411 def _testFromFd(self):
412 self.serv_conn.send(MSG)
413
414 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000415 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000416 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000417 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000418
419 def _testShutdown(self):
420 self.serv_conn.send(MSG)
421 self.serv_conn.shutdown(2)
422
423class BasicUDPTest(ThreadedUDPSocketTest):
424
425 def __init__(self, methodName='runTest'):
426 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
427
428 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000429 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000430 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000431 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000432
433 def _testSendtoAndRecv(self):
434 self.cli.sendto(MSG, 0, (HOST, PORT))
435
Guido van Rossum1c938012002-06-12 21:17:20 +0000436 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000437 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000438 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000439 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000440
Guido van Rossum1c938012002-06-12 21:17:20 +0000441 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000442 self.cli.sendto(MSG, 0, (HOST, PORT))
443
444class NonBlockingTCPTests(ThreadedTCPSocketTest):
445
446 def __init__(self, methodName='runTest'):
447 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
448
449 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000450 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451 self.serv.setblocking(0)
452 start = time.time()
453 try:
454 self.serv.accept()
455 except socket.error:
456 pass
457 end = time.time()
458 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
459
460 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000461 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000462
Guido van Rossum24e4af82002-06-12 19:18:08 +0000463 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000464 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000466 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000467 conn, addr = self.serv.accept()
468 except socket.error:
469 pass
470 else:
471 self.fail("Error trying to do non-blocking accept.")
472 read, write, err = select.select([self.serv], [], [])
473 if self.serv in read:
474 conn, addr = self.serv.accept()
475 else:
476 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000477
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000479 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480 self.cli.connect((HOST, PORT))
481
482 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000483 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 conn, addr = self.serv.accept()
485
486 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000487 self.cli.settimeout(10)
488 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489
490 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000491 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000492 conn, addr = self.serv.accept()
493 conn.setblocking(0)
494 try:
495 msg = conn.recv(len(MSG))
496 except socket.error:
497 pass
498 else:
499 self.fail("Error trying to do non-blocking recv.")
500 read, write, err = select.select([conn], [], [])
501 if conn in read:
502 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000503 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000504 else:
505 self.fail("Error during select call to non-blocking socket.")
506
507 def _testRecv(self):
508 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000509 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 self.cli.send(MSG)
511
512class FileObjectClassTestCase(SocketConnectedTest):
513
Guido van Rossume9f66142002-08-07 15:46:19 +0000514 bufsize = -1 # Use default buffer size
515
Guido van Rossum24e4af82002-06-12 19:18:08 +0000516 def __init__(self, methodName='runTest'):
517 SocketConnectedTest.__init__(self, methodName=methodName)
518
519 def setUp(self):
520 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000521 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522
523 def tearDown(self):
524 self.serv_file.close()
525 self.serv_file = None
526 SocketConnectedTest.tearDown(self)
527
528 def clientSetUp(self):
529 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000530 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531
532 def clientTearDown(self):
533 self.cli_file.close()
534 self.cli_file = None
535 SocketConnectedTest.clientTearDown(self)
536
537 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000538 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539 first_seg = self.serv_file.read(len(MSG)-3)
540 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000541 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000542 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543
544 def _testSmallRead(self):
545 self.cli_file.write(MSG)
546 self.cli_file.flush()
547
Guido van Rossum8c943832002-08-08 01:00:28 +0000548 def testFullRead(self):
549 # read until EOF
550 msg = self.serv_file.read()
551 self.assertEqual(msg, MSG)
552
553 def _testFullRead(self):
554 self.cli_file.write(MSG)
555 self.cli_file.close()
556
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000558 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559 buf = ''
560 while 1:
561 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000562 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 buf += char
565 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566
567 def _testUnbufferedRead(self):
568 self.cli_file.write(MSG)
569 self.cli_file.flush()
570
571 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000574 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575
576 def _testReadline(self):
577 self.cli_file.write(MSG)
578 self.cli_file.flush()
579
Guido van Rossume9f66142002-08-07 15:46:19 +0000580class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
581
582 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000583
Guido van Rossume9f66142002-08-07 15:46:19 +0000584 In this case (and in this case only), it should be possible to
585 create a file object, read a line from it, create another file
586 object, read another line from it, without loss of data in the
587 first file object's buffer. Note that httplib relies on this
588 when reading multiple requests from the same socket."""
589
590 bufsize = 0 # Use unbuffered mode
591
592 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000593 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000594 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000595 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000596 self.serv_file = self.cli_conn.makefile('rb', 0)
597 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000598 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000599
600 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000601 self.cli_file.write("A. " + MSG)
602 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000603 self.cli_file.flush()
604
Guido van Rossum8c943832002-08-08 01:00:28 +0000605class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
606
607 bufsize = 1 # Default-buffered for reading; line-buffered for writing
608
609
610class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
611
612 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000613
Guido van Rossumb995eb72002-07-31 16:08:40 +0000614def test_main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000615 suite = unittest.TestSuite()
Guido van Rossum29bf9152002-08-07 16:03:06 +0000616 suite.addTest(unittest.makeSuite(GeneralModuleTests))
617 suite.addTest(unittest.makeSuite(BasicTCPTest))
Jack Jansen522e7692002-09-06 21:57:50 +0000618 if sys.platform != 'mac':
619 suite.addTest(unittest.makeSuite(BasicUDPTest))
Guido van Rossum29bf9152002-08-07 16:03:06 +0000620 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
Guido van Rossume9f66142002-08-07 15:46:19 +0000622 suite.addTest(unittest.makeSuite(UnbufferedFileObjectClassTestCase))
Guido van Rossum8c943832002-08-08 01:00:28 +0000623 suite.addTest(unittest.makeSuite(LineBufferedFileObjectClassTestCase))
624 suite.addTest(unittest.makeSuite(SmallBufferedFileObjectClassTestCase))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625 test_support.run_suite(suite)
626
627if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000628 test_main()