blob: b4540a4a35d89b845a135fc21dcd625ae7172514 [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
4import 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
Barry Warsawcf3d4b51997-01-03 20:03:32 +000011
Guido van Rossum24e4af82002-06-12 19:18:08 +000012PORT = 50007
13HOST = 'localhost'
14MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000015
Guido van Rossum24e4af82002-06-12 19:18:08 +000016class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018 def setUp(self):
19 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
20 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
21 self.serv.bind((HOST, PORT))
22 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Guido van Rossum24e4af82002-06-12 19:18:08 +000024 def tearDown(self):
25 self.serv.close()
26 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000027
Guido van Rossum24e4af82002-06-12 19:18:08 +000028class SocketUDPTest(unittest.TestCase):
29
30 def setUp(self):
31 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
32 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
33 self.serv.bind((HOST, PORT))
34
35 def tearDown(self):
36 self.serv.close()
37 self.serv = None
38
39class ThreadableTest:
40
41 def __init__(self):
42 # Swap the true setup function
43 self.__setUp = self.setUp
44 self.__tearDown = self.tearDown
45 self.setUp = self._setUp
46 self.tearDown = self._tearDown
47
48 def _setUp(self):
49 self.ready = threading.Event()
50 self.done = threading.Event()
51 self.queue = Queue.Queue(1)
52
53 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +000054 methodname = self.id()
55 i = methodname.rfind('.')
56 methodname = methodname[i+1:]
57 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +000058 self.client_thread = thread.start_new_thread(
59 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +000060
61 self.__setUp()
62 self.ready.wait()
63
64 def _tearDown(self):
65 self.__tearDown()
66 self.done.wait()
67
68 if not self.queue.empty():
69 msg = self.queue.get()
70 self.fail(msg)
71
72 def clientRun(self, test_func):
73 self.ready.set()
74 self.clientSetUp()
75 if not callable(test_func):
76 raise TypeError, "test_func must be a callable function"
77 try:
78 test_func()
79 except Exception, strerror:
80 self.queue.put(strerror)
81 self.clientTearDown()
82
83 def clientSetUp(self):
84 raise NotImplementedError, "clientSetUp must be implemented."
85
86 def clientTearDown(self):
87 self.done.set()
88 thread.exit()
89
90class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
91
92 def __init__(self, methodName='runTest'):
93 SocketTCPTest.__init__(self, methodName=methodName)
94 ThreadableTest.__init__(self)
95
96 def clientSetUp(self):
97 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
98
99 def clientTearDown(self):
100 self.cli.close()
101 self.cli = None
102 ThreadableTest.clientTearDown(self)
103
104class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
105
106 def __init__(self, methodName='runTest'):
107 SocketUDPTest.__init__(self, methodName=methodName)
108 ThreadableTest.__init__(self)
109
110 def clientSetUp(self):
111 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
112
113class SocketConnectedTest(ThreadedTCPSocketTest):
114
115 def __init__(self, methodName='runTest'):
116 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
117
118 def setUp(self):
119 ThreadedTCPSocketTest.setUp(self)
120 conn, addr = self.serv.accept()
121 self.cli_conn = conn
122
123 def tearDown(self):
124 self.cli_conn.close()
125 self.cli_conn = None
126 ThreadedTCPSocketTest.tearDown(self)
127
128 def clientSetUp(self):
129 ThreadedTCPSocketTest.clientSetUp(self)
130 self.cli.connect((HOST, PORT))
131 self.serv_conn = self.cli
132
133 def clientTearDown(self):
134 self.serv_conn.close()
135 self.serv_conn = None
136 ThreadedTCPSocketTest.clientTearDown(self)
137
138#######################################################################
139## Begin Tests
140
141class GeneralModuleTests(unittest.TestCase):
142
143 def testSocketError(self):
144 """Testing that socket module exceptions."""
145 def raise_error(*args, **kwargs):
146 raise socket.error
147 def raise_herror(*args, **kwargs):
148 raise socket.herror
149 def raise_gaierror(*args, **kwargs):
150 raise socket.gaierror
151 self.failUnlessRaises(socket.error, raise_error,
152 "Error raising socket exception.")
153 self.failUnlessRaises(socket.error, raise_herror,
154 "Error raising socket exception.")
155 self.failUnlessRaises(socket.error, raise_gaierror,
156 "Error raising socket exception.")
157
158 def testCrucialConstants(self):
159 """Testing for mission critical constants."""
160 socket.AF_INET
161 socket.SOCK_STREAM
162 socket.SOCK_DGRAM
163 socket.SOCK_RAW
164 socket.SOCK_RDM
165 socket.SOCK_SEQPACKET
166 socket.SOL_SOCKET
167 socket.SO_REUSEADDR
168
169 def testNonCrucialConstants(self):
170 """Testing for existance of non-crucial constants."""
171 for const in (
172 "AF_UNIX",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000173
Guido van Rossum41360a41998-03-26 19:42:58 +0000174 "SO_DEBUG", "SO_ACCEPTCONN", "SO_REUSEADDR", "SO_KEEPALIVE",
175 "SO_DONTROUTE", "SO_BROADCAST", "SO_USELOOPBACK", "SO_LINGER",
176 "SO_OOBINLINE", "SO_REUSEPORT", "SO_SNDBUF", "SO_RCVBUF",
177 "SO_SNDLOWAT", "SO_RCVLOWAT", "SO_SNDTIMEO", "SO_RCVTIMEO",
178 "SO_ERROR", "SO_TYPE", "SOMAXCONN",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000179
Guido van Rossum41360a41998-03-26 19:42:58 +0000180 "MSG_OOB", "MSG_PEEK", "MSG_DONTROUTE", "MSG_EOR",
181 "MSG_TRUNC", "MSG_CTRUNC", "MSG_WAITALL", "MSG_BTAG",
182 "MSG_ETAG",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000183
Guido van Rossum41360a41998-03-26 19:42:58 +0000184 "SOL_SOCKET",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000185
Guido van Rossum41360a41998-03-26 19:42:58 +0000186 "IPPROTO_IP", "IPPROTO_ICMP", "IPPROTO_IGMP",
187 "IPPROTO_GGP", "IPPROTO_TCP", "IPPROTO_EGP",
188 "IPPROTO_PUP", "IPPROTO_UDP", "IPPROTO_IDP",
189 "IPPROTO_HELLO", "IPPROTO_ND", "IPPROTO_TP",
190 "IPPROTO_XTP", "IPPROTO_EON", "IPPROTO_BIP",
191 "IPPROTO_RAW", "IPPROTO_MAX",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000192
Guido van Rossum41360a41998-03-26 19:42:58 +0000193 "IPPORT_RESERVED", "IPPORT_USERRESERVED",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000194
Guido van Rossum41360a41998-03-26 19:42:58 +0000195 "INADDR_ANY", "INADDR_BROADCAST", "INADDR_LOOPBACK",
196 "INADDR_UNSPEC_GROUP", "INADDR_ALLHOSTS_GROUP",
197 "INADDR_MAX_LOCAL_GROUP", "INADDR_NONE",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000198
Guido van Rossum41360a41998-03-26 19:42:58 +0000199 "IP_OPTIONS", "IP_HDRINCL", "IP_TOS", "IP_TTL",
200 "IP_RECVOPTS", "IP_RECVRETOPTS", "IP_RECVDSTADDR",
201 "IP_RETOPTS", "IP_MULTICAST_IF", "IP_MULTICAST_TTL",
202 "IP_MULTICAST_LOOP", "IP_ADD_MEMBERSHIP",
203 "IP_DROP_MEMBERSHIP",
Guido van Rossum24e4af82002-06-12 19:18:08 +0000204 ):
205 try:
206 getattr(socket, const)
207 except AttributeError:
208 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000209
Guido van Rossum654c11e2002-06-13 20:24:17 +0000210 def testHostnameRes(self):
211 """Testing hostname resolution mechanisms."""
212 hostname = socket.gethostname()
213 ip = socket.gethostbyname(hostname)
214 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
215 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
216 all_host_names = [hname] + aliases
217 fqhn = socket.getfqdn()
218 if not fqhn in all_host_names:
219 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000220
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000221 def testRefCountGetNameInfo(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000222 """Testing reference count for getnameinfo."""
223 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000224 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000225 try:
226 # On some versions, this loses a reference
227 orig = sys.getrefcount(__name__)
228 socket.getnameinfo(__name__,0)
229 except SystemError:
230 if sys.getrefcount(__name__) <> orig:
231 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000232
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def testInterpreterCrash(self):
234 """Making sure getnameinfo doesn't crash the interpreter."""
235 try:
236 # On some versions, this crashes the interpreter.
237 socket.getnameinfo(('x', 0, 0, 0), 0)
238 except socket.error:
239 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000240
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241 def testGetServByName(self):
Guido van Rossum1c938012002-06-12 21:17:20 +0000242 """Testing getservbyname()."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 if hasattr(socket, 'getservbyname'):
244 socket.getservbyname('telnet', 'tcp')
245 try:
246 socket.getservbyname('telnet', 'udp')
247 except socket.error:
248 pass
249
250 def testSockName(self):
251 """Testing getsockname()."""
252 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000253 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000255 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000256
257 def testGetSockOpt(self):
258 """Testing getsockopt()."""
259 # We know a socket should start without reuse==0
260 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
261 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000262 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000263
264 def testSetSockOpt(self):
265 """Testing setsockopt()."""
266 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
267 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
268 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000269 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270
271class BasicTCPTest(SocketConnectedTest):
272
273 def __init__(self, methodName='runTest'):
274 SocketConnectedTest.__init__(self, methodName=methodName)
275
276 def testRecv(self):
277 """Testing large receive over TCP."""
278 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000279 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280
281 def _testRecv(self):
282 self.serv_conn.send(MSG)
283
284 def testOverFlowRecv(self):
285 """Testing receive in chunks over TCP."""
286 seg1 = self.cli_conn.recv(len(MSG) - 3)
287 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000288 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000289 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290
291 def _testOverFlowRecv(self):
292 self.serv_conn.send(MSG)
293
294 def testRecvFrom(self):
295 """Testing large recvfrom() over TCP."""
296 msg, addr = self.cli_conn.recvfrom(1024)
297 hostname, port = addr
Guido van Rossum1c938012002-06-12 21:17:20 +0000298 ##self.assertEqual(hostname, socket.gethostbyname('localhost'))
Guido van Rossum76489682002-06-12 20:38:30 +0000299 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000300
301 def _testRecvFrom(self):
302 self.serv_conn.send(MSG)
303
304 def testOverFlowRecvFrom(self):
305 """Testing recvfrom() in chunks over TCP."""
306 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
307 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000308 msg = seg1 + seg2
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309 hostname, port = addr
Guido van Rossum1c938012002-06-12 21:17:20 +0000310 ##self.assertEqual(hostname, socket.gethostbyname('localhost'))
Guido van Rossum76489682002-06-12 20:38:30 +0000311 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000312
313 def _testOverFlowRecvFrom(self):
314 self.serv_conn.send(MSG)
315
316 def testSendAll(self):
317 """Testing sendall() with a 2048 byte string over TCP."""
318 while 1:
319 read = self.cli_conn.recv(1024)
320 if not read:
321 break
322 self.assert_(len(read) == 1024, "Error performing sendall.")
323 read = filter(lambda x: x == 'f', read)
324 self.assert_(len(read) == 1024, "Error performing sendall.")
325
326 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000327 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000328 self.serv_conn.sendall(big_chunk)
329
330 def testFromFd(self):
331 """Testing fromfd()."""
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000332 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000333 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334 fd = self.cli_conn.fileno()
335 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
336 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000337 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000338
339 def _testFromFd(self):
340 self.serv_conn.send(MSG)
341
342 def testShutdown(self):
343 """Testing shutdown()."""
344 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000345 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000346
347 def _testShutdown(self):
348 self.serv_conn.send(MSG)
349 self.serv_conn.shutdown(2)
350
351class BasicUDPTest(ThreadedUDPSocketTest):
352
353 def __init__(self, methodName='runTest'):
354 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
355
356 def testSendtoAndRecv(self):
357 """Testing sendto() and Recv() over UDP."""
358 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000359 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000360
361 def _testSendtoAndRecv(self):
362 self.cli.sendto(MSG, 0, (HOST, PORT))
363
Guido van Rossum1c938012002-06-12 21:17:20 +0000364 def testRecvFrom(self):
Guido van Rossumdfad1a92002-06-13 15:03:01 +0000365 """Testing recvfrom() over UDP."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000366 msg, addr = self.serv.recvfrom(len(MSG))
367 hostname, port = addr
Guido van Rossum1c938012002-06-12 21:17:20 +0000368 ##self.assertEqual(hostname, socket.gethostbyname('localhost'))
Guido van Rossum76489682002-06-12 20:38:30 +0000369 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000370
Guido van Rossum1c938012002-06-12 21:17:20 +0000371 def _testRecvFrom(self):
Guido van Rossumdfad1a92002-06-13 15:03:01 +0000372 time.sleep(1) # Give server a chance to set up
Guido van Rossum24e4af82002-06-12 19:18:08 +0000373 self.cli.sendto(MSG, 0, (HOST, PORT))
374
375class NonBlockingTCPTests(ThreadedTCPSocketTest):
376
377 def __init__(self, methodName='runTest'):
378 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
379
380 def testSetBlocking(self):
381 """Testing whether set blocking works."""
382 self.serv.setblocking(0)
383 start = time.time()
384 try:
385 self.serv.accept()
386 except socket.error:
387 pass
388 end = time.time()
389 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
390
391 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000392 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000393
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394 def testAccept(self):
395 """Testing non-blocking accept."""
396 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000397 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398 conn, addr = self.serv.accept()
399 except socket.error:
400 pass
401 else:
402 self.fail("Error trying to do non-blocking accept.")
403 read, write, err = select.select([self.serv], [], [])
404 if self.serv in read:
405 conn, addr = self.serv.accept()
406 else:
407 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000408
Guido van Rossum24e4af82002-06-12 19:18:08 +0000409 def _testAccept(self):
410 time.sleep(1)
411 self.cli.connect((HOST, PORT))
412
413 def testConnect(self):
414 """Testing non-blocking connect."""
415 time.sleep(1)
416 conn, addr = self.serv.accept()
417
418 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000419 self.cli.settimeout(10)
420 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000421
422 def testRecv(self):
423 """Testing non-blocking recv."""
424 conn, addr = self.serv.accept()
425 conn.setblocking(0)
426 try:
427 msg = conn.recv(len(MSG))
428 except socket.error:
429 pass
430 else:
431 self.fail("Error trying to do non-blocking recv.")
432 read, write, err = select.select([conn], [], [])
433 if conn in read:
434 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000435 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000436 else:
437 self.fail("Error during select call to non-blocking socket.")
438
439 def _testRecv(self):
440 self.cli.connect((HOST, PORT))
441 time.sleep(1)
442 self.cli.send(MSG)
443
444class FileObjectClassTestCase(SocketConnectedTest):
445
446 def __init__(self, methodName='runTest'):
447 SocketConnectedTest.__init__(self, methodName=methodName)
448
449 def setUp(self):
450 SocketConnectedTest.setUp(self)
451 self.serv_file = socket._fileobject(self.cli_conn, 'rb', 8192)
452
453 def tearDown(self):
454 self.serv_file.close()
455 self.serv_file = None
456 SocketConnectedTest.tearDown(self)
457
458 def clientSetUp(self):
459 SocketConnectedTest.clientSetUp(self)
460 self.cli_file = socket._fileobject(self.serv_conn, 'rb', 8192)
461
462 def clientTearDown(self):
463 self.cli_file.close()
464 self.cli_file = None
465 SocketConnectedTest.clientTearDown(self)
466
467 def testSmallRead(self):
468 """Performing small file read test."""
469 first_seg = self.serv_file.read(len(MSG)-3)
470 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000471 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000472 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000473
474 def _testSmallRead(self):
475 self.cli_file.write(MSG)
476 self.cli_file.flush()
477
478 def testUnbufferedRead(self):
479 """Performing unbuffered file read test."""
480 buf = ''
481 while 1:
482 char = self.serv_file.read(1)
Guido van Rossum76489682002-06-12 20:38:30 +0000483 self.failIf(not char)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 buf += char
485 if buf == MSG:
486 break
487
488 def _testUnbufferedRead(self):
489 self.cli_file.write(MSG)
490 self.cli_file.flush()
491
492 def testReadline(self):
493 """Performing file readline test."""
494 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000495 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496
497 def _testReadline(self):
498 self.cli_file.write(MSG)
499 self.cli_file.flush()
500
Guido van Rossum654c11e2002-06-13 20:24:17 +0000501def main():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502 suite = unittest.TestSuite()
503 suite.addTest(unittest.makeSuite(GeneralModuleTests))
504 suite.addTest(unittest.makeSuite(BasicTCPTest))
505 suite.addTest(unittest.makeSuite(BasicUDPTest))
506 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
507 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
508 test_support.run_suite(suite)
509
510if __name__ == "__main__":
Guido van Rossum654c11e2002-06-13 20:24:17 +0000511 main()