blob: 25025ddc3ed3307fb21cef02ef3ec7b86bbe2189 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000016from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000017import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Benjamin Petersonee8712c2008-05-20 21:35:26 +000019HOST = support.HOST
Guido van Rossum7d0a8262007-05-21 23:13:11 +000020MSG = b'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000021
Victor Stinner45df8202010-04-28 22:31:17 +000022try:
23 import _thread as thread
24 import threading
25except ImportError:
26 thread = None
27 threading = None
28
Guido van Rossum24e4af82002-06-12 19:18:08 +000029class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000030
Guido van Rossum24e4af82002-06-12 19:18:08 +000031 def setUp(self):
32 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000034 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Guido van Rossum24e4af82002-06-12 19:18:08 +000036 def tearDown(self):
37 self.serv.close()
38 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000039
Guido van Rossum24e4af82002-06-12 19:18:08 +000040class SocketUDPTest(unittest.TestCase):
41
42 def setUp(self):
43 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000044 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000045
46 def tearDown(self):
47 self.serv.close()
48 self.serv = None
49
50class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000051 """Threadable Test class
52
53 The ThreadableTest class makes it easy to create a threaded
54 client/server pair from an existing unit test. To create a
55 new threaded class from an existing unit test, use multiple
56 inheritance:
57
58 class NewClass (OldClass, ThreadableTest):
59 pass
60
61 This class defines two new fixture functions with obvious
62 purposes for overriding:
63
64 clientSetUp ()
65 clientTearDown ()
66
67 Any new test functions within the class must then define
68 tests in pairs, where the test name is preceeded with a
69 '_' to indicate the client portion of the test. Ex:
70
71 def testFoo(self):
72 # Server portion
73
74 def _testFoo(self):
75 # Client portion
76
77 Any exceptions raised by the clients during their tests
78 are caught and transferred to the main thread to alert
79 the testing framework.
80
81 Note, the server setup function cannot call any blocking
82 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000083 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000084 the blocking call (such as in setting up a client/server
85 connection and performing the accept() in setUp().
86 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000087
88 def __init__(self):
89 # Swap the true setup function
90 self.__setUp = self.setUp
91 self.__tearDown = self.tearDown
92 self.setUp = self._setUp
93 self.tearDown = self._tearDown
94
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000095 def serverExplicitReady(self):
96 """This method allows the server to explicitly indicate that
97 it wants the client thread to proceed. This is useful if the
98 server is about to execute a blocking routine that is
99 dependent upon the client thread during its setup routine."""
100 self.server_ready.set()
101
Guido van Rossum24e4af82002-06-12 19:18:08 +0000102 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000103 self.server_ready = threading.Event()
104 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000105 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000106 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000107
108 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000109 methodname = self.id()
110 i = methodname.rfind('.')
111 methodname = methodname[i+1:]
112 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000113 self.client_thread = thread.start_new_thread(
114 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000117 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000118 self.server_ready.set()
119 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120
121 def _tearDown(self):
122 self.__tearDown()
123 self.done.wait()
124
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000125 if self.queue.qsize():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126 msg = self.queue.get()
127 self.fail(msg)
128
129 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000130 self.server_ready.wait()
131 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000132 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000133 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000134 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135 try:
136 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000137 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000138 self.queue.put(strerror)
139 self.clientTearDown()
140
141 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000142 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 def clientTearDown(self):
145 self.done.set()
146 thread.exit()
147
148class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
149
150 def __init__(self, methodName='runTest'):
151 SocketTCPTest.__init__(self, methodName=methodName)
152 ThreadableTest.__init__(self)
153
154 def clientSetUp(self):
155 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
156
157 def clientTearDown(self):
158 self.cli.close()
159 self.cli = None
160 ThreadableTest.clientTearDown(self)
161
162class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
163
164 def __init__(self, methodName='runTest'):
165 SocketUDPTest.__init__(self, methodName=methodName)
166 ThreadableTest.__init__(self)
167
168 def clientSetUp(self):
169 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
170
171class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000172 """Socket tests for client-server connection.
173
174 self.cli_conn is a client socket connected to the server. The
175 setUp() method guarantees that it is connected to the server.
176 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177
178 def __init__(self, methodName='runTest'):
179 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
180
181 def setUp(self):
182 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000183 # Indicate explicitly we're ready for the client thread to
184 # proceed and then perform the blocking call to accept
185 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186 conn, addr = self.serv.accept()
187 self.cli_conn = conn
188
189 def tearDown(self):
190 self.cli_conn.close()
191 self.cli_conn = None
192 ThreadedTCPSocketTest.tearDown(self)
193
194 def clientSetUp(self):
195 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000196 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197 self.serv_conn = self.cli
198
199 def clientTearDown(self):
200 self.serv_conn.close()
201 self.serv_conn = None
202 ThreadedTCPSocketTest.clientTearDown(self)
203
Dave Cole331708b2004-08-09 04:51:41 +0000204class SocketPairTest(unittest.TestCase, ThreadableTest):
205
206 def __init__(self, methodName='runTest'):
207 unittest.TestCase.__init__(self, methodName=methodName)
208 ThreadableTest.__init__(self)
209
210 def setUp(self):
211 self.serv, self.cli = socket.socketpair()
212
213 def tearDown(self):
214 self.serv.close()
215 self.serv = None
216
217 def clientSetUp(self):
218 pass
219
220 def clientTearDown(self):
221 self.cli.close()
222 self.cli = None
223 ThreadableTest.clientTearDown(self)
224
Tim Peters494aaee2004-08-09 18:54:11 +0000225
Guido van Rossum24e4af82002-06-12 19:18:08 +0000226#######################################################################
227## Begin Tests
228
229class GeneralModuleTests(unittest.TestCase):
230
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000231 def test_repr(self):
232 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000233 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000234
Raymond Hettinger027bb632004-05-31 03:09:25 +0000235 def test_weakref(self):
236 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
237 p = proxy(s)
238 self.assertEqual(p.fileno(), s.fileno())
239 s.close()
240 s = None
241 try:
242 p.fileno()
243 except ReferenceError:
244 pass
245 else:
246 self.fail('Socket proxy still exists')
247
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000249 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 def raise_error(*args, **kwargs):
251 raise socket.error
252 def raise_herror(*args, **kwargs):
253 raise socket.herror
254 def raise_gaierror(*args, **kwargs):
255 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000258 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000259 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000260 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000261 "Error raising socket exception.")
262
263 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000264 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 socket.AF_INET
266 socket.SOCK_STREAM
267 socket.SOCK_DGRAM
268 socket.SOCK_RAW
269 socket.SOCK_RDM
270 socket.SOCK_SEQPACKET
271 socket.SOL_SOCKET
272 socket.SO_REUSEADDR
273
Guido van Rossum654c11e2002-06-13 20:24:17 +0000274 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000275 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000276 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000277 try:
278 ip = socket.gethostbyname(hostname)
279 except socket.error:
280 # Probably name lookup wasn't set up right; skip this test
281 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000282 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000283 try:
284 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
285 except socket.error:
286 # Probably a similar problem as above; skip this test
287 return
Brett Cannon01668a12005-03-11 00:04:17 +0000288 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000289 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000291 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000292
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000293 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000294 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000295 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 try:
297 # On some versions, this loses a reference
298 orig = sys.getrefcount(__name__)
299 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000300 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000301 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000302 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000303
Guido van Rossum24e4af82002-06-12 19:18:08 +0000304 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000305 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000306 try:
307 # On some versions, this crashes the interpreter.
308 socket.getnameinfo(('x', 0, 0, 0), 0)
309 except socket.error:
310 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000311
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000312 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000313 # This just checks that htons etc. are their own inverse,
314 # when looking at the lower 16 or 32 bits.
315 sizes = {socket.htonl: 32, socket.ntohl: 32,
316 socket.htons: 16, socket.ntohs: 16}
317 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000318 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000319 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
320 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000321
Guido van Rossuma2627af2002-09-14 00:58:46 +0000322 swapped = func(mask)
323 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000324 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000325
Guido van Rossum018919a2007-01-15 00:07:32 +0000326 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000327 good_values = [ 1, 2, 3, 1, 2, 3 ]
328 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000329 for k in good_values:
330 socket.ntohl(k)
331 socket.ntohs(k)
332 socket.htonl(k)
333 socket.htons(k)
334 for k in bad_values:
335 self.assertRaises(OverflowError, socket.ntohl, k)
336 self.assertRaises(OverflowError, socket.ntohs, k)
337 self.assertRaises(OverflowError, socket.htonl, k)
338 self.assertRaises(OverflowError, socket.htons, k)
339
Barry Warsaw11b91a02004-06-28 00:50:43 +0000340 def testGetServBy(self):
341 eq = self.assertEqual
342 # Find one service that exists, then check all the related interfaces.
343 # I've ordered this by protocols that have both a tcp and udp
344 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000345 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000346 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000347 # avoid the 'echo' service on this platform, as there is an
348 # assumption breaking non-standard port/protocol entry
349 services = ('daytime', 'qotd', 'domain')
350 else:
351 services = ('echo', 'daytime', 'domain')
352 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000353 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000354 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000355 break
356 except socket.error:
357 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000358 else:
359 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000360 # Try same call with optional protocol omitted
361 port2 = socket.getservbyname(service)
362 eq(port, port2)
363 # Try udp, but don't barf it it doesn't exist
364 try:
365 udpport = socket.getservbyname(service, 'udp')
366 except socket.error:
367 udpport = None
368 else:
369 eq(udpport, port)
370 # Now make sure the lookup by port returns the same service name
371 eq(socket.getservbyport(port2), service)
372 eq(socket.getservbyport(port, 'tcp'), service)
373 if udpport is not None:
374 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000375 # Make sure getservbyport does not accept out of range ports.
376 self.assertRaises(OverflowError, socket.getservbyport, -1)
377 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000378
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000379 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000380 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000381 # The default timeout should initially be None
382 self.assertEqual(socket.getdefaulttimeout(), None)
383 s = socket.socket()
384 self.assertEqual(s.gettimeout(), None)
385 s.close()
386
387 # Set the default timeout to 10, and see if it propagates
388 socket.setdefaulttimeout(10)
389 self.assertEqual(socket.getdefaulttimeout(), 10)
390 s = socket.socket()
391 self.assertEqual(s.gettimeout(), 10)
392 s.close()
393
394 # Reset the default timeout to None, and see if it propagates
395 socket.setdefaulttimeout(None)
396 self.assertEqual(socket.getdefaulttimeout(), None)
397 s = socket.socket()
398 self.assertEqual(s.gettimeout(), None)
399 s.close()
400
401 # Check that setting it to an invalid value raises ValueError
402 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
403
404 # Check that setting it to an invalid type raises TypeError
405 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
406
Benjamin Petersonf91df042009-02-13 02:50:59 +0000407 def testIPv4_inet_aton_fourbytes(self):
408 if not hasattr(socket, 'inet_aton'):
409 return # No inet_aton, nothing to check
410 # Test that issue1008086 and issue767150 are fixed.
411 # It must return 4 bytes.
412 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
413 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
414
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000415 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000416 if not hasattr(socket, 'inet_pton'):
417 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000418 from socket import inet_aton as f, inet_pton, AF_INET
419 g = lambda a: inet_pton(AF_INET, a)
420
Guido van Rossumb5b22702007-05-18 18:55:53 +0000421 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
422 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
423 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
424 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
425 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000426
Guido van Rossumb5b22702007-05-18 18:55:53 +0000427 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
428 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
429 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
430 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000431
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000432 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000433 if not hasattr(socket, 'inet_pton'):
434 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000435 try:
436 from socket import inet_pton, AF_INET6, has_ipv6
437 if not has_ipv6:
438 return
439 except ImportError:
440 return
441 f = lambda a: inet_pton(AF_INET6, a)
442
Guido van Rossum540d9872007-08-17 03:51:09 +0000443 self.assertEquals(b'\x00' * 16, f('::'))
444 self.assertEquals(b'\x00' * 16, f('0::0'))
445 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000447 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000448 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
449 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000450
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000451 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000452 if not hasattr(socket, 'inet_ntop'):
453 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000454 from socket import inet_ntoa as f, inet_ntop, AF_INET
455 g = lambda a: inet_ntop(AF_INET, a)
456
Guido van Rossumb5b22702007-05-18 18:55:53 +0000457 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
458 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
459 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
460 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000461
Guido van Rossumb5b22702007-05-18 18:55:53 +0000462 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
463 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
464 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000465
466 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000467 if not hasattr(socket, 'inet_ntop'):
468 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 try:
470 from socket import inet_ntop, AF_INET6, has_ipv6
471 if not has_ipv6:
472 return
473 except ImportError:
474 return
475 f = lambda a: inet_ntop(AF_INET6, a)
476
Guido van Rossum540d9872007-08-17 03:51:09 +0000477 self.assertEquals('::', f(b'\x00' * 16))
478 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000479 self.assertEquals(
480 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000481 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000482 )
483
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000484 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000485
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000486 def _get_unused_port(self, bind_address='0.0.0.0'):
487 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000488
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000489 Args:
490 bind_address: Hostname or IP address to search for a port on.
491
492 Returns: A most likely to be unused port.
493 """
494 tempsock = socket.socket()
495 tempsock.bind((bind_address, 0))
496 host, port = tempsock.getsockname()
497 tempsock.close()
498 return port
499
500 def testSockName(self):
501 # Testing getsockname()
502 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000504 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000505 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000506 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
507 # it reasonable to get the host's addr in addition to 0.0.0.0.
508 # At least for eCos. This is required for the S/390 to pass.
509 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000510 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000511 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512
513 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000514 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000515 # We know a socket should start without reuse==0
516 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
517 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000518 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519
520 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000521 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
523 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
524 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000525 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000527 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000528 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000529 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
530 sock.settimeout(1)
531 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000532 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000533
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000534 def testNewAttributes(self):
535 # testing .family, .type and .protocol
536 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
537 self.assertEqual(sock.family, socket.AF_INET)
538 self.assertEqual(sock.type, socket.SOCK_STREAM)
539 self.assertEqual(sock.proto, 0)
540 sock.close()
541
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000542 def test_getsockaddrarg(self):
543 host = '0.0.0.0'
544 port = self._get_unused_port(bind_address=host)
545 big_port = port + 65536
546 neg_port = port - 65536
547 sock = socket.socket()
548 try:
549 self.assertRaises(OverflowError, sock.bind, (host, big_port))
550 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
551 sock.bind((host, port))
552 finally:
553 sock.close()
554
Christian Heimesfaf2f632008-01-06 16:59:19 +0000555 def test_sock_ioctl(self):
556 if os.name != "nt":
557 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000558 self.assertTrue(hasattr(socket.socket, 'ioctl'))
559 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
560 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
561 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000562 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
563 s = socket.socket()
564 self.assertRaises(ValueError, s.ioctl, -1, None)
565 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000566
567
Victor Stinner45df8202010-04-28 22:31:17 +0000568@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569class BasicTCPTest(SocketConnectedTest):
570
571 def __init__(self, methodName='runTest'):
572 SocketConnectedTest.__init__(self, methodName=methodName)
573
574 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000575 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000576 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000577 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578
579 def _testRecv(self):
580 self.serv_conn.send(MSG)
581
582 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000583 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 seg1 = self.cli_conn.recv(len(MSG) - 3)
585 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000586 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000587 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588
589 def _testOverFlowRecv(self):
590 self.serv_conn.send(MSG)
591
592 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000593 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000595 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596
597 def _testRecvFrom(self):
598 self.serv_conn.send(MSG)
599
600 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000601 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000602 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
603 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000604 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000605 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606
607 def _testOverFlowRecvFrom(self):
608 self.serv_conn.send(MSG)
609
610 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000611 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000612 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613 while 1:
614 read = self.cli_conn.recv(1024)
615 if not read:
616 break
Guido van Rossume531e292002-08-08 20:28:34 +0000617 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000618 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619
620 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000621 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622 self.serv_conn.sendall(big_chunk)
623
624 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000625 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000626 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000627 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000628 fd = self.cli_conn.fileno()
629 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
630 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000631 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000632
633 def _testFromFd(self):
634 self.serv_conn.send(MSG)
635
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000636 def testDup(self):
637 # Testing dup()
638 sock = self.cli_conn.dup()
639 msg = sock.recv(1024)
640 self.assertEqual(msg, MSG)
641
642 def _testDup(self):
643 self.serv_conn.send(MSG)
644
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000646 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000648 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000649 # wait for _testShutdown to finish: on OS X, when the server
650 # closes the connection the client also becomes disconnected,
651 # and the client's shutdown call will fail. (Issue #4397.)
652 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653
654 def _testShutdown(self):
655 self.serv_conn.send(MSG)
656 self.serv_conn.shutdown(2)
657
Victor Stinner45df8202010-04-28 22:31:17 +0000658@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659class BasicUDPTest(ThreadedUDPSocketTest):
660
661 def __init__(self, methodName='runTest'):
662 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
663
664 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000665 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000666 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000667 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668
669 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000670 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671
Guido van Rossum1c938012002-06-12 21:17:20 +0000672 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000673 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000675 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000676
Guido van Rossum1c938012002-06-12 21:17:20 +0000677 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000678 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679
Guido van Rossumd8faa362007-04-27 19:54:29 +0000680 def testRecvFromNegative(self):
681 # Negative lengths passed to recvfrom should give ValueError.
682 self.assertRaises(ValueError, self.serv.recvfrom, -1)
683
684 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000685 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000686
Victor Stinner45df8202010-04-28 22:31:17 +0000687@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000688class TCPCloserTest(ThreadedTCPSocketTest):
689
690 def testClose(self):
691 conn, addr = self.serv.accept()
692 conn.close()
693
694 sd = self.cli
695 read, write, err = select.select([sd], [], [], 1.0)
696 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000697 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000698
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000699 # Calling close() many times should be safe.
700 conn.close()
701 conn.close()
702
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000704 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000705 time.sleep(1.0)
706
Victor Stinner45df8202010-04-28 22:31:17 +0000707@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000708class BasicSocketPairTest(SocketPairTest):
709
710 def __init__(self, methodName='runTest'):
711 SocketPairTest.__init__(self, methodName=methodName)
712
713 def testRecv(self):
714 msg = self.serv.recv(1024)
715 self.assertEqual(msg, MSG)
716
717 def _testRecv(self):
718 self.cli.send(MSG)
719
720 def testSend(self):
721 self.serv.send(MSG)
722
723 def _testSend(self):
724 msg = self.cli.recv(1024)
725 self.assertEqual(msg, MSG)
726
Victor Stinner45df8202010-04-28 22:31:17 +0000727@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728class NonBlockingTCPTests(ThreadedTCPSocketTest):
729
730 def __init__(self, methodName='runTest'):
731 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
732
733 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 self.serv.setblocking(0)
736 start = time.time()
737 try:
738 self.serv.accept()
739 except socket.error:
740 pass
741 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000742 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
744 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000745 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000746
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000748 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000750 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751 conn, addr = self.serv.accept()
752 except socket.error:
753 pass
754 else:
755 self.fail("Error trying to do non-blocking accept.")
756 read, write, err = select.select([self.serv], [], [])
757 if self.serv in read:
758 conn, addr = self.serv.accept()
759 else:
760 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000761
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000763 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000764 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765
766 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 conn, addr = self.serv.accept()
769
770 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000771 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000772 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773
774 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000775 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776 conn, addr = self.serv.accept()
777 conn.setblocking(0)
778 try:
779 msg = conn.recv(len(MSG))
780 except socket.error:
781 pass
782 else:
783 self.fail("Error trying to do non-blocking recv.")
784 read, write, err = select.select([conn], [], [])
785 if conn in read:
786 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000787 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 else:
789 self.fail("Error during select call to non-blocking socket.")
790
791 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000792 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000793 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 self.cli.send(MSG)
795
Victor Stinner45df8202010-04-28 22:31:17 +0000796@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000798 """Unit tests for the object returned by socket.makefile()
799
800 self.serv_file is the io object returned by makefile() on
801 the client connection. You can read from this file to
802 get output from the server.
803
804 self.cli_file is the io object returned by makefile() on the
805 server connection. You can write to this file to send output
806 to the client.
807 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808
Guido van Rossume9f66142002-08-07 15:46:19 +0000809 bufsize = -1 # Use default buffer size
810
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 def __init__(self, methodName='runTest'):
812 SocketConnectedTest.__init__(self, methodName=methodName)
813
814 def setUp(self):
815 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000816 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817
818 def tearDown(self):
819 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000820 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 self.serv_file = None
822 SocketConnectedTest.tearDown(self)
823
824 def clientSetUp(self):
825 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000826 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827
828 def clientTearDown(self):
829 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000830 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831 self.cli_file = None
832 SocketConnectedTest.clientTearDown(self)
833
834 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000835 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 first_seg = self.serv_file.read(len(MSG)-3)
837 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000838 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000839 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def _testSmallRead(self):
842 self.cli_file.write(MSG)
843 self.cli_file.flush()
844
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 def testFullRead(self):
846 # read until EOF
847 msg = self.serv_file.read()
848 self.assertEqual(msg, MSG)
849
850 def _testFullRead(self):
851 self.cli_file.write(MSG)
852 self.cli_file.close()
853
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000855 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000856 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 while 1:
858 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000859 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000860 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000861 buf += char
862 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
864 def _testUnbufferedRead(self):
865 self.cli_file.write(MSG)
866 self.cli_file.flush()
867
868 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000871 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872
873 def _testReadline(self):
874 self.cli_file.write(MSG)
875 self.cli_file.flush()
876
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000877 def testCloseAfterMakefile(self):
878 # The file returned by makefile should keep the socket open.
879 self.cli_conn.close()
880 # read until EOF
881 msg = self.serv_file.read()
882 self.assertEqual(msg, MSG)
883
884 def _testCloseAfterMakefile(self):
885 self.cli_file.write(MSG)
886 self.cli_file.flush()
887
888 def testMakefileAfterMakefileClose(self):
889 self.serv_file.close()
890 msg = self.cli_conn.recv(len(MSG))
891 self.assertEqual(msg, MSG)
892
893 def _testMakefileAfterMakefileClose(self):
894 self.cli_file.write(MSG)
895 self.cli_file.flush()
896
Tim Peters116d83c2004-03-28 02:20:45 +0000897 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000898 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000899
900 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000901 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000902
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000903 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000904 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000905 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
906
907 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000908 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000909 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
910
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000911 def testRealClose(self):
912 self.serv_file.close()
913 self.assertRaises(ValueError, self.serv_file.fileno)
914 self.cli_conn.close()
915 self.assertRaises(socket.error, self.cli_conn.getsockname)
916
917 def _testRealClose(self):
918 pass
919
920
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000921class FileObjectInterruptedTestCase(unittest.TestCase):
922 """Test that the file object correctly handles EINTR internally."""
923
924 class MockSocket(object):
925 def __init__(self, recv_funcs=()):
926 # A generator that returns callables that we'll call for each
927 # call to recv().
928 self._recv_step = iter(recv_funcs)
929
930 def recv_into(self, buffer):
931 data = next(self._recv_step)()
932 assert len(buffer) >= len(data)
933 buffer[:len(data)] = data
934 return len(data)
935
936 def _decref_socketios(self):
937 pass
938
939 def _textiowrap_for_test(self, buffering=-1):
940 raw = socket.SocketIO(self, "r")
941 if buffering < 0:
942 buffering = io.DEFAULT_BUFFER_SIZE
943 if buffering == 0:
944 return raw
945 buffer = io.BufferedReader(raw, buffering)
946 text = io.TextIOWrapper(buffer, None, None)
947 text.mode = "rb"
948 return text
949
950 @staticmethod
951 def _raise_eintr():
952 raise socket.error(errno.EINTR)
953
954 def _textiowrap_mock_socket(self, mock, buffering=-1):
955 raw = socket.SocketIO(mock, "r")
956 if buffering < 0:
957 buffering = io.DEFAULT_BUFFER_SIZE
958 if buffering == 0:
959 return raw
960 buffer = io.BufferedReader(raw, buffering)
961 text = io.TextIOWrapper(buffer, None, None)
962 text.mode = "rb"
963 return text
964
965 def _test_readline(self, size=-1, buffering=-1):
966 mock_sock = self.MockSocket(recv_funcs=[
967 lambda : b"This is the first line\nAnd the sec",
968 self._raise_eintr,
969 lambda : b"ond line is here\n",
970 lambda : b"",
971 lambda : b"", # XXX(gps): io library does an extra EOF read
972 ])
973 fo = mock_sock._textiowrap_for_test(buffering=buffering)
974 self.assertEquals(fo.readline(size), "This is the first line\n")
975 self.assertEquals(fo.readline(size), "And the second line is here\n")
976
977 def _test_read(self, size=-1, buffering=-1):
978 mock_sock = self.MockSocket(recv_funcs=[
979 lambda : b"This is the first line\nAnd the sec",
980 self._raise_eintr,
981 lambda : b"ond line is here\n",
982 lambda : b"",
983 lambda : b"", # XXX(gps): io library does an extra EOF read
984 ])
985 expecting = (b"This is the first line\n"
986 b"And the second line is here\n")
987 fo = mock_sock._textiowrap_for_test(buffering=buffering)
988 if buffering == 0:
989 data = b''
990 else:
991 data = ''
992 expecting = expecting.decode('utf8')
993 while len(data) != len(expecting):
994 part = fo.read(size)
995 if not part:
996 break
997 data += part
998 self.assertEquals(data, expecting)
999
1000 def test_default(self):
1001 self._test_readline()
1002 self._test_readline(size=100)
1003 self._test_read()
1004 self._test_read(size=100)
1005
1006 def test_with_1k_buffer(self):
1007 self._test_readline(buffering=1024)
1008 self._test_readline(size=100, buffering=1024)
1009 self._test_read(buffering=1024)
1010 self._test_read(size=100, buffering=1024)
1011
1012 def _test_readline_no_buffer(self, size=-1):
1013 mock_sock = self.MockSocket(recv_funcs=[
1014 lambda : b"a",
1015 lambda : b"\n",
1016 lambda : b"B",
1017 self._raise_eintr,
1018 lambda : b"b",
1019 lambda : b"",
1020 ])
1021 fo = mock_sock._textiowrap_for_test(buffering=0)
1022 self.assertEquals(fo.readline(size), b"a\n")
1023 self.assertEquals(fo.readline(size), b"Bb")
1024
1025 def test_no_buffer(self):
1026 self._test_readline_no_buffer()
1027 self._test_readline_no_buffer(size=4)
1028 self._test_read(buffering=0)
1029 self._test_read(size=100, buffering=0)
1030
1031
Guido van Rossume9f66142002-08-07 15:46:19 +00001032class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1033
1034 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001035
Guido van Rossume9f66142002-08-07 15:46:19 +00001036 In this case (and in this case only), it should be possible to
1037 create a file object, read a line from it, create another file
1038 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001039 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001040 when reading multiple requests from the same socket."""
1041
1042 bufsize = 0 # Use unbuffered mode
1043
1044 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001045 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001046 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001047 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001048 self.serv_file = self.cli_conn.makefile('rb', 0)
1049 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001050 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001051
1052 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001053 self.cli_file.write(b"A. " + MSG)
1054 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001055 self.cli_file.flush()
1056
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001057 def testMakefileClose(self):
1058 # The file returned by makefile should keep the socket open...
1059 self.cli_conn.close()
1060 msg = self.cli_conn.recv(1024)
1061 self.assertEqual(msg, MSG)
1062 # ...until the file is itself closed
1063 self.serv_file.close()
1064 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1065
1066 def _testMakefileClose(self):
1067 self.cli_file.write(MSG)
1068 self.cli_file.flush()
1069
1070 def testMakefileCloseSocketDestroy(self):
1071 refcount_before = sys.getrefcount(self.cli_conn)
1072 self.serv_file.close()
1073 refcount_after = sys.getrefcount(self.cli_conn)
1074 self.assertEqual(refcount_before - 1, refcount_after)
1075
1076 def _testMakefileCloseSocketDestroy(self):
1077 pass
1078
1079
Guido van Rossum8c943832002-08-08 01:00:28 +00001080class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1081
1082 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1083
1084
1085class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1086
1087 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001088
Thomas Woutersb2137042007-02-01 18:02:27 +00001089
Guido van Rossumd8faa362007-04-27 19:54:29 +00001090class NetworkConnectionTest(object):
1091 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001092
Guido van Rossumd8faa362007-04-27 19:54:29 +00001093 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001094 # We're inherited below by BasicTCPTest2, which also inherits
1095 # BasicTCPTest, which defines self.port referenced below.
1096 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001097 self.serv_conn = self.cli
1098
1099class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1100 """Tests that NetworkConnection does not break existing TCP functionality.
1101 """
1102
1103class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001104
Guido van Rossumd8faa362007-04-27 19:54:29 +00001105 def testWithoutServer(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001106 port = support.find_unused_port()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001107 self.assertRaises(
Christian Heimes5e696852008-04-09 08:37:03 +00001108 socket.error,
1109 lambda: socket.create_connection((HOST, port))
1110 )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111
Victor Stinner45df8202010-04-28 22:31:17 +00001112@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001113class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1114
1115 def __init__(self, methodName='runTest'):
1116 SocketTCPTest.__init__(self, methodName=methodName)
1117 ThreadableTest.__init__(self)
1118
1119 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001120 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001121
1122 def clientTearDown(self):
1123 self.cli.close()
1124 self.cli = None
1125 ThreadableTest.clientTearDown(self)
1126
1127 def _justAccept(self):
1128 conn, addr = self.serv.accept()
1129
1130 testFamily = _justAccept
1131 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001132 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 self.assertEqual(self.cli.family, 2)
1134
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001135 testSourceAddress = _justAccept
1136 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001137 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1138 source_address=('', self.source_port))
1139 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001140 # The port number being used is sufficient to show that the bind()
1141 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001142
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 testTimeoutDefault = _justAccept
1144 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001145 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001146 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001147 socket.setdefaulttimeout(42)
1148 try:
1149 self.cli = socket.create_connection((HOST, self.port))
1150 finally:
1151 socket.setdefaulttimeout(None)
1152 self.assertEquals(self.cli.gettimeout(), 42)
1153
1154 testTimeoutNone = _justAccept
1155 def _testTimeoutNone(self):
1156 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001157 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001158 socket.setdefaulttimeout(30)
1159 try:
1160 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1161 finally:
1162 socket.setdefaulttimeout(None)
1163 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001164
1165 testTimeoutValueNamed = _justAccept
1166 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001167 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001168 self.assertEqual(self.cli.gettimeout(), 30)
1169
1170 testTimeoutValueNonamed = _justAccept
1171 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001172 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001173 self.assertEqual(self.cli.gettimeout(), 30)
1174
Victor Stinner45df8202010-04-28 22:31:17 +00001175@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001176class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1177
1178 def __init__(self, methodName='runTest'):
1179 SocketTCPTest.__init__(self, methodName=methodName)
1180 ThreadableTest.__init__(self)
1181
1182 def clientSetUp(self):
1183 pass
1184
1185 def clientTearDown(self):
1186 self.cli.close()
1187 self.cli = None
1188 ThreadableTest.clientTearDown(self)
1189
1190 def testInsideTimeout(self):
1191 conn, addr = self.serv.accept()
1192 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001193 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001194 testOutsideTimeout = testInsideTimeout
1195
1196 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001197 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001198 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001199 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001200
1201 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001202 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001203 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001204
1205
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001206class TCPTimeoutTest(SocketTCPTest):
1207
1208 def testTCPTimeout(self):
1209 def raise_timeout(*args, **kwargs):
1210 self.serv.settimeout(1.0)
1211 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001212 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001213 "Error generating a timeout exception (TCP)")
1214
1215 def testTimeoutZero(self):
1216 ok = False
1217 try:
1218 self.serv.settimeout(0.0)
1219 foo = self.serv.accept()
1220 except socket.timeout:
1221 self.fail("caught timeout instead of error (TCP)")
1222 except socket.error:
1223 ok = True
1224 except:
1225 self.fail("caught unexpected exception (TCP)")
1226 if not ok:
1227 self.fail("accept() returned success when we did not expect it")
1228
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001229 def testInterruptedTimeout(self):
1230 # XXX I don't know how to do this test on MSWindows or any other
1231 # plaform that doesn't support signal.alarm() or os.kill(), though
1232 # the bug should have existed on all platforms.
1233 if not hasattr(signal, "alarm"):
1234 return # can only test on *nix
1235 self.serv.settimeout(5.0) # must be longer than alarm
1236 class Alarm(Exception):
1237 pass
1238 def alarm_handler(signal, frame):
1239 raise Alarm
1240 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1241 try:
1242 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1243 try:
1244 foo = self.serv.accept()
1245 except socket.timeout:
1246 self.fail("caught timeout instead of Alarm")
1247 except Alarm:
1248 pass
1249 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001250 self.fail("caught other exception instead of Alarm:"
1251 " %s(%s):\n%s" %
1252 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001253 else:
1254 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001255 finally:
1256 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001257 except Alarm:
1258 self.fail("got Alarm in wrong place")
1259 finally:
1260 # no alarm can be pending. Safe to restore old handler.
1261 signal.signal(signal.SIGALRM, old_alarm)
1262
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001263class UDPTimeoutTest(SocketTCPTest):
1264
1265 def testUDPTimeout(self):
1266 def raise_timeout(*args, **kwargs):
1267 self.serv.settimeout(1.0)
1268 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001269 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001270 "Error generating a timeout exception (UDP)")
1271
1272 def testTimeoutZero(self):
1273 ok = False
1274 try:
1275 self.serv.settimeout(0.0)
1276 foo = self.serv.recv(1024)
1277 except socket.timeout:
1278 self.fail("caught timeout instead of error (UDP)")
1279 except socket.error:
1280 ok = True
1281 except:
1282 self.fail("caught unexpected exception (UDP)")
1283 if not ok:
1284 self.fail("recv() returned success when we did not expect it")
1285
1286class TestExceptions(unittest.TestCase):
1287
1288 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001289 self.assertTrue(issubclass(socket.error, Exception))
1290 self.assertTrue(issubclass(socket.herror, socket.error))
1291 self.assertTrue(issubclass(socket.gaierror, socket.error))
1292 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001293
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001294class TestLinuxAbstractNamespace(unittest.TestCase):
1295
1296 UNIX_PATH_MAX = 108
1297
1298 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001299 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001300 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1301 s1.bind(address)
1302 s1.listen(1)
1303 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1304 s2.connect(s1.getsockname())
1305 s1.accept()
1306 self.assertEqual(s1.getsockname(), address)
1307 self.assertEqual(s2.getpeername(), address)
1308
1309 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001310 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001311 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1312 s.bind(address)
1313 self.assertEqual(s.getsockname(), address)
1314
1315 def testNameOverflow(self):
1316 address = "\x00" + "h" * self.UNIX_PATH_MAX
1317 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1318 self.assertRaises(socket.error, s.bind, address)
1319
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001320
Victor Stinner45df8202010-04-28 22:31:17 +00001321@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001322class BufferIOTest(SocketConnectedTest):
1323 """
1324 Test the buffer versions of socket.recv() and socket.send().
1325 """
1326 def __init__(self, methodName='runTest'):
1327 SocketConnectedTest.__init__(self, methodName=methodName)
1328
Antoine Pitrou25480782010-03-17 22:50:28 +00001329 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001330 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001331 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001332 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001333 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001334 self.assertEqual(msg, MSG)
1335
Antoine Pitrou25480782010-03-17 22:50:28 +00001336 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001337 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338 self.serv_conn.send(buf)
1339
Antoine Pitrou25480782010-03-17 22:50:28 +00001340 def testRecvIntoBytearray(self):
1341 buf = bytearray(1024)
1342 nbytes = self.cli_conn.recv_into(buf)
1343 self.assertEqual(nbytes, len(MSG))
1344 msg = buf[:len(MSG)]
1345 self.assertEqual(msg, MSG)
1346
1347 _testRecvIntoBytearray = _testRecvIntoArray
1348
1349 def testRecvIntoMemoryview(self):
1350 buf = bytearray(1024)
1351 nbytes = self.cli_conn.recv_into(memoryview(buf))
1352 self.assertEqual(nbytes, len(MSG))
1353 msg = buf[:len(MSG)]
1354 self.assertEqual(msg, MSG)
1355
1356 _testRecvIntoMemoryview = _testRecvIntoArray
1357
1358 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001359 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001360 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001361 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001362 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001363 self.assertEqual(msg, MSG)
1364
Antoine Pitrou25480782010-03-17 22:50:28 +00001365 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001366 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001367 self.serv_conn.send(buf)
1368
Antoine Pitrou25480782010-03-17 22:50:28 +00001369 def testRecvFromIntoBytearray(self):
1370 buf = bytearray(1024)
1371 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1372 self.assertEqual(nbytes, len(MSG))
1373 msg = buf[:len(MSG)]
1374 self.assertEqual(msg, MSG)
1375
1376 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1377
1378 def testRecvFromIntoMemoryview(self):
1379 buf = bytearray(1024)
1380 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1381 self.assertEqual(nbytes, len(MSG))
1382 msg = buf[:len(MSG)]
1383 self.assertEqual(msg, MSG)
1384
1385 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1386
Christian Heimes043d6f62008-01-07 17:19:16 +00001387
1388TIPC_STYPE = 2000
1389TIPC_LOWER = 200
1390TIPC_UPPER = 210
1391
1392def isTipcAvailable():
1393 """Check if the TIPC module is loaded
1394
1395 The TIPC module is not loaded automatically on Ubuntu and probably
1396 other Linux distros.
1397 """
1398 if not hasattr(socket, "AF_TIPC"):
1399 return False
1400 if not os.path.isfile("/proc/modules"):
1401 return False
1402 with open("/proc/modules") as f:
1403 for line in f:
1404 if line.startswith("tipc "):
1405 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001406 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001407 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1408 return False
1409
1410class TIPCTest (unittest.TestCase):
1411 def testRDM(self):
1412 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1413 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1414
1415 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1416 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1417 TIPC_LOWER, TIPC_UPPER)
1418 srv.bind(srvaddr)
1419
1420 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1421 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1422 cli.sendto(MSG, sendaddr)
1423
1424 msg, recvaddr = srv.recvfrom(1024)
1425
1426 self.assertEqual(cli.getsockname(), recvaddr)
1427 self.assertEqual(msg, MSG)
1428
1429
1430class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1431 def __init__(self, methodName = 'runTest'):
1432 unittest.TestCase.__init__(self, methodName = methodName)
1433 ThreadableTest.__init__(self)
1434
1435 def setUp(self):
1436 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1437 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1438 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1439 TIPC_LOWER, TIPC_UPPER)
1440 self.srv.bind(srvaddr)
1441 self.srv.listen(5)
1442 self.serverExplicitReady()
1443 self.conn, self.connaddr = self.srv.accept()
1444
1445 def clientSetUp(self):
1446 # The is a hittable race between serverExplicitReady() and the
1447 # accept() call; sleep a little while to avoid it, otherwise
1448 # we could get an exception
1449 time.sleep(0.1)
1450 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1451 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1452 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1453 self.cli.connect(addr)
1454 self.cliaddr = self.cli.getsockname()
1455
1456 def testStream(self):
1457 msg = self.conn.recv(1024)
1458 self.assertEqual(msg, MSG)
1459 self.assertEqual(self.cliaddr, self.connaddr)
1460
1461 def _testStream(self):
1462 self.cli.send(MSG)
1463 self.cli.close()
1464
1465
Guido van Rossumb995eb72002-07-31 16:08:40 +00001466def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001467 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001468 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001469
1470 tests.extend([
1471 NonBlockingTCPTests,
1472 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001473 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001474 UnbufferedFileObjectClassTestCase,
1475 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001476 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001477 NetworkConnectionNoServer,
1478 NetworkConnectionAttributesTest,
1479 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001480 ])
Dave Cole331708b2004-08-09 04:51:41 +00001481 if hasattr(socket, "socketpair"):
1482 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001483 if sys.platform == 'linux2':
1484 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001485 if isTipcAvailable():
1486 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001487 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001488
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001489 thread_info = support.threading_setup()
1490 support.run_unittest(*tests)
1491 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001492
1493if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001494 test_main()