blob: 81f9cdf7f213afbb9fc358a40d719584ab679935 [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 Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000020def try_address(host, port=0, family=socket.AF_INET):
21 """Try to bind a socket on the given host:port and return True
22 if that has been possible."""
23 try:
24 sock = socket.socket(family, socket.SOCK_STREAM)
25 sock.bind((host, port))
26 except (socket.error, socket.gaierror):
27 return False
28 else:
29 sock.close()
30 return True
31
Benjamin Petersonee8712c2008-05-20 21:35:26 +000032HOST = support.HOST
Guido van Rossum7d0a8262007-05-21 23:13:11 +000033MSG = b'Michael Gilfix was here\n'
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000034SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Victor Stinner45df8202010-04-28 22:31:17 +000036try:
37 import _thread as thread
38 import threading
39except ImportError:
40 thread = None
41 threading = None
42
Guido van Rossum24e4af82002-06-12 19:18:08 +000043class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000044
Guido van Rossum24e4af82002-06-12 19:18:08 +000045 def setUp(self):
46 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000047 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000048 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 def tearDown(self):
51 self.serv.close()
52 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000053
Guido van Rossum24e4af82002-06-12 19:18:08 +000054class SocketUDPTest(unittest.TestCase):
55
56 def setUp(self):
57 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000058 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000059
60 def tearDown(self):
61 self.serv.close()
62 self.serv = None
63
64class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000065 """Threadable Test class
66
67 The ThreadableTest class makes it easy to create a threaded
68 client/server pair from an existing unit test. To create a
69 new threaded class from an existing unit test, use multiple
70 inheritance:
71
72 class NewClass (OldClass, ThreadableTest):
73 pass
74
75 This class defines two new fixture functions with obvious
76 purposes for overriding:
77
78 clientSetUp ()
79 clientTearDown ()
80
81 Any new test functions within the class must then define
82 tests in pairs, where the test name is preceeded with a
83 '_' to indicate the client portion of the test. Ex:
84
85 def testFoo(self):
86 # Server portion
87
88 def _testFoo(self):
89 # Client portion
90
91 Any exceptions raised by the clients during their tests
92 are caught and transferred to the main thread to alert
93 the testing framework.
94
95 Note, the server setup function cannot call any blocking
96 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000097 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000098 the blocking call (such as in setting up a client/server
99 connection and performing the accept() in setUp().
100 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000101
102 def __init__(self):
103 # Swap the true setup function
104 self.__setUp = self.setUp
105 self.__tearDown = self.tearDown
106 self.setUp = self._setUp
107 self.tearDown = self._tearDown
108
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000109 def serverExplicitReady(self):
110 """This method allows the server to explicitly indicate that
111 it wants the client thread to proceed. This is useful if the
112 server is about to execute a blocking routine that is
113 dependent upon the client thread during its setup routine."""
114 self.server_ready.set()
115
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000117 self.server_ready = threading.Event()
118 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000119 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000120 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121
122 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000123 methodname = self.id()
124 i = methodname.rfind('.')
125 methodname = methodname[i+1:]
126 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000127 self.client_thread = thread.start_new_thread(
128 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129
130 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000131 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000132 self.server_ready.set()
133 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000134
135 def _tearDown(self):
136 self.__tearDown()
137 self.done.wait()
138
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000139 if self.queue.qsize():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140 msg = self.queue.get()
141 self.fail(msg)
142
143 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000144 self.server_ready.wait()
145 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000146 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000147 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000148 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149 try:
150 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000151 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152 self.queue.put(strerror)
153 self.clientTearDown()
154
155 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000156 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000157
158 def clientTearDown(self):
159 self.done.set()
160 thread.exit()
161
162class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
163
164 def __init__(self, methodName='runTest'):
165 SocketTCPTest.__init__(self, methodName=methodName)
166 ThreadableTest.__init__(self)
167
168 def clientSetUp(self):
169 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
170
171 def clientTearDown(self):
172 self.cli.close()
173 self.cli = None
174 ThreadableTest.clientTearDown(self)
175
176class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
177
178 def __init__(self, methodName='runTest'):
179 SocketUDPTest.__init__(self, methodName=methodName)
180 ThreadableTest.__init__(self)
181
182 def clientSetUp(self):
183 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
184
185class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000186 """Socket tests for client-server connection.
187
188 self.cli_conn is a client socket connected to the server. The
189 setUp() method guarantees that it is connected to the server.
190 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191
192 def __init__(self, methodName='runTest'):
193 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
194
195 def setUp(self):
196 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000197 # Indicate explicitly we're ready for the client thread to
198 # proceed and then perform the blocking call to accept
199 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000200 conn, addr = self.serv.accept()
201 self.cli_conn = conn
202
203 def tearDown(self):
204 self.cli_conn.close()
205 self.cli_conn = None
206 ThreadedTCPSocketTest.tearDown(self)
207
208 def clientSetUp(self):
209 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000210 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211 self.serv_conn = self.cli
212
213 def clientTearDown(self):
214 self.serv_conn.close()
215 self.serv_conn = None
216 ThreadedTCPSocketTest.clientTearDown(self)
217
Dave Cole331708b2004-08-09 04:51:41 +0000218class SocketPairTest(unittest.TestCase, ThreadableTest):
219
220 def __init__(self, methodName='runTest'):
221 unittest.TestCase.__init__(self, methodName=methodName)
222 ThreadableTest.__init__(self)
223
224 def setUp(self):
225 self.serv, self.cli = socket.socketpair()
226
227 def tearDown(self):
228 self.serv.close()
229 self.serv = None
230
231 def clientSetUp(self):
232 pass
233
234 def clientTearDown(self):
235 self.cli.close()
236 self.cli = None
237 ThreadableTest.clientTearDown(self)
238
Tim Peters494aaee2004-08-09 18:54:11 +0000239
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240#######################################################################
241## Begin Tests
242
243class GeneralModuleTests(unittest.TestCase):
244
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000245 def test_repr(self):
246 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000247 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000248
Raymond Hettinger027bb632004-05-31 03:09:25 +0000249 def test_weakref(self):
250 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
251 p = proxy(s)
252 self.assertEqual(p.fileno(), s.fileno())
253 s.close()
254 s = None
255 try:
256 p.fileno()
257 except ReferenceError:
258 pass
259 else:
260 self.fail('Socket proxy still exists')
261
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000263 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def raise_error(*args, **kwargs):
265 raise socket.error
266 def raise_herror(*args, **kwargs):
267 raise socket.herror
268 def raise_gaierror(*args, **kwargs):
269 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000270 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000272 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
276
277 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000278 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 socket.AF_INET
280 socket.SOCK_STREAM
281 socket.SOCK_DGRAM
282 socket.SOCK_RAW
283 socket.SOCK_RDM
284 socket.SOCK_SEQPACKET
285 socket.SOL_SOCKET
286 socket.SO_REUSEADDR
287
Guido van Rossum654c11e2002-06-13 20:24:17 +0000288 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000289 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000291 try:
292 ip = socket.gethostbyname(hostname)
293 except socket.error:
294 # Probably name lookup wasn't set up right; skip this test
295 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000296 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000297 try:
298 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
299 except socket.error:
300 # Probably a similar problem as above; skip this test
301 return
Brett Cannon01668a12005-03-11 00:04:17 +0000302 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000303 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000304 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000305 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000306
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000307 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000308 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000309 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310 try:
311 # On some versions, this loses a reference
312 orig = sys.getrefcount(__name__)
313 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000314 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000315 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000317
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000319 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 try:
321 # On some versions, this crashes the interpreter.
322 socket.getnameinfo(('x', 0, 0, 0), 0)
323 except socket.error:
324 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000325
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000326 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000327 # This just checks that htons etc. are their own inverse,
328 # when looking at the lower 16 or 32 bits.
329 sizes = {socket.htonl: 32, socket.ntohl: 32,
330 socket.htons: 16, socket.ntohs: 16}
331 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000332 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000333 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
334 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000335
Guido van Rossuma2627af2002-09-14 00:58:46 +0000336 swapped = func(mask)
337 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000338 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000339
Guido van Rossum018919a2007-01-15 00:07:32 +0000340 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000341 good_values = [ 1, 2, 3, 1, 2, 3 ]
342 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000343 for k in good_values:
344 socket.ntohl(k)
345 socket.ntohs(k)
346 socket.htonl(k)
347 socket.htons(k)
348 for k in bad_values:
349 self.assertRaises(OverflowError, socket.ntohl, k)
350 self.assertRaises(OverflowError, socket.ntohs, k)
351 self.assertRaises(OverflowError, socket.htonl, k)
352 self.assertRaises(OverflowError, socket.htons, k)
353
Barry Warsaw11b91a02004-06-28 00:50:43 +0000354 def testGetServBy(self):
355 eq = self.assertEqual
356 # Find one service that exists, then check all the related interfaces.
357 # I've ordered this by protocols that have both a tcp and udp
358 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000359 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000360 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000361 # avoid the 'echo' service on this platform, as there is an
362 # assumption breaking non-standard port/protocol entry
363 services = ('daytime', 'qotd', 'domain')
364 else:
365 services = ('echo', 'daytime', 'domain')
366 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000367 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000368 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000369 break
370 except socket.error:
371 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000372 else:
373 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000374 # Try same call with optional protocol omitted
375 port2 = socket.getservbyname(service)
376 eq(port, port2)
377 # Try udp, but don't barf it it doesn't exist
378 try:
379 udpport = socket.getservbyname(service, 'udp')
380 except socket.error:
381 udpport = None
382 else:
383 eq(udpport, port)
384 # Now make sure the lookup by port returns the same service name
385 eq(socket.getservbyport(port2), service)
386 eq(socket.getservbyport(port, 'tcp'), service)
387 if udpport is not None:
388 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000389 # Make sure getservbyport does not accept out of range ports.
390 self.assertRaises(OverflowError, socket.getservbyport, -1)
391 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000392
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000393 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000394 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000395 # The default timeout should initially be None
396 self.assertEqual(socket.getdefaulttimeout(), None)
397 s = socket.socket()
398 self.assertEqual(s.gettimeout(), None)
399 s.close()
400
401 # Set the default timeout to 10, and see if it propagates
402 socket.setdefaulttimeout(10)
403 self.assertEqual(socket.getdefaulttimeout(), 10)
404 s = socket.socket()
405 self.assertEqual(s.gettimeout(), 10)
406 s.close()
407
408 # Reset the default timeout to None, and see if it propagates
409 socket.setdefaulttimeout(None)
410 self.assertEqual(socket.getdefaulttimeout(), None)
411 s = socket.socket()
412 self.assertEqual(s.gettimeout(), None)
413 s.close()
414
415 # Check that setting it to an invalid value raises ValueError
416 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
417
418 # Check that setting it to an invalid type raises TypeError
419 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
420
Benjamin Petersonf91df042009-02-13 02:50:59 +0000421 def testIPv4_inet_aton_fourbytes(self):
422 if not hasattr(socket, 'inet_aton'):
423 return # No inet_aton, nothing to check
424 # Test that issue1008086 and issue767150 are fixed.
425 # It must return 4 bytes.
426 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
427 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
428
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000429 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000430 if not hasattr(socket, 'inet_pton'):
431 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000432 from socket import inet_aton as f, inet_pton, AF_INET
433 g = lambda a: inet_pton(AF_INET, a)
434
Guido van Rossumb5b22702007-05-18 18:55:53 +0000435 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
436 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
437 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
438 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
439 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000440
Guido van Rossumb5b22702007-05-18 18:55:53 +0000441 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
442 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
443 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
444 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000445
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 def testIPv6toString(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 try:
450 from socket import inet_pton, AF_INET6, has_ipv6
451 if not has_ipv6:
452 return
453 except ImportError:
454 return
455 f = lambda a: inet_pton(AF_INET6, a)
456
Guido van Rossum540d9872007-08-17 03:51:09 +0000457 self.assertEquals(b'\x00' * 16, f('::'))
458 self.assertEquals(b'\x00' * 16, f('0::0'))
459 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000460 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000461 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 +0000462 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
463 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000464
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000465 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000466 if not hasattr(socket, 'inet_ntop'):
467 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000468 from socket import inet_ntoa as f, inet_ntop, AF_INET
469 g = lambda a: inet_ntop(AF_INET, a)
470
Guido van Rossumb5b22702007-05-18 18:55:53 +0000471 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
472 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
473 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
474 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000475
Guido van Rossumb5b22702007-05-18 18:55:53 +0000476 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
477 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
478 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000479
480 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000481 if not hasattr(socket, 'inet_ntop'):
482 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000483 try:
484 from socket import inet_ntop, AF_INET6, has_ipv6
485 if not has_ipv6:
486 return
487 except ImportError:
488 return
489 f = lambda a: inet_ntop(AF_INET6, a)
490
Guido van Rossum540d9872007-08-17 03:51:09 +0000491 self.assertEquals('::', f(b'\x00' * 16))
492 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000493 self.assertEquals(
494 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000495 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 +0000496 )
497
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000498 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000499
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000500 def _get_unused_port(self, bind_address='0.0.0.0'):
501 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000502
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000503 Args:
504 bind_address: Hostname or IP address to search for a port on.
505
506 Returns: A most likely to be unused port.
507 """
508 tempsock = socket.socket()
509 tempsock.bind((bind_address, 0))
510 host, port = tempsock.getsockname()
511 tempsock.close()
512 return port
513
514 def testSockName(self):
515 # Testing getsockname()
516 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000518 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000520 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
521 # it reasonable to get the host's addr in addition to 0.0.0.0.
522 # At least for eCos. This is required for the S/390 to pass.
523 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000524 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000525 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
527 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000528 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000529 # We know a socket should start without reuse==0
530 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
531 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000532 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533
534 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000535 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000536 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
537 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
538 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000539 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000541 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000542 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000543 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
544 sock.settimeout(1)
545 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000546 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000547
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000548 def testNewAttributes(self):
549 # testing .family, .type and .protocol
550 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
551 self.assertEqual(sock.family, socket.AF_INET)
552 self.assertEqual(sock.type, socket.SOCK_STREAM)
553 self.assertEqual(sock.proto, 0)
554 sock.close()
555
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000556 def test_getsockaddrarg(self):
557 host = '0.0.0.0'
558 port = self._get_unused_port(bind_address=host)
559 big_port = port + 65536
560 neg_port = port - 65536
561 sock = socket.socket()
562 try:
563 self.assertRaises(OverflowError, sock.bind, (host, big_port))
564 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
565 sock.bind((host, port))
566 finally:
567 sock.close()
568
Christian Heimesfaf2f632008-01-06 16:59:19 +0000569 def test_sock_ioctl(self):
570 if os.name != "nt":
571 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000572 self.assertTrue(hasattr(socket.socket, 'ioctl'))
573 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
574 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
575 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000576 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
577 s = socket.socket()
578 self.assertRaises(ValueError, s.ioctl, -1, None)
579 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000580
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000581 def testGetaddrinfo(self):
582 try:
583 socket.getaddrinfo('localhost', 80)
584 except socket.gaierror as err:
585 if err.errno == socket.EAI_SERVICE:
586 # see http://bugs.python.org/issue1282647
587 self.skipTest("buggy libc version")
588 raise
589 # len of every sequence is supposed to be == 5
590 for info in socket.getaddrinfo(HOST, None):
591 self.assertEqual(len(info), 5)
592 # host can be a domain name, a string representation of an
593 # IPv4/v6 address or None
594 socket.getaddrinfo('localhost', 80)
595 socket.getaddrinfo('127.0.0.1', 80)
596 socket.getaddrinfo(None, 80)
597 if SUPPORTS_IPV6:
598 socket.getaddrinfo('::1', 80)
599 # port can be a string service name such as "http", a numeric
600 # port number or None
601 socket.getaddrinfo(HOST, "http")
602 socket.getaddrinfo(HOST, 80)
603 socket.getaddrinfo(HOST, None)
604 # test family and socktype filters
605 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
606 for family, _, _, _, _ in infos:
607 self.assertEqual(family, socket.AF_INET)
608 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
609 for _, socktype, _, _, _ in infos:
610 self.assertEqual(socktype, socket.SOCK_STREAM)
611 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000612 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000613 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
614 # a server willing to support both IPv4 and IPv6 will
615 # usually do this
616 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
617 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000618 # test keyword arguments
619 a = socket.getaddrinfo(HOST, None)
620 b = socket.getaddrinfo(host=HOST, port=None)
621 self.assertEqual(a, b)
622 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
623 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
624 self.assertEqual(a, b)
625 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
626 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
627 self.assertEqual(a, b)
628 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
629 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
630 self.assertEqual(a, b)
631 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
632 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
633 self.assertEqual(a, b)
634 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
635 socket.AI_PASSIVE)
636 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
637 type=socket.SOCK_STREAM, proto=0,
638 flags=socket.AI_PASSIVE)
639 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000640
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000641 def test_getnameinfo(self):
642 # only IP addresses are allowed
643 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
644
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000645 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000646 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000647 # these should all be successful
648 socket.gethostbyname('испытание.python.org')
649 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000650 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
651 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
652 # have a reverse entry yet
653 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000654
Victor Stinner45df8202010-04-28 22:31:17 +0000655@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000656class BasicTCPTest(SocketConnectedTest):
657
658 def __init__(self, methodName='runTest'):
659 SocketConnectedTest.__init__(self, methodName=methodName)
660
661 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000662 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000664 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665
666 def _testRecv(self):
667 self.serv_conn.send(MSG)
668
669 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000670 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000671 seg1 = self.cli_conn.recv(len(MSG) - 3)
672 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000673 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000674 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000675
676 def _testOverFlowRecv(self):
677 self.serv_conn.send(MSG)
678
679 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000680 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000682 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000683
684 def _testRecvFrom(self):
685 self.serv_conn.send(MSG)
686
687 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000688 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
690 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000691 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000692 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000693
694 def _testOverFlowRecvFrom(self):
695 self.serv_conn.send(MSG)
696
697 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000698 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000699 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 while 1:
701 read = self.cli_conn.recv(1024)
702 if not read:
703 break
Guido van Rossume531e292002-08-08 20:28:34 +0000704 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000705 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706
707 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000708 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 self.serv_conn.sendall(big_chunk)
710
711 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000712 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 fd = self.cli_conn.fileno()
714 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
715 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000716 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717
718 def _testFromFd(self):
719 self.serv_conn.send(MSG)
720
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000721 def testDup(self):
722 # Testing dup()
723 sock = self.cli_conn.dup()
724 msg = sock.recv(1024)
725 self.assertEqual(msg, MSG)
726
727 def _testDup(self):
728 self.serv_conn.send(MSG)
729
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000731 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000733 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000734 # wait for _testShutdown to finish: on OS X, when the server
735 # closes the connection the client also becomes disconnected,
736 # and the client's shutdown call will fail. (Issue #4397.)
737 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738
739 def _testShutdown(self):
740 self.serv_conn.send(MSG)
741 self.serv_conn.shutdown(2)
742
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000743 def testDetach(self):
744 # Testing detach()
745 fileno = self.cli_conn.fileno()
746 f = self.cli_conn.detach()
747 self.assertEqual(f, fileno)
748 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000749 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
750 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000751 # ...but we can create another socket using the (still open)
752 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000753 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
754 msg = sock.recv(1024)
755 self.assertEqual(msg, MSG)
756
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000757 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000758 self.serv_conn.send(MSG)
759
Victor Stinner45df8202010-04-28 22:31:17 +0000760@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761class BasicUDPTest(ThreadedUDPSocketTest):
762
763 def __init__(self, methodName='runTest'):
764 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
765
766 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000769 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770
771 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000772 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773
Guido van Rossum1c938012002-06-12 21:17:20 +0000774 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000775 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000777 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778
Guido van Rossum1c938012002-06-12 21:17:20 +0000779 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000780 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781
Guido van Rossumd8faa362007-04-27 19:54:29 +0000782 def testRecvFromNegative(self):
783 # Negative lengths passed to recvfrom should give ValueError.
784 self.assertRaises(ValueError, self.serv.recvfrom, -1)
785
786 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000787 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000788
Victor Stinner45df8202010-04-28 22:31:17 +0000789@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000790class TCPCloserTest(ThreadedTCPSocketTest):
791
792 def testClose(self):
793 conn, addr = self.serv.accept()
794 conn.close()
795
796 sd = self.cli
797 read, write, err = select.select([sd], [], [], 1.0)
798 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000799 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000800
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000801 # Calling close() many times should be safe.
802 conn.close()
803 conn.close()
804
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000805 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000806 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000807 time.sleep(1.0)
808
Victor Stinner45df8202010-04-28 22:31:17 +0000809@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000810class BasicSocketPairTest(SocketPairTest):
811
812 def __init__(self, methodName='runTest'):
813 SocketPairTest.__init__(self, methodName=methodName)
814
815 def testRecv(self):
816 msg = self.serv.recv(1024)
817 self.assertEqual(msg, MSG)
818
819 def _testRecv(self):
820 self.cli.send(MSG)
821
822 def testSend(self):
823 self.serv.send(MSG)
824
825 def _testSend(self):
826 msg = self.cli.recv(1024)
827 self.assertEqual(msg, MSG)
828
Victor Stinner45df8202010-04-28 22:31:17 +0000829@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830class NonBlockingTCPTests(ThreadedTCPSocketTest):
831
832 def __init__(self, methodName='runTest'):
833 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
834
835 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000836 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000837 self.serv.setblocking(0)
838 start = time.time()
839 try:
840 self.serv.accept()
841 except socket.error:
842 pass
843 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000844 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000845
846 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000847 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000848
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000850 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000852 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 conn, addr = self.serv.accept()
854 except socket.error:
855 pass
856 else:
857 self.fail("Error trying to do non-blocking accept.")
858 read, write, err = select.select([self.serv], [], [])
859 if self.serv in read:
860 conn, addr = self.serv.accept()
861 else:
862 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000863
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000865 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000866 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867
868 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 conn, addr = self.serv.accept()
871
872 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000873 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000874 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000875
876 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000877 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 conn, addr = self.serv.accept()
879 conn.setblocking(0)
880 try:
881 msg = conn.recv(len(MSG))
882 except socket.error:
883 pass
884 else:
885 self.fail("Error trying to do non-blocking recv.")
886 read, write, err = select.select([conn], [], [])
887 if conn in read:
888 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000889 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 else:
891 self.fail("Error during select call to non-blocking socket.")
892
893 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000894 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000895 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896 self.cli.send(MSG)
897
Victor Stinner45df8202010-04-28 22:31:17 +0000898@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000899class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000900 """Unit tests for the object returned by socket.makefile()
901
902 self.serv_file is the io object returned by makefile() on
903 the client connection. You can read from this file to
904 get output from the server.
905
906 self.cli_file is the io object returned by makefile() on the
907 server connection. You can write to this file to send output
908 to the client.
909 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000910
Guido van Rossume9f66142002-08-07 15:46:19 +0000911 bufsize = -1 # Use default buffer size
912
Guido van Rossum24e4af82002-06-12 19:18:08 +0000913 def __init__(self, methodName='runTest'):
914 SocketConnectedTest.__init__(self, methodName=methodName)
915
916 def setUp(self):
917 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000918 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919
920 def tearDown(self):
921 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000922 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923 self.serv_file = None
924 SocketConnectedTest.tearDown(self)
925
926 def clientSetUp(self):
927 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000928 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929
930 def clientTearDown(self):
931 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000932 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 self.cli_file = None
934 SocketConnectedTest.clientTearDown(self)
935
936 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000937 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938 first_seg = self.serv_file.read(len(MSG)-3)
939 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000940 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000941 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942
943 def _testSmallRead(self):
944 self.cli_file.write(MSG)
945 self.cli_file.flush()
946
Guido van Rossum8c943832002-08-08 01:00:28 +0000947 def testFullRead(self):
948 # read until EOF
949 msg = self.serv_file.read()
950 self.assertEqual(msg, MSG)
951
952 def _testFullRead(self):
953 self.cli_file.write(MSG)
954 self.cli_file.close()
955
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000957 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000958 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000959 while 1:
960 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000961 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000962 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000963 buf += char
964 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000965
966 def _testUnbufferedRead(self):
967 self.cli_file.write(MSG)
968 self.cli_file.flush()
969
970 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000971 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000972 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000973 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974
975 def _testReadline(self):
976 self.cli_file.write(MSG)
977 self.cli_file.flush()
978
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000979 def testCloseAfterMakefile(self):
980 # The file returned by makefile should keep the socket open.
981 self.cli_conn.close()
982 # read until EOF
983 msg = self.serv_file.read()
984 self.assertEqual(msg, MSG)
985
986 def _testCloseAfterMakefile(self):
987 self.cli_file.write(MSG)
988 self.cli_file.flush()
989
990 def testMakefileAfterMakefileClose(self):
991 self.serv_file.close()
992 msg = self.cli_conn.recv(len(MSG))
993 self.assertEqual(msg, MSG)
994
995 def _testMakefileAfterMakefileClose(self):
996 self.cli_file.write(MSG)
997 self.cli_file.flush()
998
Tim Peters116d83c2004-03-28 02:20:45 +0000999 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001000 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001001
1002 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001003 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001004
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001005 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001006 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001007 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
1008
1009 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001010 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001011 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
1012
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001013 def testRealClose(self):
1014 self.serv_file.close()
1015 self.assertRaises(ValueError, self.serv_file.fileno)
1016 self.cli_conn.close()
1017 self.assertRaises(socket.error, self.cli_conn.getsockname)
1018
1019 def _testRealClose(self):
1020 pass
1021
1022
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001023class FileObjectInterruptedTestCase(unittest.TestCase):
1024 """Test that the file object correctly handles EINTR internally."""
1025
1026 class MockSocket(object):
1027 def __init__(self, recv_funcs=()):
1028 # A generator that returns callables that we'll call for each
1029 # call to recv().
1030 self._recv_step = iter(recv_funcs)
1031
1032 def recv_into(self, buffer):
1033 data = next(self._recv_step)()
1034 assert len(buffer) >= len(data)
1035 buffer[:len(data)] = data
1036 return len(data)
1037
1038 def _decref_socketios(self):
1039 pass
1040
1041 def _textiowrap_for_test(self, buffering=-1):
1042 raw = socket.SocketIO(self, "r")
1043 if buffering < 0:
1044 buffering = io.DEFAULT_BUFFER_SIZE
1045 if buffering == 0:
1046 return raw
1047 buffer = io.BufferedReader(raw, buffering)
1048 text = io.TextIOWrapper(buffer, None, None)
1049 text.mode = "rb"
1050 return text
1051
1052 @staticmethod
1053 def _raise_eintr():
1054 raise socket.error(errno.EINTR)
1055
1056 def _textiowrap_mock_socket(self, mock, buffering=-1):
1057 raw = socket.SocketIO(mock, "r")
1058 if buffering < 0:
1059 buffering = io.DEFAULT_BUFFER_SIZE
1060 if buffering == 0:
1061 return raw
1062 buffer = io.BufferedReader(raw, buffering)
1063 text = io.TextIOWrapper(buffer, None, None)
1064 text.mode = "rb"
1065 return text
1066
1067 def _test_readline(self, size=-1, buffering=-1):
1068 mock_sock = self.MockSocket(recv_funcs=[
1069 lambda : b"This is the first line\nAnd the sec",
1070 self._raise_eintr,
1071 lambda : b"ond line is here\n",
1072 lambda : b"",
1073 lambda : b"", # XXX(gps): io library does an extra EOF read
1074 ])
1075 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1076 self.assertEquals(fo.readline(size), "This is the first line\n")
1077 self.assertEquals(fo.readline(size), "And the second line is here\n")
1078
1079 def _test_read(self, size=-1, buffering=-1):
1080 mock_sock = self.MockSocket(recv_funcs=[
1081 lambda : b"This is the first line\nAnd the sec",
1082 self._raise_eintr,
1083 lambda : b"ond line is here\n",
1084 lambda : b"",
1085 lambda : b"", # XXX(gps): io library does an extra EOF read
1086 ])
1087 expecting = (b"This is the first line\n"
1088 b"And the second line is here\n")
1089 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1090 if buffering == 0:
1091 data = b''
1092 else:
1093 data = ''
1094 expecting = expecting.decode('utf8')
1095 while len(data) != len(expecting):
1096 part = fo.read(size)
1097 if not part:
1098 break
1099 data += part
1100 self.assertEquals(data, expecting)
1101
1102 def test_default(self):
1103 self._test_readline()
1104 self._test_readline(size=100)
1105 self._test_read()
1106 self._test_read(size=100)
1107
1108 def test_with_1k_buffer(self):
1109 self._test_readline(buffering=1024)
1110 self._test_readline(size=100, buffering=1024)
1111 self._test_read(buffering=1024)
1112 self._test_read(size=100, buffering=1024)
1113
1114 def _test_readline_no_buffer(self, size=-1):
1115 mock_sock = self.MockSocket(recv_funcs=[
1116 lambda : b"a",
1117 lambda : b"\n",
1118 lambda : b"B",
1119 self._raise_eintr,
1120 lambda : b"b",
1121 lambda : b"",
1122 ])
1123 fo = mock_sock._textiowrap_for_test(buffering=0)
1124 self.assertEquals(fo.readline(size), b"a\n")
1125 self.assertEquals(fo.readline(size), b"Bb")
1126
1127 def test_no_buffer(self):
1128 self._test_readline_no_buffer()
1129 self._test_readline_no_buffer(size=4)
1130 self._test_read(buffering=0)
1131 self._test_read(size=100, buffering=0)
1132
1133
Guido van Rossume9f66142002-08-07 15:46:19 +00001134class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1135
1136 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001137
Guido van Rossume9f66142002-08-07 15:46:19 +00001138 In this case (and in this case only), it should be possible to
1139 create a file object, read a line from it, create another file
1140 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001141 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001142 when reading multiple requests from the same socket."""
1143
1144 bufsize = 0 # Use unbuffered mode
1145
1146 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001147 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001148 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001149 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001150 self.serv_file = self.cli_conn.makefile('rb', 0)
1151 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001152 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001153
1154 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001155 self.cli_file.write(b"A. " + MSG)
1156 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001157 self.cli_file.flush()
1158
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001159 def testMakefileClose(self):
1160 # The file returned by makefile should keep the socket open...
1161 self.cli_conn.close()
1162 msg = self.cli_conn.recv(1024)
1163 self.assertEqual(msg, MSG)
1164 # ...until the file is itself closed
1165 self.serv_file.close()
1166 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1167
1168 def _testMakefileClose(self):
1169 self.cli_file.write(MSG)
1170 self.cli_file.flush()
1171
1172 def testMakefileCloseSocketDestroy(self):
1173 refcount_before = sys.getrefcount(self.cli_conn)
1174 self.serv_file.close()
1175 refcount_after = sys.getrefcount(self.cli_conn)
1176 self.assertEqual(refcount_before - 1, refcount_after)
1177
1178 def _testMakefileCloseSocketDestroy(self):
1179 pass
1180
1181
Guido van Rossum8c943832002-08-08 01:00:28 +00001182class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1183
1184 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1185
1186
1187class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1188
1189 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001190
Thomas Woutersb2137042007-02-01 18:02:27 +00001191
Guido van Rossumd8faa362007-04-27 19:54:29 +00001192class NetworkConnectionTest(object):
1193 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001194
Guido van Rossumd8faa362007-04-27 19:54:29 +00001195 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001196 # We're inherited below by BasicTCPTest2, which also inherits
1197 # BasicTCPTest, which defines self.port referenced below.
1198 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001199 self.serv_conn = self.cli
1200
1201class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1202 """Tests that NetworkConnection does not break existing TCP functionality.
1203 """
1204
1205class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001206
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001207 class MockSocket(socket.socket):
1208 def connect(self, *args):
1209 raise socket.timeout('timed out')
1210
1211 @contextlib.contextmanager
1212 def mocked_socket_module(self):
1213 """Return a socket which times out on connect"""
1214 old_socket = socket.socket
1215 socket.socket = self.MockSocket
1216 try:
1217 yield
1218 finally:
1219 socket.socket = old_socket
1220
1221 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001222 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001223 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1224 with self.assertRaises(socket.error) as cm:
1225 cli.connect((HOST, port))
1226 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1227
1228 def test_create_connection(self):
1229 # Issue #9792: errors raised by create_connection() should have
1230 # a proper errno attribute.
1231 port = support.find_unused_port()
1232 with self.assertRaises(socket.error) as cm:
1233 socket.create_connection((HOST, port))
1234 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1235
1236 def test_create_connection_timeout(self):
1237 # Issue #9792: create_connection() should not recast timeout errors
1238 # as generic socket errors.
1239 with self.mocked_socket_module():
1240 with self.assertRaises(socket.timeout):
1241 socket.create_connection((HOST, 1234))
1242
Guido van Rossumd8faa362007-04-27 19:54:29 +00001243
Victor Stinner45df8202010-04-28 22:31:17 +00001244@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001245class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1246
1247 def __init__(self, methodName='runTest'):
1248 SocketTCPTest.__init__(self, methodName=methodName)
1249 ThreadableTest.__init__(self)
1250
1251 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001252 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001253
1254 def clientTearDown(self):
1255 self.cli.close()
1256 self.cli = None
1257 ThreadableTest.clientTearDown(self)
1258
1259 def _justAccept(self):
1260 conn, addr = self.serv.accept()
1261
1262 testFamily = _justAccept
1263 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001264 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001265 self.assertEqual(self.cli.family, 2)
1266
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001267 testSourceAddress = _justAccept
1268 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001269 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1270 source_address=('', self.source_port))
1271 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001272 # The port number being used is sufficient to show that the bind()
1273 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001274
Guido van Rossumd8faa362007-04-27 19:54:29 +00001275 testTimeoutDefault = _justAccept
1276 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001277 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001278 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001279 socket.setdefaulttimeout(42)
1280 try:
1281 self.cli = socket.create_connection((HOST, self.port))
1282 finally:
1283 socket.setdefaulttimeout(None)
1284 self.assertEquals(self.cli.gettimeout(), 42)
1285
1286 testTimeoutNone = _justAccept
1287 def _testTimeoutNone(self):
1288 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001289 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001290 socket.setdefaulttimeout(30)
1291 try:
1292 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1293 finally:
1294 socket.setdefaulttimeout(None)
1295 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001296
1297 testTimeoutValueNamed = _justAccept
1298 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001299 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001300 self.assertEqual(self.cli.gettimeout(), 30)
1301
1302 testTimeoutValueNonamed = _justAccept
1303 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001304 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001305 self.assertEqual(self.cli.gettimeout(), 30)
1306
Victor Stinner45df8202010-04-28 22:31:17 +00001307@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001308class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1309
1310 def __init__(self, methodName='runTest'):
1311 SocketTCPTest.__init__(self, methodName=methodName)
1312 ThreadableTest.__init__(self)
1313
1314 def clientSetUp(self):
1315 pass
1316
1317 def clientTearDown(self):
1318 self.cli.close()
1319 self.cli = None
1320 ThreadableTest.clientTearDown(self)
1321
1322 def testInsideTimeout(self):
1323 conn, addr = self.serv.accept()
1324 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001325 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001326 testOutsideTimeout = testInsideTimeout
1327
1328 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001329 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001330 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001331 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001332
1333 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001334 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001335 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001336
1337
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001338class TCPTimeoutTest(SocketTCPTest):
1339
1340 def testTCPTimeout(self):
1341 def raise_timeout(*args, **kwargs):
1342 self.serv.settimeout(1.0)
1343 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001344 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001345 "Error generating a timeout exception (TCP)")
1346
1347 def testTimeoutZero(self):
1348 ok = False
1349 try:
1350 self.serv.settimeout(0.0)
1351 foo = self.serv.accept()
1352 except socket.timeout:
1353 self.fail("caught timeout instead of error (TCP)")
1354 except socket.error:
1355 ok = True
1356 except:
1357 self.fail("caught unexpected exception (TCP)")
1358 if not ok:
1359 self.fail("accept() returned success when we did not expect it")
1360
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001361 def testInterruptedTimeout(self):
1362 # XXX I don't know how to do this test on MSWindows or any other
1363 # plaform that doesn't support signal.alarm() or os.kill(), though
1364 # the bug should have existed on all platforms.
1365 if not hasattr(signal, "alarm"):
1366 return # can only test on *nix
1367 self.serv.settimeout(5.0) # must be longer than alarm
1368 class Alarm(Exception):
1369 pass
1370 def alarm_handler(signal, frame):
1371 raise Alarm
1372 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1373 try:
1374 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1375 try:
1376 foo = self.serv.accept()
1377 except socket.timeout:
1378 self.fail("caught timeout instead of Alarm")
1379 except Alarm:
1380 pass
1381 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001382 self.fail("caught other exception instead of Alarm:"
1383 " %s(%s):\n%s" %
1384 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001385 else:
1386 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001387 finally:
1388 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001389 except Alarm:
1390 self.fail("got Alarm in wrong place")
1391 finally:
1392 # no alarm can be pending. Safe to restore old handler.
1393 signal.signal(signal.SIGALRM, old_alarm)
1394
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001395class UDPTimeoutTest(SocketTCPTest):
1396
1397 def testUDPTimeout(self):
1398 def raise_timeout(*args, **kwargs):
1399 self.serv.settimeout(1.0)
1400 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001401 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001402 "Error generating a timeout exception (UDP)")
1403
1404 def testTimeoutZero(self):
1405 ok = False
1406 try:
1407 self.serv.settimeout(0.0)
1408 foo = self.serv.recv(1024)
1409 except socket.timeout:
1410 self.fail("caught timeout instead of error (UDP)")
1411 except socket.error:
1412 ok = True
1413 except:
1414 self.fail("caught unexpected exception (UDP)")
1415 if not ok:
1416 self.fail("recv() returned success when we did not expect it")
1417
1418class TestExceptions(unittest.TestCase):
1419
1420 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001421 self.assertTrue(issubclass(socket.error, Exception))
1422 self.assertTrue(issubclass(socket.herror, socket.error))
1423 self.assertTrue(issubclass(socket.gaierror, socket.error))
1424 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001425
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001426class TestLinuxAbstractNamespace(unittest.TestCase):
1427
1428 UNIX_PATH_MAX = 108
1429
1430 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001431 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001432 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1433 s1.bind(address)
1434 s1.listen(1)
1435 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1436 s2.connect(s1.getsockname())
1437 s1.accept()
1438 self.assertEqual(s1.getsockname(), address)
1439 self.assertEqual(s2.getpeername(), address)
1440
1441 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001442 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001443 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1444 s.bind(address)
1445 self.assertEqual(s.getsockname(), address)
1446
1447 def testNameOverflow(self):
1448 address = "\x00" + "h" * self.UNIX_PATH_MAX
1449 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1450 self.assertRaises(socket.error, s.bind, address)
1451
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001452
Victor Stinner45df8202010-04-28 22:31:17 +00001453@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001454class BufferIOTest(SocketConnectedTest):
1455 """
1456 Test the buffer versions of socket.recv() and socket.send().
1457 """
1458 def __init__(self, methodName='runTest'):
1459 SocketConnectedTest.__init__(self, methodName=methodName)
1460
Antoine Pitrou25480782010-03-17 22:50:28 +00001461 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001462 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001463 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001464 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001465 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001466 self.assertEqual(msg, MSG)
1467
Antoine Pitrou25480782010-03-17 22:50:28 +00001468 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001469 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001470 self.serv_conn.send(buf)
1471
Antoine Pitrou25480782010-03-17 22:50:28 +00001472 def testRecvIntoBytearray(self):
1473 buf = bytearray(1024)
1474 nbytes = self.cli_conn.recv_into(buf)
1475 self.assertEqual(nbytes, len(MSG))
1476 msg = buf[:len(MSG)]
1477 self.assertEqual(msg, MSG)
1478
1479 _testRecvIntoBytearray = _testRecvIntoArray
1480
1481 def testRecvIntoMemoryview(self):
1482 buf = bytearray(1024)
1483 nbytes = self.cli_conn.recv_into(memoryview(buf))
1484 self.assertEqual(nbytes, len(MSG))
1485 msg = buf[:len(MSG)]
1486 self.assertEqual(msg, MSG)
1487
1488 _testRecvIntoMemoryview = _testRecvIntoArray
1489
1490 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001491 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001492 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001493 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001494 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001495 self.assertEqual(msg, MSG)
1496
Antoine Pitrou25480782010-03-17 22:50:28 +00001497 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001498 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001499 self.serv_conn.send(buf)
1500
Antoine Pitrou25480782010-03-17 22:50:28 +00001501 def testRecvFromIntoBytearray(self):
1502 buf = bytearray(1024)
1503 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1504 self.assertEqual(nbytes, len(MSG))
1505 msg = buf[:len(MSG)]
1506 self.assertEqual(msg, MSG)
1507
1508 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1509
1510 def testRecvFromIntoMemoryview(self):
1511 buf = bytearray(1024)
1512 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1513 self.assertEqual(nbytes, len(MSG))
1514 msg = buf[:len(MSG)]
1515 self.assertEqual(msg, MSG)
1516
1517 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1518
Christian Heimes043d6f62008-01-07 17:19:16 +00001519
1520TIPC_STYPE = 2000
1521TIPC_LOWER = 200
1522TIPC_UPPER = 210
1523
1524def isTipcAvailable():
1525 """Check if the TIPC module is loaded
1526
1527 The TIPC module is not loaded automatically on Ubuntu and probably
1528 other Linux distros.
1529 """
1530 if not hasattr(socket, "AF_TIPC"):
1531 return False
1532 if not os.path.isfile("/proc/modules"):
1533 return False
1534 with open("/proc/modules") as f:
1535 for line in f:
1536 if line.startswith("tipc "):
1537 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001538 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001539 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1540 return False
1541
1542class TIPCTest (unittest.TestCase):
1543 def testRDM(self):
1544 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1545 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1546
1547 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1548 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1549 TIPC_LOWER, TIPC_UPPER)
1550 srv.bind(srvaddr)
1551
1552 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1553 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1554 cli.sendto(MSG, sendaddr)
1555
1556 msg, recvaddr = srv.recvfrom(1024)
1557
1558 self.assertEqual(cli.getsockname(), recvaddr)
1559 self.assertEqual(msg, MSG)
1560
1561
1562class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1563 def __init__(self, methodName = 'runTest'):
1564 unittest.TestCase.__init__(self, methodName = methodName)
1565 ThreadableTest.__init__(self)
1566
1567 def setUp(self):
1568 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1569 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1570 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1571 TIPC_LOWER, TIPC_UPPER)
1572 self.srv.bind(srvaddr)
1573 self.srv.listen(5)
1574 self.serverExplicitReady()
1575 self.conn, self.connaddr = self.srv.accept()
1576
1577 def clientSetUp(self):
1578 # The is a hittable race between serverExplicitReady() and the
1579 # accept() call; sleep a little while to avoid it, otherwise
1580 # we could get an exception
1581 time.sleep(0.1)
1582 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1583 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1584 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1585 self.cli.connect(addr)
1586 self.cliaddr = self.cli.getsockname()
1587
1588 def testStream(self):
1589 msg = self.conn.recv(1024)
1590 self.assertEqual(msg, MSG)
1591 self.assertEqual(self.cliaddr, self.connaddr)
1592
1593 def _testStream(self):
1594 self.cli.send(MSG)
1595 self.cli.close()
1596
1597
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001598@unittest.skipUnless(thread, 'Threading required for this test.')
1599class ContextManagersTest(ThreadedTCPSocketTest):
1600
1601 def _testSocketClass(self):
1602 # base test
1603 with socket.socket() as sock:
1604 self.assertFalse(sock._closed)
1605 self.assertTrue(sock._closed)
1606 # close inside with block
1607 with socket.socket() as sock:
1608 sock.close()
1609 self.assertTrue(sock._closed)
1610 # exception inside with block
1611 with socket.socket() as sock:
1612 self.assertRaises(socket.error, sock.sendall, b'foo')
1613 self.assertTrue(sock._closed)
1614
1615 def testCreateConnectionBase(self):
1616 conn, addr = self.serv.accept()
1617 data = conn.recv(1024)
1618 conn.sendall(data)
1619
1620 def _testCreateConnectionBase(self):
1621 address = self.serv.getsockname()
1622 with socket.create_connection(address) as sock:
1623 self.assertFalse(sock._closed)
1624 sock.sendall(b'foo')
1625 self.assertEqual(sock.recv(1024), b'foo')
1626 self.assertTrue(sock._closed)
1627
1628 def testCreateConnectionClose(self):
1629 conn, addr = self.serv.accept()
1630 data = conn.recv(1024)
1631 conn.sendall(data)
1632
1633 def _testCreateConnectionClose(self):
1634 address = self.serv.getsockname()
1635 with socket.create_connection(address) as sock:
1636 sock.close()
1637 self.assertTrue(sock._closed)
1638 self.assertRaises(socket.error, sock.sendall, b'foo')
1639
1640
Guido van Rossumb995eb72002-07-31 16:08:40 +00001641def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001642 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001643 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001644
1645 tests.extend([
1646 NonBlockingTCPTests,
1647 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001648 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001649 UnbufferedFileObjectClassTestCase,
1650 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001651 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001652 NetworkConnectionNoServer,
1653 NetworkConnectionAttributesTest,
1654 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001655 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001656 ])
Dave Cole331708b2004-08-09 04:51:41 +00001657 if hasattr(socket, "socketpair"):
1658 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001659 if sys.platform == 'linux2':
1660 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001661 if isTipcAvailable():
1662 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001663 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001664
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001665 thread_info = support.threading_setup()
1666 support.run_unittest(*tests)
1667 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001668
1669if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001670 test_main()