blob: 6beadd298d36fb7b80f6d0699bf73523baf09678 [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 Rossumab659962002-06-12 21:29:43 +000054 test_method = getattr(self, '_' + self._TestCase__testMethodName)
55 self.client_thread = thread.start_new_thread(
56 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +000057
58 self.__setUp()
59 self.ready.wait()
60
61 def _tearDown(self):
62 self.__tearDown()
63 self.done.wait()
64
65 if not self.queue.empty():
66 msg = self.queue.get()
67 self.fail(msg)
68
69 def clientRun(self, test_func):
70 self.ready.set()
71 self.clientSetUp()
72 if not callable(test_func):
73 raise TypeError, "test_func must be a callable function"
74 try:
75 test_func()
76 except Exception, strerror:
77 self.queue.put(strerror)
78 self.clientTearDown()
79
80 def clientSetUp(self):
81 raise NotImplementedError, "clientSetUp must be implemented."
82
83 def clientTearDown(self):
84 self.done.set()
85 thread.exit()
86
87class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
88
89 def __init__(self, methodName='runTest'):
90 SocketTCPTest.__init__(self, methodName=methodName)
91 ThreadableTest.__init__(self)
92
93 def clientSetUp(self):
94 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
95
96 def clientTearDown(self):
97 self.cli.close()
98 self.cli = None
99 ThreadableTest.clientTearDown(self)
100
101class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
102
103 def __init__(self, methodName='runTest'):
104 SocketUDPTest.__init__(self, methodName=methodName)
105 ThreadableTest.__init__(self)
106
107 def clientSetUp(self):
108 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
109
110class SocketConnectedTest(ThreadedTCPSocketTest):
111
112 def __init__(self, methodName='runTest'):
113 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
114
115 def setUp(self):
116 ThreadedTCPSocketTest.setUp(self)
117 conn, addr = self.serv.accept()
118 self.cli_conn = conn
119
120 def tearDown(self):
121 self.cli_conn.close()
122 self.cli_conn = None
123 ThreadedTCPSocketTest.tearDown(self)
124
125 def clientSetUp(self):
126 ThreadedTCPSocketTest.clientSetUp(self)
127 self.cli.connect((HOST, PORT))
128 self.serv_conn = self.cli
129
130 def clientTearDown(self):
131 self.serv_conn.close()
132 self.serv_conn = None
133 ThreadedTCPSocketTest.clientTearDown(self)
134
135#######################################################################
136## Begin Tests
137
138class GeneralModuleTests(unittest.TestCase):
139
140 def testSocketError(self):
141 """Testing that socket module exceptions."""
142 def raise_error(*args, **kwargs):
143 raise socket.error
144 def raise_herror(*args, **kwargs):
145 raise socket.herror
146 def raise_gaierror(*args, **kwargs):
147 raise socket.gaierror
148 self.failUnlessRaises(socket.error, raise_error,
149 "Error raising socket exception.")
150 self.failUnlessRaises(socket.error, raise_herror,
151 "Error raising socket exception.")
152 self.failUnlessRaises(socket.error, raise_gaierror,
153 "Error raising socket exception.")
154
155 def testCrucialConstants(self):
156 """Testing for mission critical constants."""
157 socket.AF_INET
158 socket.SOCK_STREAM
159 socket.SOCK_DGRAM
160 socket.SOCK_RAW
161 socket.SOCK_RDM
162 socket.SOCK_SEQPACKET
163 socket.SOL_SOCKET
164 socket.SO_REUSEADDR
165
166 def testNonCrucialConstants(self):
167 """Testing for existance of non-crucial constants."""
168 for const in (
169 "AF_UNIX",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000170
Guido van Rossum41360a41998-03-26 19:42:58 +0000171 "SO_DEBUG", "SO_ACCEPTCONN", "SO_REUSEADDR", "SO_KEEPALIVE",
172 "SO_DONTROUTE", "SO_BROADCAST", "SO_USELOOPBACK", "SO_LINGER",
173 "SO_OOBINLINE", "SO_REUSEPORT", "SO_SNDBUF", "SO_RCVBUF",
174 "SO_SNDLOWAT", "SO_RCVLOWAT", "SO_SNDTIMEO", "SO_RCVTIMEO",
175 "SO_ERROR", "SO_TYPE", "SOMAXCONN",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000176
Guido van Rossum41360a41998-03-26 19:42:58 +0000177 "MSG_OOB", "MSG_PEEK", "MSG_DONTROUTE", "MSG_EOR",
178 "MSG_TRUNC", "MSG_CTRUNC", "MSG_WAITALL", "MSG_BTAG",
179 "MSG_ETAG",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000180
Guido van Rossum41360a41998-03-26 19:42:58 +0000181 "SOL_SOCKET",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000182
Guido van Rossum41360a41998-03-26 19:42:58 +0000183 "IPPROTO_IP", "IPPROTO_ICMP", "IPPROTO_IGMP",
184 "IPPROTO_GGP", "IPPROTO_TCP", "IPPROTO_EGP",
185 "IPPROTO_PUP", "IPPROTO_UDP", "IPPROTO_IDP",
186 "IPPROTO_HELLO", "IPPROTO_ND", "IPPROTO_TP",
187 "IPPROTO_XTP", "IPPROTO_EON", "IPPROTO_BIP",
188 "IPPROTO_RAW", "IPPROTO_MAX",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000189
Guido van Rossum41360a41998-03-26 19:42:58 +0000190 "IPPORT_RESERVED", "IPPORT_USERRESERVED",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000191
Guido van Rossum41360a41998-03-26 19:42:58 +0000192 "INADDR_ANY", "INADDR_BROADCAST", "INADDR_LOOPBACK",
193 "INADDR_UNSPEC_GROUP", "INADDR_ALLHOSTS_GROUP",
194 "INADDR_MAX_LOCAL_GROUP", "INADDR_NONE",
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000195
Guido van Rossum41360a41998-03-26 19:42:58 +0000196 "IP_OPTIONS", "IP_HDRINCL", "IP_TOS", "IP_TTL",
197 "IP_RECVOPTS", "IP_RECVRETOPTS", "IP_RECVDSTADDR",
198 "IP_RETOPTS", "IP_MULTICAST_IF", "IP_MULTICAST_TTL",
199 "IP_MULTICAST_LOOP", "IP_ADD_MEMBERSHIP",
200 "IP_DROP_MEMBERSHIP",
Guido van Rossum24e4af82002-06-12 19:18:08 +0000201 ):
202 try:
203 getattr(socket, const)
204 except AttributeError:
205 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000206
Guido van Rossum24e4af82002-06-12 19:18:08 +0000207 def testHostnameRes(self):
208 """Testing hostname resolution mechanisms."""
209 hostname = socket.gethostname()
210 ip = socket.gethostbyname(hostname)
211 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
212 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
213 all_host_names = [hname] + aliases
214 fqhn = socket.getfqdn()
215 if not fqhn in all_host_names:
216 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000217
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000218 def testRefCountGetNameInfo(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000219 """Testing reference count for getnameinfo."""
220 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000221 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000222 try:
223 # On some versions, this loses a reference
224 orig = sys.getrefcount(__name__)
225 socket.getnameinfo(__name__,0)
226 except SystemError:
227 if sys.getrefcount(__name__) <> orig:
228 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000229
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230 def testInterpreterCrash(self):
231 """Making sure getnameinfo doesn't crash the interpreter."""
232 try:
233 # On some versions, this crashes the interpreter.
234 socket.getnameinfo(('x', 0, 0, 0), 0)
235 except socket.error:
236 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000237
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238 def testGetServByName(self):
Guido van Rossum1c938012002-06-12 21:17:20 +0000239 """Testing getservbyname()."""
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240 if hasattr(socket, 'getservbyname'):
241 socket.getservbyname('telnet', 'tcp')
242 try:
243 socket.getservbyname('telnet', 'udp')
244 except socket.error:
245 pass
246
247 def testSockName(self):
248 """Testing getsockname()."""
249 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000250 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000251 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000252 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000253
254 def testGetSockOpt(self):
255 """Testing getsockopt()."""
256 # We know a socket should start without reuse==0
257 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
258 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000259 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260
261 def testSetSockOpt(self):
262 """Testing setsockopt()."""
263 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
264 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
265 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000266 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267
268class BasicTCPTest(SocketConnectedTest):
269
270 def __init__(self, methodName='runTest'):
271 SocketConnectedTest.__init__(self, methodName=methodName)
272
273 def testRecv(self):
274 """Testing large receive over TCP."""
275 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000276 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277
278 def _testRecv(self):
279 self.serv_conn.send(MSG)
280
281 def testOverFlowRecv(self):
282 """Testing receive in chunks over TCP."""
283 seg1 = self.cli_conn.recv(len(MSG) - 3)
284 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000285 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000286 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287
288 def _testOverFlowRecv(self):
289 self.serv_conn.send(MSG)
290
291 def testRecvFrom(self):
292 """Testing large recvfrom() over TCP."""
293 msg, addr = self.cli_conn.recvfrom(1024)
294 hostname, port = addr
Guido van Rossum1c938012002-06-12 21:17:20 +0000295 ##self.assertEqual(hostname, socket.gethostbyname('localhost'))
Guido van Rossum76489682002-06-12 20:38:30 +0000296 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297
298 def _testRecvFrom(self):
299 self.serv_conn.send(MSG)
300
301 def testOverFlowRecvFrom(self):
302 """Testing recvfrom() in chunks over TCP."""
303 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
304 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000305 msg = seg1 + seg2
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306 hostname, port = addr
Guido van Rossum1c938012002-06-12 21:17:20 +0000307 ##self.assertEqual(hostname, socket.gethostbyname('localhost'))
Guido van Rossum76489682002-06-12 20:38:30 +0000308 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309
310 def _testOverFlowRecvFrom(self):
311 self.serv_conn.send(MSG)
312
313 def testSendAll(self):
314 """Testing sendall() with a 2048 byte string over TCP."""
315 while 1:
316 read = self.cli_conn.recv(1024)
317 if not read:
318 break
319 self.assert_(len(read) == 1024, "Error performing sendall.")
320 read = filter(lambda x: x == 'f', read)
321 self.assert_(len(read) == 1024, "Error performing sendall.")
322
323 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000324 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 self.serv_conn.sendall(big_chunk)
326
327 def testFromFd(self):
328 """Testing fromfd()."""
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000329 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000330 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 fd = self.cli_conn.fileno()
332 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
333 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000334 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335
336 def _testFromFd(self):
337 self.serv_conn.send(MSG)
338
339 def testShutdown(self):
340 """Testing shutdown()."""
341 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000342 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343
344 def _testShutdown(self):
345 self.serv_conn.send(MSG)
346 self.serv_conn.shutdown(2)
347
348class BasicUDPTest(ThreadedUDPSocketTest):
349
350 def __init__(self, methodName='runTest'):
351 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
352
353 def testSendtoAndRecv(self):
354 """Testing sendto() and Recv() over UDP."""
355 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000356 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000357
358 def _testSendtoAndRecv(self):
359 self.cli.sendto(MSG, 0, (HOST, PORT))
360
Guido van Rossum1c938012002-06-12 21:17:20 +0000361 def testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362 """Testing recfrom() over UDP."""
363 msg, addr = self.serv.recvfrom(len(MSG))
364 hostname, port = addr
Guido van Rossum1c938012002-06-12 21:17:20 +0000365 ##self.assertEqual(hostname, socket.gethostbyname('localhost'))
Guido van Rossum76489682002-06-12 20:38:30 +0000366 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000367
Guido van Rossum1c938012002-06-12 21:17:20 +0000368 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000369 self.cli.sendto(MSG, 0, (HOST, PORT))
370
371class NonBlockingTCPTests(ThreadedTCPSocketTest):
372
373 def __init__(self, methodName='runTest'):
374 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
375
376 def testSetBlocking(self):
377 """Testing whether set blocking works."""
378 self.serv.setblocking(0)
379 start = time.time()
380 try:
381 self.serv.accept()
382 except socket.error:
383 pass
384 end = time.time()
385 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
386
387 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000388 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000389
Guido van Rossum24e4af82002-06-12 19:18:08 +0000390 def testAccept(self):
391 """Testing non-blocking accept."""
392 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000393 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394 conn, addr = self.serv.accept()
395 except socket.error:
396 pass
397 else:
398 self.fail("Error trying to do non-blocking accept.")
399 read, write, err = select.select([self.serv], [], [])
400 if self.serv in read:
401 conn, addr = self.serv.accept()
402 else:
403 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000404
Guido van Rossum24e4af82002-06-12 19:18:08 +0000405 def _testAccept(self):
406 time.sleep(1)
407 self.cli.connect((HOST, PORT))
408
409 def testConnect(self):
410 """Testing non-blocking connect."""
411 time.sleep(1)
412 conn, addr = self.serv.accept()
413
414 def _testConnect(self):
415 self.cli.setblocking(0)
416 try:
417 self.cli.connect((HOST, PORT))
418 except socket.error:
419 pass
420 else:
421 self.fail("Error trying to do non-blocking connect.")
422 read, write, err = select.select([self.cli], [], [])
423 if self.cli in read:
424 self.cli.connect((HOST, PORT))
425 else:
426 self.fail("Error trying to do connect after select.")
427
428 def testRecv(self):
429 """Testing non-blocking recv."""
430 conn, addr = self.serv.accept()
431 conn.setblocking(0)
432 try:
433 msg = conn.recv(len(MSG))
434 except socket.error:
435 pass
436 else:
437 self.fail("Error trying to do non-blocking recv.")
438 read, write, err = select.select([conn], [], [])
439 if conn in read:
440 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000441 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000442 else:
443 self.fail("Error during select call to non-blocking socket.")
444
445 def _testRecv(self):
446 self.cli.connect((HOST, PORT))
447 time.sleep(1)
448 self.cli.send(MSG)
449
450class FileObjectClassTestCase(SocketConnectedTest):
451
452 def __init__(self, methodName='runTest'):
453 SocketConnectedTest.__init__(self, methodName=methodName)
454
455 def setUp(self):
456 SocketConnectedTest.setUp(self)
457 self.serv_file = socket._fileobject(self.cli_conn, 'rb', 8192)
458
459 def tearDown(self):
460 self.serv_file.close()
461 self.serv_file = None
462 SocketConnectedTest.tearDown(self)
463
464 def clientSetUp(self):
465 SocketConnectedTest.clientSetUp(self)
466 self.cli_file = socket._fileobject(self.serv_conn, 'rb', 8192)
467
468 def clientTearDown(self):
469 self.cli_file.close()
470 self.cli_file = None
471 SocketConnectedTest.clientTearDown(self)
472
473 def testSmallRead(self):
474 """Performing small file read test."""
475 first_seg = self.serv_file.read(len(MSG)-3)
476 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000477 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000478 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479
480 def _testSmallRead(self):
481 self.cli_file.write(MSG)
482 self.cli_file.flush()
483
484 def testUnbufferedRead(self):
485 """Performing unbuffered file read test."""
486 buf = ''
487 while 1:
488 char = self.serv_file.read(1)
Guido van Rossum76489682002-06-12 20:38:30 +0000489 self.failIf(not char)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000490 buf += char
491 if buf == MSG:
492 break
493
494 def _testUnbufferedRead(self):
495 self.cli_file.write(MSG)
496 self.cli_file.flush()
497
498 def testReadline(self):
499 """Performing file readline test."""
500 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000501 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502
503 def _testReadline(self):
504 self.cli_file.write(MSG)
505 self.cli_file.flush()
506
507def test_main():
508 suite = unittest.TestSuite()
509 suite.addTest(unittest.makeSuite(GeneralModuleTests))
510 suite.addTest(unittest.makeSuite(BasicTCPTest))
511 suite.addTest(unittest.makeSuite(BasicUDPTest))
512 suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
513 suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
514 test_support.run_suite(suite)
515
516if __name__ == "__main__":
517 test_main()