blob: ae34c11492390544b6fbc3efa6bf3434dcb2772f [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
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000658 def testForget(self):
659 # Testing forget()
660 f = self.cli_conn.fileno()
661 self.cli_conn.forget()
662 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
663 self.cli_conn.close()
664 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
665 msg = sock.recv(1024)
666 self.assertEqual(msg, MSG)
667
668 def _testForget(self):
669 self.serv_conn.send(MSG)
670
Victor Stinner45df8202010-04-28 22:31:17 +0000671@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672class BasicUDPTest(ThreadedUDPSocketTest):
673
674 def __init__(self, methodName='runTest'):
675 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
676
677 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000678 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000680 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681
682 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000683 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684
Guido van Rossum1c938012002-06-12 21:17:20 +0000685 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000688 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689
Guido van Rossum1c938012002-06-12 21:17:20 +0000690 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000691 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000692
Guido van Rossumd8faa362007-04-27 19:54:29 +0000693 def testRecvFromNegative(self):
694 # Negative lengths passed to recvfrom should give ValueError.
695 self.assertRaises(ValueError, self.serv.recvfrom, -1)
696
697 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000698 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000699
Victor Stinner45df8202010-04-28 22:31:17 +0000700@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000701class TCPCloserTest(ThreadedTCPSocketTest):
702
703 def testClose(self):
704 conn, addr = self.serv.accept()
705 conn.close()
706
707 sd = self.cli
708 read, write, err = select.select([sd], [], [], 1.0)
709 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000710 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000711
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000712 # Calling close() many times should be safe.
713 conn.close()
714 conn.close()
715
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000716 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000717 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000718 time.sleep(1.0)
719
Victor Stinner45df8202010-04-28 22:31:17 +0000720@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000721class BasicSocketPairTest(SocketPairTest):
722
723 def __init__(self, methodName='runTest'):
724 SocketPairTest.__init__(self, methodName=methodName)
725
726 def testRecv(self):
727 msg = self.serv.recv(1024)
728 self.assertEqual(msg, MSG)
729
730 def _testRecv(self):
731 self.cli.send(MSG)
732
733 def testSend(self):
734 self.serv.send(MSG)
735
736 def _testSend(self):
737 msg = self.cli.recv(1024)
738 self.assertEqual(msg, MSG)
739
Victor Stinner45df8202010-04-28 22:31:17 +0000740@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741class NonBlockingTCPTests(ThreadedTCPSocketTest):
742
743 def __init__(self, methodName='runTest'):
744 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
745
746 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000747 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 self.serv.setblocking(0)
749 start = time.time()
750 try:
751 self.serv.accept()
752 except socket.error:
753 pass
754 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000755 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756
757 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000758 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000759
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000761 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000763 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 conn, addr = self.serv.accept()
765 except socket.error:
766 pass
767 else:
768 self.fail("Error trying to do non-blocking accept.")
769 read, write, err = select.select([self.serv], [], [])
770 if self.serv in read:
771 conn, addr = self.serv.accept()
772 else:
773 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000774
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000776 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000777 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778
779 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000780 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 conn, addr = self.serv.accept()
782
783 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000784 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000785 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786
787 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789 conn, addr = self.serv.accept()
790 conn.setblocking(0)
791 try:
792 msg = conn.recv(len(MSG))
793 except socket.error:
794 pass
795 else:
796 self.fail("Error trying to do non-blocking recv.")
797 read, write, err = select.select([conn], [], [])
798 if conn in read:
799 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000800 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801 else:
802 self.fail("Error during select call to non-blocking socket.")
803
804 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000805 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000806 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000807 self.cli.send(MSG)
808
Victor Stinner45df8202010-04-28 22:31:17 +0000809@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000811 """Unit tests for the object returned by socket.makefile()
812
813 self.serv_file is the io object returned by makefile() on
814 the client connection. You can read from this file to
815 get output from the server.
816
817 self.cli_file is the io object returned by makefile() on the
818 server connection. You can write to this file to send output
819 to the client.
820 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821
Guido van Rossume9f66142002-08-07 15:46:19 +0000822 bufsize = -1 # Use default buffer size
823
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 def __init__(self, methodName='runTest'):
825 SocketConnectedTest.__init__(self, methodName=methodName)
826
827 def setUp(self):
828 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000829 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830
831 def tearDown(self):
832 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000833 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 self.serv_file = None
835 SocketConnectedTest.tearDown(self)
836
837 def clientSetUp(self):
838 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000839 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def clientTearDown(self):
842 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000843 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 self.cli_file = None
845 SocketConnectedTest.clientTearDown(self)
846
847 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 first_seg = self.serv_file.read(len(MSG)-3)
850 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000851 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000852 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853
854 def _testSmallRead(self):
855 self.cli_file.write(MSG)
856 self.cli_file.flush()
857
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 def testFullRead(self):
859 # read until EOF
860 msg = self.serv_file.read()
861 self.assertEqual(msg, MSG)
862
863 def _testFullRead(self):
864 self.cli_file.write(MSG)
865 self.cli_file.close()
866
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000869 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 while 1:
871 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000872 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000874 buf += char
875 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876
877 def _testUnbufferedRead(self):
878 self.cli_file.write(MSG)
879 self.cli_file.flush()
880
881 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000882 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000884 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885
886 def _testReadline(self):
887 self.cli_file.write(MSG)
888 self.cli_file.flush()
889
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000890 def testCloseAfterMakefile(self):
891 # The file returned by makefile should keep the socket open.
892 self.cli_conn.close()
893 # read until EOF
894 msg = self.serv_file.read()
895 self.assertEqual(msg, MSG)
896
897 def _testCloseAfterMakefile(self):
898 self.cli_file.write(MSG)
899 self.cli_file.flush()
900
901 def testMakefileAfterMakefileClose(self):
902 self.serv_file.close()
903 msg = self.cli_conn.recv(len(MSG))
904 self.assertEqual(msg, MSG)
905
906 def _testMakefileAfterMakefileClose(self):
907 self.cli_file.write(MSG)
908 self.cli_file.flush()
909
Tim Peters116d83c2004-03-28 02:20:45 +0000910 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000911 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000912
913 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000914 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000915
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000916 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000917 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000918 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
919
920 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000921 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000922 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
923
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000924 def testRealClose(self):
925 self.serv_file.close()
926 self.assertRaises(ValueError, self.serv_file.fileno)
927 self.cli_conn.close()
928 self.assertRaises(socket.error, self.cli_conn.getsockname)
929
930 def _testRealClose(self):
931 pass
932
933
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000934class FileObjectInterruptedTestCase(unittest.TestCase):
935 """Test that the file object correctly handles EINTR internally."""
936
937 class MockSocket(object):
938 def __init__(self, recv_funcs=()):
939 # A generator that returns callables that we'll call for each
940 # call to recv().
941 self._recv_step = iter(recv_funcs)
942
943 def recv_into(self, buffer):
944 data = next(self._recv_step)()
945 assert len(buffer) >= len(data)
946 buffer[:len(data)] = data
947 return len(data)
948
949 def _decref_socketios(self):
950 pass
951
952 def _textiowrap_for_test(self, buffering=-1):
953 raw = socket.SocketIO(self, "r")
954 if buffering < 0:
955 buffering = io.DEFAULT_BUFFER_SIZE
956 if buffering == 0:
957 return raw
958 buffer = io.BufferedReader(raw, buffering)
959 text = io.TextIOWrapper(buffer, None, None)
960 text.mode = "rb"
961 return text
962
963 @staticmethod
964 def _raise_eintr():
965 raise socket.error(errno.EINTR)
966
967 def _textiowrap_mock_socket(self, mock, buffering=-1):
968 raw = socket.SocketIO(mock, "r")
969 if buffering < 0:
970 buffering = io.DEFAULT_BUFFER_SIZE
971 if buffering == 0:
972 return raw
973 buffer = io.BufferedReader(raw, buffering)
974 text = io.TextIOWrapper(buffer, None, None)
975 text.mode = "rb"
976 return text
977
978 def _test_readline(self, size=-1, buffering=-1):
979 mock_sock = self.MockSocket(recv_funcs=[
980 lambda : b"This is the first line\nAnd the sec",
981 self._raise_eintr,
982 lambda : b"ond line is here\n",
983 lambda : b"",
984 lambda : b"", # XXX(gps): io library does an extra EOF read
985 ])
986 fo = mock_sock._textiowrap_for_test(buffering=buffering)
987 self.assertEquals(fo.readline(size), "This is the first line\n")
988 self.assertEquals(fo.readline(size), "And the second line is here\n")
989
990 def _test_read(self, size=-1, buffering=-1):
991 mock_sock = self.MockSocket(recv_funcs=[
992 lambda : b"This is the first line\nAnd the sec",
993 self._raise_eintr,
994 lambda : b"ond line is here\n",
995 lambda : b"",
996 lambda : b"", # XXX(gps): io library does an extra EOF read
997 ])
998 expecting = (b"This is the first line\n"
999 b"And the second line is here\n")
1000 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1001 if buffering == 0:
1002 data = b''
1003 else:
1004 data = ''
1005 expecting = expecting.decode('utf8')
1006 while len(data) != len(expecting):
1007 part = fo.read(size)
1008 if not part:
1009 break
1010 data += part
1011 self.assertEquals(data, expecting)
1012
1013 def test_default(self):
1014 self._test_readline()
1015 self._test_readline(size=100)
1016 self._test_read()
1017 self._test_read(size=100)
1018
1019 def test_with_1k_buffer(self):
1020 self._test_readline(buffering=1024)
1021 self._test_readline(size=100, buffering=1024)
1022 self._test_read(buffering=1024)
1023 self._test_read(size=100, buffering=1024)
1024
1025 def _test_readline_no_buffer(self, size=-1):
1026 mock_sock = self.MockSocket(recv_funcs=[
1027 lambda : b"a",
1028 lambda : b"\n",
1029 lambda : b"B",
1030 self._raise_eintr,
1031 lambda : b"b",
1032 lambda : b"",
1033 ])
1034 fo = mock_sock._textiowrap_for_test(buffering=0)
1035 self.assertEquals(fo.readline(size), b"a\n")
1036 self.assertEquals(fo.readline(size), b"Bb")
1037
1038 def test_no_buffer(self):
1039 self._test_readline_no_buffer()
1040 self._test_readline_no_buffer(size=4)
1041 self._test_read(buffering=0)
1042 self._test_read(size=100, buffering=0)
1043
1044
Guido van Rossume9f66142002-08-07 15:46:19 +00001045class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1046
1047 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001048
Guido van Rossume9f66142002-08-07 15:46:19 +00001049 In this case (and in this case only), it should be possible to
1050 create a file object, read a line from it, create another file
1051 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001052 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001053 when reading multiple requests from the same socket."""
1054
1055 bufsize = 0 # Use unbuffered mode
1056
1057 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001058 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001059 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001060 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001061 self.serv_file = self.cli_conn.makefile('rb', 0)
1062 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001063 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001064
1065 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001066 self.cli_file.write(b"A. " + MSG)
1067 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001068 self.cli_file.flush()
1069
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001070 def testMakefileClose(self):
1071 # The file returned by makefile should keep the socket open...
1072 self.cli_conn.close()
1073 msg = self.cli_conn.recv(1024)
1074 self.assertEqual(msg, MSG)
1075 # ...until the file is itself closed
1076 self.serv_file.close()
1077 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1078
1079 def _testMakefileClose(self):
1080 self.cli_file.write(MSG)
1081 self.cli_file.flush()
1082
1083 def testMakefileCloseSocketDestroy(self):
1084 refcount_before = sys.getrefcount(self.cli_conn)
1085 self.serv_file.close()
1086 refcount_after = sys.getrefcount(self.cli_conn)
1087 self.assertEqual(refcount_before - 1, refcount_after)
1088
1089 def _testMakefileCloseSocketDestroy(self):
1090 pass
1091
1092
Guido van Rossum8c943832002-08-08 01:00:28 +00001093class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1094
1095 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1096
1097
1098class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1099
1100 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001101
Thomas Woutersb2137042007-02-01 18:02:27 +00001102
Guido van Rossumd8faa362007-04-27 19:54:29 +00001103class NetworkConnectionTest(object):
1104 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001105
Guido van Rossumd8faa362007-04-27 19:54:29 +00001106 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001107 # We're inherited below by BasicTCPTest2, which also inherits
1108 # BasicTCPTest, which defines self.port referenced below.
1109 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 self.serv_conn = self.cli
1111
1112class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1113 """Tests that NetworkConnection does not break existing TCP functionality.
1114 """
1115
1116class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001117
Guido van Rossumd8faa362007-04-27 19:54:29 +00001118 def testWithoutServer(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001119 port = support.find_unused_port()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001120 self.assertRaises(
Christian Heimes5e696852008-04-09 08:37:03 +00001121 socket.error,
1122 lambda: socket.create_connection((HOST, port))
1123 )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001124
Victor Stinner45df8202010-04-28 22:31:17 +00001125@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1127
1128 def __init__(self, methodName='runTest'):
1129 SocketTCPTest.__init__(self, methodName=methodName)
1130 ThreadableTest.__init__(self)
1131
1132 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001133 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001134
1135 def clientTearDown(self):
1136 self.cli.close()
1137 self.cli = None
1138 ThreadableTest.clientTearDown(self)
1139
1140 def _justAccept(self):
1141 conn, addr = self.serv.accept()
1142
1143 testFamily = _justAccept
1144 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001145 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 self.assertEqual(self.cli.family, 2)
1147
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001148 testSourceAddress = _justAccept
1149 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001150 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1151 source_address=('', self.source_port))
1152 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001153 # The port number being used is sufficient to show that the bind()
1154 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001155
Guido van Rossumd8faa362007-04-27 19:54:29 +00001156 testTimeoutDefault = _justAccept
1157 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001158 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001159 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001160 socket.setdefaulttimeout(42)
1161 try:
1162 self.cli = socket.create_connection((HOST, self.port))
1163 finally:
1164 socket.setdefaulttimeout(None)
1165 self.assertEquals(self.cli.gettimeout(), 42)
1166
1167 testTimeoutNone = _justAccept
1168 def _testTimeoutNone(self):
1169 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001170 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001171 socket.setdefaulttimeout(30)
1172 try:
1173 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1174 finally:
1175 socket.setdefaulttimeout(None)
1176 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001177
1178 testTimeoutValueNamed = _justAccept
1179 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001180 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001181 self.assertEqual(self.cli.gettimeout(), 30)
1182
1183 testTimeoutValueNonamed = _justAccept
1184 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001185 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001186 self.assertEqual(self.cli.gettimeout(), 30)
1187
Victor Stinner45df8202010-04-28 22:31:17 +00001188@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001189class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1190
1191 def __init__(self, methodName='runTest'):
1192 SocketTCPTest.__init__(self, methodName=methodName)
1193 ThreadableTest.__init__(self)
1194
1195 def clientSetUp(self):
1196 pass
1197
1198 def clientTearDown(self):
1199 self.cli.close()
1200 self.cli = None
1201 ThreadableTest.clientTearDown(self)
1202
1203 def testInsideTimeout(self):
1204 conn, addr = self.serv.accept()
1205 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001206 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001207 testOutsideTimeout = testInsideTimeout
1208
1209 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001210 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001211 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001212 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001213
1214 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001215 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001216 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001217
1218
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001219class TCPTimeoutTest(SocketTCPTest):
1220
1221 def testTCPTimeout(self):
1222 def raise_timeout(*args, **kwargs):
1223 self.serv.settimeout(1.0)
1224 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001225 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001226 "Error generating a timeout exception (TCP)")
1227
1228 def testTimeoutZero(self):
1229 ok = False
1230 try:
1231 self.serv.settimeout(0.0)
1232 foo = self.serv.accept()
1233 except socket.timeout:
1234 self.fail("caught timeout instead of error (TCP)")
1235 except socket.error:
1236 ok = True
1237 except:
1238 self.fail("caught unexpected exception (TCP)")
1239 if not ok:
1240 self.fail("accept() returned success when we did not expect it")
1241
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001242 def testInterruptedTimeout(self):
1243 # XXX I don't know how to do this test on MSWindows or any other
1244 # plaform that doesn't support signal.alarm() or os.kill(), though
1245 # the bug should have existed on all platforms.
1246 if not hasattr(signal, "alarm"):
1247 return # can only test on *nix
1248 self.serv.settimeout(5.0) # must be longer than alarm
1249 class Alarm(Exception):
1250 pass
1251 def alarm_handler(signal, frame):
1252 raise Alarm
1253 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1254 try:
1255 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1256 try:
1257 foo = self.serv.accept()
1258 except socket.timeout:
1259 self.fail("caught timeout instead of Alarm")
1260 except Alarm:
1261 pass
1262 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001263 self.fail("caught other exception instead of Alarm:"
1264 " %s(%s):\n%s" %
1265 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001266 else:
1267 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001268 finally:
1269 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001270 except Alarm:
1271 self.fail("got Alarm in wrong place")
1272 finally:
1273 # no alarm can be pending. Safe to restore old handler.
1274 signal.signal(signal.SIGALRM, old_alarm)
1275
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001276class UDPTimeoutTest(SocketTCPTest):
1277
1278 def testUDPTimeout(self):
1279 def raise_timeout(*args, **kwargs):
1280 self.serv.settimeout(1.0)
1281 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001282 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001283 "Error generating a timeout exception (UDP)")
1284
1285 def testTimeoutZero(self):
1286 ok = False
1287 try:
1288 self.serv.settimeout(0.0)
1289 foo = self.serv.recv(1024)
1290 except socket.timeout:
1291 self.fail("caught timeout instead of error (UDP)")
1292 except socket.error:
1293 ok = True
1294 except:
1295 self.fail("caught unexpected exception (UDP)")
1296 if not ok:
1297 self.fail("recv() returned success when we did not expect it")
1298
1299class TestExceptions(unittest.TestCase):
1300
1301 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001302 self.assertTrue(issubclass(socket.error, Exception))
1303 self.assertTrue(issubclass(socket.herror, socket.error))
1304 self.assertTrue(issubclass(socket.gaierror, socket.error))
1305 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001306
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001307class TestLinuxAbstractNamespace(unittest.TestCase):
1308
1309 UNIX_PATH_MAX = 108
1310
1311 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001312 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001313 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1314 s1.bind(address)
1315 s1.listen(1)
1316 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1317 s2.connect(s1.getsockname())
1318 s1.accept()
1319 self.assertEqual(s1.getsockname(), address)
1320 self.assertEqual(s2.getpeername(), address)
1321
1322 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001323 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1325 s.bind(address)
1326 self.assertEqual(s.getsockname(), address)
1327
1328 def testNameOverflow(self):
1329 address = "\x00" + "h" * self.UNIX_PATH_MAX
1330 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1331 self.assertRaises(socket.error, s.bind, address)
1332
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001333
Victor Stinner45df8202010-04-28 22:31:17 +00001334@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335class BufferIOTest(SocketConnectedTest):
1336 """
1337 Test the buffer versions of socket.recv() and socket.send().
1338 """
1339 def __init__(self, methodName='runTest'):
1340 SocketConnectedTest.__init__(self, methodName=methodName)
1341
Antoine Pitrou25480782010-03-17 22:50:28 +00001342 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001343 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001344 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001345 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001346 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001347 self.assertEqual(msg, MSG)
1348
Antoine Pitrou25480782010-03-17 22:50:28 +00001349 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001350 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001351 self.serv_conn.send(buf)
1352
Antoine Pitrou25480782010-03-17 22:50:28 +00001353 def testRecvIntoBytearray(self):
1354 buf = bytearray(1024)
1355 nbytes = self.cli_conn.recv_into(buf)
1356 self.assertEqual(nbytes, len(MSG))
1357 msg = buf[:len(MSG)]
1358 self.assertEqual(msg, MSG)
1359
1360 _testRecvIntoBytearray = _testRecvIntoArray
1361
1362 def testRecvIntoMemoryview(self):
1363 buf = bytearray(1024)
1364 nbytes = self.cli_conn.recv_into(memoryview(buf))
1365 self.assertEqual(nbytes, len(MSG))
1366 msg = buf[:len(MSG)]
1367 self.assertEqual(msg, MSG)
1368
1369 _testRecvIntoMemoryview = _testRecvIntoArray
1370
1371 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001372 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001373 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001374 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001375 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001376 self.assertEqual(msg, MSG)
1377
Antoine Pitrou25480782010-03-17 22:50:28 +00001378 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001379 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380 self.serv_conn.send(buf)
1381
Antoine Pitrou25480782010-03-17 22:50:28 +00001382 def testRecvFromIntoBytearray(self):
1383 buf = bytearray(1024)
1384 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1385 self.assertEqual(nbytes, len(MSG))
1386 msg = buf[:len(MSG)]
1387 self.assertEqual(msg, MSG)
1388
1389 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1390
1391 def testRecvFromIntoMemoryview(self):
1392 buf = bytearray(1024)
1393 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1394 self.assertEqual(nbytes, len(MSG))
1395 msg = buf[:len(MSG)]
1396 self.assertEqual(msg, MSG)
1397
1398 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1399
Christian Heimes043d6f62008-01-07 17:19:16 +00001400
1401TIPC_STYPE = 2000
1402TIPC_LOWER = 200
1403TIPC_UPPER = 210
1404
1405def isTipcAvailable():
1406 """Check if the TIPC module is loaded
1407
1408 The TIPC module is not loaded automatically on Ubuntu and probably
1409 other Linux distros.
1410 """
1411 if not hasattr(socket, "AF_TIPC"):
1412 return False
1413 if not os.path.isfile("/proc/modules"):
1414 return False
1415 with open("/proc/modules") as f:
1416 for line in f:
1417 if line.startswith("tipc "):
1418 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001419 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001420 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1421 return False
1422
1423class TIPCTest (unittest.TestCase):
1424 def testRDM(self):
1425 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1426 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1427
1428 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1429 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1430 TIPC_LOWER, TIPC_UPPER)
1431 srv.bind(srvaddr)
1432
1433 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1434 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1435 cli.sendto(MSG, sendaddr)
1436
1437 msg, recvaddr = srv.recvfrom(1024)
1438
1439 self.assertEqual(cli.getsockname(), recvaddr)
1440 self.assertEqual(msg, MSG)
1441
1442
1443class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1444 def __init__(self, methodName = 'runTest'):
1445 unittest.TestCase.__init__(self, methodName = methodName)
1446 ThreadableTest.__init__(self)
1447
1448 def setUp(self):
1449 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1450 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1451 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1452 TIPC_LOWER, TIPC_UPPER)
1453 self.srv.bind(srvaddr)
1454 self.srv.listen(5)
1455 self.serverExplicitReady()
1456 self.conn, self.connaddr = self.srv.accept()
1457
1458 def clientSetUp(self):
1459 # The is a hittable race between serverExplicitReady() and the
1460 # accept() call; sleep a little while to avoid it, otherwise
1461 # we could get an exception
1462 time.sleep(0.1)
1463 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1464 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1465 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1466 self.cli.connect(addr)
1467 self.cliaddr = self.cli.getsockname()
1468
1469 def testStream(self):
1470 msg = self.conn.recv(1024)
1471 self.assertEqual(msg, MSG)
1472 self.assertEqual(self.cliaddr, self.connaddr)
1473
1474 def _testStream(self):
1475 self.cli.send(MSG)
1476 self.cli.close()
1477
1478
Guido van Rossumb995eb72002-07-31 16:08:40 +00001479def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001480 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001481 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001482
1483 tests.extend([
1484 NonBlockingTCPTests,
1485 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001486 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001487 UnbufferedFileObjectClassTestCase,
1488 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001489 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001490 NetworkConnectionNoServer,
1491 NetworkConnectionAttributesTest,
1492 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001493 ])
Dave Cole331708b2004-08-09 04:51:41 +00001494 if hasattr(socket, "socketpair"):
1495 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001496 if sys.platform == 'linux2':
1497 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001498 if isTipcAvailable():
1499 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001500 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001501
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001502 thread_info = support.threading_setup()
1503 support.run_unittest(*tests)
1504 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001505
1506if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001507 test_main()