blob: 1f26b4eb8afe9c653c12ab7029d4b2fc6590cc6c [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
Thomas Wouters477c8d52006-05-27 19:21:47 +000012import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000013from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +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)
Thomas Wouters0e3f5912006-08-11 14:57:12 +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)
Thomas Wouters0e3f5912006-08-11 14:57:12 +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()
Guido van Rossumb940e112007-01-10 16:19:56 +0000132 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000275 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000276 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000288 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 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():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000305 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000306 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)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000311 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000312
Guido van Rossum018919a2007-01-15 00:07:32 +0000313 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000314 good_values = [ 1, 2, 3, 1, 2, 3 ]
315 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000316 for k in good_values:
317 socket.ntohl(k)
318 socket.ntohs(k)
319 socket.htonl(k)
320 socket.htons(k)
321 for k in bad_values:
322 self.assertRaises(OverflowError, socket.ntohl, k)
323 self.assertRaises(OverflowError, socket.ntohs, k)
324 self.assertRaises(OverflowError, socket.htonl, k)
325 self.assertRaises(OverflowError, socket.htons, k)
326
Barry Warsaw11b91a02004-06-28 00:50:43 +0000327 def testGetServBy(self):
328 eq = self.assertEqual
329 # Find one service that exists, then check all the related interfaces.
330 # I've ordered this by protocols that have both a tcp and udp
331 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000332 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000333 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000334 # avoid the 'echo' service on this platform, as there is an
335 # assumption breaking non-standard port/protocol entry
336 services = ('daytime', 'qotd', 'domain')
337 else:
338 services = ('echo', 'daytime', 'domain')
339 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000340 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000341 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000342 break
343 except socket.error:
344 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000345 else:
346 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000347 # Try same call with optional protocol omitted
348 port2 = socket.getservbyname(service)
349 eq(port, port2)
350 # Try udp, but don't barf it it doesn't exist
351 try:
352 udpport = socket.getservbyname(service, 'udp')
353 except socket.error:
354 udpport = None
355 else:
356 eq(udpport, port)
357 # Now make sure the lookup by port returns the same service name
358 eq(socket.getservbyport(port2), service)
359 eq(socket.getservbyport(port, 'tcp'), service)
360 if udpport is not None:
361 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000363 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000364 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000365 # The default timeout should initially be None
366 self.assertEqual(socket.getdefaulttimeout(), None)
367 s = socket.socket()
368 self.assertEqual(s.gettimeout(), None)
369 s.close()
370
371 # Set the default timeout to 10, and see if it propagates
372 socket.setdefaulttimeout(10)
373 self.assertEqual(socket.getdefaulttimeout(), 10)
374 s = socket.socket()
375 self.assertEqual(s.gettimeout(), 10)
376 s.close()
377
378 # Reset the default timeout to None, and see if it propagates
379 socket.setdefaulttimeout(None)
380 self.assertEqual(socket.getdefaulttimeout(), None)
381 s = socket.socket()
382 self.assertEqual(s.gettimeout(), None)
383 s.close()
384
385 # Check that setting it to an invalid value raises ValueError
386 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
387
388 # Check that setting it to an invalid type raises TypeError
389 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
390
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000391 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000392 if not hasattr(socket, 'inet_pton'):
393 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000394 from socket import inet_aton as f, inet_pton, AF_INET
395 g = lambda a: inet_pton(AF_INET, a)
396
397 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
398 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
399 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
400 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000401 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000402
403 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
404 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
405 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000406 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000407
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000408 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000409 if not hasattr(socket, 'inet_pton'):
410 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000411 try:
412 from socket import inet_pton, AF_INET6, has_ipv6
413 if not has_ipv6:
414 return
415 except ImportError:
416 return
417 f = lambda a: inet_pton(AF_INET6, a)
418
419 self.assertEquals('\x00' * 16, f('::'))
420 self.assertEquals('\x00' * 16, f('0::0'))
421 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
422 self.assertEquals(
423 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
424 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
425 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000426
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000427 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000428 if not hasattr(socket, 'inet_ntop'):
429 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 from socket import inet_ntoa as f, inet_ntop, AF_INET
431 g = lambda a: inet_ntop(AF_INET, a)
432
433 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
434 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
435 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
436 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000437
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000438 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
439 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
440 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
441
442 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000443 if not hasattr(socket, 'inet_ntop'):
444 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000445 try:
446 from socket import inet_ntop, AF_INET6, has_ipv6
447 if not has_ipv6:
448 return
449 except ImportError:
450 return
451 f = lambda a: inet_ntop(AF_INET6, a)
452
453 self.assertEquals('::', f('\x00' * 16))
454 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
455 self.assertEquals(
456 'aef:b01:506:1001:ffff:9997:55:170',
457 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
458 )
459
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000460 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000461
Guido van Rossum24e4af82002-06-12 19:18:08 +0000462 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000463 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000464 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000465 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000466 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000467 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
468 # it reasonable to get the host's addr in addition to 0.0.0.0.
469 # At least for eCos. This is required for the S/390 to pass.
470 my_ip_addr = socket.gethostbyname(socket.gethostname())
471 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
472 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000473
474 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000475 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 # We know a socket should start without reuse==0
477 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
478 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000479 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480
481 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000482 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000483 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
484 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
485 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000486 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000487
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000488 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000489 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000490 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
491 sock.settimeout(1)
492 sock.close()
493 self.assertRaises(socket.error, sock.send, "spam")
494
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000495 def testNewAttributes(self):
496 # testing .family, .type and .protocol
497 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
498 self.assertEqual(sock.family, socket.AF_INET)
499 self.assertEqual(sock.type, socket.SOCK_STREAM)
500 self.assertEqual(sock.proto, 0)
501 sock.close()
502
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503class BasicTCPTest(SocketConnectedTest):
504
505 def __init__(self, methodName='runTest'):
506 SocketConnectedTest.__init__(self, methodName=methodName)
507
508 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000509 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000511 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512
513 def _testRecv(self):
514 self.serv_conn.send(MSG)
515
516 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000517 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000518 seg1 = self.cli_conn.recv(len(MSG) - 3)
519 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000520 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000521 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522
523 def _testOverFlowRecv(self):
524 self.serv_conn.send(MSG)
525
526 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000527 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000529 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530
531 def _testRecvFrom(self):
532 self.serv_conn.send(MSG)
533
534 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000535 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
537 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000538 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000539 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540
541 def _testOverFlowRecvFrom(self):
542 self.serv_conn.send(MSG)
543
544 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000545 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000546 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000547 while 1:
548 read = self.cli_conn.recv(1024)
549 if not read:
550 break
Guido van Rossume531e292002-08-08 20:28:34 +0000551 msg += read
552 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000553
554 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000555 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000556 self.serv_conn.sendall(big_chunk)
557
558 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000559 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000560 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000561 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562 fd = self.cli_conn.fileno()
563 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
564 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000565 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566
567 def _testFromFd(self):
568 self.serv_conn.send(MSG)
569
570 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000571 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000573 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574
575 def _testShutdown(self):
576 self.serv_conn.send(MSG)
577 self.serv_conn.shutdown(2)
578
579class BasicUDPTest(ThreadedUDPSocketTest):
580
581 def __init__(self, methodName='runTest'):
582 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
583
584 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000585 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000587 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588
589 def _testSendtoAndRecv(self):
590 self.cli.sendto(MSG, 0, (HOST, PORT))
591
Guido van Rossum1c938012002-06-12 21:17:20 +0000592 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000593 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000595 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596
Guido van Rossum1c938012002-06-12 21:17:20 +0000597 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000598 self.cli.sendto(MSG, 0, (HOST, PORT))
599
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000600class TCPCloserTest(ThreadedTCPSocketTest):
601
602 def testClose(self):
603 conn, addr = self.serv.accept()
604 conn.close()
605
606 sd = self.cli
607 read, write, err = select.select([sd], [], [], 1.0)
608 self.assertEqual(read, [sd])
609 self.assertEqual(sd.recv(1), '')
610
611 def _testClose(self):
612 self.cli.connect((HOST, PORT))
613 time.sleep(1.0)
614
Dave Cole331708b2004-08-09 04:51:41 +0000615class BasicSocketPairTest(SocketPairTest):
616
617 def __init__(self, methodName='runTest'):
618 SocketPairTest.__init__(self, methodName=methodName)
619
620 def testRecv(self):
621 msg = self.serv.recv(1024)
622 self.assertEqual(msg, MSG)
623
624 def _testRecv(self):
625 self.cli.send(MSG)
626
627 def testSend(self):
628 self.serv.send(MSG)
629
630 def _testSend(self):
631 msg = self.cli.recv(1024)
632 self.assertEqual(msg, MSG)
633
Guido van Rossum24e4af82002-06-12 19:18:08 +0000634class NonBlockingTCPTests(ThreadedTCPSocketTest):
635
636 def __init__(self, methodName='runTest'):
637 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
638
639 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000640 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 self.serv.setblocking(0)
642 start = time.time()
643 try:
644 self.serv.accept()
645 except socket.error:
646 pass
647 end = time.time()
648 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
649
650 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000651 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000652
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000654 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000655 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000656 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657 conn, addr = self.serv.accept()
658 except socket.error:
659 pass
660 else:
661 self.fail("Error trying to do non-blocking accept.")
662 read, write, err = select.select([self.serv], [], [])
663 if self.serv in read:
664 conn, addr = self.serv.accept()
665 else:
666 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000669 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000670 self.cli.connect((HOST, PORT))
671
672 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000673 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 conn, addr = self.serv.accept()
675
676 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000677 self.cli.settimeout(10)
678 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679
680 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000681 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682 conn, addr = self.serv.accept()
683 conn.setblocking(0)
684 try:
685 msg = conn.recv(len(MSG))
686 except socket.error:
687 pass
688 else:
689 self.fail("Error trying to do non-blocking recv.")
690 read, write, err = select.select([conn], [], [])
691 if conn in read:
692 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000693 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 else:
695 self.fail("Error during select call to non-blocking socket.")
696
697 def _testRecv(self):
698 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000699 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 self.cli.send(MSG)
701
702class FileObjectClassTestCase(SocketConnectedTest):
703
Guido van Rossume9f66142002-08-07 15:46:19 +0000704 bufsize = -1 # Use default buffer size
705
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706 def __init__(self, methodName='runTest'):
707 SocketConnectedTest.__init__(self, methodName=methodName)
708
709 def setUp(self):
710 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000711 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712
713 def tearDown(self):
714 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000715 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 self.serv_file = None
717 SocketConnectedTest.tearDown(self)
718
719 def clientSetUp(self):
720 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000721 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722
723 def clientTearDown(self):
724 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000725 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726 self.cli_file = None
727 SocketConnectedTest.clientTearDown(self)
728
729 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000730 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000731 first_seg = self.serv_file.read(len(MSG)-3)
732 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000733 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000734 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735
736 def _testSmallRead(self):
737 self.cli_file.write(MSG)
738 self.cli_file.flush()
739
Guido van Rossum8c943832002-08-08 01:00:28 +0000740 def testFullRead(self):
741 # read until EOF
742 msg = self.serv_file.read()
743 self.assertEqual(msg, MSG)
744
745 def _testFullRead(self):
746 self.cli_file.write(MSG)
747 self.cli_file.close()
748
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000750 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751 buf = ''
752 while 1:
753 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 buf += char
757 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758
759 def _testUnbufferedRead(self):
760 self.cli_file.write(MSG)
761 self.cli_file.flush()
762
763 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000764 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000766 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767
768 def _testReadline(self):
769 self.cli_file.write(MSG)
770 self.cli_file.flush()
771
Tim Peters116d83c2004-03-28 02:20:45 +0000772 def testClosedAttr(self):
773 self.assert_(not self.serv_file.closed)
774
775 def _testClosedAttr(self):
776 self.assert_(not self.cli_file.closed)
777
Guido van Rossume9f66142002-08-07 15:46:19 +0000778class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
779
780 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000781
Guido van Rossume9f66142002-08-07 15:46:19 +0000782 In this case (and in this case only), it should be possible to
783 create a file object, read a line from it, create another file
784 object, read another line from it, without loss of data in the
785 first file object's buffer. Note that httplib relies on this
786 when reading multiple requests from the same socket."""
787
788 bufsize = 0 # Use unbuffered mode
789
790 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000791 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000792 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000793 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000794 self.serv_file = self.cli_conn.makefile('rb', 0)
795 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000796 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000797
798 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000799 self.cli_file.write("A. " + MSG)
800 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000801 self.cli_file.flush()
802
Guido van Rossum8c943832002-08-08 01:00:28 +0000803class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
804
805 bufsize = 1 # Default-buffered for reading; line-buffered for writing
806
807
808class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
809
810 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000811
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000812class TCPTimeoutTest(SocketTCPTest):
813
814 def testTCPTimeout(self):
815 def raise_timeout(*args, **kwargs):
816 self.serv.settimeout(1.0)
817 self.serv.accept()
818 self.failUnlessRaises(socket.timeout, raise_timeout,
819 "Error generating a timeout exception (TCP)")
820
821 def testTimeoutZero(self):
822 ok = False
823 try:
824 self.serv.settimeout(0.0)
825 foo = self.serv.accept()
826 except socket.timeout:
827 self.fail("caught timeout instead of error (TCP)")
828 except socket.error:
829 ok = True
830 except:
831 self.fail("caught unexpected exception (TCP)")
832 if not ok:
833 self.fail("accept() returned success when we did not expect it")
834
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000835 def testInterruptedTimeout(self):
836 # XXX I don't know how to do this test on MSWindows or any other
837 # plaform that doesn't support signal.alarm() or os.kill(), though
838 # the bug should have existed on all platforms.
839 if not hasattr(signal, "alarm"):
840 return # can only test on *nix
841 self.serv.settimeout(5.0) # must be longer than alarm
842 class Alarm(Exception):
843 pass
844 def alarm_handler(signal, frame):
845 raise Alarm
846 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
847 try:
848 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
849 try:
850 foo = self.serv.accept()
851 except socket.timeout:
852 self.fail("caught timeout instead of Alarm")
853 except Alarm:
854 pass
855 except:
856 self.fail("caught other exception instead of Alarm")
857 else:
858 self.fail("nothing caught")
859 signal.alarm(0) # shut off alarm
860 except Alarm:
861 self.fail("got Alarm in wrong place")
862 finally:
863 # no alarm can be pending. Safe to restore old handler.
864 signal.signal(signal.SIGALRM, old_alarm)
865
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000866class UDPTimeoutTest(SocketTCPTest):
867
868 def testUDPTimeout(self):
869 def raise_timeout(*args, **kwargs):
870 self.serv.settimeout(1.0)
871 self.serv.recv(1024)
872 self.failUnlessRaises(socket.timeout, raise_timeout,
873 "Error generating a timeout exception (UDP)")
874
875 def testTimeoutZero(self):
876 ok = False
877 try:
878 self.serv.settimeout(0.0)
879 foo = self.serv.recv(1024)
880 except socket.timeout:
881 self.fail("caught timeout instead of error (UDP)")
882 except socket.error:
883 ok = True
884 except:
885 self.fail("caught unexpected exception (UDP)")
886 if not ok:
887 self.fail("recv() returned success when we did not expect it")
888
889class TestExceptions(unittest.TestCase):
890
891 def testExceptionTree(self):
892 self.assert_(issubclass(socket.error, Exception))
893 self.assert_(issubclass(socket.herror, socket.error))
894 self.assert_(issubclass(socket.gaierror, socket.error))
895 self.assert_(issubclass(socket.timeout, socket.error))
896
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000897class TestLinuxAbstractNamespace(unittest.TestCase):
898
899 UNIX_PATH_MAX = 108
900
901 def testLinuxAbstractNamespace(self):
902 address = "\x00python-test-hello\x00\xff"
903 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
904 s1.bind(address)
905 s1.listen(1)
906 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
907 s2.connect(s1.getsockname())
908 s1.accept()
909 self.assertEqual(s1.getsockname(), address)
910 self.assertEqual(s2.getpeername(), address)
911
912 def testMaxName(self):
913 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
914 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
915 s.bind(address)
916 self.assertEqual(s.getsockname(), address)
917
918 def testNameOverflow(self):
919 address = "\x00" + "h" * self.UNIX_PATH_MAX
920 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
921 self.assertRaises(socket.error, s.bind, address)
922
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000923
Thomas Wouters477c8d52006-05-27 19:21:47 +0000924class BufferIOTest(SocketConnectedTest):
925 """
926 Test the buffer versions of socket.recv() and socket.send().
927 """
928 def __init__(self, methodName='runTest'):
929 SocketConnectedTest.__init__(self, methodName=methodName)
930
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000931 def testRecvInto(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000932 buf = array.array('c', ' '*1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000933 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000934 self.assertEqual(nbytes, len(MSG))
935 msg = buf.tostring()[:len(MSG)]
936 self.assertEqual(msg, MSG)
937
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000938 def _testRecvInto(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000939 buf = buffer(MSG)
940 self.serv_conn.send(buf)
941
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000942 def testRecvFromInto(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000943 buf = array.array('c', ' '*1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000944 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000945 self.assertEqual(nbytes, len(MSG))
946 msg = buf.tostring()[:len(MSG)]
947 self.assertEqual(msg, MSG)
948
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000949 def _testRecvFromInto(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000950 buf = buffer(MSG)
951 self.serv_conn.send(buf)
952
Guido van Rossumb995eb72002-07-31 16:08:40 +0000953def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000954 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
955 TestExceptions, BufferIOTest]
Jack Jansen522e7692002-09-06 21:57:50 +0000956 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000957 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000958
959 tests.extend([
960 NonBlockingTCPTests,
961 FileObjectClassTestCase,
962 UnbufferedFileObjectClassTestCase,
963 LineBufferedFileObjectClassTestCase,
964 SmallBufferedFileObjectClassTestCase
965 ])
Dave Cole331708b2004-08-09 04:51:41 +0000966 if hasattr(socket, "socketpair"):
967 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000968 if sys.platform == 'linux2':
969 tests.append(TestLinuxAbstractNamespace)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000970
971 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +0000972 test_support.run_unittest(*tests)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000973 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974
975if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000976 test_main()