blob: 699efc0789f8fd57b1b36d9c85f6d9effef67076 [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
709
Victor Stinner45df8202010-04-28 22:31:17 +0000710@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711class BasicTCPTest(SocketConnectedTest):
712
713 def __init__(self, methodName='runTest'):
714 SocketConnectedTest.__init__(self, methodName=methodName)
715
716 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000717 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000719 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000720
721 def _testRecv(self):
722 self.serv_conn.send(MSG)
723
724 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000725 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726 seg1 = self.cli_conn.recv(len(MSG) - 3)
727 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000728 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000729 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730
731 def _testOverFlowRecv(self):
732 self.serv_conn.send(MSG)
733
734 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000735 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000737 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738
739 def _testRecvFrom(self):
740 self.serv_conn.send(MSG)
741
742 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000743 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
745 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000746 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000747 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748
749 def _testOverFlowRecvFrom(self):
750 self.serv_conn.send(MSG)
751
752 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000753 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000754 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 while 1:
756 read = self.cli_conn.recv(1024)
757 if not read:
758 break
Guido van Rossume531e292002-08-08 20:28:34 +0000759 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000760 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761
762 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000763 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 self.serv_conn.sendall(big_chunk)
765
766 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 fd = self.cli_conn.fileno()
769 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000770 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000772 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773
774 def _testFromFd(self):
775 self.serv_conn.send(MSG)
776
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000777 def testDup(self):
778 # Testing dup()
779 sock = self.cli_conn.dup()
780 msg = sock.recv(1024)
781 self.assertEqual(msg, MSG)
782
783 def _testDup(self):
784 self.serv_conn.send(MSG)
785
Guido van Rossum24e4af82002-06-12 19:18:08 +0000786 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000787 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000789 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000790 # wait for _testShutdown to finish: on OS X, when the server
791 # closes the connection the client also becomes disconnected,
792 # and the client's shutdown call will fail. (Issue #4397.)
793 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794
795 def _testShutdown(self):
796 self.serv_conn.send(MSG)
797 self.serv_conn.shutdown(2)
798
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000799 def testDetach(self):
800 # Testing detach()
801 fileno = self.cli_conn.fileno()
802 f = self.cli_conn.detach()
803 self.assertEqual(f, fileno)
804 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000805 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
806 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000807 # ...but we can create another socket using the (still open)
808 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000809 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
810 msg = sock.recv(1024)
811 self.assertEqual(msg, MSG)
812
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000813 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000814 self.serv_conn.send(MSG)
815
Victor Stinner45df8202010-04-28 22:31:17 +0000816@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817class BasicUDPTest(ThreadedUDPSocketTest):
818
819 def __init__(self, methodName='runTest'):
820 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
821
822 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000823 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000825 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
827 def _testSendtoAndRecv(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 Rossum1c938012002-06-12 21:17:20 +0000830 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000831 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000833 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834
Guido van Rossum1c938012002-06-12 21:17:20 +0000835 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000836 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837
Guido van Rossumd8faa362007-04-27 19:54:29 +0000838 def testRecvFromNegative(self):
839 # Negative lengths passed to recvfrom should give ValueError.
840 self.assertRaises(ValueError, self.serv.recvfrom, -1)
841
842 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000843 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000844
Victor Stinner45df8202010-04-28 22:31:17 +0000845@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000846class TCPCloserTest(ThreadedTCPSocketTest):
847
848 def testClose(self):
849 conn, addr = self.serv.accept()
850 conn.close()
851
852 sd = self.cli
853 read, write, err = select.select([sd], [], [], 1.0)
854 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000855 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000856
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000857 # Calling close() many times should be safe.
858 conn.close()
859 conn.close()
860
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000861 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000862 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000863 time.sleep(1.0)
864
Victor Stinner45df8202010-04-28 22:31:17 +0000865@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000866class BasicSocketPairTest(SocketPairTest):
867
868 def __init__(self, methodName='runTest'):
869 SocketPairTest.__init__(self, methodName=methodName)
870
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000871 def _check_defaults(self, sock):
872 self.assertIsInstance(sock, socket.socket)
873 if hasattr(socket, 'AF_UNIX'):
874 self.assertEqual(sock.family, socket.AF_UNIX)
875 else:
876 self.assertEqual(sock.family, socket.AF_INET)
877 self.assertEqual(sock.type, socket.SOCK_STREAM)
878 self.assertEqual(sock.proto, 0)
879
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000880 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000881 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000882
883 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000884 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000885
Dave Cole331708b2004-08-09 04:51:41 +0000886 def testRecv(self):
887 msg = self.serv.recv(1024)
888 self.assertEqual(msg, MSG)
889
890 def _testRecv(self):
891 self.cli.send(MSG)
892
893 def testSend(self):
894 self.serv.send(MSG)
895
896 def _testSend(self):
897 msg = self.cli.recv(1024)
898 self.assertEqual(msg, MSG)
899
Victor Stinner45df8202010-04-28 22:31:17 +0000900@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901class NonBlockingTCPTests(ThreadedTCPSocketTest):
902
903 def __init__(self, methodName='runTest'):
904 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
905
906 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000907 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908 self.serv.setblocking(0)
909 start = time.time()
910 try:
911 self.serv.accept()
912 except socket.error:
913 pass
914 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000915 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916
917 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000918 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000919
Antoine Pitroub1c54962010-10-14 15:05:38 +0000920 if hasattr(socket, "SOCK_NONBLOCK"):
921 def testInitNonBlocking(self):
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000922 v = linux_version()
923 if v < (2, 6, 28):
924 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
925 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +0000926 # reinit server socket
927 self.serv.close()
928 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +0000929 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000930 self.port = support.bind_port(self.serv)
931 self.serv.listen(1)
932 # actual testing
933 start = time.time()
934 try:
935 self.serv.accept()
936 except socket.error:
937 pass
938 end = time.time()
939 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
940
941 def _testInitNonBlocking(self):
942 pass
943
Guido van Rossum24e4af82002-06-12 19:18:08 +0000944 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000945 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000946 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000947 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000948 conn, addr = self.serv.accept()
949 except socket.error:
950 pass
951 else:
952 self.fail("Error trying to do non-blocking accept.")
953 read, write, err = select.select([self.serv], [], [])
954 if self.serv in read:
955 conn, addr = self.serv.accept()
956 else:
957 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000958
Guido van Rossum24e4af82002-06-12 19:18:08 +0000959 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000960 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000961 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000962
963 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000964 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965 conn, addr = self.serv.accept()
966
967 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000968 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000969 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000970
971 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000972 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000973 conn, addr = self.serv.accept()
974 conn.setblocking(0)
975 try:
976 msg = conn.recv(len(MSG))
977 except socket.error:
978 pass
979 else:
980 self.fail("Error trying to do non-blocking recv.")
981 read, write, err = select.select([conn], [], [])
982 if conn in read:
983 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000984 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000985 else:
986 self.fail("Error during select call to non-blocking socket.")
987
988 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000989 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000990 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991 self.cli.send(MSG)
992
Victor Stinner45df8202010-04-28 22:31:17 +0000993@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000995 """Unit tests for the object returned by socket.makefile()
996
Antoine Pitrou834bd812010-10-13 16:17:14 +0000997 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000998 the client connection. You can read from this file to
999 get output from the server.
1000
Antoine Pitrou834bd812010-10-13 16:17:14 +00001001 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001002 server connection. You can write to this file to send output
1003 to the client.
1004 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001005
Guido van Rossume9f66142002-08-07 15:46:19 +00001006 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +00001007 encoding = 'utf8'
1008 errors = 'strict'
1009 newline = None
1010
1011 read_mode = 'rb'
1012 read_msg = MSG
1013 write_mode = 'wb'
1014 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001015
Guido van Rossum24e4af82002-06-12 19:18:08 +00001016 def __init__(self, methodName='runTest'):
1017 SocketConnectedTest.__init__(self, methodName=methodName)
1018
1019 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001020 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1021 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001023 self.read_file = self.cli_conn.makefile(
1024 self.read_mode, self.bufsize,
1025 encoding = self.encoding,
1026 errors = self.errors,
1027 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001028
1029 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001030 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001031 self.read_file.close()
1032 self.assertTrue(self.read_file.closed)
1033 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034 SocketConnectedTest.tearDown(self)
1035
1036 def clientSetUp(self):
1037 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001038 self.write_file = self.serv_conn.makefile(
1039 self.write_mode, self.bufsize,
1040 encoding = self.encoding,
1041 errors = self.errors,
1042 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001043
1044 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001045 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001046 self.write_file.close()
1047 self.assertTrue(self.write_file.closed)
1048 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001049 SocketConnectedTest.clientTearDown(self)
1050
1051 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001052 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001053 first_seg = self.read_file.read(len(self.read_msg)-3)
1054 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001055 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001056 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001057
1058 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001059 self.write_file.write(self.write_msg)
1060 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061
Guido van Rossum8c943832002-08-08 01:00:28 +00001062 def testFullRead(self):
1063 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001064 msg = self.read_file.read()
1065 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001066
1067 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001068 self.write_file.write(self.write_msg)
1069 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001070
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001072 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001073 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001075 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001076 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001078 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001079 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001080
1081 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001082 self.write_file.write(self.write_msg)
1083 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001084
1085 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001086 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001087 line = self.read_file.readline()
1088 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089
1090 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001091 self.write_file.write(self.write_msg)
1092 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001093
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001094 def testCloseAfterMakefile(self):
1095 # The file returned by makefile should keep the socket open.
1096 self.cli_conn.close()
1097 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001098 msg = self.read_file.read()
1099 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001100
1101 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001102 self.write_file.write(self.write_msg)
1103 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001104
1105 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001106 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001107 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001108 if isinstance(self.read_msg, str):
1109 msg = msg.decode()
1110 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001111
1112 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001113 self.write_file.write(self.write_msg)
1114 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001115
Tim Peters116d83c2004-03-28 02:20:45 +00001116 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001117 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001118
1119 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001120 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001121
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001122 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001123 self.assertEqual(self.read_file.mode, self.read_mode)
1124 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001125
1126 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001127 self.assertEqual(self.write_file.mode, self.write_mode)
1128 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001129
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001130 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001131 self.read_file.close()
1132 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001133 self.cli_conn.close()
1134 self.assertRaises(socket.error, self.cli_conn.getsockname)
1135
1136 def _testRealClose(self):
1137 pass
1138
1139
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001140class FileObjectInterruptedTestCase(unittest.TestCase):
1141 """Test that the file object correctly handles EINTR internally."""
1142
1143 class MockSocket(object):
1144 def __init__(self, recv_funcs=()):
1145 # A generator that returns callables that we'll call for each
1146 # call to recv().
1147 self._recv_step = iter(recv_funcs)
1148
1149 def recv_into(self, buffer):
1150 data = next(self._recv_step)()
1151 assert len(buffer) >= len(data)
1152 buffer[:len(data)] = data
1153 return len(data)
1154
1155 def _decref_socketios(self):
1156 pass
1157
1158 def _textiowrap_for_test(self, buffering=-1):
1159 raw = socket.SocketIO(self, "r")
1160 if buffering < 0:
1161 buffering = io.DEFAULT_BUFFER_SIZE
1162 if buffering == 0:
1163 return raw
1164 buffer = io.BufferedReader(raw, buffering)
1165 text = io.TextIOWrapper(buffer, None, None)
1166 text.mode = "rb"
1167 return text
1168
1169 @staticmethod
1170 def _raise_eintr():
1171 raise socket.error(errno.EINTR)
1172
1173 def _textiowrap_mock_socket(self, mock, buffering=-1):
1174 raw = socket.SocketIO(mock, "r")
1175 if buffering < 0:
1176 buffering = io.DEFAULT_BUFFER_SIZE
1177 if buffering == 0:
1178 return raw
1179 buffer = io.BufferedReader(raw, buffering)
1180 text = io.TextIOWrapper(buffer, None, None)
1181 text.mode = "rb"
1182 return text
1183
1184 def _test_readline(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 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1193 self.assertEquals(fo.readline(size), "This is the first line\n")
1194 self.assertEquals(fo.readline(size), "And the second line is here\n")
1195
1196 def _test_read(self, size=-1, buffering=-1):
1197 mock_sock = self.MockSocket(recv_funcs=[
1198 lambda : b"This is the first line\nAnd the sec",
1199 self._raise_eintr,
1200 lambda : b"ond line is here\n",
1201 lambda : b"",
1202 lambda : b"", # XXX(gps): io library does an extra EOF read
1203 ])
1204 expecting = (b"This is the first line\n"
1205 b"And the second line is here\n")
1206 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1207 if buffering == 0:
1208 data = b''
1209 else:
1210 data = ''
1211 expecting = expecting.decode('utf8')
1212 while len(data) != len(expecting):
1213 part = fo.read(size)
1214 if not part:
1215 break
1216 data += part
1217 self.assertEquals(data, expecting)
1218
1219 def test_default(self):
1220 self._test_readline()
1221 self._test_readline(size=100)
1222 self._test_read()
1223 self._test_read(size=100)
1224
1225 def test_with_1k_buffer(self):
1226 self._test_readline(buffering=1024)
1227 self._test_readline(size=100, buffering=1024)
1228 self._test_read(buffering=1024)
1229 self._test_read(size=100, buffering=1024)
1230
1231 def _test_readline_no_buffer(self, size=-1):
1232 mock_sock = self.MockSocket(recv_funcs=[
1233 lambda : b"a",
1234 lambda : b"\n",
1235 lambda : b"B",
1236 self._raise_eintr,
1237 lambda : b"b",
1238 lambda : b"",
1239 ])
1240 fo = mock_sock._textiowrap_for_test(buffering=0)
1241 self.assertEquals(fo.readline(size), b"a\n")
1242 self.assertEquals(fo.readline(size), b"Bb")
1243
1244 def test_no_buffer(self):
1245 self._test_readline_no_buffer()
1246 self._test_readline_no_buffer(size=4)
1247 self._test_read(buffering=0)
1248 self._test_read(size=100, buffering=0)
1249
1250
Guido van Rossume9f66142002-08-07 15:46:19 +00001251class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1252
1253 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001254
Guido van Rossume9f66142002-08-07 15:46:19 +00001255 In this case (and in this case only), it should be possible to
1256 create a file object, read a line from it, create another file
1257 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001258 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001259 when reading multiple requests from the same socket."""
1260
1261 bufsize = 0 # Use unbuffered mode
1262
1263 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001264 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001265 line = self.read_file.readline() # first line
1266 self.assertEqual(line, b"A. " + self.write_msg) # first line
1267 self.read_file = self.cli_conn.makefile('rb', 0)
1268 line = self.read_file.readline() # second line
1269 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001270
1271 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001272 self.write_file.write(b"A. " + self.write_msg)
1273 self.write_file.write(b"B. " + self.write_msg)
1274 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001275
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001276 def testMakefileClose(self):
1277 # The file returned by makefile should keep the socket open...
1278 self.cli_conn.close()
1279 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001280 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001281 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001282 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001283 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1284
1285 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001286 self.write_file.write(self.write_msg)
1287 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001288
1289 def testMakefileCloseSocketDestroy(self):
1290 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001291 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001292 refcount_after = sys.getrefcount(self.cli_conn)
1293 self.assertEqual(refcount_before - 1, refcount_after)
1294
1295 def _testMakefileCloseSocketDestroy(self):
1296 pass
1297
Antoine Pitrou98b46702010-09-18 22:59:00 +00001298 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001299 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001300 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1301
1302 def testSmallReadNonBlocking(self):
1303 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001304 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1305 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001306 self.evt1.set()
1307 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001308 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001309 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001310 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001311 self.assertEqual(n, 3)
1312 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001313 self.assertEqual(msg, self.read_msg)
1314 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1315 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001316
1317 def _testSmallReadNonBlocking(self):
1318 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001319 self.write_file.write(self.write_msg)
1320 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001321 self.evt2.set()
1322 # Avoid cloding the socket before the server test has finished,
1323 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1324 self.serv_finished.wait(5.0)
1325
1326 def testWriteNonBlocking(self):
1327 self.cli_finished.wait(5.0)
1328 # The client thread can't skip directly - the SkipTest exception
1329 # would appear as a failure.
1330 if self.serv_skipped:
1331 self.skipTest(self.serv_skipped)
1332
1333 def _testWriteNonBlocking(self):
1334 self.serv_skipped = None
1335 self.serv_conn.setblocking(False)
1336 # Try to saturate the socket buffer pipe with repeated large writes.
1337 BIG = b"x" * (1024 ** 2)
1338 LIMIT = 10
1339 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001340 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001341 self.assertGreater(n, 0)
1342 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001343 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001344 if n is None:
1345 # Succeeded
1346 break
1347 self.assertGreater(n, 0)
1348 else:
1349 # Let us know that this test didn't manage to establish
1350 # the expected conditions. This is not a failure in itself but,
1351 # if it happens repeatedly, the test should be fixed.
1352 self.serv_skipped = "failed to saturate the socket buffer"
1353
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001354
Guido van Rossum8c943832002-08-08 01:00:28 +00001355class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1356
1357 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1358
1359
1360class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1361
1362 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001363
Thomas Woutersb2137042007-02-01 18:02:27 +00001364
Antoine Pitrou834bd812010-10-13 16:17:14 +00001365class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1366 """Tests for socket.makefile() in text mode (rather than binary)"""
1367
1368 read_mode = 'r'
1369 read_msg = MSG.decode('utf8')
1370 write_mode = 'wb'
1371 write_msg = MSG
1372 newline = ''
1373
1374
1375class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1376 """Tests for socket.makefile() in text mode (rather than binary)"""
1377
1378 read_mode = 'rb'
1379 read_msg = MSG
1380 write_mode = 'w'
1381 write_msg = MSG.decode('utf8')
1382 newline = ''
1383
1384
1385class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1386 """Tests for socket.makefile() in text mode (rather than binary)"""
1387
1388 read_mode = 'r'
1389 read_msg = MSG.decode('utf8')
1390 write_mode = 'w'
1391 write_msg = MSG.decode('utf8')
1392 newline = ''
1393
1394
Guido van Rossumd8faa362007-04-27 19:54:29 +00001395class NetworkConnectionTest(object):
1396 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001397
Guido van Rossumd8faa362007-04-27 19:54:29 +00001398 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001399 # We're inherited below by BasicTCPTest2, which also inherits
1400 # BasicTCPTest, which defines self.port referenced below.
1401 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001402 self.serv_conn = self.cli
1403
1404class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1405 """Tests that NetworkConnection does not break existing TCP functionality.
1406 """
1407
1408class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001409
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001410 class MockSocket(socket.socket):
1411 def connect(self, *args):
1412 raise socket.timeout('timed out')
1413
1414 @contextlib.contextmanager
1415 def mocked_socket_module(self):
1416 """Return a socket which times out on connect"""
1417 old_socket = socket.socket
1418 socket.socket = self.MockSocket
1419 try:
1420 yield
1421 finally:
1422 socket.socket = old_socket
1423
1424 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001425 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001426 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1427 with self.assertRaises(socket.error) as cm:
1428 cli.connect((HOST, port))
1429 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1430
1431 def test_create_connection(self):
1432 # Issue #9792: errors raised by create_connection() should have
1433 # a proper errno attribute.
1434 port = support.find_unused_port()
1435 with self.assertRaises(socket.error) as cm:
1436 socket.create_connection((HOST, port))
1437 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1438
1439 def test_create_connection_timeout(self):
1440 # Issue #9792: create_connection() should not recast timeout errors
1441 # as generic socket errors.
1442 with self.mocked_socket_module():
1443 with self.assertRaises(socket.timeout):
1444 socket.create_connection((HOST, 1234))
1445
Guido van Rossumd8faa362007-04-27 19:54:29 +00001446
Victor Stinner45df8202010-04-28 22:31:17 +00001447@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001448class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1449
1450 def __init__(self, methodName='runTest'):
1451 SocketTCPTest.__init__(self, methodName=methodName)
1452 ThreadableTest.__init__(self)
1453
1454 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001455 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001456
1457 def clientTearDown(self):
1458 self.cli.close()
1459 self.cli = None
1460 ThreadableTest.clientTearDown(self)
1461
1462 def _justAccept(self):
1463 conn, addr = self.serv.accept()
1464
1465 testFamily = _justAccept
1466 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001467 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001468 self.assertEqual(self.cli.family, 2)
1469
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001470 testSourceAddress = _justAccept
1471 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001472 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1473 source_address=('', self.source_port))
1474 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001475 # The port number being used is sufficient to show that the bind()
1476 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001477
Guido van Rossumd8faa362007-04-27 19:54:29 +00001478 testTimeoutDefault = _justAccept
1479 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001480 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001481 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001482 socket.setdefaulttimeout(42)
1483 try:
1484 self.cli = socket.create_connection((HOST, self.port))
1485 finally:
1486 socket.setdefaulttimeout(None)
1487 self.assertEquals(self.cli.gettimeout(), 42)
1488
1489 testTimeoutNone = _justAccept
1490 def _testTimeoutNone(self):
1491 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001492 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001493 socket.setdefaulttimeout(30)
1494 try:
1495 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1496 finally:
1497 socket.setdefaulttimeout(None)
1498 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001499
1500 testTimeoutValueNamed = _justAccept
1501 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001502 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001503 self.assertEqual(self.cli.gettimeout(), 30)
1504
1505 testTimeoutValueNonamed = _justAccept
1506 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001507 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001508 self.assertEqual(self.cli.gettimeout(), 30)
1509
Victor Stinner45df8202010-04-28 22:31:17 +00001510@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001511class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1512
1513 def __init__(self, methodName='runTest'):
1514 SocketTCPTest.__init__(self, methodName=methodName)
1515 ThreadableTest.__init__(self)
1516
1517 def clientSetUp(self):
1518 pass
1519
1520 def clientTearDown(self):
1521 self.cli.close()
1522 self.cli = None
1523 ThreadableTest.clientTearDown(self)
1524
1525 def testInsideTimeout(self):
1526 conn, addr = self.serv.accept()
1527 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001528 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001529 testOutsideTimeout = testInsideTimeout
1530
1531 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001532 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001533 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001534 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535
1536 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001537 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001538 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539
1540
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001541class TCPTimeoutTest(SocketTCPTest):
1542
1543 def testTCPTimeout(self):
1544 def raise_timeout(*args, **kwargs):
1545 self.serv.settimeout(1.0)
1546 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001547 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001548 "Error generating a timeout exception (TCP)")
1549
1550 def testTimeoutZero(self):
1551 ok = False
1552 try:
1553 self.serv.settimeout(0.0)
1554 foo = self.serv.accept()
1555 except socket.timeout:
1556 self.fail("caught timeout instead of error (TCP)")
1557 except socket.error:
1558 ok = True
1559 except:
1560 self.fail("caught unexpected exception (TCP)")
1561 if not ok:
1562 self.fail("accept() returned success when we did not expect it")
1563
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001564 def testInterruptedTimeout(self):
1565 # XXX I don't know how to do this test on MSWindows or any other
1566 # plaform that doesn't support signal.alarm() or os.kill(), though
1567 # the bug should have existed on all platforms.
1568 if not hasattr(signal, "alarm"):
1569 return # can only test on *nix
1570 self.serv.settimeout(5.0) # must be longer than alarm
1571 class Alarm(Exception):
1572 pass
1573 def alarm_handler(signal, frame):
1574 raise Alarm
1575 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1576 try:
1577 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1578 try:
1579 foo = self.serv.accept()
1580 except socket.timeout:
1581 self.fail("caught timeout instead of Alarm")
1582 except Alarm:
1583 pass
1584 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001585 self.fail("caught other exception instead of Alarm:"
1586 " %s(%s):\n%s" %
1587 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001588 else:
1589 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001590 finally:
1591 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001592 except Alarm:
1593 self.fail("got Alarm in wrong place")
1594 finally:
1595 # no alarm can be pending. Safe to restore old handler.
1596 signal.signal(signal.SIGALRM, old_alarm)
1597
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001598class UDPTimeoutTest(SocketTCPTest):
1599
1600 def testUDPTimeout(self):
1601 def raise_timeout(*args, **kwargs):
1602 self.serv.settimeout(1.0)
1603 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001604 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001605 "Error generating a timeout exception (UDP)")
1606
1607 def testTimeoutZero(self):
1608 ok = False
1609 try:
1610 self.serv.settimeout(0.0)
1611 foo = self.serv.recv(1024)
1612 except socket.timeout:
1613 self.fail("caught timeout instead of error (UDP)")
1614 except socket.error:
1615 ok = True
1616 except:
1617 self.fail("caught unexpected exception (UDP)")
1618 if not ok:
1619 self.fail("recv() returned success when we did not expect it")
1620
1621class TestExceptions(unittest.TestCase):
1622
1623 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001624 self.assertTrue(issubclass(socket.error, Exception))
1625 self.assertTrue(issubclass(socket.herror, socket.error))
1626 self.assertTrue(issubclass(socket.gaierror, socket.error))
1627 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001628
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001629class TestLinuxAbstractNamespace(unittest.TestCase):
1630
1631 UNIX_PATH_MAX = 108
1632
1633 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001634 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001635 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1636 s1.bind(address)
1637 s1.listen(1)
1638 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1639 s2.connect(s1.getsockname())
1640 s1.accept()
1641 self.assertEqual(s1.getsockname(), address)
1642 self.assertEqual(s2.getpeername(), address)
1643
1644 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001645 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001646 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1647 s.bind(address)
1648 self.assertEqual(s.getsockname(), address)
1649
1650 def testNameOverflow(self):
1651 address = "\x00" + "h" * self.UNIX_PATH_MAX
1652 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1653 self.assertRaises(socket.error, s.bind, address)
1654
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001655
Victor Stinner45df8202010-04-28 22:31:17 +00001656@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001657class BufferIOTest(SocketConnectedTest):
1658 """
1659 Test the buffer versions of socket.recv() and socket.send().
1660 """
1661 def __init__(self, methodName='runTest'):
1662 SocketConnectedTest.__init__(self, methodName=methodName)
1663
Antoine Pitrou25480782010-03-17 22:50:28 +00001664 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001665 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001666 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001667 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001668 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001669 self.assertEqual(msg, MSG)
1670
Antoine Pitrou25480782010-03-17 22:50:28 +00001671 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001672 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001673 self.serv_conn.send(buf)
1674
Antoine Pitrou25480782010-03-17 22:50:28 +00001675 def testRecvIntoBytearray(self):
1676 buf = bytearray(1024)
1677 nbytes = self.cli_conn.recv_into(buf)
1678 self.assertEqual(nbytes, len(MSG))
1679 msg = buf[:len(MSG)]
1680 self.assertEqual(msg, MSG)
1681
1682 _testRecvIntoBytearray = _testRecvIntoArray
1683
1684 def testRecvIntoMemoryview(self):
1685 buf = bytearray(1024)
1686 nbytes = self.cli_conn.recv_into(memoryview(buf))
1687 self.assertEqual(nbytes, len(MSG))
1688 msg = buf[:len(MSG)]
1689 self.assertEqual(msg, MSG)
1690
1691 _testRecvIntoMemoryview = _testRecvIntoArray
1692
1693 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001694 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001695 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001696 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001697 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001698 self.assertEqual(msg, MSG)
1699
Antoine Pitrou25480782010-03-17 22:50:28 +00001700 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001701 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001702 self.serv_conn.send(buf)
1703
Antoine Pitrou25480782010-03-17 22:50:28 +00001704 def testRecvFromIntoBytearray(self):
1705 buf = bytearray(1024)
1706 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1707 self.assertEqual(nbytes, len(MSG))
1708 msg = buf[:len(MSG)]
1709 self.assertEqual(msg, MSG)
1710
1711 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1712
1713 def testRecvFromIntoMemoryview(self):
1714 buf = bytearray(1024)
1715 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1716 self.assertEqual(nbytes, len(MSG))
1717 msg = buf[:len(MSG)]
1718 self.assertEqual(msg, MSG)
1719
1720 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1721
Christian Heimes043d6f62008-01-07 17:19:16 +00001722
1723TIPC_STYPE = 2000
1724TIPC_LOWER = 200
1725TIPC_UPPER = 210
1726
1727def isTipcAvailable():
1728 """Check if the TIPC module is loaded
1729
1730 The TIPC module is not loaded automatically on Ubuntu and probably
1731 other Linux distros.
1732 """
1733 if not hasattr(socket, "AF_TIPC"):
1734 return False
1735 if not os.path.isfile("/proc/modules"):
1736 return False
1737 with open("/proc/modules") as f:
1738 for line in f:
1739 if line.startswith("tipc "):
1740 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001741 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001742 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1743 return False
1744
1745class TIPCTest (unittest.TestCase):
1746 def testRDM(self):
1747 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1748 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1749
1750 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1751 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1752 TIPC_LOWER, TIPC_UPPER)
1753 srv.bind(srvaddr)
1754
1755 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1756 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1757 cli.sendto(MSG, sendaddr)
1758
1759 msg, recvaddr = srv.recvfrom(1024)
1760
1761 self.assertEqual(cli.getsockname(), recvaddr)
1762 self.assertEqual(msg, MSG)
1763
1764
1765class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1766 def __init__(self, methodName = 'runTest'):
1767 unittest.TestCase.__init__(self, methodName = methodName)
1768 ThreadableTest.__init__(self)
1769
1770 def setUp(self):
1771 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1772 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1773 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1774 TIPC_LOWER, TIPC_UPPER)
1775 self.srv.bind(srvaddr)
1776 self.srv.listen(5)
1777 self.serverExplicitReady()
1778 self.conn, self.connaddr = self.srv.accept()
1779
1780 def clientSetUp(self):
1781 # The is a hittable race between serverExplicitReady() and the
1782 # accept() call; sleep a little while to avoid it, otherwise
1783 # we could get an exception
1784 time.sleep(0.1)
1785 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1786 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1787 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1788 self.cli.connect(addr)
1789 self.cliaddr = self.cli.getsockname()
1790
1791 def testStream(self):
1792 msg = self.conn.recv(1024)
1793 self.assertEqual(msg, MSG)
1794 self.assertEqual(self.cliaddr, self.connaddr)
1795
1796 def _testStream(self):
1797 self.cli.send(MSG)
1798 self.cli.close()
1799
1800
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001801@unittest.skipUnless(thread, 'Threading required for this test.')
1802class ContextManagersTest(ThreadedTCPSocketTest):
1803
1804 def _testSocketClass(self):
1805 # base test
1806 with socket.socket() as sock:
1807 self.assertFalse(sock._closed)
1808 self.assertTrue(sock._closed)
1809 # close inside with block
1810 with socket.socket() as sock:
1811 sock.close()
1812 self.assertTrue(sock._closed)
1813 # exception inside with block
1814 with socket.socket() as sock:
1815 self.assertRaises(socket.error, sock.sendall, b'foo')
1816 self.assertTrue(sock._closed)
1817
1818 def testCreateConnectionBase(self):
1819 conn, addr = self.serv.accept()
1820 data = conn.recv(1024)
1821 conn.sendall(data)
1822
1823 def _testCreateConnectionBase(self):
1824 address = self.serv.getsockname()
1825 with socket.create_connection(address) as sock:
1826 self.assertFalse(sock._closed)
1827 sock.sendall(b'foo')
1828 self.assertEqual(sock.recv(1024), b'foo')
1829 self.assertTrue(sock._closed)
1830
1831 def testCreateConnectionClose(self):
1832 conn, addr = self.serv.accept()
1833 data = conn.recv(1024)
1834 conn.sendall(data)
1835
1836 def _testCreateConnectionClose(self):
1837 address = self.serv.getsockname()
1838 with socket.create_connection(address) as sock:
1839 sock.close()
1840 self.assertTrue(sock._closed)
1841 self.assertRaises(socket.error, sock.sendall, b'foo')
1842
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001843
Antoine Pitroub1c54962010-10-14 15:05:38 +00001844@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1845 "SOCK_CLOEXEC not defined")
1846@unittest.skipUnless(fcntl, "module fcntl not available")
1847class CloexecConstantTest(unittest.TestCase):
1848 def test_SOCK_CLOEXEC(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001849 v = linux_version()
1850 if v < (2, 6, 28):
1851 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1852 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001853 s = socket.socket(socket.AF_INET,
1854 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1855 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1856 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1857
1858
1859@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1860 "SOCK_NONBLOCK not defined")
1861class NonblockConstantTest(unittest.TestCase):
1862 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1863 if nonblock:
1864 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1865 self.assertEqual(s.gettimeout(), timeout)
1866 else:
1867 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1868 self.assertEqual(s.gettimeout(), None)
1869
1870 def test_SOCK_NONBLOCK(self):
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001871 v = linux_version()
1872 if v < (2, 6, 28):
1873 self.skipTest("Linux kernel 2.6.28 or higher required, not %s"
1874 % ".".join(map(str, v)))
Antoine Pitroub1c54962010-10-14 15:05:38 +00001875 # a lot of it seems silly and redundant, but I wanted to test that
1876 # changing back and forth worked ok
1877 s = socket.socket(socket.AF_INET,
1878 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1879 self.checkNonblock(s)
1880 s.setblocking(1)
1881 self.checkNonblock(s, False)
1882 s.setblocking(0)
1883 self.checkNonblock(s)
1884 s.settimeout(None)
1885 self.checkNonblock(s, False)
1886 s.settimeout(2.0)
1887 self.checkNonblock(s, timeout=2.0)
1888 s.setblocking(1)
1889 self.checkNonblock(s, False)
1890 # defaulttimeout
1891 t = socket.getdefaulttimeout()
1892 socket.setdefaulttimeout(0.0)
1893 self.checkNonblock(socket.socket())
1894 socket.setdefaulttimeout(None)
1895 self.checkNonblock(socket.socket(), False)
1896 socket.setdefaulttimeout(2.0)
1897 self.checkNonblock(socket.socket(), timeout=2.0)
1898 socket.setdefaulttimeout(None)
1899 self.checkNonblock(socket.socket(), False)
1900 socket.setdefaulttimeout(t)
1901
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001902
Guido van Rossumb995eb72002-07-31 16:08:40 +00001903def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001904 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001905 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001906
1907 tests.extend([
1908 NonBlockingTCPTests,
1909 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001910 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001911 UnbufferedFileObjectClassTestCase,
1912 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001913 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001914 UnicodeReadFileObjectClassTestCase,
1915 UnicodeWriteFileObjectClassTestCase,
1916 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001917 NetworkConnectionNoServer,
1918 NetworkConnectionAttributesTest,
1919 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001920 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001921 CloexecConstantTest,
1922 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001923 ])
Dave Cole331708b2004-08-09 04:51:41 +00001924 if hasattr(socket, "socketpair"):
1925 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001926 if sys.platform == 'linux2':
1927 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001928 if isTipcAvailable():
1929 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001930 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001931
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001932 thread_info = support.threading_setup()
1933 support.run_unittest(*tests)
1934 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001935
1936if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001937 test_main()