blob: b5215214d1b7942121e21ce7a3772f6659f5aaef [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
Martin Blais2856e5f2006-05-26 12:03:27 +000012import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000013from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000014import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000015
Guido van Rossum24e4af82002-06-12 19:18:08 +000016PORT = 50007
17HOST = 'localhost'
18MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Guido van Rossum24e4af82002-06-12 19:18:08 +000020class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000021
Guido van Rossum24e4af82002-06-12 19:18:08 +000022 def setUp(self):
23 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
24 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000025 global PORT
26 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000027 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029 def tearDown(self):
30 self.serv.close()
31 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Guido van Rossum24e4af82002-06-12 19:18:08 +000033class SocketUDPTest(unittest.TestCase):
34
35 def setUp(self):
36 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
37 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Neal Norwitz909eb122006-06-12 02:13:21 +000038 global PORT
39 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000040
41 def tearDown(self):
42 self.serv.close()
43 self.serv = None
44
45class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000046 """Threadable Test class
47
48 The ThreadableTest class makes it easy to create a threaded
49 client/server pair from an existing unit test. To create a
50 new threaded class from an existing unit test, use multiple
51 inheritance:
52
53 class NewClass (OldClass, ThreadableTest):
54 pass
55
56 This class defines two new fixture functions with obvious
57 purposes for overriding:
58
59 clientSetUp ()
60 clientTearDown ()
61
62 Any new test functions within the class must then define
63 tests in pairs, where the test name is preceeded with a
64 '_' to indicate the client portion of the test. Ex:
65
66 def testFoo(self):
67 # Server portion
68
69 def _testFoo(self):
70 # Client portion
71
72 Any exceptions raised by the clients during their tests
73 are caught and transferred to the main thread to alert
74 the testing framework.
75
76 Note, the server setup function cannot call any blocking
77 functions that rely on the client thread during setup,
78 unless serverExplicityReady() is called just before
79 the blocking call (such as in setting up a client/server
80 connection and performing the accept() in setUp().
81 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000082
83 def __init__(self):
84 # Swap the true setup function
85 self.__setUp = self.setUp
86 self.__tearDown = self.tearDown
87 self.setUp = self._setUp
88 self.tearDown = self._tearDown
89
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000090 def serverExplicitReady(self):
91 """This method allows the server to explicitly indicate that
92 it wants the client thread to proceed. This is useful if the
93 server is about to execute a blocking routine that is
94 dependent upon the client thread during its setup routine."""
95 self.server_ready.set()
96
Guido van Rossum24e4af82002-06-12 19:18:08 +000097 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000098 self.server_ready = threading.Event()
99 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000100 self.done = threading.Event()
101 self.queue = Queue.Queue(1)
102
103 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000104 methodname = self.id()
105 i = methodname.rfind('.')
106 methodname = methodname[i+1:]
107 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000108 self.client_thread = thread.start_new_thread(
109 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110
111 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 if not self.server_ready.isSet():
113 self.server_ready.set()
114 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def _tearDown(self):
117 self.__tearDown()
118 self.done.wait()
119
120 if not self.queue.empty():
121 msg = self.queue.get()
122 self.fail(msg)
123
124 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000125 self.server_ready.wait()
126 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000127 self.clientSetUp()
128 if not callable(test_func):
129 raise TypeError, "test_func must be a callable function"
130 try:
131 test_func()
132 except Exception, strerror:
133 self.queue.put(strerror)
134 self.clientTearDown()
135
136 def clientSetUp(self):
137 raise NotImplementedError, "clientSetUp must be implemented."
138
139 def clientTearDown(self):
140 self.done.set()
141 thread.exit()
142
143class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
144
145 def __init__(self, methodName='runTest'):
146 SocketTCPTest.__init__(self, methodName=methodName)
147 ThreadableTest.__init__(self)
148
149 def clientSetUp(self):
150 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
151
152 def clientTearDown(self):
153 self.cli.close()
154 self.cli = None
155 ThreadableTest.clientTearDown(self)
156
157class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
158
159 def __init__(self, methodName='runTest'):
160 SocketUDPTest.__init__(self, methodName=methodName)
161 ThreadableTest.__init__(self)
162
163 def clientSetUp(self):
164 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
165
166class SocketConnectedTest(ThreadedTCPSocketTest):
167
168 def __init__(self, methodName='runTest'):
169 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
170
171 def setUp(self):
172 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000173 # Indicate explicitly we're ready for the client thread to
174 # proceed and then perform the blocking call to accept
175 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000176 conn, addr = self.serv.accept()
177 self.cli_conn = conn
178
179 def tearDown(self):
180 self.cli_conn.close()
181 self.cli_conn = None
182 ThreadedTCPSocketTest.tearDown(self)
183
184 def clientSetUp(self):
185 ThreadedTCPSocketTest.clientSetUp(self)
186 self.cli.connect((HOST, PORT))
187 self.serv_conn = self.cli
188
189 def clientTearDown(self):
190 self.serv_conn.close()
191 self.serv_conn = None
192 ThreadedTCPSocketTest.clientTearDown(self)
193
Dave Cole331708b2004-08-09 04:51:41 +0000194class SocketPairTest(unittest.TestCase, ThreadableTest):
195
196 def __init__(self, methodName='runTest'):
197 unittest.TestCase.__init__(self, methodName=methodName)
198 ThreadableTest.__init__(self)
199
200 def setUp(self):
201 self.serv, self.cli = socket.socketpair()
202
203 def tearDown(self):
204 self.serv.close()
205 self.serv = None
206
207 def clientSetUp(self):
208 pass
209
210 def clientTearDown(self):
211 self.cli.close()
212 self.cli = None
213 ThreadableTest.clientTearDown(self)
214
Tim Peters494aaee2004-08-09 18:54:11 +0000215
Guido van Rossum24e4af82002-06-12 19:18:08 +0000216#######################################################################
217## Begin Tests
218
219class GeneralModuleTests(unittest.TestCase):
220
Raymond Hettinger027bb632004-05-31 03:09:25 +0000221 def test_weakref(self):
222 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
223 p = proxy(s)
224 self.assertEqual(p.fileno(), s.fileno())
225 s.close()
226 s = None
227 try:
228 p.fileno()
229 except ReferenceError:
230 pass
231 else:
232 self.fail('Socket proxy still exists')
233
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000235 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000236 def raise_error(*args, **kwargs):
237 raise socket.error
238 def raise_herror(*args, **kwargs):
239 raise socket.herror
240 def raise_gaierror(*args, **kwargs):
241 raise socket.gaierror
242 self.failUnlessRaises(socket.error, raise_error,
243 "Error raising socket exception.")
244 self.failUnlessRaises(socket.error, raise_herror,
245 "Error raising socket exception.")
246 self.failUnlessRaises(socket.error, raise_gaierror,
247 "Error raising socket exception.")
248
249 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000250 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000251 socket.AF_INET
252 socket.SOCK_STREAM
253 socket.SOCK_DGRAM
254 socket.SOCK_RAW
255 socket.SOCK_RDM
256 socket.SOCK_SEQPACKET
257 socket.SOL_SOCKET
258 socket.SO_REUSEADDR
259
Guido van Rossum654c11e2002-06-13 20:24:17 +0000260 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000261 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000262 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000263 try:
264 ip = socket.gethostbyname(hostname)
265 except socket.error:
266 # Probably name lookup wasn't set up right; skip this test
267 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000268 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000269 try:
270 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
271 except socket.error:
272 # Probably a similar problem as above; skip this test
273 return
Brett Cannon01668a12005-03-11 00:04:17 +0000274 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000275 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000276 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000277 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000278
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000279 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000280 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000282 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000283 try:
284 # On some versions, this loses a reference
285 orig = sys.getrefcount(__name__)
286 socket.getnameinfo(__name__,0)
287 except SystemError:
288 if sys.getrefcount(__name__) <> orig:
289 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000290
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000292 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000293 try:
294 # On some versions, this crashes the interpreter.
295 socket.getnameinfo(('x', 0, 0, 0), 0)
296 except socket.error:
297 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000298
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000299 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000300 # This just checks that htons etc. are their own inverse,
301 # when looking at the lower 16 or 32 bits.
302 sizes = {socket.htonl: 32, socket.ntohl: 32,
303 socket.htons: 16, socket.ntohs: 16}
304 for func, size in sizes.items():
305 mask = (1L<<size) - 1
306 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
307 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000308
Guido van Rossuma2627af2002-09-14 00:58:46 +0000309 swapped = func(mask)
310 self.assertEqual(swapped & mask, mask)
311 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000312
Barry Warsaw11b91a02004-06-28 00:50:43 +0000313 def testGetServBy(self):
314 eq = self.assertEqual
315 # Find one service that exists, then check all the related interfaces.
316 # I've ordered this by protocols that have both a tcp and udp
317 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000318 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000319 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000320 # avoid the 'echo' service on this platform, as there is an
321 # assumption breaking non-standard port/protocol entry
322 services = ('daytime', 'qotd', 'domain')
323 else:
324 services = ('echo', 'daytime', 'domain')
325 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000326 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000327 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000328 break
329 except socket.error:
330 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000331 else:
332 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000333 # Try same call with optional protocol omitted
334 port2 = socket.getservbyname(service)
335 eq(port, port2)
336 # Try udp, but don't barf it it doesn't exist
337 try:
338 udpport = socket.getservbyname(service, 'udp')
339 except socket.error:
340 udpport = None
341 else:
342 eq(udpport, port)
343 # Now make sure the lookup by port returns the same service name
344 eq(socket.getservbyport(port2), service)
345 eq(socket.getservbyport(port, 'tcp'), service)
346 if udpport is not None:
347 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000348
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000349 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000350 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000351 # The default timeout should initially be None
352 self.assertEqual(socket.getdefaulttimeout(), None)
353 s = socket.socket()
354 self.assertEqual(s.gettimeout(), None)
355 s.close()
356
357 # Set the default timeout to 10, and see if it propagates
358 socket.setdefaulttimeout(10)
359 self.assertEqual(socket.getdefaulttimeout(), 10)
360 s = socket.socket()
361 self.assertEqual(s.gettimeout(), 10)
362 s.close()
363
364 # Reset the default timeout to None, and see if it propagates
365 socket.setdefaulttimeout(None)
366 self.assertEqual(socket.getdefaulttimeout(), None)
367 s = socket.socket()
368 self.assertEqual(s.gettimeout(), None)
369 s.close()
370
371 # Check that setting it to an invalid value raises ValueError
372 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
373
374 # Check that setting it to an invalid type raises TypeError
375 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
376
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000377 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000378 if not hasattr(socket, 'inet_pton'):
379 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000380 from socket import inet_aton as f, inet_pton, AF_INET
381 g = lambda a: inet_pton(AF_INET, a)
382
383 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
384 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
385 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
386 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000387 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000388
389 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
390 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
391 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000392 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000393
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000394 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000395 if not hasattr(socket, 'inet_pton'):
396 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000397 try:
398 from socket import inet_pton, AF_INET6, has_ipv6
399 if not has_ipv6:
400 return
401 except ImportError:
402 return
403 f = lambda a: inet_pton(AF_INET6, a)
404
405 self.assertEquals('\x00' * 16, f('::'))
406 self.assertEquals('\x00' * 16, f('0::0'))
407 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
408 self.assertEquals(
409 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
410 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
411 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000412
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000413 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000414 if not hasattr(socket, 'inet_ntop'):
415 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000416 from socket import inet_ntoa as f, inet_ntop, AF_INET
417 g = lambda a: inet_ntop(AF_INET, a)
418
419 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
420 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
421 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
422 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000423
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000424 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
425 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
426 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
427
428 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000429 if not hasattr(socket, 'inet_ntop'):
430 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000431 try:
432 from socket import inet_ntop, AF_INET6, has_ipv6
433 if not has_ipv6:
434 return
435 except ImportError:
436 return
437 f = lambda a: inet_ntop(AF_INET6, a)
438
439 self.assertEquals('::', f('\x00' * 16))
440 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
441 self.assertEquals(
442 'aef:b01:506:1001:ffff:9997:55:170',
443 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
444 )
445
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000446 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000447
Guido van Rossum24e4af82002-06-12 19:18:08 +0000448 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000449 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000451 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000452 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000453 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
454 # it reasonable to get the host's addr in addition to 0.0.0.0.
455 # At least for eCos. This is required for the S/390 to pass.
456 my_ip_addr = socket.gethostbyname(socket.gethostname())
457 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
458 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000459
460 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000461 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462 # We know a socket should start without reuse==0
463 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
464 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000465 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466
467 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000468 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000469 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
470 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
471 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000472 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000473
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000474 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000475 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000476 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
477 sock.settimeout(1)
478 sock.close()
479 self.assertRaises(socket.error, sock.send, "spam")
480
Georg Brandlbb03ac02006-03-21 18:17:25 +0000481 def testNewAttributes(self):
482 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000483 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000484 self.assertEqual(sock.family, socket.AF_INET)
485 self.assertEqual(sock.type, socket.SOCK_STREAM)
486 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000487 sock.close()
488
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489class BasicTCPTest(SocketConnectedTest):
490
491 def __init__(self, methodName='runTest'):
492 SocketConnectedTest.__init__(self, methodName=methodName)
493
494 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000495 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000497 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000498
499 def _testRecv(self):
500 self.serv_conn.send(MSG)
501
502 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000503 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000504 seg1 = self.cli_conn.recv(len(MSG) - 3)
505 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000506 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000507 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000508
509 def _testOverFlowRecv(self):
510 self.serv_conn.send(MSG)
511
512 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000513 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000515 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000516
517 def _testRecvFrom(self):
518 self.serv_conn.send(MSG)
519
520 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000521 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
523 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000524 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000525 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
527 def _testOverFlowRecvFrom(self):
528 self.serv_conn.send(MSG)
529
530 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000531 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000532 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533 while 1:
534 read = self.cli_conn.recv(1024)
535 if not read:
536 break
Guido van Rossume531e292002-08-08 20:28:34 +0000537 msg += read
538 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539
540 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000541 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542 self.serv_conn.sendall(big_chunk)
543
544 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000545 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000546 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000547 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000548 fd = self.cli_conn.fileno()
549 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
550 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000551 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def _testFromFd(self):
554 self.serv_conn.send(MSG)
555
556 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000557 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000558 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000559 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560
561 def _testShutdown(self):
562 self.serv_conn.send(MSG)
563 self.serv_conn.shutdown(2)
564
565class BasicUDPTest(ThreadedUDPSocketTest):
566
567 def __init__(self, methodName='runTest'):
568 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
569
570 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000571 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000573 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574
575 def _testSendtoAndRecv(self):
576 self.cli.sendto(MSG, 0, (HOST, PORT))
577
Guido van Rossum1c938012002-06-12 21:17:20 +0000578 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000579 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000581 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582
Guido van Rossum1c938012002-06-12 21:17:20 +0000583 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 self.cli.sendto(MSG, 0, (HOST, PORT))
585
Neal Norwitz65407fb2007-03-31 18:56:11 +0000586 def testRecvFromNegative(self):
587 # Negative lengths passed to recvfrom should give ValueError.
588 self.assertRaises(ValueError, self.serv.recvfrom, -1)
589
590 def _testRecvFromNegative(self):
591 self.cli.sendto(MSG, 0, (HOST, PORT))
592
Martin v. Löwis7596e832006-07-01 15:33:37 +0000593class TCPCloserTest(ThreadedTCPSocketTest):
594
595 def testClose(self):
596 conn, addr = self.serv.accept()
597 conn.close()
598
599 sd = self.cli
600 read, write, err = select.select([sd], [], [], 1.0)
601 self.assertEqual(read, [sd])
602 self.assertEqual(sd.recv(1), '')
603
604 def _testClose(self):
605 self.cli.connect((HOST, PORT))
606 time.sleep(1.0)
607
Dave Cole331708b2004-08-09 04:51:41 +0000608class BasicSocketPairTest(SocketPairTest):
609
610 def __init__(self, methodName='runTest'):
611 SocketPairTest.__init__(self, methodName=methodName)
612
613 def testRecv(self):
614 msg = self.serv.recv(1024)
615 self.assertEqual(msg, MSG)
616
617 def _testRecv(self):
618 self.cli.send(MSG)
619
620 def testSend(self):
621 self.serv.send(MSG)
622
623 def _testSend(self):
624 msg = self.cli.recv(1024)
625 self.assertEqual(msg, MSG)
626
Guido van Rossum24e4af82002-06-12 19:18:08 +0000627class NonBlockingTCPTests(ThreadedTCPSocketTest):
628
629 def __init__(self, methodName='runTest'):
630 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
631
632 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000633 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000634 self.serv.setblocking(0)
635 start = time.time()
636 try:
637 self.serv.accept()
638 except socket.error:
639 pass
640 end = time.time()
641 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
642
643 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000644 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000645
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000647 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000649 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650 conn, addr = self.serv.accept()
651 except socket.error:
652 pass
653 else:
654 self.fail("Error trying to do non-blocking accept.")
655 read, write, err = select.select([self.serv], [], [])
656 if self.serv in read:
657 conn, addr = self.serv.accept()
658 else:
659 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000660
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000662 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663 self.cli.connect((HOST, PORT))
664
665 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000666 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 conn, addr = self.serv.accept()
668
669 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000670 self.cli.settimeout(10)
671 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672
673 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000674 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000675 conn, addr = self.serv.accept()
676 conn.setblocking(0)
677 try:
678 msg = conn.recv(len(MSG))
679 except socket.error:
680 pass
681 else:
682 self.fail("Error trying to do non-blocking recv.")
683 read, write, err = select.select([conn], [], [])
684 if conn in read:
685 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000686 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 else:
688 self.fail("Error during select call to non-blocking socket.")
689
690 def _testRecv(self):
691 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000692 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000693 self.cli.send(MSG)
694
695class FileObjectClassTestCase(SocketConnectedTest):
696
Guido van Rossume9f66142002-08-07 15:46:19 +0000697 bufsize = -1 # Use default buffer size
698
Guido van Rossum24e4af82002-06-12 19:18:08 +0000699 def __init__(self, methodName='runTest'):
700 SocketConnectedTest.__init__(self, methodName=methodName)
701
702 def setUp(self):
703 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000704 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705
706 def tearDown(self):
707 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000708 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 self.serv_file = None
710 SocketConnectedTest.tearDown(self)
711
712 def clientSetUp(self):
713 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000714 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715
716 def clientTearDown(self):
717 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000718 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719 self.cli_file = None
720 SocketConnectedTest.clientTearDown(self)
721
722 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000723 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000724 first_seg = self.serv_file.read(len(MSG)-3)
725 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000726 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000727 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728
729 def _testSmallRead(self):
730 self.cli_file.write(MSG)
731 self.cli_file.flush()
732
Guido van Rossum8c943832002-08-08 01:00:28 +0000733 def testFullRead(self):
734 # read until EOF
735 msg = self.serv_file.read()
736 self.assertEqual(msg, MSG)
737
738 def _testFullRead(self):
739 self.cli_file.write(MSG)
740 self.cli_file.close()
741
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000743 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744 buf = ''
745 while 1:
746 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000747 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000749 buf += char
750 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751
752 def _testUnbufferedRead(self):
753 self.cli_file.write(MSG)
754 self.cli_file.flush()
755
756 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000757 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000759 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760
761 def _testReadline(self):
762 self.cli_file.write(MSG)
763 self.cli_file.flush()
764
Tim Peters116d83c2004-03-28 02:20:45 +0000765 def testClosedAttr(self):
766 self.assert_(not self.serv_file.closed)
767
768 def _testClosedAttr(self):
769 self.assert_(not self.cli_file.closed)
770
Guido van Rossume9f66142002-08-07 15:46:19 +0000771class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
772
773 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000774
Guido van Rossume9f66142002-08-07 15:46:19 +0000775 In this case (and in this case only), it should be possible to
776 create a file object, read a line from it, create another file
777 object, read another line from it, without loss of data in the
778 first file object's buffer. Note that httplib relies on this
779 when reading multiple requests from the same socket."""
780
781 bufsize = 0 # Use unbuffered mode
782
783 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000784 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000785 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000786 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000787 self.serv_file = self.cli_conn.makefile('rb', 0)
788 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000789 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000790
791 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000792 self.cli_file.write("A. " + MSG)
793 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000794 self.cli_file.flush()
795
Guido van Rossum8c943832002-08-08 01:00:28 +0000796class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
797
798 bufsize = 1 # Default-buffered for reading; line-buffered for writing
799
800
801class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
802
803 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000804
Georg Brandl962e9162007-01-21 10:35:14 +0000805
806class Urllib2FileobjectTest(unittest.TestCase):
807
808 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
809 # it close the socket if the close c'tor argument is true
810
811 def testClose(self):
812 class MockSocket:
813 closed = False
814 def flush(self): pass
815 def close(self): self.closed = True
816
817 # must not close unless we request it: the original use of _fileobject
818 # by module socket requires that the underlying socket not be closed until
819 # the _socketobject that created the _fileobject is closed
820 s = MockSocket()
821 f = socket._fileobject(s)
822 f.close()
823 self.assert_(not s.closed)
824
825 s = MockSocket()
826 f = socket._fileobject(s, close=True)
827 f.close()
828 self.assert_(s.closed)
829
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000830class TCPTimeoutTest(SocketTCPTest):
831
832 def testTCPTimeout(self):
833 def raise_timeout(*args, **kwargs):
834 self.serv.settimeout(1.0)
835 self.serv.accept()
836 self.failUnlessRaises(socket.timeout, raise_timeout,
837 "Error generating a timeout exception (TCP)")
838
839 def testTimeoutZero(self):
840 ok = False
841 try:
842 self.serv.settimeout(0.0)
843 foo = self.serv.accept()
844 except socket.timeout:
845 self.fail("caught timeout instead of error (TCP)")
846 except socket.error:
847 ok = True
848 except:
849 self.fail("caught unexpected exception (TCP)")
850 if not ok:
851 self.fail("accept() returned success when we did not expect it")
852
Neal Norwitz9b0ca792006-08-02 06:46:21 +0000853 def testInterruptedTimeout(self):
854 # XXX I don't know how to do this test on MSWindows or any other
855 # plaform that doesn't support signal.alarm() or os.kill(), though
856 # the bug should have existed on all platforms.
857 if not hasattr(signal, "alarm"):
858 return # can only test on *nix
859 self.serv.settimeout(5.0) # must be longer than alarm
860 class Alarm(Exception):
861 pass
862 def alarm_handler(signal, frame):
863 raise Alarm
864 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
865 try:
866 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
867 try:
868 foo = self.serv.accept()
869 except socket.timeout:
870 self.fail("caught timeout instead of Alarm")
871 except Alarm:
872 pass
873 except:
874 self.fail("caught other exception instead of Alarm")
875 else:
876 self.fail("nothing caught")
877 signal.alarm(0) # shut off alarm
878 except Alarm:
879 self.fail("got Alarm in wrong place")
880 finally:
881 # no alarm can be pending. Safe to restore old handler.
882 signal.signal(signal.SIGALRM, old_alarm)
883
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000884class UDPTimeoutTest(SocketTCPTest):
885
886 def testUDPTimeout(self):
887 def raise_timeout(*args, **kwargs):
888 self.serv.settimeout(1.0)
889 self.serv.recv(1024)
890 self.failUnlessRaises(socket.timeout, raise_timeout,
891 "Error generating a timeout exception (UDP)")
892
893 def testTimeoutZero(self):
894 ok = False
895 try:
896 self.serv.settimeout(0.0)
897 foo = self.serv.recv(1024)
898 except socket.timeout:
899 self.fail("caught timeout instead of error (UDP)")
900 except socket.error:
901 ok = True
902 except:
903 self.fail("caught unexpected exception (UDP)")
904 if not ok:
905 self.fail("recv() returned success when we did not expect it")
906
907class TestExceptions(unittest.TestCase):
908
909 def testExceptionTree(self):
910 self.assert_(issubclass(socket.error, Exception))
911 self.assert_(issubclass(socket.herror, socket.error))
912 self.assert_(issubclass(socket.gaierror, socket.error))
913 self.assert_(issubclass(socket.timeout, socket.error))
914
Armin Rigoa9017c32006-04-19 11:50:27 +0000915class TestLinuxAbstractNamespace(unittest.TestCase):
916
917 UNIX_PATH_MAX = 108
918
919 def testLinuxAbstractNamespace(self):
920 address = "\x00python-test-hello\x00\xff"
921 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
922 s1.bind(address)
923 s1.listen(1)
924 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
925 s2.connect(s1.getsockname())
926 s1.accept()
927 self.assertEqual(s1.getsockname(), address)
928 self.assertEqual(s2.getpeername(), address)
929
930 def testMaxName(self):
931 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
932 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
933 s.bind(address)
934 self.assertEqual(s.getsockname(), address)
935
936 def testNameOverflow(self):
937 address = "\x00" + "h" * self.UNIX_PATH_MAX
938 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
939 self.assertRaises(socket.error, s.bind, address)
940
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000941
Martin Blais2856e5f2006-05-26 12:03:27 +0000942class BufferIOTest(SocketConnectedTest):
943 """
944 Test the buffer versions of socket.recv() and socket.send().
945 """
946 def __init__(self, methodName='runTest'):
947 SocketConnectedTest.__init__(self, methodName=methodName)
948
Martin Blaisaf2ae722006-06-04 13:49:49 +0000949 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000950 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000951 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000952 self.assertEqual(nbytes, len(MSG))
953 msg = buf.tostring()[:len(MSG)]
954 self.assertEqual(msg, MSG)
955
Martin Blaisaf2ae722006-06-04 13:49:49 +0000956 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000957 buf = buffer(MSG)
958 self.serv_conn.send(buf)
959
Martin Blaisaf2ae722006-06-04 13:49:49 +0000960 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000961 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +0000962 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +0000963 self.assertEqual(nbytes, len(MSG))
964 msg = buf.tostring()[:len(MSG)]
965 self.assertEqual(msg, MSG)
966
Martin Blaisaf2ae722006-06-04 13:49:49 +0000967 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +0000968 buf = buffer(MSG)
969 self.serv_conn.send(buf)
970
Guido van Rossumb995eb72002-07-31 16:08:40 +0000971def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +0000972 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
973 TestExceptions, BufferIOTest]
Jack Jansen522e7692002-09-06 21:57:50 +0000974 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000975 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000976
977 tests.extend([
978 NonBlockingTCPTests,
979 FileObjectClassTestCase,
980 UnbufferedFileObjectClassTestCase,
981 LineBufferedFileObjectClassTestCase,
Georg Brandl962e9162007-01-21 10:35:14 +0000982 SmallBufferedFileObjectClassTestCase,
983 Urllib2FileobjectTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000984 ])
Dave Cole331708b2004-08-09 04:51:41 +0000985 if hasattr(socket, "socketpair"):
986 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +0000987 if sys.platform == 'linux2':
988 tests.append(TestLinuxAbstractNamespace)
Neal Norwitz9602cc22006-06-18 19:35:01 +0000989
990 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000991 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +0000992 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993
994if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000995 test_main()