blob: 4e0e2429476be6b5f01ec862433aa41ceefb0fbe [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
Raymond Hettinger027bb632004-05-31 03:09:25 +000012from weakref import proxy
Barry Warsawcf3d4b51997-01-03 20:03:32 +000013
Guido van Rossum24e4af82002-06-12 19:18:08 +000014PORT = 50007
15HOST = 'localhost'
16MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Guido van Rossum24e4af82002-06-12 19:18:08 +000020 def setUp(self):
21 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
22 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
23 self.serv.bind((HOST, PORT))
24 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 def tearDown(self):
27 self.serv.close()
28 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030class SocketUDPTest(unittest.TestCase):
31
32 def setUp(self):
33 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
34 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
35 self.serv.bind((HOST, PORT))
36
37 def tearDown(self):
38 self.serv.close()
39 self.serv = None
40
41class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000042 """Threadable Test class
43
44 The ThreadableTest class makes it easy to create a threaded
45 client/server pair from an existing unit test. To create a
46 new threaded class from an existing unit test, use multiple
47 inheritance:
48
49 class NewClass (OldClass, ThreadableTest):
50 pass
51
52 This class defines two new fixture functions with obvious
53 purposes for overriding:
54
55 clientSetUp ()
56 clientTearDown ()
57
58 Any new test functions within the class must then define
59 tests in pairs, where the test name is preceeded with a
60 '_' to indicate the client portion of the test. Ex:
61
62 def testFoo(self):
63 # Server portion
64
65 def _testFoo(self):
66 # Client portion
67
68 Any exceptions raised by the clients during their tests
69 are caught and transferred to the main thread to alert
70 the testing framework.
71
72 Note, the server setup function cannot call any blocking
73 functions that rely on the client thread during setup,
74 unless serverExplicityReady() is called just before
75 the blocking call (such as in setting up a client/server
76 connection and performing the accept() in setUp().
77 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000078
79 def __init__(self):
80 # Swap the true setup function
81 self.__setUp = self.setUp
82 self.__tearDown = self.tearDown
83 self.setUp = self._setUp
84 self.tearDown = self._tearDown
85
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000086 def serverExplicitReady(self):
87 """This method allows the server to explicitly indicate that
88 it wants the client thread to proceed. This is useful if the
89 server is about to execute a blocking routine that is
90 dependent upon the client thread during its setup routine."""
91 self.server_ready.set()
92
Guido van Rossum24e4af82002-06-12 19:18:08 +000093 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000094 self.server_ready = threading.Event()
95 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 self.done = threading.Event()
97 self.queue = Queue.Queue(1)
98
99 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000100 methodname = self.id()
101 i = methodname.rfind('.')
102 methodname = methodname[i+1:]
103 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000104 self.client_thread = thread.start_new_thread(
105 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106
107 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000108 if not self.server_ready.isSet():
109 self.server_ready.set()
110 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111
112 def _tearDown(self):
113 self.__tearDown()
114 self.done.wait()
115
116 if not self.queue.empty():
117 msg = self.queue.get()
118 self.fail(msg)
119
120 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000121 self.server_ready.wait()
122 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 self.clientSetUp()
124 if not callable(test_func):
125 raise TypeError, "test_func must be a callable function"
126 try:
127 test_func()
128 except Exception, strerror:
129 self.queue.put(strerror)
130 self.clientTearDown()
131
132 def clientSetUp(self):
133 raise NotImplementedError, "clientSetUp must be implemented."
134
135 def clientTearDown(self):
136 self.done.set()
137 thread.exit()
138
139class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
140
141 def __init__(self, methodName='runTest'):
142 SocketTCPTest.__init__(self, methodName=methodName)
143 ThreadableTest.__init__(self)
144
145 def clientSetUp(self):
146 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
147
148 def clientTearDown(self):
149 self.cli.close()
150 self.cli = None
151 ThreadableTest.clientTearDown(self)
152
153class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
154
155 def __init__(self, methodName='runTest'):
156 SocketUDPTest.__init__(self, methodName=methodName)
157 ThreadableTest.__init__(self)
158
159 def clientSetUp(self):
160 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
161
162class SocketConnectedTest(ThreadedTCPSocketTest):
163
164 def __init__(self, methodName='runTest'):
165 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
166
167 def setUp(self):
168 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000169 # Indicate explicitly we're ready for the client thread to
170 # proceed and then perform the blocking call to accept
171 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172 conn, addr = self.serv.accept()
173 self.cli_conn = conn
174
175 def tearDown(self):
176 self.cli_conn.close()
177 self.cli_conn = None
178 ThreadedTCPSocketTest.tearDown(self)
179
180 def clientSetUp(self):
181 ThreadedTCPSocketTest.clientSetUp(self)
182 self.cli.connect((HOST, PORT))
183 self.serv_conn = self.cli
184
185 def clientTearDown(self):
186 self.serv_conn.close()
187 self.serv_conn = None
188 ThreadedTCPSocketTest.clientTearDown(self)
189
Dave Cole331708b2004-08-09 04:51:41 +0000190class SocketPairTest(unittest.TestCase, ThreadableTest):
191
192 def __init__(self, methodName='runTest'):
193 unittest.TestCase.__init__(self, methodName=methodName)
194 ThreadableTest.__init__(self)
195
196 def setUp(self):
197 self.serv, self.cli = socket.socketpair()
198
199 def tearDown(self):
200 self.serv.close()
201 self.serv = None
202
203 def clientSetUp(self):
204 pass
205
206 def clientTearDown(self):
207 self.cli.close()
208 self.cli = None
209 ThreadableTest.clientTearDown(self)
210
Tim Peters494aaee2004-08-09 18:54:11 +0000211
Guido van Rossum24e4af82002-06-12 19:18:08 +0000212#######################################################################
213## Begin Tests
214
215class GeneralModuleTests(unittest.TestCase):
216
Raymond Hettinger027bb632004-05-31 03:09:25 +0000217 def test_weakref(self):
218 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
219 p = proxy(s)
220 self.assertEqual(p.fileno(), s.fileno())
221 s.close()
222 s = None
223 try:
224 p.fileno()
225 except ReferenceError:
226 pass
227 else:
228 self.fail('Socket proxy still exists')
229
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000231 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232 def raise_error(*args, **kwargs):
233 raise socket.error
234 def raise_herror(*args, **kwargs):
235 raise socket.herror
236 def raise_gaierror(*args, **kwargs):
237 raise socket.gaierror
238 self.failUnlessRaises(socket.error, raise_error,
239 "Error raising socket exception.")
240 self.failUnlessRaises(socket.error, raise_herror,
241 "Error raising socket exception.")
242 self.failUnlessRaises(socket.error, raise_gaierror,
243 "Error raising socket exception.")
244
245 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000246 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247 socket.AF_INET
248 socket.SOCK_STREAM
249 socket.SOCK_DGRAM
250 socket.SOCK_RAW
251 socket.SOCK_RDM
252 socket.SOCK_SEQPACKET
253 socket.SOL_SOCKET
254 socket.SO_REUSEADDR
255
Guido van Rossum654c11e2002-06-13 20:24:17 +0000256 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000257 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000258 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000259 try:
260 ip = socket.gethostbyname(hostname)
261 except socket.error:
262 # Probably name lookup wasn't set up right; skip this test
263 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000264 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000265 try:
266 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
267 except socket.error:
268 # Probably a similar problem as above; skip this test
269 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000270 all_host_names = [hname] + aliases
271 fqhn = socket.getfqdn()
272 if not fqhn in all_host_names:
273 self.fail("Error testing host resolution mechanisms.")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000274
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000275 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000276 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000278 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 try:
280 # On some versions, this loses a reference
281 orig = sys.getrefcount(__name__)
282 socket.getnameinfo(__name__,0)
283 except SystemError:
284 if sys.getrefcount(__name__) <> orig:
285 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000286
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000288 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 try:
290 # On some versions, this crashes the interpreter.
291 socket.getnameinfo(('x', 0, 0, 0), 0)
292 except socket.error:
293 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000294
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000295 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000296 # This just checks that htons etc. are their own inverse,
297 # when looking at the lower 16 or 32 bits.
298 sizes = {socket.htonl: 32, socket.ntohl: 32,
299 socket.htons: 16, socket.ntohs: 16}
300 for func, size in sizes.items():
301 mask = (1L<<size) - 1
302 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
303 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000304
Guido van Rossuma2627af2002-09-14 00:58:46 +0000305 swapped = func(mask)
306 self.assertEqual(swapped & mask, mask)
307 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000308
Barry Warsaw11b91a02004-06-28 00:50:43 +0000309 def testGetServBy(self):
310 eq = self.assertEqual
311 # Find one service that exists, then check all the related interfaces.
312 # I've ordered this by protocols that have both a tcp and udp
313 # protocol, at least for modern Linuxes.
Skip Montanarod4ff2062004-08-16 15:35:54 +0000314 if sys.platform in ('freebsd4', 'freebsd5', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000315 # avoid the 'echo' service on this platform, as there is an
316 # assumption breaking non-standard port/protocol entry
317 services = ('daytime', 'qotd', 'domain')
318 else:
319 services = ('echo', 'daytime', 'domain')
320 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000321 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000322 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000323 break
324 except socket.error:
325 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000326 else:
327 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000328 # Try same call with optional protocol omitted
329 port2 = socket.getservbyname(service)
330 eq(port, port2)
331 # Try udp, but don't barf it it doesn't exist
332 try:
333 udpport = socket.getservbyname(service, 'udp')
334 except socket.error:
335 udpport = None
336 else:
337 eq(udpport, port)
338 # Now make sure the lookup by port returns the same service name
339 eq(socket.getservbyport(port2), service)
340 eq(socket.getservbyport(port, 'tcp'), service)
341 if udpport is not None:
342 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000343
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000344 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000345 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000346 # The default timeout should initially be None
347 self.assertEqual(socket.getdefaulttimeout(), None)
348 s = socket.socket()
349 self.assertEqual(s.gettimeout(), None)
350 s.close()
351
352 # Set the default timeout to 10, and see if it propagates
353 socket.setdefaulttimeout(10)
354 self.assertEqual(socket.getdefaulttimeout(), 10)
355 s = socket.socket()
356 self.assertEqual(s.gettimeout(), 10)
357 s.close()
358
359 # Reset the default timeout to None, and see if it propagates
360 socket.setdefaulttimeout(None)
361 self.assertEqual(socket.getdefaulttimeout(), None)
362 s = socket.socket()
363 self.assertEqual(s.gettimeout(), None)
364 s.close()
365
366 # Check that setting it to an invalid value raises ValueError
367 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
368
369 # Check that setting it to an invalid type raises TypeError
370 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
371
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000372 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000373 if not hasattr(socket, 'inet_pton'):
374 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000375 from socket import inet_aton as f, inet_pton, AF_INET
376 g = lambda a: inet_pton(AF_INET, a)
377
378 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
379 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
380 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
381 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
382
383 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
384 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
385 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000386
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000387 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000388 if not hasattr(socket, 'inet_pton'):
389 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000390 try:
391 from socket import inet_pton, AF_INET6, has_ipv6
392 if not has_ipv6:
393 return
394 except ImportError:
395 return
396 f = lambda a: inet_pton(AF_INET6, a)
397
398 self.assertEquals('\x00' * 16, f('::'))
399 self.assertEquals('\x00' * 16, f('0::0'))
400 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
401 self.assertEquals(
402 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
403 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
404 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000405
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000406 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000407 if not hasattr(socket, 'inet_ntop'):
408 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000409 from socket import inet_ntoa as f, inet_ntop, AF_INET
410 g = lambda a: inet_ntop(AF_INET, a)
411
412 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
413 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
414 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
415 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000416
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000417 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
418 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
419 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
420
421 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000422 if not hasattr(socket, 'inet_ntop'):
423 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000424 try:
425 from socket import inet_ntop, AF_INET6, has_ipv6
426 if not has_ipv6:
427 return
428 except ImportError:
429 return
430 f = lambda a: inet_ntop(AF_INET6, a)
431
432 self.assertEquals('::', f('\x00' * 16))
433 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
434 self.assertEquals(
435 'aef:b01:506:1001:ffff:9997:55:170',
436 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
437 )
438
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000439 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000440
Guido van Rossum24e4af82002-06-12 19:18:08 +0000441 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000442 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000443 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000444 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000445 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000446 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447
448 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000449 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450 # We know a socket should start without reuse==0
451 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
452 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000453 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454
455 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000456 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000457 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
458 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
459 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000460 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000461
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000462 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000463 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000464 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
465 sock.settimeout(1)
466 sock.close()
467 self.assertRaises(socket.error, sock.send, "spam")
468
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469class BasicTCPTest(SocketConnectedTest):
470
471 def __init__(self, methodName='runTest'):
472 SocketConnectedTest.__init__(self, methodName=methodName)
473
474 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000475 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000477 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478
479 def _testRecv(self):
480 self.serv_conn.send(MSG)
481
482 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000483 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000484 seg1 = self.cli_conn.recv(len(MSG) - 3)
485 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000486 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000487 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488
489 def _testOverFlowRecv(self):
490 self.serv_conn.send(MSG)
491
492 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000493 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000494 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000495 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496
497 def _testRecvFrom(self):
498 self.serv_conn.send(MSG)
499
500 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000501 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
503 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000504 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000505 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506
507 def _testOverFlowRecvFrom(self):
508 self.serv_conn.send(MSG)
509
510 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000511 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000512 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 while 1:
514 read = self.cli_conn.recv(1024)
515 if not read:
516 break
Guido van Rossume531e292002-08-08 20:28:34 +0000517 msg += read
518 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519
520 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000521 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 self.serv_conn.sendall(big_chunk)
523
524 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000525 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000526 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000527 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528 fd = self.cli_conn.fileno()
529 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
530 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000531 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def _testFromFd(self):
534 self.serv_conn.send(MSG)
535
536 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000539 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540
541 def _testShutdown(self):
542 self.serv_conn.send(MSG)
543 self.serv_conn.shutdown(2)
544
545class BasicUDPTest(ThreadedUDPSocketTest):
546
547 def __init__(self, methodName='runTest'):
548 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
549
550 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000551 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000553 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000554
555 def _testSendtoAndRecv(self):
556 self.cli.sendto(MSG, 0, (HOST, PORT))
557
Guido van Rossum1c938012002-06-12 21:17:20 +0000558 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000559 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000561 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
Guido van Rossum1c938012002-06-12 21:17:20 +0000563 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000564 self.cli.sendto(MSG, 0, (HOST, PORT))
565
Dave Cole331708b2004-08-09 04:51:41 +0000566class BasicSocketPairTest(SocketPairTest):
567
568 def __init__(self, methodName='runTest'):
569 SocketPairTest.__init__(self, methodName=methodName)
570
571 def testRecv(self):
572 msg = self.serv.recv(1024)
573 self.assertEqual(msg, MSG)
574
575 def _testRecv(self):
576 self.cli.send(MSG)
577
578 def testSend(self):
579 self.serv.send(MSG)
580
581 def _testSend(self):
582 msg = self.cli.recv(1024)
583 self.assertEqual(msg, MSG)
584
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585class NonBlockingTCPTests(ThreadedTCPSocketTest):
586
587 def __init__(self, methodName='runTest'):
588 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
589
590 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000591 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 self.serv.setblocking(0)
593 start = time.time()
594 try:
595 self.serv.accept()
596 except socket.error:
597 pass
598 end = time.time()
599 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
600
601 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000602 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000603
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000605 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000607 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 conn, addr = self.serv.accept()
609 except socket.error:
610 pass
611 else:
612 self.fail("Error trying to do non-blocking accept.")
613 read, write, err = select.select([self.serv], [], [])
614 if self.serv in read:
615 conn, addr = self.serv.accept()
616 else:
617 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000620 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621 self.cli.connect((HOST, PORT))
622
623 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000624 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000625 conn, addr = self.serv.accept()
626
627 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000628 self.cli.settimeout(10)
629 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000630
631 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000632 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000633 conn, addr = self.serv.accept()
634 conn.setblocking(0)
635 try:
636 msg = conn.recv(len(MSG))
637 except socket.error:
638 pass
639 else:
640 self.fail("Error trying to do non-blocking recv.")
641 read, write, err = select.select([conn], [], [])
642 if conn in read:
643 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000644 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 else:
646 self.fail("Error during select call to non-blocking socket.")
647
648 def _testRecv(self):
649 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000650 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651 self.cli.send(MSG)
652
653class FileObjectClassTestCase(SocketConnectedTest):
654
Guido van Rossume9f66142002-08-07 15:46:19 +0000655 bufsize = -1 # Use default buffer size
656
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657 def __init__(self, methodName='runTest'):
658 SocketConnectedTest.__init__(self, methodName=methodName)
659
660 def setUp(self):
661 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000662 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663
664 def tearDown(self):
665 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000666 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 self.serv_file = None
668 SocketConnectedTest.tearDown(self)
669
670 def clientSetUp(self):
671 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000672 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673
674 def clientTearDown(self):
675 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000676 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677 self.cli_file = None
678 SocketConnectedTest.clientTearDown(self)
679
680 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000681 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682 first_seg = self.serv_file.read(len(MSG)-3)
683 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000684 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000685 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000686
687 def _testSmallRead(self):
688 self.cli_file.write(MSG)
689 self.cli_file.flush()
690
Guido van Rossum8c943832002-08-08 01:00:28 +0000691 def testFullRead(self):
692 # read until EOF
693 msg = self.serv_file.read()
694 self.assertEqual(msg, MSG)
695
696 def _testFullRead(self):
697 self.cli_file.write(MSG)
698 self.cli_file.close()
699
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000701 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702 buf = ''
703 while 1:
704 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000705 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000707 buf += char
708 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709
710 def _testUnbufferedRead(self):
711 self.cli_file.write(MSG)
712 self.cli_file.flush()
713
714 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000715 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000717 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718
719 def _testReadline(self):
720 self.cli_file.write(MSG)
721 self.cli_file.flush()
722
Tim Peters116d83c2004-03-28 02:20:45 +0000723 def testClosedAttr(self):
724 self.assert_(not self.serv_file.closed)
725
726 def _testClosedAttr(self):
727 self.assert_(not self.cli_file.closed)
728
Guido van Rossume9f66142002-08-07 15:46:19 +0000729class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
730
731 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000732
Guido van Rossume9f66142002-08-07 15:46:19 +0000733 In this case (and in this case only), it should be possible to
734 create a file object, read a line from it, create another file
735 object, read another line from it, without loss of data in the
736 first file object's buffer. Note that httplib relies on this
737 when reading multiple requests from the same socket."""
738
739 bufsize = 0 # Use unbuffered mode
740
741 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000742 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000743 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000744 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000745 self.serv_file = self.cli_conn.makefile('rb', 0)
746 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000747 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000748
749 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000750 self.cli_file.write("A. " + MSG)
751 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000752 self.cli_file.flush()
753
Guido van Rossum8c943832002-08-08 01:00:28 +0000754class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
755
756 bufsize = 1 # Default-buffered for reading; line-buffered for writing
757
758
759class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
760
761 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000762
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000763class TCPTimeoutTest(SocketTCPTest):
764
765 def testTCPTimeout(self):
766 def raise_timeout(*args, **kwargs):
767 self.serv.settimeout(1.0)
768 self.serv.accept()
769 self.failUnlessRaises(socket.timeout, raise_timeout,
770 "Error generating a timeout exception (TCP)")
771
772 def testTimeoutZero(self):
773 ok = False
774 try:
775 self.serv.settimeout(0.0)
776 foo = self.serv.accept()
777 except socket.timeout:
778 self.fail("caught timeout instead of error (TCP)")
779 except socket.error:
780 ok = True
781 except:
782 self.fail("caught unexpected exception (TCP)")
783 if not ok:
784 self.fail("accept() returned success when we did not expect it")
785
786class UDPTimeoutTest(SocketTCPTest):
787
788 def testUDPTimeout(self):
789 def raise_timeout(*args, **kwargs):
790 self.serv.settimeout(1.0)
791 self.serv.recv(1024)
792 self.failUnlessRaises(socket.timeout, raise_timeout,
793 "Error generating a timeout exception (UDP)")
794
795 def testTimeoutZero(self):
796 ok = False
797 try:
798 self.serv.settimeout(0.0)
799 foo = self.serv.recv(1024)
800 except socket.timeout:
801 self.fail("caught timeout instead of error (UDP)")
802 except socket.error:
803 ok = True
804 except:
805 self.fail("caught unexpected exception (UDP)")
806 if not ok:
807 self.fail("recv() returned success when we did not expect it")
808
809class TestExceptions(unittest.TestCase):
810
811 def testExceptionTree(self):
812 self.assert_(issubclass(socket.error, Exception))
813 self.assert_(issubclass(socket.herror, socket.error))
814 self.assert_(issubclass(socket.gaierror, socket.error))
815 self.assert_(issubclass(socket.timeout, socket.error))
816
817
Guido van Rossumb995eb72002-07-31 16:08:40 +0000818def test_main():
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000819 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions]
Jack Jansen522e7692002-09-06 21:57:50 +0000820 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000821 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000822
823 tests.extend([
824 NonBlockingTCPTests,
825 FileObjectClassTestCase,
826 UnbufferedFileObjectClassTestCase,
827 LineBufferedFileObjectClassTestCase,
828 SmallBufferedFileObjectClassTestCase
829 ])
Dave Cole331708b2004-08-09 04:51:41 +0000830 if hasattr(socket, "socketpair"):
831 tests.append(BasicSocketPairTest)
Walter Dörwald21d3a322003-05-01 17:45:56 +0000832 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833
834if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000835 test_main()