blob: e20364dca96a5f0f5249bd865b51abd1f6e483be [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
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000021try:
22 import fcntl
23except ImportError:
24 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000026def try_address(host, port=0, family=socket.AF_INET):
27 """Try to bind a socket on the given host:port and return True
28 if that has been possible."""
29 try:
30 sock = socket.socket(family, socket.SOCK_STREAM)
31 sock.bind((host, port))
32 except (socket.error, socket.gaierror):
33 return False
34 else:
35 sock.close()
36 return True
37
Antoine Pitrou1cae8b52010-10-23 17:05:13 +000038def linux_version():
39 try:
40 # platform.release() is something like '2.6.33.7-desktop-2mnb'
41 version_string = platform.release().split('-')[0]
42 return tuple(map(int, version_string.split('.')))
43 except ValueError:
44 return 0, 0, 0
45
Benjamin Petersonee8712c2008-05-20 21:35:26 +000046HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000047MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000048SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Victor Stinner45df8202010-04-28 22:31:17 +000050try:
51 import _thread as thread
52 import threading
53except ImportError:
54 thread = None
55 threading = None
56
Guido van Rossum24e4af82002-06-12 19:18:08 +000057class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059 def setUp(self):
60 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000063
Guido van Rossum24e4af82002-06-12 19:18:08 +000064 def tearDown(self):
65 self.serv.close()
66 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000067
Guido van Rossum24e4af82002-06-12 19:18:08 +000068class SocketUDPTest(unittest.TestCase):
69
70 def setUp(self):
71 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000073
74 def tearDown(self):
75 self.serv.close()
76 self.serv = None
77
78class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 """Threadable Test class
80
81 The ThreadableTest class makes it easy to create a threaded
82 client/server pair from an existing unit test. To create a
83 new threaded class from an existing unit test, use multiple
84 inheritance:
85
86 class NewClass (OldClass, ThreadableTest):
87 pass
88
89 This class defines two new fixture functions with obvious
90 purposes for overriding:
91
92 clientSetUp ()
93 clientTearDown ()
94
95 Any new test functions within the class must then define
96 tests in pairs, where the test name is preceeded with a
97 '_' to indicate the client portion of the test. Ex:
98
99 def testFoo(self):
100 # Server portion
101
102 def _testFoo(self):
103 # Client portion
104
105 Any exceptions raised by the clients during their tests
106 are caught and transferred to the main thread to alert
107 the testing framework.
108
109 Note, the server setup function cannot call any blocking
110 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 the blocking call (such as in setting up a client/server
113 connection and performing the accept() in setUp().
114 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def __init__(self):
117 # Swap the true setup function
118 self.__setUp = self.setUp
119 self.__tearDown = self.tearDown
120 self.setUp = self._setUp
121 self.tearDown = self._tearDown
122
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 def serverExplicitReady(self):
124 """This method allows the server to explicitly indicate that
125 it wants the client thread to proceed. This is useful if the
126 server is about to execute a blocking routine that is
127 dependent upon the client thread during its setup routine."""
128 self.server_ready.set()
129
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000131 self.server_ready = threading.Event()
132 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000134 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000137 methodname = self.id()
138 i = methodname.rfind('.')
139 methodname = methodname[i+1:]
140 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000141 self.client_thread = thread.start_new_thread(
142 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000145 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.set()
147 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def _tearDown(self):
150 self.__tearDown()
151 self.done.wait()
152
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000153 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000154 exc = self.queue.get()
155 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000158 self.server_ready.wait()
159 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000161 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163 try:
164 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000165 except BaseException as e:
166 self.queue.put(e)
167 finally:
168 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000169
170 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000171 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def clientTearDown(self):
174 self.done.set()
175 thread.exit()
176
177class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
178
179 def __init__(self, methodName='runTest'):
180 SocketTCPTest.__init__(self, methodName=methodName)
181 ThreadableTest.__init__(self)
182
183 def clientSetUp(self):
184 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
185
186 def clientTearDown(self):
187 self.cli.close()
188 self.cli = None
189 ThreadableTest.clientTearDown(self)
190
191class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 SocketUDPTest.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def clientSetUp(self):
198 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
199
200class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000201 """Socket tests for client-server connection.
202
203 self.cli_conn is a client socket connected to the server. The
204 setUp() method guarantees that it is connected to the server.
205 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000206
207 def __init__(self, methodName='runTest'):
208 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
209
210 def setUp(self):
211 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000212 # Indicate explicitly we're ready for the client thread to
213 # proceed and then perform the blocking call to accept
214 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215 conn, addr = self.serv.accept()
216 self.cli_conn = conn
217
218 def tearDown(self):
219 self.cli_conn.close()
220 self.cli_conn = None
221 ThreadedTCPSocketTest.tearDown(self)
222
223 def clientSetUp(self):
224 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000225 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000226 self.serv_conn = self.cli
227
228 def clientTearDown(self):
229 self.serv_conn.close()
230 self.serv_conn = None
231 ThreadedTCPSocketTest.clientTearDown(self)
232
Dave Cole331708b2004-08-09 04:51:41 +0000233class SocketPairTest(unittest.TestCase, ThreadableTest):
234
235 def __init__(self, methodName='runTest'):
236 unittest.TestCase.__init__(self, methodName=methodName)
237 ThreadableTest.__init__(self)
238
239 def setUp(self):
240 self.serv, self.cli = socket.socketpair()
241
242 def tearDown(self):
243 self.serv.close()
244 self.serv = None
245
246 def clientSetUp(self):
247 pass
248
249 def clientTearDown(self):
250 self.cli.close()
251 self.cli = None
252 ThreadableTest.clientTearDown(self)
253
Tim Peters494aaee2004-08-09 18:54:11 +0000254
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255#######################################################################
256## Begin Tests
257
258class GeneralModuleTests(unittest.TestCase):
259
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000260 def test_repr(self):
261 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000262 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000263
Raymond Hettinger027bb632004-05-31 03:09:25 +0000264 def test_weakref(self):
265 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
266 p = proxy(s)
267 self.assertEqual(p.fileno(), s.fileno())
268 s.close()
269 s = None
270 try:
271 p.fileno()
272 except ReferenceError:
273 pass
274 else:
275 self.fail('Socket proxy still exists')
276
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000278 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 def raise_error(*args, **kwargs):
280 raise socket.error
281 def raise_herror(*args, **kwargs):
282 raise socket.herror
283 def raise_gaierror(*args, **kwargs):
284 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000285 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000287 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000289 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290 "Error raising socket exception.")
291
292 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000293 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000294 socket.AF_INET
295 socket.SOCK_STREAM
296 socket.SOCK_DGRAM
297 socket.SOCK_RAW
298 socket.SOCK_RDM
299 socket.SOCK_SEQPACKET
300 socket.SOL_SOCKET
301 socket.SO_REUSEADDR
302
Guido van Rossum654c11e2002-06-13 20:24:17 +0000303 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000304 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000305 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000306 try:
307 ip = socket.gethostbyname(hostname)
308 except socket.error:
309 # Probably name lookup wasn't set up right; skip this test
310 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000311 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000312 try:
313 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
314 except socket.error:
315 # Probably a similar problem as above; skip this test
316 return
Brett Cannon01668a12005-03-11 00:04:17 +0000317 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000318 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000319 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000320 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000321
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000322 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000323 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000324 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 try:
326 # On some versions, this loses a reference
327 orig = sys.getrefcount(__name__)
328 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000329 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000330 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000332
Guido van Rossum24e4af82002-06-12 19:18:08 +0000333 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000334 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000335 try:
336 # On some versions, this crashes the interpreter.
337 socket.getnameinfo(('x', 0, 0, 0), 0)
338 except socket.error:
339 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000340
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000341 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000342 # This just checks that htons etc. are their own inverse,
343 # when looking at the lower 16 or 32 bits.
344 sizes = {socket.htonl: 32, socket.ntohl: 32,
345 socket.htons: 16, socket.ntohs: 16}
346 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000347 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000348 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
349 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000350
Guido van Rossuma2627af2002-09-14 00:58:46 +0000351 swapped = func(mask)
352 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000353 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000354
Guido van Rossum018919a2007-01-15 00:07:32 +0000355 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000356 good_values = [ 1, 2, 3, 1, 2, 3 ]
357 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000358 for k in good_values:
359 socket.ntohl(k)
360 socket.ntohs(k)
361 socket.htonl(k)
362 socket.htons(k)
363 for k in bad_values:
364 self.assertRaises(OverflowError, socket.ntohl, k)
365 self.assertRaises(OverflowError, socket.ntohs, k)
366 self.assertRaises(OverflowError, socket.htonl, k)
367 self.assertRaises(OverflowError, socket.htons, k)
368
Barry Warsaw11b91a02004-06-28 00:50:43 +0000369 def testGetServBy(self):
370 eq = self.assertEqual
371 # Find one service that exists, then check all the related interfaces.
372 # I've ordered this by protocols that have both a tcp and udp
373 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000374 if (sys.platform.startswith('linux') or
375 sys.platform.startswith('freebsd') or
376 sys.platform.startswith('netbsd') or
377 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000378 # avoid the 'echo' service on this platform, as there is an
379 # assumption breaking non-standard port/protocol entry
380 services = ('daytime', 'qotd', 'domain')
381 else:
382 services = ('echo', 'daytime', 'domain')
383 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000384 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000385 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000386 break
387 except socket.error:
388 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000389 else:
390 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000391 # Try same call with optional protocol omitted
392 port2 = socket.getservbyname(service)
393 eq(port, port2)
394 # Try udp, but don't barf it it doesn't exist
395 try:
396 udpport = socket.getservbyname(service, 'udp')
397 except socket.error:
398 udpport = None
399 else:
400 eq(udpport, port)
401 # Now make sure the lookup by port returns the same service name
402 eq(socket.getservbyport(port2), service)
403 eq(socket.getservbyport(port, 'tcp'), service)
404 if udpport is not None:
405 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000406 # Make sure getservbyport does not accept out of range ports.
407 self.assertRaises(OverflowError, socket.getservbyport, -1)
408 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000409
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000410 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000411 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000412 # The default timeout should initially be None
413 self.assertEqual(socket.getdefaulttimeout(), None)
414 s = socket.socket()
415 self.assertEqual(s.gettimeout(), None)
416 s.close()
417
418 # Set the default timeout to 10, and see if it propagates
419 socket.setdefaulttimeout(10)
420 self.assertEqual(socket.getdefaulttimeout(), 10)
421 s = socket.socket()
422 self.assertEqual(s.gettimeout(), 10)
423 s.close()
424
425 # Reset the default timeout to None, and see if it propagates
426 socket.setdefaulttimeout(None)
427 self.assertEqual(socket.getdefaulttimeout(), None)
428 s = socket.socket()
429 self.assertEqual(s.gettimeout(), None)
430 s.close()
431
432 # Check that setting it to an invalid value raises ValueError
433 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
434
435 # Check that setting it to an invalid type raises TypeError
436 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
437
Benjamin Petersonf91df042009-02-13 02:50:59 +0000438 def testIPv4_inet_aton_fourbytes(self):
439 if not hasattr(socket, 'inet_aton'):
440 return # No inet_aton, nothing to check
441 # Test that issue1008086 and issue767150 are fixed.
442 # It must return 4 bytes.
443 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
444 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
445
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000447 if not hasattr(socket, 'inet_pton'):
448 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000449 from socket import inet_aton as f, inet_pton, AF_INET
450 g = lambda a: inet_pton(AF_INET, a)
451
Guido van Rossumb5b22702007-05-18 18:55:53 +0000452 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
453 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
454 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
455 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
456 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000457
Guido van Rossumb5b22702007-05-18 18:55:53 +0000458 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
459 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
460 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
461 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000462
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000463 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000464 if not hasattr(socket, 'inet_pton'):
465 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000466 try:
467 from socket import inet_pton, AF_INET6, has_ipv6
468 if not has_ipv6:
469 return
470 except ImportError:
471 return
472 f = lambda a: inet_pton(AF_INET6, a)
473
Guido van Rossum540d9872007-08-17 03:51:09 +0000474 self.assertEquals(b'\x00' * 16, f('::'))
475 self.assertEquals(b'\x00' * 16, f('0::0'))
476 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000477 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000478 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 +0000479 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
480 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000481
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000482 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000483 if not hasattr(socket, 'inet_ntop'):
484 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000485 from socket import inet_ntoa as f, inet_ntop, AF_INET
486 g = lambda a: inet_ntop(AF_INET, a)
487
Guido van Rossumb5b22702007-05-18 18:55:53 +0000488 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
489 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
490 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
491 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000492
Guido van Rossumb5b22702007-05-18 18:55:53 +0000493 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
494 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
495 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000496
497 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000498 if not hasattr(socket, 'inet_ntop'):
499 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000500 try:
501 from socket import inet_ntop, AF_INET6, has_ipv6
502 if not has_ipv6:
503 return
504 except ImportError:
505 return
506 f = lambda a: inet_ntop(AF_INET6, a)
507
Guido van Rossum540d9872007-08-17 03:51:09 +0000508 self.assertEquals('::', f(b'\x00' * 16))
509 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000510 self.assertEquals(
511 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000512 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 +0000513 )
514
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000515 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000516
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000517 def _get_unused_port(self, bind_address='0.0.0.0'):
518 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000519
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000520 Args:
521 bind_address: Hostname or IP address to search for a port on.
522
523 Returns: A most likely to be unused port.
524 """
525 tempsock = socket.socket()
526 tempsock.bind((bind_address, 0))
527 host, port = tempsock.getsockname()
528 tempsock.close()
529 return port
530
531 def testSockName(self):
532 # Testing getsockname()
533 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000535 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000537 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
538 # it reasonable to get the host's addr in addition to 0.0.0.0.
539 # At least for eCos. This is required for the S/390 to pass.
540 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000541 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000542 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543
544 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000545 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000546 # We know a socket should start without reuse==0
547 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
548 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000549 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550
551 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000552 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000553 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
554 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
555 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000556 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000558 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000559 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000560 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
561 sock.settimeout(1)
562 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000563 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000564
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000565 def testNewAttributes(self):
566 # testing .family, .type and .protocol
567 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
568 self.assertEqual(sock.family, socket.AF_INET)
569 self.assertEqual(sock.type, socket.SOCK_STREAM)
570 self.assertEqual(sock.proto, 0)
571 sock.close()
572
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000573 def test_getsockaddrarg(self):
574 host = '0.0.0.0'
575 port = self._get_unused_port(bind_address=host)
576 big_port = port + 65536
577 neg_port = port - 65536
578 sock = socket.socket()
579 try:
580 self.assertRaises(OverflowError, sock.bind, (host, big_port))
581 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
582 sock.bind((host, port))
583 finally:
584 sock.close()
585
Christian Heimesfaf2f632008-01-06 16:59:19 +0000586 def test_sock_ioctl(self):
587 if os.name != "nt":
588 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000589 self.assertTrue(hasattr(socket.socket, 'ioctl'))
590 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
591 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
592 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000593 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
594 s = socket.socket()
595 self.assertRaises(ValueError, s.ioctl, -1, None)
596 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000597
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000598 def testGetaddrinfo(self):
599 try:
600 socket.getaddrinfo('localhost', 80)
601 except socket.gaierror as err:
602 if err.errno == socket.EAI_SERVICE:
603 # see http://bugs.python.org/issue1282647
604 self.skipTest("buggy libc version")
605 raise
606 # len of every sequence is supposed to be == 5
607 for info in socket.getaddrinfo(HOST, None):
608 self.assertEqual(len(info), 5)
609 # host can be a domain name, a string representation of an
610 # IPv4/v6 address or None
611 socket.getaddrinfo('localhost', 80)
612 socket.getaddrinfo('127.0.0.1', 80)
613 socket.getaddrinfo(None, 80)
614 if SUPPORTS_IPV6:
615 socket.getaddrinfo('::1', 80)
616 # port can be a string service name such as "http", a numeric
617 # port number or None
618 socket.getaddrinfo(HOST, "http")
619 socket.getaddrinfo(HOST, 80)
620 socket.getaddrinfo(HOST, None)
621 # test family and socktype filters
622 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
623 for family, _, _, _, _ in infos:
624 self.assertEqual(family, socket.AF_INET)
625 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
626 for _, socktype, _, _, _ in infos:
627 self.assertEqual(socktype, socket.SOCK_STREAM)
628 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000629 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000630 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
631 # a server willing to support both IPv4 and IPv6 will
632 # usually do this
633 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
634 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000635 # test keyword arguments
636 a = socket.getaddrinfo(HOST, None)
637 b = socket.getaddrinfo(host=HOST, port=None)
638 self.assertEqual(a, b)
639 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
640 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
641 self.assertEqual(a, b)
642 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
643 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
644 self.assertEqual(a, b)
645 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
646 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
647 self.assertEqual(a, b)
648 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
649 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
650 self.assertEqual(a, b)
651 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
652 socket.AI_PASSIVE)
653 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
654 type=socket.SOCK_STREAM, proto=0,
655 flags=socket.AI_PASSIVE)
656 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000657
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000658 def test_getnameinfo(self):
659 # only IP addresses are allowed
660 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
661
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000662 @unittest.skipUnless(support.is_resource_enabled('network'),
663 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000664 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000665 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000666 # these should all be successful
667 socket.gethostbyname('испытание.python.org')
668 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000669 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
670 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
671 # have a reverse entry yet
672 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000673
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000674 def check_sendall_interrupted(self, with_timeout):
675 # socketpair() is not stricly required, but it makes things easier.
676 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
677 self.skipTest("signal.alarm and socket.socketpair required for this test")
678 # Our signal handlers clobber the C errno by calling a math function
679 # with an invalid domain value.
680 def ok_handler(*args):
681 self.assertRaises(ValueError, math.acosh, 0)
682 def raising_handler(*args):
683 self.assertRaises(ValueError, math.acosh, 0)
684 1 // 0
685 c, s = socket.socketpair()
686 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
687 try:
688 if with_timeout:
689 # Just above the one second minimum for signal.alarm
690 c.settimeout(1.5)
691 with self.assertRaises(ZeroDivisionError):
692 signal.alarm(1)
693 c.sendall(b"x" * (1024**2))
694 if with_timeout:
695 signal.signal(signal.SIGALRM, ok_handler)
696 signal.alarm(1)
697 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
698 finally:
699 signal.signal(signal.SIGALRM, old_alarm)
700 c.close()
701 s.close()
702
703 def test_sendall_interrupted(self):
704 self.check_sendall_interrupted(False)
705
706 def test_sendall_interrupted_with_timeout(self):
707 self.check_sendall_interrupted(True)
708
Antoine Pitroue033e062010-10-29 10:38:18 +0000709 def test_dealloc_warn(self):
710 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
711 r = repr(sock)
712 with self.assertWarns(ResourceWarning) as cm:
713 sock = None
714 support.gc_collect()
715 self.assertIn(r, str(cm.warning.args[0]))
716 # An open socket file object gets dereferenced after the socket
717 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
718 f = sock.makefile('rb')
719 r = repr(sock)
720 sock = None
721 support.gc_collect()
722 with self.assertWarns(ResourceWarning):
723 f = None
724 support.gc_collect()
725
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000726
Victor Stinner45df8202010-04-28 22:31:17 +0000727@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728class BasicTCPTest(SocketConnectedTest):
729
730 def __init__(self, methodName='runTest'):
731 SocketConnectedTest.__init__(self, methodName=methodName)
732
733 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000736 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737
738 def _testRecv(self):
739 self.serv_conn.send(MSG)
740
741 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000742 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743 seg1 = self.cli_conn.recv(len(MSG) - 3)
744 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000745 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000746 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747
748 def _testOverFlowRecv(self):
749 self.serv_conn.send(MSG)
750
751 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000752 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000754 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755
756 def _testRecvFrom(self):
757 self.serv_conn.send(MSG)
758
759 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000760 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
762 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000763 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000764 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765
766 def _testOverFlowRecvFrom(self):
767 self.serv_conn.send(MSG)
768
769 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000770 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000771 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772 while 1:
773 read = self.cli_conn.recv(1024)
774 if not read:
775 break
Guido van Rossume531e292002-08-08 20:28:34 +0000776 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000777 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778
779 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000780 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 self.serv_conn.sendall(big_chunk)
782
783 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000784 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 fd = self.cli_conn.fileno()
786 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000787 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000789 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790
791 def _testFromFd(self):
792 self.serv_conn.send(MSG)
793
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000794 def testDup(self):
795 # Testing dup()
796 sock = self.cli_conn.dup()
797 msg = sock.recv(1024)
798 self.assertEqual(msg, MSG)
799
800 def _testDup(self):
801 self.serv_conn.send(MSG)
802
Guido van Rossum24e4af82002-06-12 19:18:08 +0000803 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000804 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000806 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000807 # wait for _testShutdown to finish: on OS X, when the server
808 # closes the connection the client also becomes disconnected,
809 # and the client's shutdown call will fail. (Issue #4397.)
810 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811
812 def _testShutdown(self):
813 self.serv_conn.send(MSG)
814 self.serv_conn.shutdown(2)
815
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000816 def testDetach(self):
817 # Testing detach()
818 fileno = self.cli_conn.fileno()
819 f = self.cli_conn.detach()
820 self.assertEqual(f, fileno)
821 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000822 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
823 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000824 # ...but we can create another socket using the (still open)
825 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000826 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
827 msg = sock.recv(1024)
828 self.assertEqual(msg, MSG)
829
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000830 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000831 self.serv_conn.send(MSG)
832
Victor Stinner45df8202010-04-28 22:31:17 +0000833@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834class BasicUDPTest(ThreadedUDPSocketTest):
835
836 def __init__(self, methodName='runTest'):
837 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
838
839 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000840 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000841 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000842 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843
844 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000845 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846
Guido van Rossum1c938012002-06-12 21:17:20 +0000847 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000850 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851
Guido van Rossum1c938012002-06-12 21:17:20 +0000852 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000853 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854
Guido van Rossumd8faa362007-04-27 19:54:29 +0000855 def testRecvFromNegative(self):
856 # Negative lengths passed to recvfrom should give ValueError.
857 self.assertRaises(ValueError, self.serv.recvfrom, -1)
858
859 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000860 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000861
Victor Stinner45df8202010-04-28 22:31:17 +0000862@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000863class TCPCloserTest(ThreadedTCPSocketTest):
864
865 def testClose(self):
866 conn, addr = self.serv.accept()
867 conn.close()
868
869 sd = self.cli
870 read, write, err = select.select([sd], [], [], 1.0)
871 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000872 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000873
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000874 # Calling close() many times should be safe.
875 conn.close()
876 conn.close()
877
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000878 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000879 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000880 time.sleep(1.0)
881
Victor Stinner45df8202010-04-28 22:31:17 +0000882@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000883class BasicSocketPairTest(SocketPairTest):
884
885 def __init__(self, methodName='runTest'):
886 SocketPairTest.__init__(self, methodName=methodName)
887
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000888 def _check_defaults(self, sock):
889 self.assertIsInstance(sock, socket.socket)
890 if hasattr(socket, 'AF_UNIX'):
891 self.assertEqual(sock.family, socket.AF_UNIX)
892 else:
893 self.assertEqual(sock.family, socket.AF_INET)
894 self.assertEqual(sock.type, socket.SOCK_STREAM)
895 self.assertEqual(sock.proto, 0)
896
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000897 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000898 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000899
900 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000901 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000902
Dave Cole331708b2004-08-09 04:51:41 +0000903 def testRecv(self):
904 msg = self.serv.recv(1024)
905 self.assertEqual(msg, MSG)
906
907 def _testRecv(self):
908 self.cli.send(MSG)
909
910 def testSend(self):
911 self.serv.send(MSG)
912
913 def _testSend(self):
914 msg = self.cli.recv(1024)
915 self.assertEqual(msg, MSG)
916
Victor Stinner45df8202010-04-28 22:31:17 +0000917@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000918class NonBlockingTCPTests(ThreadedTCPSocketTest):
919
920 def __init__(self, methodName='runTest'):
921 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
922
923 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000924 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925 self.serv.setblocking(0)
926 start = time.time()
927 try:
928 self.serv.accept()
929 except socket.error:
930 pass
931 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000932 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933
934 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000935 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000936
Antoine Pitroub1c54962010-10-14 15:05:38 +0000937 if hasattr(socket, "SOCK_NONBLOCK"):
938 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000939 v = linux_version()
940 if v < (2, 6, 28):
941 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
942 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000943 # reinit server socket
944 self.serv.close()
945 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000946 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000947 self.port = support.bind_port(self.serv)
948 self.serv.listen(1)
949 # actual testing
950 start = time.time()
951 try:
952 self.serv.accept()
953 except socket.error:
954 pass
955 end = time.time()
956 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
957
958 def _testInitNonBlocking(self):
959 pass
960
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000962 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000963 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000964 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965 conn, addr = self.serv.accept()
966 except socket.error:
967 pass
968 else:
969 self.fail("Error trying to do non-blocking accept.")
970 read, write, err = select.select([self.serv], [], [])
971 if self.serv in read:
972 conn, addr = self.serv.accept()
973 else:
974 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000975
Guido van Rossum24e4af82002-06-12 19:18:08 +0000976 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000977 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000978 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979
980 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000981 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 conn, addr = self.serv.accept()
983
984 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000985 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000986 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000987
988 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000989 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000990 conn, addr = self.serv.accept()
991 conn.setblocking(0)
992 try:
993 msg = conn.recv(len(MSG))
994 except socket.error:
995 pass
996 else:
997 self.fail("Error trying to do non-blocking recv.")
998 read, write, err = select.select([conn], [], [])
999 if conn in read:
1000 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001001 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002 else:
1003 self.fail("Error during select call to non-blocking socket.")
1004
1005 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001006 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001007 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001008 self.cli.send(MSG)
1009
Victor Stinner45df8202010-04-28 22:31:17 +00001010@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001011class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001012 """Unit tests for the object returned by socket.makefile()
1013
Antoine Pitrou834bd812010-10-13 16:17:14 +00001014 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001015 the client connection. You can read from this file to
1016 get output from the server.
1017
Antoine Pitrou834bd812010-10-13 16:17:14 +00001018 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001019 server connection. You can write to this file to send output
1020 to the client.
1021 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022
Guido van Rossume9f66142002-08-07 15:46:19 +00001023 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001024 encoding = 'utf8'
1025 errors = 'strict'
1026 newline = None
1027
1028 read_mode = 'rb'
1029 read_msg = MSG
1030 write_mode = 'wb'
1031 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001032
Guido van Rossum24e4af82002-06-12 19:18:08 +00001033 def __init__(self, methodName='runTest'):
1034 SocketConnectedTest.__init__(self, methodName=methodName)
1035
1036 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001037 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1038 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001039 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001040 self.read_file = self.cli_conn.makefile(
1041 self.read_mode, self.bufsize,
1042 encoding = self.encoding,
1043 errors = self.errors,
1044 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001045
1046 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001047 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001048 self.read_file.close()
1049 self.assertTrue(self.read_file.closed)
1050 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051 SocketConnectedTest.tearDown(self)
1052
1053 def clientSetUp(self):
1054 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001055 self.write_file = self.serv_conn.makefile(
1056 self.write_mode, self.bufsize,
1057 encoding = self.encoding,
1058 errors = self.errors,
1059 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001060
1061 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001062 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001063 self.write_file.close()
1064 self.assertTrue(self.write_file.closed)
1065 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001066 SocketConnectedTest.clientTearDown(self)
1067
1068 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001069 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001070 first_seg = self.read_file.read(len(self.read_msg)-3)
1071 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001072 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001073 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074
1075 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001076 self.write_file.write(self.write_msg)
1077 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001078
Guido van Rossum8c943832002-08-08 01:00:28 +00001079 def testFullRead(self):
1080 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001081 msg = self.read_file.read()
1082 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001083
1084 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001085 self.write_file.write(self.write_msg)
1086 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001087
Guido van Rossum24e4af82002-06-12 19:18:08 +00001088 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001089 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001090 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001092 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001093 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001094 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001095 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001096 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001097
1098 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001099 self.write_file.write(self.write_msg)
1100 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001101
1102 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001103 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001104 line = self.read_file.readline()
1105 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001106
1107 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001108 self.write_file.write(self.write_msg)
1109 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001110
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001111 def testCloseAfterMakefile(self):
1112 # The file returned by makefile should keep the socket open.
1113 self.cli_conn.close()
1114 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001115 msg = self.read_file.read()
1116 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001117
1118 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001119 self.write_file.write(self.write_msg)
1120 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001121
1122 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001123 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001124 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001125 if isinstance(self.read_msg, str):
1126 msg = msg.decode()
1127 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001128
1129 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001130 self.write_file.write(self.write_msg)
1131 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001132
Tim Peters116d83c2004-03-28 02:20:45 +00001133 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001134 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001135
1136 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001137 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001138
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001139 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001140 self.assertEqual(self.read_file.mode, self.read_mode)
1141 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001142
1143 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001144 self.assertEqual(self.write_file.mode, self.write_mode)
1145 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001146
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001147 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001148 self.read_file.close()
1149 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001150 self.cli_conn.close()
1151 self.assertRaises(socket.error, self.cli_conn.getsockname)
1152
1153 def _testRealClose(self):
1154 pass
1155
1156
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001157class FileObjectInterruptedTestCase(unittest.TestCase):
1158 """Test that the file object correctly handles EINTR internally."""
1159
1160 class MockSocket(object):
1161 def __init__(self, recv_funcs=()):
1162 # A generator that returns callables that we'll call for each
1163 # call to recv().
1164 self._recv_step = iter(recv_funcs)
1165
1166 def recv_into(self, buffer):
1167 data = next(self._recv_step)()
1168 assert len(buffer) >= len(data)
1169 buffer[:len(data)] = data
1170 return len(data)
1171
1172 def _decref_socketios(self):
1173 pass
1174
1175 def _textiowrap_for_test(self, buffering=-1):
1176 raw = socket.SocketIO(self, "r")
1177 if buffering < 0:
1178 buffering = io.DEFAULT_BUFFER_SIZE
1179 if buffering == 0:
1180 return raw
1181 buffer = io.BufferedReader(raw, buffering)
1182 text = io.TextIOWrapper(buffer, None, None)
1183 text.mode = "rb"
1184 return text
1185
1186 @staticmethod
1187 def _raise_eintr():
1188 raise socket.error(errno.EINTR)
1189
1190 def _textiowrap_mock_socket(self, mock, buffering=-1):
1191 raw = socket.SocketIO(mock, "r")
1192 if buffering < 0:
1193 buffering = io.DEFAULT_BUFFER_SIZE
1194 if buffering == 0:
1195 return raw
1196 buffer = io.BufferedReader(raw, buffering)
1197 text = io.TextIOWrapper(buffer, None, None)
1198 text.mode = "rb"
1199 return text
1200
1201 def _test_readline(self, size=-1, buffering=-1):
1202 mock_sock = self.MockSocket(recv_funcs=[
1203 lambda : b"This is the first line\nAnd the sec",
1204 self._raise_eintr,
1205 lambda : b"ond line is here\n",
1206 lambda : b"",
1207 lambda : b"", # XXX(gps): io library does an extra EOF read
1208 ])
1209 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1210 self.assertEquals(fo.readline(size), "This is the first line\n")
1211 self.assertEquals(fo.readline(size), "And the second line is here\n")
1212
1213 def _test_read(self, size=-1, buffering=-1):
1214 mock_sock = self.MockSocket(recv_funcs=[
1215 lambda : b"This is the first line\nAnd the sec",
1216 self._raise_eintr,
1217 lambda : b"ond line is here\n",
1218 lambda : b"",
1219 lambda : b"", # XXX(gps): io library does an extra EOF read
1220 ])
1221 expecting = (b"This is the first line\n"
1222 b"And the second line is here\n")
1223 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1224 if buffering == 0:
1225 data = b''
1226 else:
1227 data = ''
1228 expecting = expecting.decode('utf8')
1229 while len(data) != len(expecting):
1230 part = fo.read(size)
1231 if not part:
1232 break
1233 data += part
1234 self.assertEquals(data, expecting)
1235
1236 def test_default(self):
1237 self._test_readline()
1238 self._test_readline(size=100)
1239 self._test_read()
1240 self._test_read(size=100)
1241
1242 def test_with_1k_buffer(self):
1243 self._test_readline(buffering=1024)
1244 self._test_readline(size=100, buffering=1024)
1245 self._test_read(buffering=1024)
1246 self._test_read(size=100, buffering=1024)
1247
1248 def _test_readline_no_buffer(self, size=-1):
1249 mock_sock = self.MockSocket(recv_funcs=[
1250 lambda : b"a",
1251 lambda : b"\n",
1252 lambda : b"B",
1253 self._raise_eintr,
1254 lambda : b"b",
1255 lambda : b"",
1256 ])
1257 fo = mock_sock._textiowrap_for_test(buffering=0)
1258 self.assertEquals(fo.readline(size), b"a\n")
1259 self.assertEquals(fo.readline(size), b"Bb")
1260
1261 def test_no_buffer(self):
1262 self._test_readline_no_buffer()
1263 self._test_readline_no_buffer(size=4)
1264 self._test_read(buffering=0)
1265 self._test_read(size=100, buffering=0)
1266
1267
Guido van Rossume9f66142002-08-07 15:46:19 +00001268class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1269
1270 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001271
Guido van Rossume9f66142002-08-07 15:46:19 +00001272 In this case (and in this case only), it should be possible to
1273 create a file object, read a line from it, create another file
1274 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001275 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001276 when reading multiple requests from the same socket."""
1277
1278 bufsize = 0 # Use unbuffered mode
1279
1280 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001281 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001282 line = self.read_file.readline() # first line
1283 self.assertEqual(line, b"A. " + self.write_msg) # first line
1284 self.read_file = self.cli_conn.makefile('rb', 0)
1285 line = self.read_file.readline() # second line
1286 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001287
1288 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001289 self.write_file.write(b"A. " + self.write_msg)
1290 self.write_file.write(b"B. " + self.write_msg)
1291 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001292
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001293 def testMakefileClose(self):
1294 # The file returned by makefile should keep the socket open...
1295 self.cli_conn.close()
1296 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001297 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001298 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001299 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001300 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1301
1302 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001303 self.write_file.write(self.write_msg)
1304 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001305
1306 def testMakefileCloseSocketDestroy(self):
1307 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001308 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001309 refcount_after = sys.getrefcount(self.cli_conn)
1310 self.assertEqual(refcount_before - 1, refcount_after)
1311
1312 def _testMakefileCloseSocketDestroy(self):
1313 pass
1314
Antoine Pitrou98b46702010-09-18 22:59:00 +00001315 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001316 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001317 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1318
1319 def testSmallReadNonBlocking(self):
1320 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001321 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1322 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001323 self.evt1.set()
1324 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001325 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001326 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001327 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001328 self.assertEqual(n, 3)
1329 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001330 self.assertEqual(msg, self.read_msg)
1331 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1332 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001333
1334 def _testSmallReadNonBlocking(self):
1335 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001336 self.write_file.write(self.write_msg)
1337 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001338 self.evt2.set()
1339 # Avoid cloding the socket before the server test has finished,
1340 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1341 self.serv_finished.wait(5.0)
1342
1343 def testWriteNonBlocking(self):
1344 self.cli_finished.wait(5.0)
1345 # The client thread can't skip directly - the SkipTest exception
1346 # would appear as a failure.
1347 if self.serv_skipped:
1348 self.skipTest(self.serv_skipped)
1349
1350 def _testWriteNonBlocking(self):
1351 self.serv_skipped = None
1352 self.serv_conn.setblocking(False)
1353 # Try to saturate the socket buffer pipe with repeated large writes.
1354 BIG = b"x" * (1024 ** 2)
1355 LIMIT = 10
1356 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001357 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001358 self.assertGreater(n, 0)
1359 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001360 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001361 if n is None:
1362 # Succeeded
1363 break
1364 self.assertGreater(n, 0)
1365 else:
1366 # Let us know that this test didn't manage to establish
1367 # the expected conditions. This is not a failure in itself but,
1368 # if it happens repeatedly, the test should be fixed.
1369 self.serv_skipped = "failed to saturate the socket buffer"
1370
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001371
Guido van Rossum8c943832002-08-08 01:00:28 +00001372class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1373
1374 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1375
1376
1377class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1378
1379 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001380
Thomas Woutersb2137042007-02-01 18:02:27 +00001381
Antoine Pitrou834bd812010-10-13 16:17:14 +00001382class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1383 """Tests for socket.makefile() in text mode (rather than binary)"""
1384
1385 read_mode = 'r'
1386 read_msg = MSG.decode('utf8')
1387 write_mode = 'wb'
1388 write_msg = MSG
1389 newline = ''
1390
1391
1392class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1393 """Tests for socket.makefile() in text mode (rather than binary)"""
1394
1395 read_mode = 'rb'
1396 read_msg = MSG
1397 write_mode = 'w'
1398 write_msg = MSG.decode('utf8')
1399 newline = ''
1400
1401
1402class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1403 """Tests for socket.makefile() in text mode (rather than binary)"""
1404
1405 read_mode = 'r'
1406 read_msg = MSG.decode('utf8')
1407 write_mode = 'w'
1408 write_msg = MSG.decode('utf8')
1409 newline = ''
1410
1411
Guido van Rossumd8faa362007-04-27 19:54:29 +00001412class NetworkConnectionTest(object):
1413 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001414
Guido van Rossumd8faa362007-04-27 19:54:29 +00001415 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001416 # We're inherited below by BasicTCPTest2, which also inherits
1417 # BasicTCPTest, which defines self.port referenced below.
1418 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001419 self.serv_conn = self.cli
1420
1421class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1422 """Tests that NetworkConnection does not break existing TCP functionality.
1423 """
1424
1425class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001426
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001427 class MockSocket(socket.socket):
1428 def connect(self, *args):
1429 raise socket.timeout('timed out')
1430
1431 @contextlib.contextmanager
1432 def mocked_socket_module(self):
1433 """Return a socket which times out on connect"""
1434 old_socket = socket.socket
1435 socket.socket = self.MockSocket
1436 try:
1437 yield
1438 finally:
1439 socket.socket = old_socket
1440
1441 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001442 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001443 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1444 with self.assertRaises(socket.error) as cm:
1445 cli.connect((HOST, port))
1446 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1447
1448 def test_create_connection(self):
1449 # Issue #9792: errors raised by create_connection() should have
1450 # a proper errno attribute.
1451 port = support.find_unused_port()
1452 with self.assertRaises(socket.error) as cm:
1453 socket.create_connection((HOST, port))
1454 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1455
1456 def test_create_connection_timeout(self):
1457 # Issue #9792: create_connection() should not recast timeout errors
1458 # as generic socket errors.
1459 with self.mocked_socket_module():
1460 with self.assertRaises(socket.timeout):
1461 socket.create_connection((HOST, 1234))
1462
Guido van Rossumd8faa362007-04-27 19:54:29 +00001463
Victor Stinner45df8202010-04-28 22:31:17 +00001464@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001465class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1466
1467 def __init__(self, methodName='runTest'):
1468 SocketTCPTest.__init__(self, methodName=methodName)
1469 ThreadableTest.__init__(self)
1470
1471 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001472 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001473
1474 def clientTearDown(self):
1475 self.cli.close()
1476 self.cli = None
1477 ThreadableTest.clientTearDown(self)
1478
1479 def _justAccept(self):
1480 conn, addr = self.serv.accept()
1481
1482 testFamily = _justAccept
1483 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001484 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001485 self.assertEqual(self.cli.family, 2)
1486
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001487 testSourceAddress = _justAccept
1488 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001489 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1490 source_address=('', self.source_port))
1491 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001492 # The port number being used is sufficient to show that the bind()
1493 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001494
Guido van Rossumd8faa362007-04-27 19:54:29 +00001495 testTimeoutDefault = _justAccept
1496 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001497 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001498 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001499 socket.setdefaulttimeout(42)
1500 try:
1501 self.cli = socket.create_connection((HOST, self.port))
1502 finally:
1503 socket.setdefaulttimeout(None)
1504 self.assertEquals(self.cli.gettimeout(), 42)
1505
1506 testTimeoutNone = _justAccept
1507 def _testTimeoutNone(self):
1508 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001509 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001510 socket.setdefaulttimeout(30)
1511 try:
1512 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1513 finally:
1514 socket.setdefaulttimeout(None)
1515 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001516
1517 testTimeoutValueNamed = _justAccept
1518 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001519 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001520 self.assertEqual(self.cli.gettimeout(), 30)
1521
1522 testTimeoutValueNonamed = _justAccept
1523 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001524 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001525 self.assertEqual(self.cli.gettimeout(), 30)
1526
Victor Stinner45df8202010-04-28 22:31:17 +00001527@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001528class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1529
1530 def __init__(self, methodName='runTest'):
1531 SocketTCPTest.__init__(self, methodName=methodName)
1532 ThreadableTest.__init__(self)
1533
1534 def clientSetUp(self):
1535 pass
1536
1537 def clientTearDown(self):
1538 self.cli.close()
1539 self.cli = None
1540 ThreadableTest.clientTearDown(self)
1541
1542 def testInsideTimeout(self):
1543 conn, addr = self.serv.accept()
1544 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001545 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001546 testOutsideTimeout = testInsideTimeout
1547
1548 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001549 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001550 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001551 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552
1553 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001554 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001555 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556
1557
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001558class TCPTimeoutTest(SocketTCPTest):
1559
1560 def testTCPTimeout(self):
1561 def raise_timeout(*args, **kwargs):
1562 self.serv.settimeout(1.0)
1563 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001564 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001565 "Error generating a timeout exception (TCP)")
1566
1567 def testTimeoutZero(self):
1568 ok = False
1569 try:
1570 self.serv.settimeout(0.0)
1571 foo = self.serv.accept()
1572 except socket.timeout:
1573 self.fail("caught timeout instead of error (TCP)")
1574 except socket.error:
1575 ok = True
1576 except:
1577 self.fail("caught unexpected exception (TCP)")
1578 if not ok:
1579 self.fail("accept() returned success when we did not expect it")
1580
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001581 def testInterruptedTimeout(self):
1582 # XXX I don't know how to do this test on MSWindows or any other
1583 # plaform that doesn't support signal.alarm() or os.kill(), though
1584 # the bug should have existed on all platforms.
1585 if not hasattr(signal, "alarm"):
1586 return # can only test on *nix
1587 self.serv.settimeout(5.0) # must be longer than alarm
1588 class Alarm(Exception):
1589 pass
1590 def alarm_handler(signal, frame):
1591 raise Alarm
1592 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1593 try:
1594 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1595 try:
1596 foo = self.serv.accept()
1597 except socket.timeout:
1598 self.fail("caught timeout instead of Alarm")
1599 except Alarm:
1600 pass
1601 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001602 self.fail("caught other exception instead of Alarm:"
1603 " %s(%s):\n%s" %
1604 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001605 else:
1606 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001607 finally:
1608 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001609 except Alarm:
1610 self.fail("got Alarm in wrong place")
1611 finally:
1612 # no alarm can be pending. Safe to restore old handler.
1613 signal.signal(signal.SIGALRM, old_alarm)
1614
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001615class UDPTimeoutTest(SocketTCPTest):
1616
1617 def testUDPTimeout(self):
1618 def raise_timeout(*args, **kwargs):
1619 self.serv.settimeout(1.0)
1620 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001621 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001622 "Error generating a timeout exception (UDP)")
1623
1624 def testTimeoutZero(self):
1625 ok = False
1626 try:
1627 self.serv.settimeout(0.0)
1628 foo = self.serv.recv(1024)
1629 except socket.timeout:
1630 self.fail("caught timeout instead of error (UDP)")
1631 except socket.error:
1632 ok = True
1633 except:
1634 self.fail("caught unexpected exception (UDP)")
1635 if not ok:
1636 self.fail("recv() returned success when we did not expect it")
1637
1638class TestExceptions(unittest.TestCase):
1639
1640 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001641 self.assertTrue(issubclass(socket.error, Exception))
1642 self.assertTrue(issubclass(socket.herror, socket.error))
1643 self.assertTrue(issubclass(socket.gaierror, socket.error))
1644 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001645
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001646class TestLinuxAbstractNamespace(unittest.TestCase):
1647
1648 UNIX_PATH_MAX = 108
1649
1650 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001651 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001652 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1653 s1.bind(address)
1654 s1.listen(1)
1655 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1656 s2.connect(s1.getsockname())
1657 s1.accept()
1658 self.assertEqual(s1.getsockname(), address)
1659 self.assertEqual(s2.getpeername(), address)
1660
1661 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001662 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001663 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1664 s.bind(address)
1665 self.assertEqual(s.getsockname(), address)
1666
1667 def testNameOverflow(self):
1668 address = "\x00" + "h" * self.UNIX_PATH_MAX
1669 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1670 self.assertRaises(socket.error, s.bind, address)
1671
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001672
Victor Stinner45df8202010-04-28 22:31:17 +00001673@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001674class BufferIOTest(SocketConnectedTest):
1675 """
1676 Test the buffer versions of socket.recv() and socket.send().
1677 """
1678 def __init__(self, methodName='runTest'):
1679 SocketConnectedTest.__init__(self, methodName=methodName)
1680
Antoine Pitrou25480782010-03-17 22:50:28 +00001681 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001682 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001683 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001684 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001685 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001686 self.assertEqual(msg, MSG)
1687
Antoine Pitrou25480782010-03-17 22:50:28 +00001688 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001689 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001690 self.serv_conn.send(buf)
1691
Antoine Pitrou25480782010-03-17 22:50:28 +00001692 def testRecvIntoBytearray(self):
1693 buf = bytearray(1024)
1694 nbytes = self.cli_conn.recv_into(buf)
1695 self.assertEqual(nbytes, len(MSG))
1696 msg = buf[:len(MSG)]
1697 self.assertEqual(msg, MSG)
1698
1699 _testRecvIntoBytearray = _testRecvIntoArray
1700
1701 def testRecvIntoMemoryview(self):
1702 buf = bytearray(1024)
1703 nbytes = self.cli_conn.recv_into(memoryview(buf))
1704 self.assertEqual(nbytes, len(MSG))
1705 msg = buf[:len(MSG)]
1706 self.assertEqual(msg, MSG)
1707
1708 _testRecvIntoMemoryview = _testRecvIntoArray
1709
1710 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001711 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001712 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001713 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001714 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001715 self.assertEqual(msg, MSG)
1716
Antoine Pitrou25480782010-03-17 22:50:28 +00001717 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001718 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001719 self.serv_conn.send(buf)
1720
Antoine Pitrou25480782010-03-17 22:50:28 +00001721 def testRecvFromIntoBytearray(self):
1722 buf = bytearray(1024)
1723 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1724 self.assertEqual(nbytes, len(MSG))
1725 msg = buf[:len(MSG)]
1726 self.assertEqual(msg, MSG)
1727
1728 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1729
1730 def testRecvFromIntoMemoryview(self):
1731 buf = bytearray(1024)
1732 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1733 self.assertEqual(nbytes, len(MSG))
1734 msg = buf[:len(MSG)]
1735 self.assertEqual(msg, MSG)
1736
1737 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1738
Christian Heimes043d6f62008-01-07 17:19:16 +00001739
1740TIPC_STYPE = 2000
1741TIPC_LOWER = 200
1742TIPC_UPPER = 210
1743
1744def isTipcAvailable():
1745 """Check if the TIPC module is loaded
1746
1747 The TIPC module is not loaded automatically on Ubuntu and probably
1748 other Linux distros.
1749 """
1750 if not hasattr(socket, "AF_TIPC"):
1751 return False
1752 if not os.path.isfile("/proc/modules"):
1753 return False
1754 with open("/proc/modules") as f:
1755 for line in f:
1756 if line.startswith("tipc "):
1757 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001758 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001759 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1760 return False
1761
1762class TIPCTest (unittest.TestCase):
1763 def testRDM(self):
1764 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1765 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1766
1767 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1768 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1769 TIPC_LOWER, TIPC_UPPER)
1770 srv.bind(srvaddr)
1771
1772 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1773 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1774 cli.sendto(MSG, sendaddr)
1775
1776 msg, recvaddr = srv.recvfrom(1024)
1777
1778 self.assertEqual(cli.getsockname(), recvaddr)
1779 self.assertEqual(msg, MSG)
1780
1781
1782class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1783 def __init__(self, methodName = 'runTest'):
1784 unittest.TestCase.__init__(self, methodName = methodName)
1785 ThreadableTest.__init__(self)
1786
1787 def setUp(self):
1788 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1789 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1790 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1791 TIPC_LOWER, TIPC_UPPER)
1792 self.srv.bind(srvaddr)
1793 self.srv.listen(5)
1794 self.serverExplicitReady()
1795 self.conn, self.connaddr = self.srv.accept()
1796
1797 def clientSetUp(self):
1798 # The is a hittable race between serverExplicitReady() and the
1799 # accept() call; sleep a little while to avoid it, otherwise
1800 # we could get an exception
1801 time.sleep(0.1)
1802 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1803 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1804 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1805 self.cli.connect(addr)
1806 self.cliaddr = self.cli.getsockname()
1807
1808 def testStream(self):
1809 msg = self.conn.recv(1024)
1810 self.assertEqual(msg, MSG)
1811 self.assertEqual(self.cliaddr, self.connaddr)
1812
1813 def _testStream(self):
1814 self.cli.send(MSG)
1815 self.cli.close()
1816
1817
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001818@unittest.skipUnless(thread, 'Threading required for this test.')
1819class ContextManagersTest(ThreadedTCPSocketTest):
1820
1821 def _testSocketClass(self):
1822 # base test
1823 with socket.socket() as sock:
1824 self.assertFalse(sock._closed)
1825 self.assertTrue(sock._closed)
1826 # close inside with block
1827 with socket.socket() as sock:
1828 sock.close()
1829 self.assertTrue(sock._closed)
1830 # exception inside with block
1831 with socket.socket() as sock:
1832 self.assertRaises(socket.error, sock.sendall, b'foo')
1833 self.assertTrue(sock._closed)
1834
1835 def testCreateConnectionBase(self):
1836 conn, addr = self.serv.accept()
1837 data = conn.recv(1024)
1838 conn.sendall(data)
1839
1840 def _testCreateConnectionBase(self):
1841 address = self.serv.getsockname()
1842 with socket.create_connection(address) as sock:
1843 self.assertFalse(sock._closed)
1844 sock.sendall(b'foo')
1845 self.assertEqual(sock.recv(1024), b'foo')
1846 self.assertTrue(sock._closed)
1847
1848 def testCreateConnectionClose(self):
1849 conn, addr = self.serv.accept()
1850 data = conn.recv(1024)
1851 conn.sendall(data)
1852
1853 def _testCreateConnectionClose(self):
1854 address = self.serv.getsockname()
1855 with socket.create_connection(address) as sock:
1856 sock.close()
1857 self.assertTrue(sock._closed)
1858 self.assertRaises(socket.error, sock.sendall, b'foo')
1859
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001860
Antoine Pitroub1c54962010-10-14 15:05:38 +00001861@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1862 "SOCK_CLOEXEC not defined")
1863@unittest.skipUnless(fcntl, "module fcntl not available")
1864class CloexecConstantTest(unittest.TestCase):
1865 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001866 v = linux_version()
1867 if v < (2, 6, 28):
1868 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1869 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001870 s = socket.socket(socket.AF_INET,
1871 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1872 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1873 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1874
1875
1876@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1877 "SOCK_NONBLOCK not defined")
1878class NonblockConstantTest(unittest.TestCase):
1879 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1880 if nonblock:
1881 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1882 self.assertEqual(s.gettimeout(), timeout)
1883 else:
1884 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1885 self.assertEqual(s.gettimeout(), None)
1886
1887 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001888 v = linux_version()
1889 if v < (2, 6, 28):
1890 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1891 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001892 # a lot of it seems silly and redundant, but I wanted to test that
1893 # changing back and forth worked ok
1894 s = socket.socket(socket.AF_INET,
1895 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1896 self.checkNonblock(s)
1897 s.setblocking(1)
1898 self.checkNonblock(s, False)
1899 s.setblocking(0)
1900 self.checkNonblock(s)
1901 s.settimeout(None)
1902 self.checkNonblock(s, False)
1903 s.settimeout(2.0)
1904 self.checkNonblock(s, timeout=2.0)
1905 s.setblocking(1)
1906 self.checkNonblock(s, False)
1907 # defaulttimeout
1908 t = socket.getdefaulttimeout()
1909 socket.setdefaulttimeout(0.0)
1910 self.checkNonblock(socket.socket())
1911 socket.setdefaulttimeout(None)
1912 self.checkNonblock(socket.socket(), False)
1913 socket.setdefaulttimeout(2.0)
1914 self.checkNonblock(socket.socket(), timeout=2.0)
1915 socket.setdefaulttimeout(None)
1916 self.checkNonblock(socket.socket(), False)
1917 socket.setdefaulttimeout(t)
1918
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001919
Guido van Rossumb995eb72002-07-31 16:08:40 +00001920def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001921 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001922 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001923
1924 tests.extend([
1925 NonBlockingTCPTests,
1926 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001927 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001928 UnbufferedFileObjectClassTestCase,
1929 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001930 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001931 UnicodeReadFileObjectClassTestCase,
1932 UnicodeWriteFileObjectClassTestCase,
1933 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001934 NetworkConnectionNoServer,
1935 NetworkConnectionAttributesTest,
1936 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001937 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001938 CloexecConstantTest,
1939 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001940 ])
Dave Cole331708b2004-08-09 04:51:41 +00001941 if hasattr(socket, "socketpair"):
1942 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001943 if sys.platform == 'linux2':
1944 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001945 if isTipcAvailable():
1946 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001947 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001948
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001949 thread_info = support.threading_setup()
1950 support.run_unittest(*tests)
1951 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001952
1953if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001954 test_main()