blob: 1f8f93f8e4ab620bc12ec6023a80f74039284cbd [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +000038HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000039MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000040SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000041
Victor Stinner45df8202010-04-28 22:31:17 +000042try:
43 import _thread as thread
44 import threading
45except ImportError:
46 thread = None
47 threading = None
48
Guido van Rossum24e4af82002-06-12 19:18:08 +000049class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000050
Guido van Rossum24e4af82002-06-12 19:18:08 +000051 def setUp(self):
52 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000053 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000054 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000055
Guido van Rossum24e4af82002-06-12 19:18:08 +000056 def tearDown(self):
57 self.serv.close()
58 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000059
Guido van Rossum24e4af82002-06-12 19:18:08 +000060class SocketUDPTest(unittest.TestCase):
61
62 def setUp(self):
63 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000064 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000065
66 def tearDown(self):
67 self.serv.close()
68 self.serv = None
69
70class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000071 """Threadable Test class
72
73 The ThreadableTest class makes it easy to create a threaded
74 client/server pair from an existing unit test. To create a
75 new threaded class from an existing unit test, use multiple
76 inheritance:
77
78 class NewClass (OldClass, ThreadableTest):
79 pass
80
81 This class defines two new fixture functions with obvious
82 purposes for overriding:
83
84 clientSetUp ()
85 clientTearDown ()
86
87 Any new test functions within the class must then define
88 tests in pairs, where the test name is preceeded with a
89 '_' to indicate the client portion of the test. Ex:
90
91 def testFoo(self):
92 # Server portion
93
94 def _testFoo(self):
95 # Client portion
96
97 Any exceptions raised by the clients during their tests
98 are caught and transferred to the main thread to alert
99 the testing framework.
100
101 Note, the server setup function cannot call any blocking
102 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000103 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000104 the blocking call (such as in setting up a client/server
105 connection and performing the accept() in setUp().
106 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000107
108 def __init__(self):
109 # Swap the true setup function
110 self.__setUp = self.setUp
111 self.__tearDown = self.tearDown
112 self.setUp = self._setUp
113 self.tearDown = self._tearDown
114
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000115 def serverExplicitReady(self):
116 """This method allows the server to explicitly indicate that
117 it wants the client thread to proceed. This is useful if the
118 server is about to execute a blocking routine that is
119 dependent upon the client thread during its setup routine."""
120 self.server_ready.set()
121
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 self.server_ready = threading.Event()
124 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000126 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000127
128 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000129 methodname = self.id()
130 i = methodname.rfind('.')
131 methodname = methodname[i+1:]
132 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000133 self.client_thread = thread.start_new_thread(
134 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000137 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000138 self.server_ready.set()
139 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140
141 def _tearDown(self):
142 self.__tearDown()
143 self.done.wait()
144
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000145 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000146 exc = self.queue.get()
147 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148
149 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000150 self.server_ready.wait()
151 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000153 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000154 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000155 try:
156 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000157 except BaseException as e:
158 self.queue.put(e)
159 finally:
160 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000161
162 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +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
192class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000193 """Socket tests for client-server connection.
194
195 self.cli_conn is a client socket connected to the server. The
196 setUp() method guarantees that it is connected to the server.
197 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000198
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)
Christian Heimes5e696852008-04-09 08:37:03 +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
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000252 def test_repr(self):
253 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000254 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000255
Raymond Hettinger027bb632004-05-31 03:09:25 +0000256 def test_weakref(self):
257 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
258 p = proxy(s)
259 self.assertEqual(p.fileno(), s.fileno())
260 s.close()
261 s = None
262 try:
263 p.fileno()
264 except ReferenceError:
265 pass
266 else:
267 self.fail('Socket proxy still exists')
268
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000270 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 def raise_error(*args, **kwargs):
272 raise socket.error
273 def raise_herror(*args, **kwargs):
274 raise socket.herror
275 def raise_gaierror(*args, **kwargs):
276 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000277 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000279 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000281 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282 "Error raising socket exception.")
283
284 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000285 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000286 socket.AF_INET
287 socket.SOCK_STREAM
288 socket.SOCK_DGRAM
289 socket.SOCK_RAW
290 socket.SOCK_RDM
291 socket.SOCK_SEQPACKET
292 socket.SOL_SOCKET
293 socket.SO_REUSEADDR
294
Guido van Rossum654c11e2002-06-13 20:24:17 +0000295 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000296 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000297 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000298 try:
299 ip = socket.gethostbyname(hostname)
300 except socket.error:
301 # Probably name lookup wasn't set up right; skip this test
302 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000303 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000304 try:
305 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
306 except socket.error:
307 # Probably a similar problem as above; skip this test
308 return
Brett Cannon01668a12005-03-11 00:04:17 +0000309 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000310 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000311 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000312 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000313
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000314 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000315 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000316 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317 try:
318 # On some versions, this loses a reference
319 orig = sys.getrefcount(__name__)
320 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000321 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000322 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000323 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000326 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000327 try:
328 # On some versions, this crashes the interpreter.
329 socket.getnameinfo(('x', 0, 0, 0), 0)
330 except socket.error:
331 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000332
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000333 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000334 # This just checks that htons etc. are their own inverse,
335 # when looking at the lower 16 or 32 bits.
336 sizes = {socket.htonl: 32, socket.ntohl: 32,
337 socket.htons: 16, socket.ntohs: 16}
338 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000339 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000340 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
341 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000342
Guido van Rossuma2627af2002-09-14 00:58:46 +0000343 swapped = func(mask)
344 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000345 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000346
Guido van Rossum018919a2007-01-15 00:07:32 +0000347 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000348 good_values = [ 1, 2, 3, 1, 2, 3 ]
349 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000350 for k in good_values:
351 socket.ntohl(k)
352 socket.ntohs(k)
353 socket.htonl(k)
354 socket.htons(k)
355 for k in bad_values:
356 self.assertRaises(OverflowError, socket.ntohl, k)
357 self.assertRaises(OverflowError, socket.ntohs, k)
358 self.assertRaises(OverflowError, socket.htonl, k)
359 self.assertRaises(OverflowError, socket.htons, k)
360
Barry Warsaw11b91a02004-06-28 00:50:43 +0000361 def testGetServBy(self):
362 eq = self.assertEqual
363 # Find one service that exists, then check all the related interfaces.
364 # I've ordered this by protocols that have both a tcp and udp
365 # protocol, at least for modern Linuxes.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000366 if (sys.platform.startswith('linux') or
367 sys.platform.startswith('freebsd') or
368 sys.platform.startswith('netbsd') or
369 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000370 # avoid the 'echo' service on this platform, as there is an
371 # assumption breaking non-standard port/protocol entry
372 services = ('daytime', 'qotd', 'domain')
373 else:
374 services = ('echo', 'daytime', 'domain')
375 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000376 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000377 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000378 break
379 except socket.error:
380 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000381 else:
382 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000383 # Try same call with optional protocol omitted
384 port2 = socket.getservbyname(service)
385 eq(port, port2)
386 # Try udp, but don't barf it it doesn't exist
387 try:
388 udpport = socket.getservbyname(service, 'udp')
389 except socket.error:
390 udpport = None
391 else:
392 eq(udpport, port)
393 # Now make sure the lookup by port returns the same service name
394 eq(socket.getservbyport(port2), service)
395 eq(socket.getservbyport(port, 'tcp'), service)
396 if udpport is not None:
397 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000398 # Make sure getservbyport does not accept out of range ports.
399 self.assertRaises(OverflowError, socket.getservbyport, -1)
400 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000401
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000402 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000403 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000404 # The default timeout should initially be None
405 self.assertEqual(socket.getdefaulttimeout(), None)
406 s = socket.socket()
407 self.assertEqual(s.gettimeout(), None)
408 s.close()
409
410 # Set the default timeout to 10, and see if it propagates
411 socket.setdefaulttimeout(10)
412 self.assertEqual(socket.getdefaulttimeout(), 10)
413 s = socket.socket()
414 self.assertEqual(s.gettimeout(), 10)
415 s.close()
416
417 # Reset the default timeout to None, and see if it propagates
418 socket.setdefaulttimeout(None)
419 self.assertEqual(socket.getdefaulttimeout(), None)
420 s = socket.socket()
421 self.assertEqual(s.gettimeout(), None)
422 s.close()
423
424 # Check that setting it to an invalid value raises ValueError
425 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
426
427 # Check that setting it to an invalid type raises TypeError
428 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
429
Benjamin Petersonf91df042009-02-13 02:50:59 +0000430 def testIPv4_inet_aton_fourbytes(self):
431 if not hasattr(socket, 'inet_aton'):
432 return # No inet_aton, nothing to check
433 # Test that issue1008086 and issue767150 are fixed.
434 # It must return 4 bytes.
435 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
436 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
437
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000438 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000439 if not hasattr(socket, 'inet_pton'):
440 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000441 from socket import inet_aton as f, inet_pton, AF_INET
442 g = lambda a: inet_pton(AF_INET, a)
443
Guido van Rossumb5b22702007-05-18 18:55:53 +0000444 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
445 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
446 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
447 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
448 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000449
Guido van Rossumb5b22702007-05-18 18:55:53 +0000450 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
451 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
452 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
453 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000454
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000455 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000456 if not hasattr(socket, 'inet_pton'):
457 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000458 try:
459 from socket import inet_pton, AF_INET6, has_ipv6
460 if not has_ipv6:
461 return
462 except ImportError:
463 return
464 f = lambda a: inet_pton(AF_INET6, a)
465
Guido van Rossum540d9872007-08-17 03:51:09 +0000466 self.assertEquals(b'\x00' * 16, f('::'))
467 self.assertEquals(b'\x00' * 16, f('0::0'))
468 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000470 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 +0000471 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
472 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000473
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000474 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000475 if not hasattr(socket, 'inet_ntop'):
476 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000477 from socket import inet_ntoa as f, inet_ntop, AF_INET
478 g = lambda a: inet_ntop(AF_INET, a)
479
Guido van Rossumb5b22702007-05-18 18:55:53 +0000480 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
481 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
482 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
483 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000484
Guido van Rossumb5b22702007-05-18 18:55:53 +0000485 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
486 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
487 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000488
489 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000490 if not hasattr(socket, 'inet_ntop'):
491 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000492 try:
493 from socket import inet_ntop, AF_INET6, has_ipv6
494 if not has_ipv6:
495 return
496 except ImportError:
497 return
498 f = lambda a: inet_ntop(AF_INET6, a)
499
Guido van Rossum540d9872007-08-17 03:51:09 +0000500 self.assertEquals('::', f(b'\x00' * 16))
501 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000502 self.assertEquals(
503 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000504 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 +0000505 )
506
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000507 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000508
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000509 def _get_unused_port(self, bind_address='0.0.0.0'):
510 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000511
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000512 Args:
513 bind_address: Hostname or IP address to search for a port on.
514
515 Returns: A most likely to be unused port.
516 """
517 tempsock = socket.socket()
518 tempsock.bind((bind_address, 0))
519 host, port = tempsock.getsockname()
520 tempsock.close()
521 return port
522
523 def testSockName(self):
524 # Testing getsockname()
525 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000527 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000529 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
530 # it reasonable to get the host's addr in addition to 0.0.0.0.
531 # At least for eCos. This is required for the S/390 to pass.
532 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000533 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000534 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535
536 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 # We know a socket should start without reuse==0
539 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
540 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000541 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542
543 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000545 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
546 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
547 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000548 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000550 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000551 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000552 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
553 sock.settimeout(1)
554 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000555 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000556
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000557 def testNewAttributes(self):
558 # testing .family, .type and .protocol
559 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
560 self.assertEqual(sock.family, socket.AF_INET)
561 self.assertEqual(sock.type, socket.SOCK_STREAM)
562 self.assertEqual(sock.proto, 0)
563 sock.close()
564
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000565 def test_getsockaddrarg(self):
566 host = '0.0.0.0'
567 port = self._get_unused_port(bind_address=host)
568 big_port = port + 65536
569 neg_port = port - 65536
570 sock = socket.socket()
571 try:
572 self.assertRaises(OverflowError, sock.bind, (host, big_port))
573 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
574 sock.bind((host, port))
575 finally:
576 sock.close()
577
Christian Heimesfaf2f632008-01-06 16:59:19 +0000578 def test_sock_ioctl(self):
579 if os.name != "nt":
580 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000581 self.assertTrue(hasattr(socket.socket, 'ioctl'))
582 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
583 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
584 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000585 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
586 s = socket.socket()
587 self.assertRaises(ValueError, s.ioctl, -1, None)
588 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000589
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000590 def testGetaddrinfo(self):
591 try:
592 socket.getaddrinfo('localhost', 80)
593 except socket.gaierror as err:
594 if err.errno == socket.EAI_SERVICE:
595 # see http://bugs.python.org/issue1282647
596 self.skipTest("buggy libc version")
597 raise
598 # len of every sequence is supposed to be == 5
599 for info in socket.getaddrinfo(HOST, None):
600 self.assertEqual(len(info), 5)
601 # host can be a domain name, a string representation of an
602 # IPv4/v6 address or None
603 socket.getaddrinfo('localhost', 80)
604 socket.getaddrinfo('127.0.0.1', 80)
605 socket.getaddrinfo(None, 80)
606 if SUPPORTS_IPV6:
607 socket.getaddrinfo('::1', 80)
608 # port can be a string service name such as "http", a numeric
609 # port number or None
610 socket.getaddrinfo(HOST, "http")
611 socket.getaddrinfo(HOST, 80)
612 socket.getaddrinfo(HOST, None)
613 # test family and socktype filters
614 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
615 for family, _, _, _, _ in infos:
616 self.assertEqual(family, socket.AF_INET)
617 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
618 for _, socktype, _, _, _ in infos:
619 self.assertEqual(socktype, socket.SOCK_STREAM)
620 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000621 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000622 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
623 # a server willing to support both IPv4 and IPv6 will
624 # usually do this
625 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
626 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000627 # test keyword arguments
628 a = socket.getaddrinfo(HOST, None)
629 b = socket.getaddrinfo(host=HOST, port=None)
630 self.assertEqual(a, b)
631 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
632 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
633 self.assertEqual(a, b)
634 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
635 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
636 self.assertEqual(a, b)
637 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
638 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
639 self.assertEqual(a, b)
640 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
641 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
642 self.assertEqual(a, b)
643 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
644 socket.AI_PASSIVE)
645 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
646 type=socket.SOCK_STREAM, proto=0,
647 flags=socket.AI_PASSIVE)
648 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000649
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000650 def test_getnameinfo(self):
651 # only IP addresses are allowed
652 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
653
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000654 @unittest.skipUnless(support.is_resource_enabled('network'),
655 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000656 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000657 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000658 # these should all be successful
659 socket.gethostbyname('испытание.python.org')
660 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000661 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
662 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
663 # have a reverse entry yet
664 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000665
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000666 def check_sendall_interrupted(self, with_timeout):
667 # socketpair() is not stricly required, but it makes things easier.
668 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
669 self.skipTest("signal.alarm and socket.socketpair required for this test")
670 # Our signal handlers clobber the C errno by calling a math function
671 # with an invalid domain value.
672 def ok_handler(*args):
673 self.assertRaises(ValueError, math.acosh, 0)
674 def raising_handler(*args):
675 self.assertRaises(ValueError, math.acosh, 0)
676 1 // 0
677 c, s = socket.socketpair()
678 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
679 try:
680 if with_timeout:
681 # Just above the one second minimum for signal.alarm
682 c.settimeout(1.5)
683 with self.assertRaises(ZeroDivisionError):
684 signal.alarm(1)
685 c.sendall(b"x" * (1024**2))
686 if with_timeout:
687 signal.signal(signal.SIGALRM, ok_handler)
688 signal.alarm(1)
689 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
690 finally:
691 signal.signal(signal.SIGALRM, old_alarm)
692 c.close()
693 s.close()
694
695 def test_sendall_interrupted(self):
696 self.check_sendall_interrupted(False)
697
698 def test_sendall_interrupted_with_timeout(self):
699 self.check_sendall_interrupted(True)
700
701
Victor Stinner45df8202010-04-28 22:31:17 +0000702@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703class BasicTCPTest(SocketConnectedTest):
704
705 def __init__(self, methodName='runTest'):
706 SocketConnectedTest.__init__(self, methodName=methodName)
707
708 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000709 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000711 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712
713 def _testRecv(self):
714 self.serv_conn.send(MSG)
715
716 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000717 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 seg1 = self.cli_conn.recv(len(MSG) - 3)
719 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000720 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000721 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722
723 def _testOverFlowRecv(self):
724 self.serv_conn.send(MSG)
725
726 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000727 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000729 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730
731 def _testRecvFrom(self):
732 self.serv_conn.send(MSG)
733
734 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000735 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
737 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000738 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000739 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740
741 def _testOverFlowRecvFrom(self):
742 self.serv_conn.send(MSG)
743
744 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000745 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000746 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000747 while 1:
748 read = self.cli_conn.recv(1024)
749 if not read:
750 break
Guido van Rossume531e292002-08-08 20:28:34 +0000751 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000752 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753
754 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000755 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 self.serv_conn.sendall(big_chunk)
757
758 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000759 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760 fd = self.cli_conn.fileno()
761 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000762 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000764 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000765
766 def _testFromFd(self):
767 self.serv_conn.send(MSG)
768
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000769 def testDup(self):
770 # Testing dup()
771 sock = self.cli_conn.dup()
772 msg = sock.recv(1024)
773 self.assertEqual(msg, MSG)
774
775 def _testDup(self):
776 self.serv_conn.send(MSG)
777
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000779 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000781 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000782 # wait for _testShutdown to finish: on OS X, when the server
783 # closes the connection the client also becomes disconnected,
784 # and the client's shutdown call will fail. (Issue #4397.)
785 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786
787 def _testShutdown(self):
788 self.serv_conn.send(MSG)
789 self.serv_conn.shutdown(2)
790
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000791 def testDetach(self):
792 # Testing detach()
793 fileno = self.cli_conn.fileno()
794 f = self.cli_conn.detach()
795 self.assertEqual(f, fileno)
796 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000797 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
798 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000799 # ...but we can create another socket using the (still open)
800 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000801 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
802 msg = sock.recv(1024)
803 self.assertEqual(msg, MSG)
804
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000805 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000806 self.serv_conn.send(MSG)
807
Victor Stinner45df8202010-04-28 22:31:17 +0000808@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809class BasicUDPTest(ThreadedUDPSocketTest):
810
811 def __init__(self, methodName='runTest'):
812 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
813
814 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000815 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000817 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818
819 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000820 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821
Guido van Rossum1c938012002-06-12 21:17:20 +0000822 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000823 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000825 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
Guido van Rossum1c938012002-06-12 21:17:20 +0000827 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000828 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829
Guido van Rossumd8faa362007-04-27 19:54:29 +0000830 def testRecvFromNegative(self):
831 # Negative lengths passed to recvfrom should give ValueError.
832 self.assertRaises(ValueError, self.serv.recvfrom, -1)
833
834 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000835 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000836
Victor Stinner45df8202010-04-28 22:31:17 +0000837@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000838class TCPCloserTest(ThreadedTCPSocketTest):
839
840 def testClose(self):
841 conn, addr = self.serv.accept()
842 conn.close()
843
844 sd = self.cli
845 read, write, err = select.select([sd], [], [], 1.0)
846 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000847 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000848
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000849 # Calling close() many times should be safe.
850 conn.close()
851 conn.close()
852
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000853 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000854 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000855 time.sleep(1.0)
856
Victor Stinner45df8202010-04-28 22:31:17 +0000857@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000858class BasicSocketPairTest(SocketPairTest):
859
860 def __init__(self, methodName='runTest'):
861 SocketPairTest.__init__(self, methodName=methodName)
862
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000863 def _check_defaults(self, sock):
864 self.assertIsInstance(sock, socket.socket)
865 if hasattr(socket, 'AF_UNIX'):
866 self.assertEqual(sock.family, socket.AF_UNIX)
867 else:
868 self.assertEqual(sock.family, socket.AF_INET)
869 self.assertEqual(sock.type, socket.SOCK_STREAM)
870 self.assertEqual(sock.proto, 0)
871
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000872 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000873 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000874
875 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000876 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000877
Dave Cole331708b2004-08-09 04:51:41 +0000878 def testRecv(self):
879 msg = self.serv.recv(1024)
880 self.assertEqual(msg, MSG)
881
882 def _testRecv(self):
883 self.cli.send(MSG)
884
885 def testSend(self):
886 self.serv.send(MSG)
887
888 def _testSend(self):
889 msg = self.cli.recv(1024)
890 self.assertEqual(msg, MSG)
891
Victor Stinner45df8202010-04-28 22:31:17 +0000892@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893class NonBlockingTCPTests(ThreadedTCPSocketTest):
894
895 def __init__(self, methodName='runTest'):
896 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
897
898 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000899 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000900 self.serv.setblocking(0)
901 start = time.time()
902 try:
903 self.serv.accept()
904 except socket.error:
905 pass
906 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000907 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908
909 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000910 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000911
Antoine Pitroub1c54962010-10-14 15:05:38 +0000912 if hasattr(socket, "SOCK_NONBLOCK"):
913 def testInitNonBlocking(self):
914 # reinit server socket
915 self.serv.close()
916 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
917 socket.SOCK_NONBLOCK)
918 self.port = support.bind_port(self.serv)
919 self.serv.listen(1)
920 # actual testing
921 start = time.time()
922 try:
923 self.serv.accept()
924 except socket.error:
925 pass
926 end = time.time()
927 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
928
929 def _testInitNonBlocking(self):
930 pass
931
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000935 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936 conn, addr = self.serv.accept()
937 except socket.error:
938 pass
939 else:
940 self.fail("Error trying to do non-blocking accept.")
941 read, write, err = select.select([self.serv], [], [])
942 if self.serv in read:
943 conn, addr = self.serv.accept()
944 else:
945 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000946
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000948 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000949 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000950
951 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000952 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000953 conn, addr = self.serv.accept()
954
955 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000956 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000957 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000958
959 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000960 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961 conn, addr = self.serv.accept()
962 conn.setblocking(0)
963 try:
964 msg = conn.recv(len(MSG))
965 except socket.error:
966 pass
967 else:
968 self.fail("Error trying to do non-blocking recv.")
969 read, write, err = select.select([conn], [], [])
970 if conn in read:
971 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000972 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000973 else:
974 self.fail("Error during select call to non-blocking socket.")
975
976 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000977 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000978 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979 self.cli.send(MSG)
980
Victor Stinner45df8202010-04-28 22:31:17 +0000981@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000983 """Unit tests for the object returned by socket.makefile()
984
Antoine Pitrou834bd812010-10-13 16:17:14 +0000985 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000986 the client connection. You can read from this file to
987 get output from the server.
988
Antoine Pitrou834bd812010-10-13 16:17:14 +0000989 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000990 server connection. You can write to this file to send output
991 to the client.
992 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993
Guido van Rossume9f66142002-08-07 15:46:19 +0000994 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +0000995 encoding = 'utf8'
996 errors = 'strict'
997 newline = None
998
999 read_mode = 'rb'
1000 read_msg = MSG
1001 write_mode = 'wb'
1002 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001003
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004 def __init__(self, methodName='runTest'):
1005 SocketConnectedTest.__init__(self, methodName=methodName)
1006
1007 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001008 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1009 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001011 self.read_file = self.cli_conn.makefile(
1012 self.read_mode, self.bufsize,
1013 encoding = self.encoding,
1014 errors = self.errors,
1015 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001016
1017 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001018 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001019 self.read_file.close()
1020 self.assertTrue(self.read_file.closed)
1021 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022 SocketConnectedTest.tearDown(self)
1023
1024 def clientSetUp(self):
1025 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001026 self.write_file = self.serv_conn.makefile(
1027 self.write_mode, self.bufsize,
1028 encoding = self.encoding,
1029 errors = self.errors,
1030 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001031
1032 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001033 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001034 self.write_file.close()
1035 self.assertTrue(self.write_file.closed)
1036 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001037 SocketConnectedTest.clientTearDown(self)
1038
1039 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001040 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001041 first_seg = self.read_file.read(len(self.read_msg)-3)
1042 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001043 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001044 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001045
1046 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001047 self.write_file.write(self.write_msg)
1048 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049
Guido van Rossum8c943832002-08-08 01:00:28 +00001050 def testFullRead(self):
1051 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001052 msg = self.read_file.read()
1053 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001054
1055 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001056 self.write_file.write(self.write_msg)
1057 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001058
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001060 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001061 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001063 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001064 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001066 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001067 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001068
1069 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001070 self.write_file.write(self.write_msg)
1071 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001072
1073 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001074 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001075 line = self.read_file.readline()
1076 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077
1078 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001079 self.write_file.write(self.write_msg)
1080 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001081
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001082 def testCloseAfterMakefile(self):
1083 # The file returned by makefile should keep the socket open.
1084 self.cli_conn.close()
1085 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001086 msg = self.read_file.read()
1087 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001088
1089 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001090 self.write_file.write(self.write_msg)
1091 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001092
1093 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001094 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001095 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001096 if isinstance(self.read_msg, str):
1097 msg = msg.decode()
1098 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001099
1100 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001101 self.write_file.write(self.write_msg)
1102 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001103
Tim Peters116d83c2004-03-28 02:20:45 +00001104 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001105 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001106
1107 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001108 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001109
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001110 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001111 self.assertEqual(self.read_file.mode, self.read_mode)
1112 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001113
1114 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001115 self.assertEqual(self.write_file.mode, self.write_mode)
1116 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001117
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001118 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001119 self.read_file.close()
1120 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001121 self.cli_conn.close()
1122 self.assertRaises(socket.error, self.cli_conn.getsockname)
1123
1124 def _testRealClose(self):
1125 pass
1126
1127
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001128class FileObjectInterruptedTestCase(unittest.TestCase):
1129 """Test that the file object correctly handles EINTR internally."""
1130
1131 class MockSocket(object):
1132 def __init__(self, recv_funcs=()):
1133 # A generator that returns callables that we'll call for each
1134 # call to recv().
1135 self._recv_step = iter(recv_funcs)
1136
1137 def recv_into(self, buffer):
1138 data = next(self._recv_step)()
1139 assert len(buffer) >= len(data)
1140 buffer[:len(data)] = data
1141 return len(data)
1142
1143 def _decref_socketios(self):
1144 pass
1145
1146 def _textiowrap_for_test(self, buffering=-1):
1147 raw = socket.SocketIO(self, "r")
1148 if buffering < 0:
1149 buffering = io.DEFAULT_BUFFER_SIZE
1150 if buffering == 0:
1151 return raw
1152 buffer = io.BufferedReader(raw, buffering)
1153 text = io.TextIOWrapper(buffer, None, None)
1154 text.mode = "rb"
1155 return text
1156
1157 @staticmethod
1158 def _raise_eintr():
1159 raise socket.error(errno.EINTR)
1160
1161 def _textiowrap_mock_socket(self, mock, buffering=-1):
1162 raw = socket.SocketIO(mock, "r")
1163 if buffering < 0:
1164 buffering = io.DEFAULT_BUFFER_SIZE
1165 if buffering == 0:
1166 return raw
1167 buffer = io.BufferedReader(raw, buffering)
1168 text = io.TextIOWrapper(buffer, None, None)
1169 text.mode = "rb"
1170 return text
1171
1172 def _test_readline(self, size=-1, buffering=-1):
1173 mock_sock = self.MockSocket(recv_funcs=[
1174 lambda : b"This is the first line\nAnd the sec",
1175 self._raise_eintr,
1176 lambda : b"ond line is here\n",
1177 lambda : b"",
1178 lambda : b"", # XXX(gps): io library does an extra EOF read
1179 ])
1180 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1181 self.assertEquals(fo.readline(size), "This is the first line\n")
1182 self.assertEquals(fo.readline(size), "And the second line is here\n")
1183
1184 def _test_read(self, size=-1, buffering=-1):
1185 mock_sock = self.MockSocket(recv_funcs=[
1186 lambda : b"This is the first line\nAnd the sec",
1187 self._raise_eintr,
1188 lambda : b"ond line is here\n",
1189 lambda : b"",
1190 lambda : b"", # XXX(gps): io library does an extra EOF read
1191 ])
1192 expecting = (b"This is the first line\n"
1193 b"And the second line is here\n")
1194 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1195 if buffering == 0:
1196 data = b''
1197 else:
1198 data = ''
1199 expecting = expecting.decode('utf8')
1200 while len(data) != len(expecting):
1201 part = fo.read(size)
1202 if not part:
1203 break
1204 data += part
1205 self.assertEquals(data, expecting)
1206
1207 def test_default(self):
1208 self._test_readline()
1209 self._test_readline(size=100)
1210 self._test_read()
1211 self._test_read(size=100)
1212
1213 def test_with_1k_buffer(self):
1214 self._test_readline(buffering=1024)
1215 self._test_readline(size=100, buffering=1024)
1216 self._test_read(buffering=1024)
1217 self._test_read(size=100, buffering=1024)
1218
1219 def _test_readline_no_buffer(self, size=-1):
1220 mock_sock = self.MockSocket(recv_funcs=[
1221 lambda : b"a",
1222 lambda : b"\n",
1223 lambda : b"B",
1224 self._raise_eintr,
1225 lambda : b"b",
1226 lambda : b"",
1227 ])
1228 fo = mock_sock._textiowrap_for_test(buffering=0)
1229 self.assertEquals(fo.readline(size), b"a\n")
1230 self.assertEquals(fo.readline(size), b"Bb")
1231
1232 def test_no_buffer(self):
1233 self._test_readline_no_buffer()
1234 self._test_readline_no_buffer(size=4)
1235 self._test_read(buffering=0)
1236 self._test_read(size=100, buffering=0)
1237
1238
Guido van Rossume9f66142002-08-07 15:46:19 +00001239class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1240
1241 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001242
Guido van Rossume9f66142002-08-07 15:46:19 +00001243 In this case (and in this case only), it should be possible to
1244 create a file object, read a line from it, create another file
1245 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001246 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001247 when reading multiple requests from the same socket."""
1248
1249 bufsize = 0 # Use unbuffered mode
1250
1251 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001252 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001253 line = self.read_file.readline() # first line
1254 self.assertEqual(line, b"A. " + self.write_msg) # first line
1255 self.read_file = self.cli_conn.makefile('rb', 0)
1256 line = self.read_file.readline() # second line
1257 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001258
1259 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001260 self.write_file.write(b"A. " + self.write_msg)
1261 self.write_file.write(b"B. " + self.write_msg)
1262 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001263
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001264 def testMakefileClose(self):
1265 # The file returned by makefile should keep the socket open...
1266 self.cli_conn.close()
1267 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001268 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001269 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001270 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001271 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1272
1273 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001274 self.write_file.write(self.write_msg)
1275 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001276
1277 def testMakefileCloseSocketDestroy(self):
1278 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001279 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001280 refcount_after = sys.getrefcount(self.cli_conn)
1281 self.assertEqual(refcount_before - 1, refcount_after)
1282
1283 def _testMakefileCloseSocketDestroy(self):
1284 pass
1285
Antoine Pitrou98b46702010-09-18 22:59:00 +00001286 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001287 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001288 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1289
1290 def testSmallReadNonBlocking(self):
1291 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001292 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1293 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001294 self.evt1.set()
1295 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001296 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001297 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001298 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001299 self.assertEqual(n, 3)
1300 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001301 self.assertEqual(msg, self.read_msg)
1302 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1303 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001304
1305 def _testSmallReadNonBlocking(self):
1306 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001307 self.write_file.write(self.write_msg)
1308 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001309 self.evt2.set()
1310 # Avoid cloding the socket before the server test has finished,
1311 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1312 self.serv_finished.wait(5.0)
1313
1314 def testWriteNonBlocking(self):
1315 self.cli_finished.wait(5.0)
1316 # The client thread can't skip directly - the SkipTest exception
1317 # would appear as a failure.
1318 if self.serv_skipped:
1319 self.skipTest(self.serv_skipped)
1320
1321 def _testWriteNonBlocking(self):
1322 self.serv_skipped = None
1323 self.serv_conn.setblocking(False)
1324 # Try to saturate the socket buffer pipe with repeated large writes.
1325 BIG = b"x" * (1024 ** 2)
1326 LIMIT = 10
1327 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001328 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001329 self.assertGreater(n, 0)
1330 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001331 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001332 if n is None:
1333 # Succeeded
1334 break
1335 self.assertGreater(n, 0)
1336 else:
1337 # Let us know that this test didn't manage to establish
1338 # the expected conditions. This is not a failure in itself but,
1339 # if it happens repeatedly, the test should be fixed.
1340 self.serv_skipped = "failed to saturate the socket buffer"
1341
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001342
Guido van Rossum8c943832002-08-08 01:00:28 +00001343class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1344
1345 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1346
1347
1348class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1349
1350 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001351
Thomas Woutersb2137042007-02-01 18:02:27 +00001352
Antoine Pitrou834bd812010-10-13 16:17:14 +00001353class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1354 """Tests for socket.makefile() in text mode (rather than binary)"""
1355
1356 read_mode = 'r'
1357 read_msg = MSG.decode('utf8')
1358 write_mode = 'wb'
1359 write_msg = MSG
1360 newline = ''
1361
1362
1363class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1364 """Tests for socket.makefile() in text mode (rather than binary)"""
1365
1366 read_mode = 'rb'
1367 read_msg = MSG
1368 write_mode = 'w'
1369 write_msg = MSG.decode('utf8')
1370 newline = ''
1371
1372
1373class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1374 """Tests for socket.makefile() in text mode (rather than binary)"""
1375
1376 read_mode = 'r'
1377 read_msg = MSG.decode('utf8')
1378 write_mode = 'w'
1379 write_msg = MSG.decode('utf8')
1380 newline = ''
1381
1382
Guido van Rossumd8faa362007-04-27 19:54:29 +00001383class NetworkConnectionTest(object):
1384 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001385
Guido van Rossumd8faa362007-04-27 19:54:29 +00001386 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001387 # We're inherited below by BasicTCPTest2, which also inherits
1388 # BasicTCPTest, which defines self.port referenced below.
1389 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001390 self.serv_conn = self.cli
1391
1392class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1393 """Tests that NetworkConnection does not break existing TCP functionality.
1394 """
1395
1396class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001397
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001398 class MockSocket(socket.socket):
1399 def connect(self, *args):
1400 raise socket.timeout('timed out')
1401
1402 @contextlib.contextmanager
1403 def mocked_socket_module(self):
1404 """Return a socket which times out on connect"""
1405 old_socket = socket.socket
1406 socket.socket = self.MockSocket
1407 try:
1408 yield
1409 finally:
1410 socket.socket = old_socket
1411
1412 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001413 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001414 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1415 with self.assertRaises(socket.error) as cm:
1416 cli.connect((HOST, port))
1417 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1418
1419 def test_create_connection(self):
1420 # Issue #9792: errors raised by create_connection() should have
1421 # a proper errno attribute.
1422 port = support.find_unused_port()
1423 with self.assertRaises(socket.error) as cm:
1424 socket.create_connection((HOST, port))
1425 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1426
1427 def test_create_connection_timeout(self):
1428 # Issue #9792: create_connection() should not recast timeout errors
1429 # as generic socket errors.
1430 with self.mocked_socket_module():
1431 with self.assertRaises(socket.timeout):
1432 socket.create_connection((HOST, 1234))
1433
Guido van Rossumd8faa362007-04-27 19:54:29 +00001434
Victor Stinner45df8202010-04-28 22:31:17 +00001435@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001436class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1437
1438 def __init__(self, methodName='runTest'):
1439 SocketTCPTest.__init__(self, methodName=methodName)
1440 ThreadableTest.__init__(self)
1441
1442 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001443 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001444
1445 def clientTearDown(self):
1446 self.cli.close()
1447 self.cli = None
1448 ThreadableTest.clientTearDown(self)
1449
1450 def _justAccept(self):
1451 conn, addr = self.serv.accept()
1452
1453 testFamily = _justAccept
1454 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001455 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001456 self.assertEqual(self.cli.family, 2)
1457
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001458 testSourceAddress = _justAccept
1459 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001460 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1461 source_address=('', self.source_port))
1462 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001463 # The port number being used is sufficient to show that the bind()
1464 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001465
Guido van Rossumd8faa362007-04-27 19:54:29 +00001466 testTimeoutDefault = _justAccept
1467 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001468 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001469 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001470 socket.setdefaulttimeout(42)
1471 try:
1472 self.cli = socket.create_connection((HOST, self.port))
1473 finally:
1474 socket.setdefaulttimeout(None)
1475 self.assertEquals(self.cli.gettimeout(), 42)
1476
1477 testTimeoutNone = _justAccept
1478 def _testTimeoutNone(self):
1479 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001480 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001481 socket.setdefaulttimeout(30)
1482 try:
1483 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1484 finally:
1485 socket.setdefaulttimeout(None)
1486 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001487
1488 testTimeoutValueNamed = _justAccept
1489 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001490 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001491 self.assertEqual(self.cli.gettimeout(), 30)
1492
1493 testTimeoutValueNonamed = _justAccept
1494 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001495 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001496 self.assertEqual(self.cli.gettimeout(), 30)
1497
Victor Stinner45df8202010-04-28 22:31:17 +00001498@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001499class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1500
1501 def __init__(self, methodName='runTest'):
1502 SocketTCPTest.__init__(self, methodName=methodName)
1503 ThreadableTest.__init__(self)
1504
1505 def clientSetUp(self):
1506 pass
1507
1508 def clientTearDown(self):
1509 self.cli.close()
1510 self.cli = None
1511 ThreadableTest.clientTearDown(self)
1512
1513 def testInsideTimeout(self):
1514 conn, addr = self.serv.accept()
1515 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001516 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001517 testOutsideTimeout = testInsideTimeout
1518
1519 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001520 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001521 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001522 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001523
1524 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001525 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001526 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001527
1528
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001529class TCPTimeoutTest(SocketTCPTest):
1530
1531 def testTCPTimeout(self):
1532 def raise_timeout(*args, **kwargs):
1533 self.serv.settimeout(1.0)
1534 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001535 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001536 "Error generating a timeout exception (TCP)")
1537
1538 def testTimeoutZero(self):
1539 ok = False
1540 try:
1541 self.serv.settimeout(0.0)
1542 foo = self.serv.accept()
1543 except socket.timeout:
1544 self.fail("caught timeout instead of error (TCP)")
1545 except socket.error:
1546 ok = True
1547 except:
1548 self.fail("caught unexpected exception (TCP)")
1549 if not ok:
1550 self.fail("accept() returned success when we did not expect it")
1551
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001552 def testInterruptedTimeout(self):
1553 # XXX I don't know how to do this test on MSWindows or any other
1554 # plaform that doesn't support signal.alarm() or os.kill(), though
1555 # the bug should have existed on all platforms.
1556 if not hasattr(signal, "alarm"):
1557 return # can only test on *nix
1558 self.serv.settimeout(5.0) # must be longer than alarm
1559 class Alarm(Exception):
1560 pass
1561 def alarm_handler(signal, frame):
1562 raise Alarm
1563 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1564 try:
1565 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1566 try:
1567 foo = self.serv.accept()
1568 except socket.timeout:
1569 self.fail("caught timeout instead of Alarm")
1570 except Alarm:
1571 pass
1572 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001573 self.fail("caught other exception instead of Alarm:"
1574 " %s(%s):\n%s" %
1575 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001576 else:
1577 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001578 finally:
1579 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001580 except Alarm:
1581 self.fail("got Alarm in wrong place")
1582 finally:
1583 # no alarm can be pending. Safe to restore old handler.
1584 signal.signal(signal.SIGALRM, old_alarm)
1585
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001586class UDPTimeoutTest(SocketTCPTest):
1587
1588 def testUDPTimeout(self):
1589 def raise_timeout(*args, **kwargs):
1590 self.serv.settimeout(1.0)
1591 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001592 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001593 "Error generating a timeout exception (UDP)")
1594
1595 def testTimeoutZero(self):
1596 ok = False
1597 try:
1598 self.serv.settimeout(0.0)
1599 foo = self.serv.recv(1024)
1600 except socket.timeout:
1601 self.fail("caught timeout instead of error (UDP)")
1602 except socket.error:
1603 ok = True
1604 except:
1605 self.fail("caught unexpected exception (UDP)")
1606 if not ok:
1607 self.fail("recv() returned success when we did not expect it")
1608
1609class TestExceptions(unittest.TestCase):
1610
1611 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001612 self.assertTrue(issubclass(socket.error, Exception))
1613 self.assertTrue(issubclass(socket.herror, socket.error))
1614 self.assertTrue(issubclass(socket.gaierror, socket.error))
1615 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001616
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001617class TestLinuxAbstractNamespace(unittest.TestCase):
1618
1619 UNIX_PATH_MAX = 108
1620
1621 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001622 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001623 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1624 s1.bind(address)
1625 s1.listen(1)
1626 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1627 s2.connect(s1.getsockname())
1628 s1.accept()
1629 self.assertEqual(s1.getsockname(), address)
1630 self.assertEqual(s2.getpeername(), address)
1631
1632 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001633 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001634 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1635 s.bind(address)
1636 self.assertEqual(s.getsockname(), address)
1637
1638 def testNameOverflow(self):
1639 address = "\x00" + "h" * self.UNIX_PATH_MAX
1640 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1641 self.assertRaises(socket.error, s.bind, address)
1642
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001643
Victor Stinner45df8202010-04-28 22:31:17 +00001644@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001645class BufferIOTest(SocketConnectedTest):
1646 """
1647 Test the buffer versions of socket.recv() and socket.send().
1648 """
1649 def __init__(self, methodName='runTest'):
1650 SocketConnectedTest.__init__(self, methodName=methodName)
1651
Antoine Pitrou25480782010-03-17 22:50:28 +00001652 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001653 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001654 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001656 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001657 self.assertEqual(msg, MSG)
1658
Antoine Pitrou25480782010-03-17 22:50:28 +00001659 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001660 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001661 self.serv_conn.send(buf)
1662
Antoine Pitrou25480782010-03-17 22:50:28 +00001663 def testRecvIntoBytearray(self):
1664 buf = bytearray(1024)
1665 nbytes = self.cli_conn.recv_into(buf)
1666 self.assertEqual(nbytes, len(MSG))
1667 msg = buf[:len(MSG)]
1668 self.assertEqual(msg, MSG)
1669
1670 _testRecvIntoBytearray = _testRecvIntoArray
1671
1672 def testRecvIntoMemoryview(self):
1673 buf = bytearray(1024)
1674 nbytes = self.cli_conn.recv_into(memoryview(buf))
1675 self.assertEqual(nbytes, len(MSG))
1676 msg = buf[:len(MSG)]
1677 self.assertEqual(msg, MSG)
1678
1679 _testRecvIntoMemoryview = _testRecvIntoArray
1680
1681 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001682 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001683 nbytes, addr = self.cli_conn.recvfrom_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 _testRecvFromIntoArray(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 testRecvFromIntoBytearray(self):
1693 buf = bytearray(1024)
1694 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1695 self.assertEqual(nbytes, len(MSG))
1696 msg = buf[:len(MSG)]
1697 self.assertEqual(msg, MSG)
1698
1699 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1700
1701 def testRecvFromIntoMemoryview(self):
1702 buf = bytearray(1024)
1703 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1704 self.assertEqual(nbytes, len(MSG))
1705 msg = buf[:len(MSG)]
1706 self.assertEqual(msg, MSG)
1707
1708 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1709
Christian Heimes043d6f62008-01-07 17:19:16 +00001710
1711TIPC_STYPE = 2000
1712TIPC_LOWER = 200
1713TIPC_UPPER = 210
1714
1715def isTipcAvailable():
1716 """Check if the TIPC module is loaded
1717
1718 The TIPC module is not loaded automatically on Ubuntu and probably
1719 other Linux distros.
1720 """
1721 if not hasattr(socket, "AF_TIPC"):
1722 return False
1723 if not os.path.isfile("/proc/modules"):
1724 return False
1725 with open("/proc/modules") as f:
1726 for line in f:
1727 if line.startswith("tipc "):
1728 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001729 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001730 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1731 return False
1732
1733class TIPCTest (unittest.TestCase):
1734 def testRDM(self):
1735 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1736 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1737
1738 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1739 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1740 TIPC_LOWER, TIPC_UPPER)
1741 srv.bind(srvaddr)
1742
1743 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1744 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1745 cli.sendto(MSG, sendaddr)
1746
1747 msg, recvaddr = srv.recvfrom(1024)
1748
1749 self.assertEqual(cli.getsockname(), recvaddr)
1750 self.assertEqual(msg, MSG)
1751
1752
1753class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1754 def __init__(self, methodName = 'runTest'):
1755 unittest.TestCase.__init__(self, methodName = methodName)
1756 ThreadableTest.__init__(self)
1757
1758 def setUp(self):
1759 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1760 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1761 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1762 TIPC_LOWER, TIPC_UPPER)
1763 self.srv.bind(srvaddr)
1764 self.srv.listen(5)
1765 self.serverExplicitReady()
1766 self.conn, self.connaddr = self.srv.accept()
1767
1768 def clientSetUp(self):
1769 # The is a hittable race between serverExplicitReady() and the
1770 # accept() call; sleep a little while to avoid it, otherwise
1771 # we could get an exception
1772 time.sleep(0.1)
1773 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1774 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1775 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1776 self.cli.connect(addr)
1777 self.cliaddr = self.cli.getsockname()
1778
1779 def testStream(self):
1780 msg = self.conn.recv(1024)
1781 self.assertEqual(msg, MSG)
1782 self.assertEqual(self.cliaddr, self.connaddr)
1783
1784 def _testStream(self):
1785 self.cli.send(MSG)
1786 self.cli.close()
1787
1788
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001789@unittest.skipUnless(thread, 'Threading required for this test.')
1790class ContextManagersTest(ThreadedTCPSocketTest):
1791
1792 def _testSocketClass(self):
1793 # base test
1794 with socket.socket() as sock:
1795 self.assertFalse(sock._closed)
1796 self.assertTrue(sock._closed)
1797 # close inside with block
1798 with socket.socket() as sock:
1799 sock.close()
1800 self.assertTrue(sock._closed)
1801 # exception inside with block
1802 with socket.socket() as sock:
1803 self.assertRaises(socket.error, sock.sendall, b'foo')
1804 self.assertTrue(sock._closed)
1805
1806 def testCreateConnectionBase(self):
1807 conn, addr = self.serv.accept()
1808 data = conn.recv(1024)
1809 conn.sendall(data)
1810
1811 def _testCreateConnectionBase(self):
1812 address = self.serv.getsockname()
1813 with socket.create_connection(address) as sock:
1814 self.assertFalse(sock._closed)
1815 sock.sendall(b'foo')
1816 self.assertEqual(sock.recv(1024), b'foo')
1817 self.assertTrue(sock._closed)
1818
1819 def testCreateConnectionClose(self):
1820 conn, addr = self.serv.accept()
1821 data = conn.recv(1024)
1822 conn.sendall(data)
1823
1824 def _testCreateConnectionClose(self):
1825 address = self.serv.getsockname()
1826 with socket.create_connection(address) as sock:
1827 sock.close()
1828 self.assertTrue(sock._closed)
1829 self.assertRaises(socket.error, sock.sendall, b'foo')
1830
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001831
1832def linux_version():
1833 try:
1834 # platform.release() is something like '2.6.33.7-desktop-2mnb'
1835 version_string = platform.release().split('-')[0]
1836 return tuple(map(int, version_string.split('.')))
1837 except ValueError:
1838 return 0, 0, 0
1839
Antoine Pitroub1c54962010-10-14 15:05:38 +00001840@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1841 "SOCK_CLOEXEC not defined")
1842@unittest.skipUnless(fcntl, "module fcntl not available")
1843class CloexecConstantTest(unittest.TestCase):
1844 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001845 v = linux_version()
1846 if v < (2, 6, 28):
1847 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1848 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001849 s = socket.socket(socket.AF_INET,
1850 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1851 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1852 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1853
1854
1855@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1856 "SOCK_NONBLOCK not defined")
1857class NonblockConstantTest(unittest.TestCase):
1858 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1859 if nonblock:
1860 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1861 self.assertEqual(s.gettimeout(), timeout)
1862 else:
1863 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1864 self.assertEqual(s.gettimeout(), None)
1865
1866 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001867 v = linux_version()
1868 if v < (2, 6, 28):
1869 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1870 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001871 # a lot of it seems silly and redundant, but I wanted to test that
1872 # changing back and forth worked ok
1873 s = socket.socket(socket.AF_INET,
1874 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1875 self.checkNonblock(s)
1876 s.setblocking(1)
1877 self.checkNonblock(s, False)
1878 s.setblocking(0)
1879 self.checkNonblock(s)
1880 s.settimeout(None)
1881 self.checkNonblock(s, False)
1882 s.settimeout(2.0)
1883 self.checkNonblock(s, timeout=2.0)
1884 s.setblocking(1)
1885 self.checkNonblock(s, False)
1886 # defaulttimeout
1887 t = socket.getdefaulttimeout()
1888 socket.setdefaulttimeout(0.0)
1889 self.checkNonblock(socket.socket())
1890 socket.setdefaulttimeout(None)
1891 self.checkNonblock(socket.socket(), False)
1892 socket.setdefaulttimeout(2.0)
1893 self.checkNonblock(socket.socket(), timeout=2.0)
1894 socket.setdefaulttimeout(None)
1895 self.checkNonblock(socket.socket(), False)
1896 socket.setdefaulttimeout(t)
1897
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001898
Guido van Rossumb995eb72002-07-31 16:08:40 +00001899def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001900 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001901 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001902
1903 tests.extend([
1904 NonBlockingTCPTests,
1905 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001906 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001907 UnbufferedFileObjectClassTestCase,
1908 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001909 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001910 UnicodeReadFileObjectClassTestCase,
1911 UnicodeWriteFileObjectClassTestCase,
1912 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001913 NetworkConnectionNoServer,
1914 NetworkConnectionAttributesTest,
1915 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001916 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001917 CloexecConstantTest,
1918 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001919 ])
Dave Cole331708b2004-08-09 04:51:41 +00001920 if hasattr(socket, "socketpair"):
1921 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001922 if sys.platform == 'linux2':
1923 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001924 if isTipcAvailable():
1925 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001926 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001927
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001928 thread_info = support.threading_setup()
1929 support.run_unittest(*tests)
1930 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001931
1932if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001933 test_main()