blob: 81bd537e0e361c45c8cbaa4a2604a58b8a6d8eba [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00002from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Trent Nelsone41b0062008-04-08 23:47:30 +00004import errno
Charles-François Natali5a1427c2014-07-26 13:44:50 +01005import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00008import time
9import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000010import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000012import os
Martin Blais2856e5f2006-05-26 12:03:27 +000013import array
Antoine Pitrouc818ed42010-09-07 21:40:25 +000014import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000015from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000016import signal
Antoine Pitrou66b5df62010-09-27 18:16:46 +000017import math
Victor Stinner0a649c72014-07-26 14:52:55 +020018try:
19 import _socket
20except ImportError:
21 _socket = None
22
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000024def try_address(host, port=0, family=socket.AF_INET):
25 """Try to bind a socket on the given host:port and return True
26 if that has been possible."""
27 try:
28 sock = socket.socket(family, socket.SOCK_STREAM)
29 sock.bind((host, port))
30 except (socket.error, socket.gaierror):
31 return False
32 else:
33 sock.close()
34 return True
35
36HOST = test_support.HOST
37MSG = b'Michael Gilfix was here\n'
38SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
39
Victor Stinner6a102812010-04-27 23:55:59 +000040try:
41 import thread
42 import threading
43except ImportError:
44 thread = None
45 threading = None
46
Trent Nelsone41b0062008-04-08 23:47:30 +000047HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000048MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Guido van Rossum24e4af82002-06-12 19:18:08 +000050class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def setUp(self):
53 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000054 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000055 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000056
Guido van Rossum24e4af82002-06-12 19:18:08 +000057 def tearDown(self):
58 self.serv.close()
59 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000060
Guido van Rossum24e4af82002-06-12 19:18:08 +000061class SocketUDPTest(unittest.TestCase):
62
63 def setUp(self):
64 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000065 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000066
67 def tearDown(self):
68 self.serv.close()
69 self.serv = None
70
71class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000072 """Threadable Test class
73
74 The ThreadableTest class makes it easy to create a threaded
75 client/server pair from an existing unit test. To create a
76 new threaded class from an existing unit test, use multiple
77 inheritance:
78
79 class NewClass (OldClass, ThreadableTest):
80 pass
81
82 This class defines two new fixture functions with obvious
83 purposes for overriding:
84
85 clientSetUp ()
86 clientTearDown ()
87
88 Any new test functions within the class must then define
89 tests in pairs, where the test name is preceeded with a
90 '_' to indicate the client portion of the test. Ex:
91
92 def testFoo(self):
93 # Server portion
94
95 def _testFoo(self):
96 # Client portion
97
98 Any exceptions raised by the clients during their tests
99 are caught and transferred to the main thread to alert
100 the testing framework.
101
102 Note, the server setup function cannot call any blocking
103 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +0000104 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000105 the blocking call (such as in setting up a client/server
106 connection and performing the accept() in setUp().
107 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000108
109 def __init__(self):
110 # Swap the true setup function
111 self.__setUp = self.setUp
112 self.__tearDown = self.tearDown
113 self.setUp = self._setUp
114 self.tearDown = self._tearDown
115
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000116 def serverExplicitReady(self):
117 """This method allows the server to explicitly indicate that
118 it wants the client thread to proceed. This is useful if the
119 server is about to execute a blocking routine that is
120 dependent upon the client thread during its setup routine."""
121 self.server_ready.set()
122
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000124 self.server_ready = threading.Event()
125 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000127 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128
129 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000130 methodname = self.id()
131 i = methodname.rfind('.')
132 methodname = methodname[i+1:]
133 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000134 self.client_thread = thread.start_new_thread(
135 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000138 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000139 self.server_ready.set()
140 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000141
142 def _tearDown(self):
143 self.__tearDown()
144 self.done.wait()
145
146 if not self.queue.empty():
147 msg = self.queue.get()
148 self.fail(msg)
149
150 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000151 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152 self.clientSetUp()
Charles-François Natali21565942011-09-21 22:02:27 +0200153 self.client_ready.set()
Ezio Melottib22c3fe2011-11-06 17:50:52 +0200154 if not callable(test_func):
155 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156 try:
157 test_func()
158 except Exception, strerror:
159 self.queue.put(strerror)
160 self.clientTearDown()
161
162 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000163 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000164
165 def clientTearDown(self):
166 self.done.set()
167 thread.exit()
168
169class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
170
171 def __init__(self, methodName='runTest'):
172 SocketTCPTest.__init__(self, methodName=methodName)
173 ThreadableTest.__init__(self)
174
175 def clientSetUp(self):
176 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
177
178 def clientTearDown(self):
179 self.cli.close()
180 self.cli = None
181 ThreadableTest.clientTearDown(self)
182
183class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
184
185 def __init__(self, methodName='runTest'):
186 SocketUDPTest.__init__(self, methodName=methodName)
187 ThreadableTest.__init__(self)
188
189 def clientSetUp(self):
190 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
191
Brian Curtindd8564f2010-11-04 03:54:23 +0000192 def clientTearDown(self):
193 self.cli.close()
194 self.cli = None
195 ThreadableTest.clientTearDown(self)
196
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197class SocketConnectedTest(ThreadedTCPSocketTest):
198
199 def __init__(self, methodName='runTest'):
200 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
201
202 def setUp(self):
203 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000204 # Indicate explicitly we're ready for the client thread to
205 # proceed and then perform the blocking call to accept
206 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000207 conn, addr = self.serv.accept()
208 self.cli_conn = conn
209
210 def tearDown(self):
211 self.cli_conn.close()
212 self.cli_conn = None
213 ThreadedTCPSocketTest.tearDown(self)
214
215 def clientSetUp(self):
216 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000217 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000218 self.serv_conn = self.cli
219
220 def clientTearDown(self):
221 self.serv_conn.close()
222 self.serv_conn = None
223 ThreadedTCPSocketTest.clientTearDown(self)
224
Dave Cole331708b2004-08-09 04:51:41 +0000225class SocketPairTest(unittest.TestCase, ThreadableTest):
226
227 def __init__(self, methodName='runTest'):
228 unittest.TestCase.__init__(self, methodName=methodName)
229 ThreadableTest.__init__(self)
230
231 def setUp(self):
232 self.serv, self.cli = socket.socketpair()
233
234 def tearDown(self):
235 self.serv.close()
236 self.serv = None
237
238 def clientSetUp(self):
239 pass
240
241 def clientTearDown(self):
242 self.cli.close()
243 self.cli = None
244 ThreadableTest.clientTearDown(self)
245
Tim Peters494aaee2004-08-09 18:54:11 +0000246
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247#######################################################################
248## Begin Tests
249
250class GeneralModuleTests(unittest.TestCase):
251
Victor Stinner0a649c72014-07-26 14:52:55 +0200252 @unittest.skipUnless(_socket is not None, 'need _socket module')
253 def test_csocket_repr(self):
254 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
255 try:
256 expected = ('<socket object, fd=%s, family=%s, type=%s, protocol=%s>'
257 % (s.fileno(), s.family, s.type, s.proto))
258 self.assertEqual(repr(s), expected)
259 finally:
260 s.close()
261 expected = ('<socket object, fd=-1, family=%s, type=%s, protocol=%s>'
262 % (s.family, s.type, s.proto))
263 self.assertEqual(repr(s), expected)
264
Raymond Hettinger027bb632004-05-31 03:09:25 +0000265 def test_weakref(self):
266 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
267 p = proxy(s)
268 self.assertEqual(p.fileno(), s.fileno())
269 s.close()
270 s = None
271 try:
272 p.fileno()
273 except ReferenceError:
274 pass
275 else:
276 self.fail('Socket proxy still exists')
277
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 def raise_error(*args, **kwargs):
281 raise socket.error
282 def raise_herror(*args, **kwargs):
283 raise socket.herror
284 def raise_gaierror(*args, **kwargs):
285 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000286 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000288 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000290 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 "Error raising socket exception.")
292
Ezio Melotti0639be62011-05-07 19:21:22 +0300293 def testSendtoErrors(self):
294 # Testing that sendto doens't masks failures. See #10169.
295 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
296 self.addCleanup(s.close)
297 s.bind(('', 0))
298 sockname = s.getsockname()
299 # 2 args
300 with self.assertRaises(UnicodeEncodeError):
301 s.sendto(u'\u2620', sockname)
302 with self.assertRaises(TypeError) as cm:
303 s.sendto(5j, sockname)
304 self.assertIn('not complex', str(cm.exception))
305 with self.assertRaises(TypeError) as cm:
306 s.sendto('foo', None)
307 self.assertIn('not NoneType', str(cm.exception))
308 # 3 args
309 with self.assertRaises(UnicodeEncodeError):
310 s.sendto(u'\u2620', 0, sockname)
311 with self.assertRaises(TypeError) as cm:
312 s.sendto(5j, 0, sockname)
313 self.assertIn('not complex', str(cm.exception))
314 with self.assertRaises(TypeError) as cm:
315 s.sendto('foo', 0, None)
316 self.assertIn('not NoneType', str(cm.exception))
317 with self.assertRaises(TypeError) as cm:
318 s.sendto('foo', 'bar', sockname)
319 self.assertIn('an integer is required', str(cm.exception))
320 with self.assertRaises(TypeError) as cm:
321 s.sendto('foo', None, None)
322 self.assertIn('an integer is required', str(cm.exception))
323 # wrong number of args
324 with self.assertRaises(TypeError) as cm:
325 s.sendto('foo')
326 self.assertIn('(1 given)', str(cm.exception))
327 with self.assertRaises(TypeError) as cm:
328 s.sendto('foo', 0, sockname, 4)
329 self.assertIn('(4 given)', str(cm.exception))
330
331
Guido van Rossum24e4af82002-06-12 19:18:08 +0000332 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000333 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334 socket.AF_INET
335 socket.SOCK_STREAM
336 socket.SOCK_DGRAM
337 socket.SOCK_RAW
338 socket.SOCK_RDM
339 socket.SOCK_SEQPACKET
340 socket.SOL_SOCKET
341 socket.SO_REUSEADDR
342
Guido van Rossum654c11e2002-06-13 20:24:17 +0000343 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000344 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000345 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000346 try:
347 ip = socket.gethostbyname(hostname)
348 except socket.error:
349 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600350 self.skipTest('name lookup failure')
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000351 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000352 try:
353 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
354 except socket.error:
355 # Probably a similar problem as above; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600356 self.skipTest('address lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000357 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000358 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000359 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000360 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000361
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200362 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
363 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000364 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000365 # Testing reference count for getnameinfo
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200366 try:
367 # On some versions, this loses a reference
368 orig = sys.getrefcount(__name__)
369 socket.getnameinfo(__name__,0)
370 except TypeError:
371 self.assertEqual(sys.getrefcount(__name__), orig,
372 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000373
Guido van Rossum24e4af82002-06-12 19:18:08 +0000374 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000375 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000376 try:
377 # On some versions, this crashes the interpreter.
378 socket.getnameinfo(('x', 0, 0, 0), 0)
379 except socket.error:
380 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000381
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000382 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000383 # This just checks that htons etc. are their own inverse,
384 # when looking at the lower 16 or 32 bits.
385 sizes = {socket.htonl: 32, socket.ntohl: 32,
386 socket.htons: 16, socket.ntohs: 16}
387 for func, size in sizes.items():
388 mask = (1L<<size) - 1
389 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
390 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000391
Guido van Rossuma2627af2002-09-14 00:58:46 +0000392 swapped = func(mask)
393 self.assertEqual(swapped & mask, mask)
394 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000395
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000396 def testNtoHErrors(self):
397 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
398 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
399 for k in good_values:
400 socket.ntohl(k)
401 socket.ntohs(k)
402 socket.htonl(k)
403 socket.htons(k)
404 for k in bad_values:
405 self.assertRaises(OverflowError, socket.ntohl, k)
406 self.assertRaises(OverflowError, socket.ntohs, k)
407 self.assertRaises(OverflowError, socket.htonl, k)
408 self.assertRaises(OverflowError, socket.htons, k)
409
Barry Warsaw11b91a02004-06-28 00:50:43 +0000410 def testGetServBy(self):
411 eq = self.assertEqual
412 # Find one service that exists, then check all the related interfaces.
413 # I've ordered this by protocols that have both a tcp and udp
414 # protocol, at least for modern Linuxes.
Gregory P. Smith886a1cd2010-10-17 04:28:14 +0000415 if (sys.platform.startswith('linux') or
416 sys.platform.startswith('freebsd') or
417 sys.platform.startswith('netbsd') or
418 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000419 # avoid the 'echo' service on this platform, as there is an
420 # assumption breaking non-standard port/protocol entry
421 services = ('daytime', 'qotd', 'domain')
422 else:
423 services = ('echo', 'daytime', 'domain')
424 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000425 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000426 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000427 break
428 except socket.error:
429 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000430 else:
431 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000432 # Try same call with optional protocol omitted
433 port2 = socket.getservbyname(service)
434 eq(port, port2)
Terry Jan Reedya70f60a2013-03-11 17:56:17 -0400435 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +0000436 try:
437 udpport = socket.getservbyname(service, 'udp')
438 except socket.error:
439 udpport = None
440 else:
441 eq(udpport, port)
442 # Now make sure the lookup by port returns the same service name
443 eq(socket.getservbyport(port2), service)
444 eq(socket.getservbyport(port, 'tcp'), service)
445 if udpport is not None:
446 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000447 # Make sure getservbyport does not accept out of range ports.
448 self.assertRaises(OverflowError, socket.getservbyport, -1)
449 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000451 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000452 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000453 # The default timeout should initially be None
454 self.assertEqual(socket.getdefaulttimeout(), None)
455 s = socket.socket()
456 self.assertEqual(s.gettimeout(), None)
457 s.close()
458
459 # Set the default timeout to 10, and see if it propagates
460 socket.setdefaulttimeout(10)
461 self.assertEqual(socket.getdefaulttimeout(), 10)
462 s = socket.socket()
463 self.assertEqual(s.gettimeout(), 10)
464 s.close()
465
466 # Reset the default timeout to None, and see if it propagates
467 socket.setdefaulttimeout(None)
468 self.assertEqual(socket.getdefaulttimeout(), None)
469 s = socket.socket()
470 self.assertEqual(s.gettimeout(), None)
471 s.close()
472
473 # Check that setting it to an invalid value raises ValueError
474 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
475
476 # Check that setting it to an invalid type raises TypeError
477 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
478
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200479 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
480 'test needs socket.inet_aton()')
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000481 def testIPv4_inet_aton_fourbytes(self):
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000482 # Test that issue1008086 and issue767150 are fixed.
483 # It must return 4 bytes.
Ezio Melotti2623a372010-11-21 13:34:58 +0000484 self.assertEqual('\x00'*4, socket.inet_aton('0.0.0.0'))
485 self.assertEqual('\xff'*4, socket.inet_aton('255.255.255.255'))
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000486
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200487 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
488 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000489 def testIPv4toString(self):
490 from socket import inet_aton as f, inet_pton, AF_INET
491 g = lambda a: inet_pton(AF_INET, a)
492
Ezio Melotti2623a372010-11-21 13:34:58 +0000493 self.assertEqual('\x00\x00\x00\x00', f('0.0.0.0'))
494 self.assertEqual('\xff\x00\xff\x00', f('255.0.255.0'))
495 self.assertEqual('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
496 self.assertEqual('\x01\x02\x03\x04', f('1.2.3.4'))
497 self.assertEqual('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000498
Ezio Melotti2623a372010-11-21 13:34:58 +0000499 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
500 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
501 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
502 self.assertEqual('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000503
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200504 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
505 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000506 def testIPv6toString(self):
507 try:
508 from socket import inet_pton, AF_INET6, has_ipv6
509 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600510 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000511 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600512 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000513 f = lambda a: inet_pton(AF_INET6, a)
514
Ezio Melotti2623a372010-11-21 13:34:58 +0000515 self.assertEqual('\x00' * 16, f('::'))
516 self.assertEqual('\x00' * 16, f('0::0'))
517 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
518 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000519 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
520 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
521 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000522
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200523 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
524 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000525 def testStringToIPv4(self):
526 from socket import inet_ntoa as f, inet_ntop, AF_INET
527 g = lambda a: inet_ntop(AF_INET, a)
528
Ezio Melotti2623a372010-11-21 13:34:58 +0000529 self.assertEqual('1.0.1.0', f('\x01\x00\x01\x00'))
530 self.assertEqual('170.85.170.85', f('\xaa\x55\xaa\x55'))
531 self.assertEqual('255.255.255.255', f('\xff\xff\xff\xff'))
532 self.assertEqual('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000533
Ezio Melotti2623a372010-11-21 13:34:58 +0000534 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
535 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
536 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000537
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200538 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
539 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000540 def testStringToIPv6(self):
541 try:
542 from socket import inet_ntop, AF_INET6, has_ipv6
543 if not has_ipv6:
Zachary Ware1f702212013-12-10 14:09:20 -0600544 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000545 except ImportError:
Zachary Ware1f702212013-12-10 14:09:20 -0600546 self.skipTest('could not import needed symbols from socket')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000547 f = lambda a: inet_ntop(AF_INET6, a)
548
Ezio Melotti2623a372010-11-21 13:34:58 +0000549 self.assertEqual('::', f('\x00' * 16))
550 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
551 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000552 'aef:b01:506:1001:ffff:9997:55:170',
553 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
554 )
555
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000556 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000557
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000558 def _get_unused_port(self, bind_address='0.0.0.0'):
559 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000560
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000561 Args:
562 bind_address: Hostname or IP address to search for a port on.
563
564 Returns: A most likely to be unused port.
565 """
566 tempsock = socket.socket()
567 tempsock.bind((bind_address, 0))
568 host, port = tempsock.getsockname()
569 tempsock.close()
570 return port
571
572 def testSockName(self):
573 # Testing getsockname()
574 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000576 self.addCleanup(sock.close)
Trent Nelsone41b0062008-04-08 23:47:30 +0000577 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000579 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
580 # it reasonable to get the host's addr in addition to 0.0.0.0.
581 # At least for eCos. This is required for the S/390 to pass.
Georg Brandlb7276502010-11-26 08:28:05 +0000582 try:
583 my_ip_addr = socket.gethostbyname(socket.gethostname())
584 except socket.error:
585 # Probably name lookup wasn't set up right; skip this test
Zachary Ware1f702212013-12-10 14:09:20 -0600586 self.skipTest('name lookup failure')
Ezio Melottiaa980582010-01-23 23:04:36 +0000587 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000588 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589
590 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000591 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 # We know a socket should start without reuse==0
593 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000594 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000596 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597
598 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000599 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000601 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000602 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
603 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000604 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000605
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000606 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000607 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000608 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
609 sock.settimeout(1)
610 sock.close()
611 self.assertRaises(socket.error, sock.send, "spam")
612
Georg Brandlbb03ac02006-03-21 18:17:25 +0000613 def testNewAttributes(self):
614 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000615 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000616 self.assertEqual(sock.family, socket.AF_INET)
617 self.assertEqual(sock.type, socket.SOCK_STREAM)
618 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000619 sock.close()
620
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000621 def test_getsockaddrarg(self):
Charles-François Natali5a1427c2014-07-26 13:44:50 +0100622 sock = socket.socket()
623 self.addCleanup(sock.close)
624 port = test_support.find_unused_port()
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000625 big_port = port + 65536
626 neg_port = port - 65536
Charles-François Natali5a1427c2014-07-26 13:44:50 +0100627 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
628 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
629 # Since find_unused_port() is inherently subject to race conditions, we
630 # call it a couple times if necessary.
631 for i in itertools.count():
632 port = test_support.find_unused_port()
633 try:
634 sock.bind((HOST, port))
635 except OSError as e:
636 if e.errno != errno.EADDRINUSE or i == 5:
637 raise
638 else:
639 break
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000640
Brian Curtin91a5b812010-11-05 15:52:20 +0000641 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesa47b75b2008-01-04 15:48:06 +0000642 def test_sock_ioctl(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000643 self.assertTrue(hasattr(socket.socket, 'ioctl'))
644 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
645 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
646 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000647 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
648 s = socket.socket()
Brian Curtin91a5b812010-11-05 15:52:20 +0000649 self.addCleanup(s.close)
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000650 self.assertRaises(ValueError, s.ioctl, -1, None)
651 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000652
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000653 def testGetaddrinfo(self):
654 try:
655 socket.getaddrinfo('localhost', 80)
656 except socket.gaierror as err:
657 if err.errno == socket.EAI_SERVICE:
658 # see http://bugs.python.org/issue1282647
659 self.skipTest("buggy libc version")
660 raise
661 # len of every sequence is supposed to be == 5
662 for info in socket.getaddrinfo(HOST, None):
663 self.assertEqual(len(info), 5)
664 # host can be a domain name, a string representation of an
665 # IPv4/v6 address or None
666 socket.getaddrinfo('localhost', 80)
667 socket.getaddrinfo('127.0.0.1', 80)
668 socket.getaddrinfo(None, 80)
669 if SUPPORTS_IPV6:
670 socket.getaddrinfo('::1', 80)
671 # port can be a string service name such as "http", a numeric
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200672 # port number (int or long), or None
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000673 socket.getaddrinfo(HOST, "http")
674 socket.getaddrinfo(HOST, 80)
Petri Lehtinenab7dd182012-12-20 21:06:14 +0200675 socket.getaddrinfo(HOST, 80L)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000676 socket.getaddrinfo(HOST, None)
677 # test family and socktype filters
678 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
679 for family, _, _, _, _ in infos:
680 self.assertEqual(family, socket.AF_INET)
681 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
682 for _, socktype, _, _, _ in infos:
683 self.assertEqual(socktype, socket.SOCK_STREAM)
684 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000685 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000686 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
687 # a server willing to support both IPv4 and IPv6 will
688 # usually do this
689 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
690 socket.AI_PASSIVE)
691
Ned Deilye789a1d2014-02-13 22:49:30 -0800692 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussoren0e6283e2013-06-10 10:35:36 +0200693 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilye789a1d2014-02-13 22:49:30 -0800694 try:
695 # The arguments here are undefined and the call may succeed
696 # or fail. All we care here is that it doesn't segfault.
697 socket.getaddrinfo("localhost", None, 0, 0, 0,
698 socket.AI_NUMERICSERV)
699 except socket.gaierror:
700 pass
Christian Heimesa47b75b2008-01-04 15:48:06 +0000701
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000702 def check_sendall_interrupted(self, with_timeout):
703 # socketpair() is not stricly required, but it makes things easier.
704 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
705 self.skipTest("signal.alarm and socket.socketpair required for this test")
706 # Our signal handlers clobber the C errno by calling a math function
707 # with an invalid domain value.
708 def ok_handler(*args):
709 self.assertRaises(ValueError, math.acosh, 0)
710 def raising_handler(*args):
711 self.assertRaises(ValueError, math.acosh, 0)
712 1 // 0
713 c, s = socket.socketpair()
714 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
715 try:
716 if with_timeout:
717 # Just above the one second minimum for signal.alarm
718 c.settimeout(1.5)
719 with self.assertRaises(ZeroDivisionError):
720 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200721 c.sendall(b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000722 if with_timeout:
723 signal.signal(signal.SIGALRM, ok_handler)
724 signal.alarm(1)
Charles-François Natali5aac8b72013-08-29 19:00:30 +0200725 self.assertRaises(socket.timeout, c.sendall,
726 b"x" * test_support.SOCK_MAX_SIZE)
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000727 finally:
728 signal.signal(signal.SIGALRM, old_alarm)
729 c.close()
730 s.close()
731
732 def test_sendall_interrupted(self):
733 self.check_sendall_interrupted(False)
734
735 def test_sendall_interrupted_with_timeout(self):
736 self.check_sendall_interrupted(True)
737
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200738 def test_listen_backlog(self):
739 for backlog in 0, -1:
740 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
741 srv.bind((HOST, 0))
742 srv.listen(backlog)
743 srv.close()
744
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200745 @test_support.cpython_only
746 def test_listen_backlog_overflow(self):
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200747 # Issue 15989
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200748 import _testcapi
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200749 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
750 srv.bind((HOST, 0))
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200751 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou47d1d0d2011-05-10 19:16:03 +0200752 srv.close()
753
Charles-François Natali3aa59e32012-01-02 15:38:27 +0100754 @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
755 def test_flowinfo(self):
756 self.assertRaises(OverflowError, socket.getnameinfo,
757 ('::1',0, 0xffffffff), 0)
758 s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
759 try:
760 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
761 finally:
762 s.close()
763
Antoine Pitrou66b5df62010-09-27 18:16:46 +0000764
Victor Stinner6a102812010-04-27 23:55:59 +0000765@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766class BasicTCPTest(SocketConnectedTest):
767
768 def __init__(self, methodName='runTest'):
769 SocketConnectedTest.__init__(self, methodName=methodName)
770
771 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000774 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775
776 def _testRecv(self):
777 self.serv_conn.send(MSG)
778
779 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000780 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 seg1 = self.cli_conn.recv(len(MSG) - 3)
782 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000783 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000784 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785
786 def _testOverFlowRecv(self):
787 self.serv_conn.send(MSG)
788
789 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000790 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000791 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000792 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000793
794 def _testRecvFrom(self):
795 self.serv_conn.send(MSG)
796
797 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000798 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
800 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000801 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000802 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000803
804 def _testOverFlowRecvFrom(self):
805 self.serv_conn.send(MSG)
806
807 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000808 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000809 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 while 1:
811 read = self.cli_conn.recv(1024)
812 if not read:
813 break
Guido van Rossume531e292002-08-08 20:28:34 +0000814 msg += read
815 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816
817 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000818 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819 self.serv_conn.sendall(big_chunk)
820
Zachary Ware1f702212013-12-10 14:09:20 -0600821 @unittest.skipUnless(hasattr(socket, 'fromfd'),
822 'socket.fromfd not availble')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000824 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000825 fd = self.cli_conn.fileno()
826 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +0000827 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000829 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830
831 def _testFromFd(self):
832 self.serv_conn.send(MSG)
833
Brian Curtin62c20b62010-11-02 02:59:55 +0000834 def testDup(self):
835 # Testing dup()
836 sock = self.cli_conn.dup()
837 self.addCleanup(sock.close)
838 msg = sock.recv(1024)
839 self.assertEqual(msg, MSG)
840
841 def _testDup(self):
842 self.serv_conn.send(MSG)
843
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000847 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000848 # wait for _testShutdown to finish: on OS X, when the server
849 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000850 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000851 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852
853 def _testShutdown(self):
854 self.serv_conn.send(MSG)
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200855 self.serv_conn.shutdown(2)
856
857 testShutdown_overflow = test_support.cpython_only(testShutdown)
858
859 @test_support.cpython_only
860 def _testShutdown_overflow(self):
861 import _testcapi
862 self.serv_conn.send(MSG)
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200863 # Issue 15989
864 self.assertRaises(OverflowError, self.serv_conn.shutdown,
865 _testcapi.INT_MAX + 1)
866 self.assertRaises(OverflowError, self.serv_conn.shutdown,
867 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 self.serv_conn.shutdown(2)
869
Victor Stinner6a102812010-04-27 23:55:59 +0000870@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871class BasicUDPTest(ThreadedUDPSocketTest):
872
873 def __init__(self, methodName='runTest'):
874 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
875
876 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000877 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000879 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880
881 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000882 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883
Guido van Rossum1c938012002-06-12 21:17:20 +0000884 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000885 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000887 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888
Guido van Rossum1c938012002-06-12 21:17:20 +0000889 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000890 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000891
Facundo Batista1fe9f962007-03-28 03:45:20 +0000892 def testRecvFromNegative(self):
893 # Negative lengths passed to recvfrom should give ValueError.
894 self.assertRaises(ValueError, self.serv.recvfrom, -1)
895
896 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000897 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000898
Victor Stinner6a102812010-04-27 23:55:59 +0000899@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000900class TCPCloserTest(ThreadedTCPSocketTest):
901
902 def testClose(self):
903 conn, addr = self.serv.accept()
904 conn.close()
905
906 sd = self.cli
907 read, write, err = select.select([sd], [], [], 1.0)
908 self.assertEqual(read, [sd])
909 self.assertEqual(sd.recv(1), '')
910
911 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000912 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000913 time.sleep(1.0)
914
Serhiy Storchaka32e23e72013-11-03 23:15:46 +0200915@unittest.skipUnless(hasattr(socket, 'socketpair'),
916 'test needs socket.socketpair()')
Victor Stinner6a102812010-04-27 23:55:59 +0000917@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000918class BasicSocketPairTest(SocketPairTest):
919
920 def __init__(self, methodName='runTest'):
921 SocketPairTest.__init__(self, methodName=methodName)
922
923 def testRecv(self):
924 msg = self.serv.recv(1024)
925 self.assertEqual(msg, MSG)
926
927 def _testRecv(self):
928 self.cli.send(MSG)
929
930 def testSend(self):
931 self.serv.send(MSG)
932
933 def _testSend(self):
934 msg = self.cli.recv(1024)
935 self.assertEqual(msg, MSG)
936
Victor Stinner6a102812010-04-27 23:55:59 +0000937@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938class NonBlockingTCPTests(ThreadedTCPSocketTest):
939
940 def __init__(self, methodName='runTest'):
941 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
942
943 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000944 # Testing whether set blocking works
Serhiy Storchaka74f49ab2013-01-19 12:55:39 +0200945 self.serv.setblocking(True)
946 self.assertIsNone(self.serv.gettimeout())
947 self.serv.setblocking(False)
948 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949 start = time.time()
950 try:
951 self.serv.accept()
952 except socket.error:
953 pass
954 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000955 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956
957 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000958 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000959
Serhiy Storchaka76249ea2014-02-07 10:06:05 +0200960 @test_support.cpython_only
961 def testSetBlocking_overflow(self):
962 # Issue 15989
963 import _testcapi
964 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
965 self.skipTest('needs UINT_MAX < ULONG_MAX')
966 self.serv.setblocking(False)
967 self.assertEqual(self.serv.gettimeout(), 0.0)
968 self.serv.setblocking(_testcapi.UINT_MAX + 1)
969 self.assertIsNone(self.serv.gettimeout())
970
971 _testSetBlocking_overflow = test_support.cpython_only(_testSetBlocking)
972
Guido van Rossum24e4af82002-06-12 19:18:08 +0000973 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000974 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000976 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 conn, addr = self.serv.accept()
978 except socket.error:
979 pass
980 else:
981 self.fail("Error trying to do non-blocking accept.")
982 read, write, err = select.select([self.serv], [], [])
983 if self.serv in read:
984 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000985 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000986 else:
987 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000988
Guido van Rossum24e4af82002-06-12 19:18:08 +0000989 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000990 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000991 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992
993 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000994 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +0000996 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000997
998 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000999 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +00001000 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001
1002 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001003 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 conn, addr = self.serv.accept()
1005 conn.setblocking(0)
1006 try:
1007 msg = conn.recv(len(MSG))
1008 except socket.error:
1009 pass
1010 else:
1011 self.fail("Error trying to do non-blocking recv.")
1012 read, write, err = select.select([conn], [], [])
1013 if conn in read:
1014 msg = conn.recv(len(MSG))
Brian Curtin62c20b62010-11-02 02:59:55 +00001015 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001016 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001017 else:
1018 self.fail("Error during select call to non-blocking socket.")
1019
1020 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001021 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001022 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001023 self.cli.send(MSG)
1024
Victor Stinner6a102812010-04-27 23:55:59 +00001025@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001026class FileObjectClassTestCase(SocketConnectedTest):
1027
Guido van Rossume9f66142002-08-07 15:46:19 +00001028 bufsize = -1 # Use default buffer size
1029
Guido van Rossum24e4af82002-06-12 19:18:08 +00001030 def __init__(self, methodName='runTest'):
1031 SocketConnectedTest.__init__(self, methodName=methodName)
1032
1033 def setUp(self):
1034 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001035 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001036
1037 def tearDown(self):
1038 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001039 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001040 SocketConnectedTest.tearDown(self)
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001041 self.serv_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001042
1043 def clientSetUp(self):
1044 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +00001045 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001046
1047 def clientTearDown(self):
1048 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001049 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050 self.cli_file = None
1051 SocketConnectedTest.clientTearDown(self)
1052
1053 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001054 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001055 first_seg = self.serv_file.read(len(MSG)-3)
1056 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001057 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001058 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059
1060 def _testSmallRead(self):
1061 self.cli_file.write(MSG)
1062 self.cli_file.flush()
1063
Guido van Rossum8c943832002-08-08 01:00:28 +00001064 def testFullRead(self):
1065 # read until EOF
1066 msg = self.serv_file.read()
1067 self.assertEqual(msg, MSG)
1068
1069 def _testFullRead(self):
1070 self.cli_file.write(MSG)
1071 self.cli_file.close()
1072
Guido van Rossum24e4af82002-06-12 19:18:08 +00001073 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001074 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001075 buf = ''
1076 while 1:
1077 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001078 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001080 buf += char
1081 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082
1083 def _testUnbufferedRead(self):
1084 self.cli_file.write(MSG)
1085 self.cli_file.flush()
1086
1087 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001088 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001090 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091
1092 def _testReadline(self):
1093 self.cli_file.write(MSG)
1094 self.cli_file.flush()
1095
Gregory P. Smith24237ea2008-05-05 21:53:45 +00001096 def testReadlineAfterRead(self):
1097 a_baloo_is = self.serv_file.read(len("A baloo is"))
1098 self.assertEqual("A baloo is", a_baloo_is)
1099 _a_bear = self.serv_file.read(len(" a bear"))
1100 self.assertEqual(" a bear", _a_bear)
1101 line = self.serv_file.readline()
1102 self.assertEqual("\n", line)
1103 line = self.serv_file.readline()
1104 self.assertEqual("A BALOO IS A BEAR.\n", line)
1105 line = self.serv_file.readline()
1106 self.assertEqual(MSG, line)
1107
1108 def _testReadlineAfterRead(self):
1109 self.cli_file.write("A baloo is a bear\n")
1110 self.cli_file.write("A BALOO IS A BEAR.\n")
1111 self.cli_file.write(MSG)
1112 self.cli_file.flush()
1113
1114 def testReadlineAfterReadNoNewline(self):
1115 end_of_ = self.serv_file.read(len("End Of "))
1116 self.assertEqual("End Of ", end_of_)
1117 line = self.serv_file.readline()
1118 self.assertEqual("Line", line)
1119
1120 def _testReadlineAfterReadNoNewline(self):
1121 self.cli_file.write("End Of Line")
1122
Tim Peters116d83c2004-03-28 02:20:45 +00001123 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001124 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001125
1126 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001127 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001128
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001129
1130class FileObjectInterruptedTestCase(unittest.TestCase):
1131 """Test that the file object correctly handles EINTR internally."""
1132
1133 class MockSocket(object):
1134 def __init__(self, recv_funcs=()):
1135 # A generator that returns callables that we'll call for each
1136 # call to recv().
1137 self._recv_step = iter(recv_funcs)
1138
1139 def recv(self, size):
1140 return self._recv_step.next()()
1141
1142 @staticmethod
1143 def _raise_eintr():
1144 raise socket.error(errno.EINTR)
1145
1146 def _test_readline(self, size=-1, **kwargs):
1147 mock_sock = self.MockSocket(recv_funcs=[
1148 lambda : "This is the first line\nAnd the sec",
1149 self._raise_eintr,
1150 lambda : "ond line is here\n",
1151 lambda : "",
1152 ])
1153 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001154 self.assertEqual(fo.readline(size), "This is the first line\n")
1155 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001156
1157 def _test_read(self, size=-1, **kwargs):
1158 mock_sock = self.MockSocket(recv_funcs=[
1159 lambda : "This is the first line\nAnd the sec",
1160 self._raise_eintr,
1161 lambda : "ond line is here\n",
1162 lambda : "",
1163 ])
1164 fo = socket._fileobject(mock_sock, **kwargs)
Ezio Melotti2623a372010-11-21 13:34:58 +00001165 self.assertEqual(fo.read(size), "This is the first line\n"
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001166 "And the second line is here\n")
1167
1168 def test_default(self):
1169 self._test_readline()
1170 self._test_readline(size=100)
1171 self._test_read()
1172 self._test_read(size=100)
1173
1174 def test_with_1k_buffer(self):
1175 self._test_readline(bufsize=1024)
1176 self._test_readline(size=100, bufsize=1024)
1177 self._test_read(bufsize=1024)
1178 self._test_read(size=100, bufsize=1024)
1179
1180 def _test_readline_no_buffer(self, size=-1):
1181 mock_sock = self.MockSocket(recv_funcs=[
1182 lambda : "aa",
1183 lambda : "\n",
1184 lambda : "BB",
1185 self._raise_eintr,
1186 lambda : "bb",
1187 lambda : "",
1188 ])
1189 fo = socket._fileobject(mock_sock, bufsize=0)
Ezio Melotti2623a372010-11-21 13:34:58 +00001190 self.assertEqual(fo.readline(size), "aa\n")
1191 self.assertEqual(fo.readline(size), "BBbb")
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001192
1193 def test_no_buffer(self):
1194 self._test_readline_no_buffer()
1195 self._test_readline_no_buffer(size=4)
1196 self._test_read(bufsize=0)
1197 self._test_read(size=100, bufsize=0)
1198
1199
Guido van Rossume9f66142002-08-07 15:46:19 +00001200class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1201
1202 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001203
Guido van Rossume9f66142002-08-07 15:46:19 +00001204 In this case (and in this case only), it should be possible to
1205 create a file object, read a line from it, create another file
1206 object, read another line from it, without loss of data in the
1207 first file object's buffer. Note that httplib relies on this
1208 when reading multiple requests from the same socket."""
1209
1210 bufsize = 0 # Use unbuffered mode
1211
1212 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001213 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001214 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001215 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001216 self.serv_file = self.cli_conn.makefile('rb', 0)
1217 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001218 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001219
1220 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001221 self.cli_file.write("A. " + MSG)
1222 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001223 self.cli_file.flush()
1224
Guido van Rossum8c943832002-08-08 01:00:28 +00001225class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1226
1227 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1228
Kristján Valur Jónsson2380fee2012-12-25 13:04:50 +00001229 class SocketMemo(object):
1230 """A wrapper to keep track of sent data, needed to examine write behaviour"""
1231 def __init__(self, sock):
1232 self._sock = sock
1233 self.sent = []
1234
1235 def send(self, data, flags=0):
1236 n = self._sock.send(data, flags)
1237 self.sent.append(data[:n])
1238 return n
1239
1240 def sendall(self, data, flags=0):
1241 self._sock.sendall(data, flags)
1242 self.sent.append(data)
1243
1244 def __getattr__(self, attr):
1245 return getattr(self._sock, attr)
1246
1247 def getsent(self):
1248 return [e.tobytes() if isinstance(e, memoryview) else e for e in self.sent]
1249
1250 def setUp(self):
1251 FileObjectClassTestCase.setUp(self)
1252 self.serv_file._sock = self.SocketMemo(self.serv_file._sock)
1253
1254 def testLinebufferedWrite(self):
1255 # Write two lines, in small chunks
1256 msg = MSG.strip()
1257 print >> self.serv_file, msg,
1258 print >> self.serv_file, msg
1259
1260 # second line:
1261 print >> self.serv_file, msg,
1262 print >> self.serv_file, msg,
1263 print >> self.serv_file, msg
1264
1265 # third line
1266 print >> self.serv_file, ''
1267
1268 self.serv_file.flush()
1269
1270 msg1 = "%s %s\n"%(msg, msg)
1271 msg2 = "%s %s %s\n"%(msg, msg, msg)
1272 msg3 = "\n"
1273 self.assertEqual(self.serv_file._sock.getsent(), [msg1, msg2, msg3])
1274
1275 def _testLinebufferedWrite(self):
1276 msg = MSG.strip()
1277 msg1 = "%s %s\n"%(msg, msg)
1278 msg2 = "%s %s %s\n"%(msg, msg, msg)
1279 msg3 = "\n"
1280 l1 = self.cli_file.readline()
1281 self.assertEqual(l1, msg1)
1282 l2 = self.cli_file.readline()
1283 self.assertEqual(l2, msg2)
1284 l3 = self.cli_file.readline()
1285 self.assertEqual(l3, msg3)
1286
Guido van Rossum8c943832002-08-08 01:00:28 +00001287
1288class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1289
1290 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001291
Georg Brandldd7b0522007-01-21 10:35:10 +00001292
Facundo Batista07c78be2007-03-23 18:54:07 +00001293class NetworkConnectionTest(object):
1294 """Prove network connection."""
1295 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001296 # We're inherited below by BasicTCPTest2, which also inherits
1297 # BasicTCPTest, which defines self.port referenced below.
1298 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001299 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001300
Facundo Batista07c78be2007-03-23 18:54:07 +00001301class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1302 """Tests that NetworkConnection does not break existing TCP functionality.
1303 """
1304
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001305class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001306 class MockSocket(socket.socket):
1307 def connect(self, *args):
1308 raise socket.timeout('timed out')
1309
1310 @contextlib.contextmanager
1311 def mocked_socket_module(self):
1312 """Return a socket which times out on connect"""
1313 old_socket = socket.socket
1314 socket.socket = self.MockSocket
1315 try:
1316 yield
1317 finally:
1318 socket.socket = old_socket
1319
1320 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001321 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001322 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin62c20b62010-11-02 02:59:55 +00001323 self.addCleanup(cli.close)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001324 with self.assertRaises(socket.error) as cm:
1325 cli.connect((HOST, port))
1326 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1327
1328 def test_create_connection(self):
1329 # Issue #9792: errors raised by create_connection() should have
1330 # a proper errno attribute.
1331 port = test_support.find_unused_port()
1332 with self.assertRaises(socket.error) as cm:
1333 socket.create_connection((HOST, port))
Trent Nelson6a7f8672012-10-18 01:35:32 -04001334
1335 # Issue #16257: create_connection() calls getaddrinfo() against
1336 # 'localhost'. This may result in an IPV6 addr being returned
1337 # as well as an IPV4 one:
1338 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
1339 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
1340 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
1341 #
1342 # create_connection() enumerates through all the addresses returned
1343 # and if it doesn't successfully bind to any of them, it propagates
1344 # the last exception it encountered.
1345 #
1346 # On Solaris, ENETUNREACH is returned in this circumstance instead
1347 # of ECONNREFUSED. So, if that errno exists, add it to our list of
1348 # expected errnos.
1349 expected_errnos = [ errno.ECONNREFUSED, ]
1350 if hasattr(errno, 'ENETUNREACH'):
1351 expected_errnos.append(errno.ENETUNREACH)
1352
1353 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001354
1355 def test_create_connection_timeout(self):
1356 # Issue #9792: create_connection() should not recast timeout errors
1357 # as generic socket errors.
1358 with self.mocked_socket_module():
1359 with self.assertRaises(socket.timeout):
1360 socket.create_connection((HOST, 1234))
1361
Facundo Batista07c78be2007-03-23 18:54:07 +00001362
Victor Stinner6a102812010-04-27 23:55:59 +00001363@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001364class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1365
1366 def __init__(self, methodName='runTest'):
1367 SocketTCPTest.__init__(self, methodName=methodName)
1368 ThreadableTest.__init__(self)
1369
1370 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001371 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001372
1373 def clientTearDown(self):
1374 self.cli.close()
1375 self.cli = None
1376 ThreadableTest.clientTearDown(self)
1377
1378 def _justAccept(self):
1379 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001380 conn.close()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001381
1382 testFamily = _justAccept
1383 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001384 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001385 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001386 self.assertEqual(self.cli.family, 2)
1387
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001388 testSourceAddress = _justAccept
1389 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001390 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1391 source_address=('', self.source_port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001392 self.addCleanup(self.cli.close)
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001393 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001394 # The port number being used is sufficient to show that the bind()
1395 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001396
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001397 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001398 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001399 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001400 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001401 socket.setdefaulttimeout(42)
1402 try:
1403 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin62c20b62010-11-02 02:59:55 +00001404 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001405 finally:
1406 socket.setdefaulttimeout(None)
Ezio Melotti2623a372010-11-21 13:34:58 +00001407 self.assertEqual(self.cli.gettimeout(), 42)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001408
1409 testTimeoutNone = _justAccept
1410 def _testTimeoutNone(self):
1411 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001412 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001413 socket.setdefaulttimeout(30)
1414 try:
1415 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin62c20b62010-11-02 02:59:55 +00001416 self.addCleanup(self.cli.close)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001417 finally:
1418 socket.setdefaulttimeout(None)
1419 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001420
1421 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001422 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001423 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001424 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001425
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001426 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001427 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001428 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin62c20b62010-11-02 02:59:55 +00001429 self.addCleanup(self.cli.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001430 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001431
Victor Stinner6a102812010-04-27 23:55:59 +00001432@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001433class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1434
1435 def __init__(self, methodName='runTest'):
1436 SocketTCPTest.__init__(self, methodName=methodName)
1437 ThreadableTest.__init__(self)
1438
1439 def clientSetUp(self):
1440 pass
1441
1442 def clientTearDown(self):
1443 self.cli.close()
1444 self.cli = None
1445 ThreadableTest.clientTearDown(self)
1446
Facundo Batista07c78be2007-03-23 18:54:07 +00001447 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001448 conn, addr = self.serv.accept()
Brian Curtin62c20b62010-11-02 02:59:55 +00001449 self.addCleanup(conn.close)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001450 time.sleep(3)
1451 conn.send("done!")
1452 testOutsideTimeout = testInsideTimeout
1453
1454 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001455 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001456 data = sock.recv(5)
1457 self.assertEqual(data, "done!")
1458
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001459 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001460 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001461 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001462
1463
Georg Brandldd7b0522007-01-21 10:35:10 +00001464class Urllib2FileobjectTest(unittest.TestCase):
1465
1466 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1467 # it close the socket if the close c'tor argument is true
1468
1469 def testClose(self):
1470 class MockSocket:
1471 closed = False
1472 def flush(self): pass
1473 def close(self): self.closed = True
1474
1475 # must not close unless we request it: the original use of _fileobject
1476 # by module socket requires that the underlying socket not be closed until
1477 # the _socketobject that created the _fileobject is closed
1478 s = MockSocket()
1479 f = socket._fileobject(s)
1480 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001481 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001482
1483 s = MockSocket()
1484 f = socket._fileobject(s, close=True)
1485 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001486 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001487
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001488class TCPTimeoutTest(SocketTCPTest):
1489
1490 def testTCPTimeout(self):
1491 def raise_timeout(*args, **kwargs):
1492 self.serv.settimeout(1.0)
1493 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001494 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001495 "Error generating a timeout exception (TCP)")
1496
1497 def testTimeoutZero(self):
1498 ok = False
1499 try:
1500 self.serv.settimeout(0.0)
1501 foo = self.serv.accept()
1502 except socket.timeout:
1503 self.fail("caught timeout instead of error (TCP)")
1504 except socket.error:
1505 ok = True
1506 except:
1507 self.fail("caught unexpected exception (TCP)")
1508 if not ok:
1509 self.fail("accept() returned success when we did not expect it")
1510
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001511 @unittest.skipUnless(hasattr(signal, 'alarm'),
1512 'test needs signal.alarm()')
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001513 def testInterruptedTimeout(self):
1514 # XXX I don't know how to do this test on MSWindows or any other
1515 # plaform that doesn't support signal.alarm() or os.kill(), though
1516 # the bug should have existed on all platforms.
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001517 self.serv.settimeout(5.0) # must be longer than alarm
1518 class Alarm(Exception):
1519 pass
1520 def alarm_handler(signal, frame):
1521 raise Alarm
1522 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1523 try:
1524 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1525 try:
1526 foo = self.serv.accept()
1527 except socket.timeout:
1528 self.fail("caught timeout instead of Alarm")
1529 except Alarm:
1530 pass
1531 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001532 self.fail("caught other exception instead of Alarm:"
1533 " %s(%s):\n%s" %
1534 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001535 else:
1536 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001537 finally:
1538 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001539 except Alarm:
1540 self.fail("got Alarm in wrong place")
1541 finally:
1542 # no alarm can be pending. Safe to restore old handler.
1543 signal.signal(signal.SIGALRM, old_alarm)
1544
Ezio Melotti169ed592011-11-18 18:33:14 +02001545class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001546
1547 def testUDPTimeout(self):
1548 def raise_timeout(*args, **kwargs):
1549 self.serv.settimeout(1.0)
1550 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001551 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001552 "Error generating a timeout exception (UDP)")
1553
1554 def testTimeoutZero(self):
1555 ok = False
1556 try:
1557 self.serv.settimeout(0.0)
1558 foo = self.serv.recv(1024)
1559 except socket.timeout:
1560 self.fail("caught timeout instead of error (UDP)")
1561 except socket.error:
1562 ok = True
1563 except:
1564 self.fail("caught unexpected exception (UDP)")
1565 if not ok:
1566 self.fail("recv() returned success when we did not expect it")
1567
1568class TestExceptions(unittest.TestCase):
1569
1570 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001571 self.assertTrue(issubclass(socket.error, Exception))
1572 self.assertTrue(issubclass(socket.herror, socket.error))
1573 self.assertTrue(issubclass(socket.gaierror, socket.error))
1574 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001575
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001576@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Armin Rigoa9017c32006-04-19 11:50:27 +00001577class TestLinuxAbstractNamespace(unittest.TestCase):
1578
1579 UNIX_PATH_MAX = 108
1580
1581 def testLinuxAbstractNamespace(self):
1582 address = "\x00python-test-hello\x00\xff"
1583 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1584 s1.bind(address)
1585 s1.listen(1)
1586 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1587 s2.connect(s1.getsockname())
1588 s1.accept()
1589 self.assertEqual(s1.getsockname(), address)
1590 self.assertEqual(s2.getpeername(), address)
1591
1592 def testMaxName(self):
1593 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1594 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1595 s.bind(address)
1596 self.assertEqual(s.getsockname(), address)
1597
1598 def testNameOverflow(self):
1599 address = "\x00" + "h" * self.UNIX_PATH_MAX
1600 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1601 self.assertRaises(socket.error, s.bind, address)
1602
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001603
Victor Stinner6a102812010-04-27 23:55:59 +00001604@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001605class BufferIOTest(SocketConnectedTest):
1606 """
1607 Test the buffer versions of socket.recv() and socket.send().
1608 """
1609 def __init__(self, methodName='runTest'):
1610 SocketConnectedTest.__init__(self, methodName=methodName)
1611
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001612 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001613 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001614 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001615 self.assertEqual(nbytes, len(MSG))
1616 msg = buf.tostring()[:len(MSG)]
1617 self.assertEqual(msg, MSG)
1618
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001619 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001620 with test_support.check_py3k_warnings():
1621 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001622 self.serv_conn.send(buf)
1623
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001624 def testRecvIntoBytearray(self):
1625 buf = bytearray(1024)
1626 nbytes = self.cli_conn.recv_into(buf)
1627 self.assertEqual(nbytes, len(MSG))
1628 msg = buf[:len(MSG)]
1629 self.assertEqual(msg, MSG)
1630
1631 _testRecvIntoBytearray = _testRecvIntoArray
1632
1633 def testRecvIntoMemoryview(self):
1634 buf = bytearray(1024)
1635 nbytes = self.cli_conn.recv_into(memoryview(buf))
1636 self.assertEqual(nbytes, len(MSG))
1637 msg = buf[:len(MSG)]
1638 self.assertEqual(msg, MSG)
1639
1640 _testRecvIntoMemoryview = _testRecvIntoArray
1641
1642 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001643 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001644 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001645 self.assertEqual(nbytes, len(MSG))
1646 msg = buf.tostring()[:len(MSG)]
1647 self.assertEqual(msg, MSG)
1648
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001649 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001650 with test_support.check_py3k_warnings():
1651 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001652 self.serv_conn.send(buf)
1653
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001654 def testRecvFromIntoBytearray(self):
1655 buf = bytearray(1024)
1656 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1657 self.assertEqual(nbytes, len(MSG))
1658 msg = buf[:len(MSG)]
1659 self.assertEqual(msg, MSG)
1660
1661 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1662
1663 def testRecvFromIntoMemoryview(self):
1664 buf = bytearray(1024)
1665 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1666 self.assertEqual(nbytes, len(MSG))
1667 msg = buf[:len(MSG)]
1668 self.assertEqual(msg, MSG)
1669
1670 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1671
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001672 def testRecvFromIntoSmallBuffer(self):
1673 # See issue #20246.
1674 buf = bytearray(8)
1675 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
1676
1677 def _testRecvFromIntoSmallBuffer(self):
1678 with test_support.check_py3k_warnings():
Stefan Krah70df6672014-01-21 23:05:52 +01001679 buf = buffer(MSG)
Benjamin Peterson28cf3682014-01-13 22:59:38 -05001680 self.serv_conn.send(buf)
1681
Benjamin Petersond93d6332014-01-14 00:27:42 -05001682 def testRecvFromIntoEmptyBuffer(self):
1683 buf = bytearray()
1684 self.cli_conn.recvfrom_into(buf)
1685 self.cli_conn.recvfrom_into(buf, 0)
1686
1687 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
1688
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001689
1690TIPC_STYPE = 2000
1691TIPC_LOWER = 200
1692TIPC_UPPER = 210
1693
1694def isTipcAvailable():
1695 """Check if the TIPC module is loaded
1696
1697 The TIPC module is not loaded automatically on Ubuntu and probably
1698 other Linux distros.
1699 """
1700 if not hasattr(socket, "AF_TIPC"):
1701 return False
1702 if not os.path.isfile("/proc/modules"):
1703 return False
1704 with open("/proc/modules") as f:
1705 for line in f:
1706 if line.startswith("tipc "):
1707 return True
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001708 return False
1709
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001710@unittest.skipUnless(isTipcAvailable(),
1711 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1712class TIPCTest(unittest.TestCase):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001713 def testRDM(self):
1714 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1715 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1716
1717 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1718 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1719 TIPC_LOWER, TIPC_UPPER)
1720 srv.bind(srvaddr)
1721
1722 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1723 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1724 cli.sendto(MSG, sendaddr)
1725
1726 msg, recvaddr = srv.recvfrom(1024)
1727
1728 self.assertEqual(cli.getsockname(), recvaddr)
1729 self.assertEqual(msg, MSG)
1730
1731
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001732@unittest.skipUnless(isTipcAvailable(),
1733 "TIPC module is not loaded, please 'sudo modprobe tipc'")
1734class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001735 def __init__(self, methodName = 'runTest'):
1736 unittest.TestCase.__init__(self, methodName = methodName)
1737 ThreadableTest.__init__(self)
1738
1739 def setUp(self):
1740 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1741 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1742 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1743 TIPC_LOWER, TIPC_UPPER)
1744 self.srv.bind(srvaddr)
1745 self.srv.listen(5)
1746 self.serverExplicitReady()
1747 self.conn, self.connaddr = self.srv.accept()
1748
1749 def clientSetUp(self):
1750 # The is a hittable race between serverExplicitReady() and the
1751 # accept() call; sleep a little while to avoid it, otherwise
1752 # we could get an exception
1753 time.sleep(0.1)
1754 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1755 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1756 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1757 self.cli.connect(addr)
1758 self.cliaddr = self.cli.getsockname()
1759
1760 def testStream(self):
1761 msg = self.conn.recv(1024)
1762 self.assertEqual(msg, MSG)
1763 self.assertEqual(self.cliaddr, self.connaddr)
1764
1765 def _testStream(self):
1766 self.cli.send(MSG)
1767 self.cli.close()
1768
1769
Guido van Rossumb995eb72002-07-31 16:08:40 +00001770def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001771 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001772 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1773 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001774
1775 tests.extend([
1776 NonBlockingTCPTests,
1777 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001778 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001779 UnbufferedFileObjectClassTestCase,
1780 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001781 SmallBufferedFileObjectClassTestCase,
1782 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001783 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001784 NetworkConnectionAttributesTest,
1785 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001786 ])
Serhiy Storchaka32e23e72013-11-03 23:15:46 +02001787 tests.append(BasicSocketPairTest)
1788 tests.append(TestLinuxAbstractNamespace)
1789 tests.extend([TIPCTest, TIPCThreadableTest])
Neal Norwitz9602cc22006-06-18 19:35:01 +00001790
1791 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001792 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001793 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001794
1795if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001796 test_main()