blob: a95e743c2fae28f342fdf0a69d78a00d73b84fa6 [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 Pitrou6e451df2010-08-09 20:39:54 +0000658 def testDetach(self):
659 # Testing detach()
660 fileno = self.cli_conn.fileno()
661 f = self.cli_conn.detach()
662 self.assertEqual(f, fileno)
663 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000664 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
665 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000666 # ...but we can create another socket using the (still open)
667 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000668 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
669 msg = sock.recv(1024)
670 self.assertEqual(msg, MSG)
671
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000672 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000673 self.serv_conn.send(MSG)
674
Victor Stinner45df8202010-04-28 22:31:17 +0000675@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000676class BasicUDPTest(ThreadedUDPSocketTest):
677
678 def __init__(self, methodName='runTest'):
679 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
680
681 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000682 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000683 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000684 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685
686 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000687 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688
Guido van Rossum1c938012002-06-12 21:17:20 +0000689 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000690 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000691 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000692 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000693
Guido van Rossum1c938012002-06-12 21:17:20 +0000694 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000695 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696
Guido van Rossumd8faa362007-04-27 19:54:29 +0000697 def testRecvFromNegative(self):
698 # Negative lengths passed to recvfrom should give ValueError.
699 self.assertRaises(ValueError, self.serv.recvfrom, -1)
700
701 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000702 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000703
Victor Stinner45df8202010-04-28 22:31:17 +0000704@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000705class TCPCloserTest(ThreadedTCPSocketTest):
706
707 def testClose(self):
708 conn, addr = self.serv.accept()
709 conn.close()
710
711 sd = self.cli
712 read, write, err = select.select([sd], [], [], 1.0)
713 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000714 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000716 # Calling close() many times should be safe.
717 conn.close()
718 conn.close()
719
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000720 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000721 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000722 time.sleep(1.0)
723
Victor Stinner45df8202010-04-28 22:31:17 +0000724@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000725class BasicSocketPairTest(SocketPairTest):
726
727 def __init__(self, methodName='runTest'):
728 SocketPairTest.__init__(self, methodName=methodName)
729
730 def testRecv(self):
731 msg = self.serv.recv(1024)
732 self.assertEqual(msg, MSG)
733
734 def _testRecv(self):
735 self.cli.send(MSG)
736
737 def testSend(self):
738 self.serv.send(MSG)
739
740 def _testSend(self):
741 msg = self.cli.recv(1024)
742 self.assertEqual(msg, MSG)
743
Victor Stinner45df8202010-04-28 22:31:17 +0000744@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000745class NonBlockingTCPTests(ThreadedTCPSocketTest):
746
747 def __init__(self, methodName='runTest'):
748 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
749
750 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000751 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752 self.serv.setblocking(0)
753 start = time.time()
754 try:
755 self.serv.accept()
756 except socket.error:
757 pass
758 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000759 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760
761 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000762 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000763
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000765 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000767 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 conn, addr = self.serv.accept()
769 except socket.error:
770 pass
771 else:
772 self.fail("Error trying to do non-blocking accept.")
773 read, write, err = select.select([self.serv], [], [])
774 if self.serv in read:
775 conn, addr = self.serv.accept()
776 else:
777 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000778
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000780 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000781 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782
783 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000784 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 conn, addr = self.serv.accept()
786
787 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000788 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000789 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790
791 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000792 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793 conn, addr = self.serv.accept()
794 conn.setblocking(0)
795 try:
796 msg = conn.recv(len(MSG))
797 except socket.error:
798 pass
799 else:
800 self.fail("Error trying to do non-blocking recv.")
801 read, write, err = select.select([conn], [], [])
802 if conn in read:
803 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000804 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805 else:
806 self.fail("Error during select call to non-blocking socket.")
807
808 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000809 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000810 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811 self.cli.send(MSG)
812
Victor Stinner45df8202010-04-28 22:31:17 +0000813@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000815 """Unit tests for the object returned by socket.makefile()
816
817 self.serv_file is the io object returned by makefile() on
818 the client connection. You can read from this file to
819 get output from the server.
820
821 self.cli_file is the io object returned by makefile() on the
822 server connection. You can write to this file to send output
823 to the client.
824 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000825
Guido van Rossume9f66142002-08-07 15:46:19 +0000826 bufsize = -1 # Use default buffer size
827
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 def __init__(self, methodName='runTest'):
829 SocketConnectedTest.__init__(self, methodName=methodName)
830
831 def setUp(self):
832 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000833 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
835 def tearDown(self):
836 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000837 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 self.serv_file = None
839 SocketConnectedTest.tearDown(self)
840
841 def clientSetUp(self):
842 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000843 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844
845 def clientTearDown(self):
846 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000847 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848 self.cli_file = None
849 SocketConnectedTest.clientTearDown(self)
850
851 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000852 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 first_seg = self.serv_file.read(len(MSG)-3)
854 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000855 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000856 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857
858 def _testSmallRead(self):
859 self.cli_file.write(MSG)
860 self.cli_file.flush()
861
Guido van Rossum8c943832002-08-08 01:00:28 +0000862 def testFullRead(self):
863 # read until EOF
864 msg = self.serv_file.read()
865 self.assertEqual(msg, MSG)
866
867 def _testFullRead(self):
868 self.cli_file.write(MSG)
869 self.cli_file.close()
870
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000872 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000873 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 while 1:
875 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000876 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 buf += char
879 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880
881 def _testUnbufferedRead(self):
882 self.cli_file.write(MSG)
883 self.cli_file.flush()
884
885 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000886 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000888 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889
890 def _testReadline(self):
891 self.cli_file.write(MSG)
892 self.cli_file.flush()
893
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000894 def testCloseAfterMakefile(self):
895 # The file returned by makefile should keep the socket open.
896 self.cli_conn.close()
897 # read until EOF
898 msg = self.serv_file.read()
899 self.assertEqual(msg, MSG)
900
901 def _testCloseAfterMakefile(self):
902 self.cli_file.write(MSG)
903 self.cli_file.flush()
904
905 def testMakefileAfterMakefileClose(self):
906 self.serv_file.close()
907 msg = self.cli_conn.recv(len(MSG))
908 self.assertEqual(msg, MSG)
909
910 def _testMakefileAfterMakefileClose(self):
911 self.cli_file.write(MSG)
912 self.cli_file.flush()
913
Tim Peters116d83c2004-03-28 02:20:45 +0000914 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000915 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000916
917 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000918 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000919
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000920 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000921 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000922 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
923
924 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000925 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000926 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
927
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000928 def testRealClose(self):
929 self.serv_file.close()
930 self.assertRaises(ValueError, self.serv_file.fileno)
931 self.cli_conn.close()
932 self.assertRaises(socket.error, self.cli_conn.getsockname)
933
934 def _testRealClose(self):
935 pass
936
937
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000938class FileObjectInterruptedTestCase(unittest.TestCase):
939 """Test that the file object correctly handles EINTR internally."""
940
941 class MockSocket(object):
942 def __init__(self, recv_funcs=()):
943 # A generator that returns callables that we'll call for each
944 # call to recv().
945 self._recv_step = iter(recv_funcs)
946
947 def recv_into(self, buffer):
948 data = next(self._recv_step)()
949 assert len(buffer) >= len(data)
950 buffer[:len(data)] = data
951 return len(data)
952
953 def _decref_socketios(self):
954 pass
955
956 def _textiowrap_for_test(self, buffering=-1):
957 raw = socket.SocketIO(self, "r")
958 if buffering < 0:
959 buffering = io.DEFAULT_BUFFER_SIZE
960 if buffering == 0:
961 return raw
962 buffer = io.BufferedReader(raw, buffering)
963 text = io.TextIOWrapper(buffer, None, None)
964 text.mode = "rb"
965 return text
966
967 @staticmethod
968 def _raise_eintr():
969 raise socket.error(errno.EINTR)
970
971 def _textiowrap_mock_socket(self, mock, buffering=-1):
972 raw = socket.SocketIO(mock, "r")
973 if buffering < 0:
974 buffering = io.DEFAULT_BUFFER_SIZE
975 if buffering == 0:
976 return raw
977 buffer = io.BufferedReader(raw, buffering)
978 text = io.TextIOWrapper(buffer, None, None)
979 text.mode = "rb"
980 return text
981
982 def _test_readline(self, size=-1, buffering=-1):
983 mock_sock = self.MockSocket(recv_funcs=[
984 lambda : b"This is the first line\nAnd the sec",
985 self._raise_eintr,
986 lambda : b"ond line is here\n",
987 lambda : b"",
988 lambda : b"", # XXX(gps): io library does an extra EOF read
989 ])
990 fo = mock_sock._textiowrap_for_test(buffering=buffering)
991 self.assertEquals(fo.readline(size), "This is the first line\n")
992 self.assertEquals(fo.readline(size), "And the second line is here\n")
993
994 def _test_read(self, size=-1, buffering=-1):
995 mock_sock = self.MockSocket(recv_funcs=[
996 lambda : b"This is the first line\nAnd the sec",
997 self._raise_eintr,
998 lambda : b"ond line is here\n",
999 lambda : b"",
1000 lambda : b"", # XXX(gps): io library does an extra EOF read
1001 ])
1002 expecting = (b"This is the first line\n"
1003 b"And the second line is here\n")
1004 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1005 if buffering == 0:
1006 data = b''
1007 else:
1008 data = ''
1009 expecting = expecting.decode('utf8')
1010 while len(data) != len(expecting):
1011 part = fo.read(size)
1012 if not part:
1013 break
1014 data += part
1015 self.assertEquals(data, expecting)
1016
1017 def test_default(self):
1018 self._test_readline()
1019 self._test_readline(size=100)
1020 self._test_read()
1021 self._test_read(size=100)
1022
1023 def test_with_1k_buffer(self):
1024 self._test_readline(buffering=1024)
1025 self._test_readline(size=100, buffering=1024)
1026 self._test_read(buffering=1024)
1027 self._test_read(size=100, buffering=1024)
1028
1029 def _test_readline_no_buffer(self, size=-1):
1030 mock_sock = self.MockSocket(recv_funcs=[
1031 lambda : b"a",
1032 lambda : b"\n",
1033 lambda : b"B",
1034 self._raise_eintr,
1035 lambda : b"b",
1036 lambda : b"",
1037 ])
1038 fo = mock_sock._textiowrap_for_test(buffering=0)
1039 self.assertEquals(fo.readline(size), b"a\n")
1040 self.assertEquals(fo.readline(size), b"Bb")
1041
1042 def test_no_buffer(self):
1043 self._test_readline_no_buffer()
1044 self._test_readline_no_buffer(size=4)
1045 self._test_read(buffering=0)
1046 self._test_read(size=100, buffering=0)
1047
1048
Guido van Rossume9f66142002-08-07 15:46:19 +00001049class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1050
1051 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001052
Guido van Rossume9f66142002-08-07 15:46:19 +00001053 In this case (and in this case only), it should be possible to
1054 create a file object, read a line from it, create another file
1055 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001056 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001057 when reading multiple requests from the same socket."""
1058
1059 bufsize = 0 # Use unbuffered mode
1060
1061 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001062 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001063 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001064 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001065 self.serv_file = self.cli_conn.makefile('rb', 0)
1066 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001067 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001068
1069 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001070 self.cli_file.write(b"A. " + MSG)
1071 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001072 self.cli_file.flush()
1073
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001074 def testMakefileClose(self):
1075 # The file returned by makefile should keep the socket open...
1076 self.cli_conn.close()
1077 msg = self.cli_conn.recv(1024)
1078 self.assertEqual(msg, MSG)
1079 # ...until the file is itself closed
1080 self.serv_file.close()
1081 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1082
1083 def _testMakefileClose(self):
1084 self.cli_file.write(MSG)
1085 self.cli_file.flush()
1086
1087 def testMakefileCloseSocketDestroy(self):
1088 refcount_before = sys.getrefcount(self.cli_conn)
1089 self.serv_file.close()
1090 refcount_after = sys.getrefcount(self.cli_conn)
1091 self.assertEqual(refcount_before - 1, refcount_after)
1092
1093 def _testMakefileCloseSocketDestroy(self):
1094 pass
1095
1096
Guido van Rossum8c943832002-08-08 01:00:28 +00001097class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1098
1099 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1100
1101
1102class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1103
1104 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001105
Thomas Woutersb2137042007-02-01 18:02:27 +00001106
Guido van Rossumd8faa362007-04-27 19:54:29 +00001107class NetworkConnectionTest(object):
1108 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001109
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001111 # We're inherited below by BasicTCPTest2, which also inherits
1112 # BasicTCPTest, which defines self.port referenced below.
1113 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001114 self.serv_conn = self.cli
1115
1116class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1117 """Tests that NetworkConnection does not break existing TCP functionality.
1118 """
1119
1120class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001121
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 def testWithoutServer(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001123 port = support.find_unused_port()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001124 self.assertRaises(
Christian Heimes5e696852008-04-09 08:37:03 +00001125 socket.error,
1126 lambda: socket.create_connection((HOST, port))
1127 )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001128
Victor Stinner45df8202010-04-28 22:31:17 +00001129@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001130class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1131
1132 def __init__(self, methodName='runTest'):
1133 SocketTCPTest.__init__(self, methodName=methodName)
1134 ThreadableTest.__init__(self)
1135
1136 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001137 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001138
1139 def clientTearDown(self):
1140 self.cli.close()
1141 self.cli = None
1142 ThreadableTest.clientTearDown(self)
1143
1144 def _justAccept(self):
1145 conn, addr = self.serv.accept()
1146
1147 testFamily = _justAccept
1148 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001149 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001150 self.assertEqual(self.cli.family, 2)
1151
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001152 testSourceAddress = _justAccept
1153 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001154 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1155 source_address=('', self.source_port))
1156 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001157 # The port number being used is sufficient to show that the bind()
1158 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001159
Guido van Rossumd8faa362007-04-27 19:54:29 +00001160 testTimeoutDefault = _justAccept
1161 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001162 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001163 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001164 socket.setdefaulttimeout(42)
1165 try:
1166 self.cli = socket.create_connection((HOST, self.port))
1167 finally:
1168 socket.setdefaulttimeout(None)
1169 self.assertEquals(self.cli.gettimeout(), 42)
1170
1171 testTimeoutNone = _justAccept
1172 def _testTimeoutNone(self):
1173 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001174 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001175 socket.setdefaulttimeout(30)
1176 try:
1177 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1178 finally:
1179 socket.setdefaulttimeout(None)
1180 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001181
1182 testTimeoutValueNamed = _justAccept
1183 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001184 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001185 self.assertEqual(self.cli.gettimeout(), 30)
1186
1187 testTimeoutValueNonamed = _justAccept
1188 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001189 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001190 self.assertEqual(self.cli.gettimeout(), 30)
1191
Victor Stinner45df8202010-04-28 22:31:17 +00001192@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001193class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1194
1195 def __init__(self, methodName='runTest'):
1196 SocketTCPTest.__init__(self, methodName=methodName)
1197 ThreadableTest.__init__(self)
1198
1199 def clientSetUp(self):
1200 pass
1201
1202 def clientTearDown(self):
1203 self.cli.close()
1204 self.cli = None
1205 ThreadableTest.clientTearDown(self)
1206
1207 def testInsideTimeout(self):
1208 conn, addr = self.serv.accept()
1209 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001210 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001211 testOutsideTimeout = testInsideTimeout
1212
1213 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001214 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001215 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001216 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001217
1218 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001219 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001220 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001221
1222
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001223class TCPTimeoutTest(SocketTCPTest):
1224
1225 def testTCPTimeout(self):
1226 def raise_timeout(*args, **kwargs):
1227 self.serv.settimeout(1.0)
1228 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001229 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001230 "Error generating a timeout exception (TCP)")
1231
1232 def testTimeoutZero(self):
1233 ok = False
1234 try:
1235 self.serv.settimeout(0.0)
1236 foo = self.serv.accept()
1237 except socket.timeout:
1238 self.fail("caught timeout instead of error (TCP)")
1239 except socket.error:
1240 ok = True
1241 except:
1242 self.fail("caught unexpected exception (TCP)")
1243 if not ok:
1244 self.fail("accept() returned success when we did not expect it")
1245
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001246 def testInterruptedTimeout(self):
1247 # XXX I don't know how to do this test on MSWindows or any other
1248 # plaform that doesn't support signal.alarm() or os.kill(), though
1249 # the bug should have existed on all platforms.
1250 if not hasattr(signal, "alarm"):
1251 return # can only test on *nix
1252 self.serv.settimeout(5.0) # must be longer than alarm
1253 class Alarm(Exception):
1254 pass
1255 def alarm_handler(signal, frame):
1256 raise Alarm
1257 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1258 try:
1259 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1260 try:
1261 foo = self.serv.accept()
1262 except socket.timeout:
1263 self.fail("caught timeout instead of Alarm")
1264 except Alarm:
1265 pass
1266 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001267 self.fail("caught other exception instead of Alarm:"
1268 " %s(%s):\n%s" %
1269 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001270 else:
1271 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001272 finally:
1273 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001274 except Alarm:
1275 self.fail("got Alarm in wrong place")
1276 finally:
1277 # no alarm can be pending. Safe to restore old handler.
1278 signal.signal(signal.SIGALRM, old_alarm)
1279
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001280class UDPTimeoutTest(SocketTCPTest):
1281
1282 def testUDPTimeout(self):
1283 def raise_timeout(*args, **kwargs):
1284 self.serv.settimeout(1.0)
1285 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001286 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001287 "Error generating a timeout exception (UDP)")
1288
1289 def testTimeoutZero(self):
1290 ok = False
1291 try:
1292 self.serv.settimeout(0.0)
1293 foo = self.serv.recv(1024)
1294 except socket.timeout:
1295 self.fail("caught timeout instead of error (UDP)")
1296 except socket.error:
1297 ok = True
1298 except:
1299 self.fail("caught unexpected exception (UDP)")
1300 if not ok:
1301 self.fail("recv() returned success when we did not expect it")
1302
1303class TestExceptions(unittest.TestCase):
1304
1305 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001306 self.assertTrue(issubclass(socket.error, Exception))
1307 self.assertTrue(issubclass(socket.herror, socket.error))
1308 self.assertTrue(issubclass(socket.gaierror, socket.error))
1309 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001310
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001311class TestLinuxAbstractNamespace(unittest.TestCase):
1312
1313 UNIX_PATH_MAX = 108
1314
1315 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001316 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001317 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1318 s1.bind(address)
1319 s1.listen(1)
1320 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1321 s2.connect(s1.getsockname())
1322 s1.accept()
1323 self.assertEqual(s1.getsockname(), address)
1324 self.assertEqual(s2.getpeername(), address)
1325
1326 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001327 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001328 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1329 s.bind(address)
1330 self.assertEqual(s.getsockname(), address)
1331
1332 def testNameOverflow(self):
1333 address = "\x00" + "h" * self.UNIX_PATH_MAX
1334 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1335 self.assertRaises(socket.error, s.bind, address)
1336
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001337
Victor Stinner45df8202010-04-28 22:31:17 +00001338@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001339class BufferIOTest(SocketConnectedTest):
1340 """
1341 Test the buffer versions of socket.recv() and socket.send().
1342 """
1343 def __init__(self, methodName='runTest'):
1344 SocketConnectedTest.__init__(self, methodName=methodName)
1345
Antoine Pitrou25480782010-03-17 22:50:28 +00001346 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001347 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001348 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001349 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001350 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001351 self.assertEqual(msg, MSG)
1352
Antoine Pitrou25480782010-03-17 22:50:28 +00001353 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001354 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001355 self.serv_conn.send(buf)
1356
Antoine Pitrou25480782010-03-17 22:50:28 +00001357 def testRecvIntoBytearray(self):
1358 buf = bytearray(1024)
1359 nbytes = self.cli_conn.recv_into(buf)
1360 self.assertEqual(nbytes, len(MSG))
1361 msg = buf[:len(MSG)]
1362 self.assertEqual(msg, MSG)
1363
1364 _testRecvIntoBytearray = _testRecvIntoArray
1365
1366 def testRecvIntoMemoryview(self):
1367 buf = bytearray(1024)
1368 nbytes = self.cli_conn.recv_into(memoryview(buf))
1369 self.assertEqual(nbytes, len(MSG))
1370 msg = buf[:len(MSG)]
1371 self.assertEqual(msg, MSG)
1372
1373 _testRecvIntoMemoryview = _testRecvIntoArray
1374
1375 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001376 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001377 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001378 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001379 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380 self.assertEqual(msg, MSG)
1381
Antoine Pitrou25480782010-03-17 22:50:28 +00001382 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001383 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001384 self.serv_conn.send(buf)
1385
Antoine Pitrou25480782010-03-17 22:50:28 +00001386 def testRecvFromIntoBytearray(self):
1387 buf = bytearray(1024)
1388 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1389 self.assertEqual(nbytes, len(MSG))
1390 msg = buf[:len(MSG)]
1391 self.assertEqual(msg, MSG)
1392
1393 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1394
1395 def testRecvFromIntoMemoryview(self):
1396 buf = bytearray(1024)
1397 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1398 self.assertEqual(nbytes, len(MSG))
1399 msg = buf[:len(MSG)]
1400 self.assertEqual(msg, MSG)
1401
1402 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1403
Christian Heimes043d6f62008-01-07 17:19:16 +00001404
1405TIPC_STYPE = 2000
1406TIPC_LOWER = 200
1407TIPC_UPPER = 210
1408
1409def isTipcAvailable():
1410 """Check if the TIPC module is loaded
1411
1412 The TIPC module is not loaded automatically on Ubuntu and probably
1413 other Linux distros.
1414 """
1415 if not hasattr(socket, "AF_TIPC"):
1416 return False
1417 if not os.path.isfile("/proc/modules"):
1418 return False
1419 with open("/proc/modules") as f:
1420 for line in f:
1421 if line.startswith("tipc "):
1422 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001423 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001424 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1425 return False
1426
1427class TIPCTest (unittest.TestCase):
1428 def testRDM(self):
1429 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1430 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1431
1432 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1433 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1434 TIPC_LOWER, TIPC_UPPER)
1435 srv.bind(srvaddr)
1436
1437 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1438 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1439 cli.sendto(MSG, sendaddr)
1440
1441 msg, recvaddr = srv.recvfrom(1024)
1442
1443 self.assertEqual(cli.getsockname(), recvaddr)
1444 self.assertEqual(msg, MSG)
1445
1446
1447class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1448 def __init__(self, methodName = 'runTest'):
1449 unittest.TestCase.__init__(self, methodName = methodName)
1450 ThreadableTest.__init__(self)
1451
1452 def setUp(self):
1453 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1454 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1455 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1456 TIPC_LOWER, TIPC_UPPER)
1457 self.srv.bind(srvaddr)
1458 self.srv.listen(5)
1459 self.serverExplicitReady()
1460 self.conn, self.connaddr = self.srv.accept()
1461
1462 def clientSetUp(self):
1463 # The is a hittable race between serverExplicitReady() and the
1464 # accept() call; sleep a little while to avoid it, otherwise
1465 # we could get an exception
1466 time.sleep(0.1)
1467 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1468 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1469 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1470 self.cli.connect(addr)
1471 self.cliaddr = self.cli.getsockname()
1472
1473 def testStream(self):
1474 msg = self.conn.recv(1024)
1475 self.assertEqual(msg, MSG)
1476 self.assertEqual(self.cliaddr, self.connaddr)
1477
1478 def _testStream(self):
1479 self.cli.send(MSG)
1480 self.cli.close()
1481
1482
Guido van Rossumb995eb72002-07-31 16:08:40 +00001483def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001484 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001485 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001486
1487 tests.extend([
1488 NonBlockingTCPTests,
1489 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001490 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001491 UnbufferedFileObjectClassTestCase,
1492 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001493 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001494 NetworkConnectionNoServer,
1495 NetworkConnectionAttributesTest,
1496 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001497 ])
Dave Cole331708b2004-08-09 04:51:41 +00001498 if hasattr(socket, "socketpair"):
1499 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001500 if sys.platform == 'linux2':
1501 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001502 if isTipcAvailable():
1503 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001504 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001505
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001506 thread_info = support.threading_setup()
1507 support.run_unittest(*tests)
1508 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001509
1510if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001511 test_main()