blob: 690d9b5ee50865f1de6abb19dccb6c6db9476e74 [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
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000645 @unittest.skipUnless(support.is_resource_enabled('network'),
646 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000647 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000648 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000649 # these should all be successful
650 socket.gethostbyname('испытание.python.org')
651 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000652 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
653 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
654 # have a reverse entry yet
655 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000656
Victor Stinner45df8202010-04-28 22:31:17 +0000657@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000658class BasicTCPTest(SocketConnectedTest):
659
660 def __init__(self, methodName='runTest'):
661 SocketConnectedTest.__init__(self, methodName=methodName)
662
663 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000664 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000666 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667
668 def _testRecv(self):
669 self.serv_conn.send(MSG)
670
671 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000672 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673 seg1 = self.cli_conn.recv(len(MSG) - 3)
674 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000675 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000676 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677
678 def _testOverFlowRecv(self):
679 self.serv_conn.send(MSG)
680
681 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000682 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000683 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000684 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685
686 def _testRecvFrom(self):
687 self.serv_conn.send(MSG)
688
689 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000690 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000691 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
692 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000693 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000694 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000695
696 def _testOverFlowRecvFrom(self):
697 self.serv_conn.send(MSG)
698
699 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000700 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000701 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702 while 1:
703 read = self.cli_conn.recv(1024)
704 if not read:
705 break
Guido van Rossume531e292002-08-08 20:28:34 +0000706 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000707 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000708
709 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000710 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 self.serv_conn.sendall(big_chunk)
712
713 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000714 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715 fd = self.cli_conn.fileno()
716 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000717 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 msg = sock.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 _testFromFd(self):
722 self.serv_conn.send(MSG)
723
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000724 def testDup(self):
725 # Testing dup()
726 sock = self.cli_conn.dup()
727 msg = sock.recv(1024)
728 self.assertEqual(msg, MSG)
729
730 def _testDup(self):
731 self.serv_conn.send(MSG)
732
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000736 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000737 # wait for _testShutdown to finish: on OS X, when the server
738 # closes the connection the client also becomes disconnected,
739 # and the client's shutdown call will fail. (Issue #4397.)
740 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741
742 def _testShutdown(self):
743 self.serv_conn.send(MSG)
744 self.serv_conn.shutdown(2)
745
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000746 def testDetach(self):
747 # Testing detach()
748 fileno = self.cli_conn.fileno()
749 f = self.cli_conn.detach()
750 self.assertEqual(f, fileno)
751 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000752 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
753 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000754 # ...but we can create another socket using the (still open)
755 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000756 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
757 msg = sock.recv(1024)
758 self.assertEqual(msg, MSG)
759
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000760 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000761 self.serv_conn.send(MSG)
762
Victor Stinner45df8202010-04-28 22:31:17 +0000763@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764class BasicUDPTest(ThreadedUDPSocketTest):
765
766 def __init__(self, methodName='runTest'):
767 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
768
769 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000770 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000772 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773
774 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000775 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776
Guido van Rossum1c938012002-06-12 21:17:20 +0000777 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000780 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781
Guido van Rossum1c938012002-06-12 21:17:20 +0000782 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000783 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784
Guido van Rossumd8faa362007-04-27 19:54:29 +0000785 def testRecvFromNegative(self):
786 # Negative lengths passed to recvfrom should give ValueError.
787 self.assertRaises(ValueError, self.serv.recvfrom, -1)
788
789 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000790 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000791
Victor Stinner45df8202010-04-28 22:31:17 +0000792@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000793class TCPCloserTest(ThreadedTCPSocketTest):
794
795 def testClose(self):
796 conn, addr = self.serv.accept()
797 conn.close()
798
799 sd = self.cli
800 read, write, err = select.select([sd], [], [], 1.0)
801 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000802 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000803
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000804 # Calling close() many times should be safe.
805 conn.close()
806 conn.close()
807
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000808 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000809 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000810 time.sleep(1.0)
811
Victor Stinner45df8202010-04-28 22:31:17 +0000812@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000813class BasicSocketPairTest(SocketPairTest):
814
815 def __init__(self, methodName='runTest'):
816 SocketPairTest.__init__(self, methodName=methodName)
817
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000818 def _testDefaults(self):
819 pass
820
821 def testDefaults(self):
822 self.assertIsInstance(self.cli, socket.socket)
823 self.assertIsInstance(self.serv, socket.socket)
824 if hasattr(socket, 'AF_UNIX'):
825 self.assertEqual(self.cli.family, socket.AF_UNIX)
826 self.assertEqual(self.serv.family, socket.AF_UNIX)
827 else:
828 self.assertEqual(self.cli.family, socket.AF_INET)
829 self.assertEqual(self.serv.family, socket.AF_INET)
830 self.assertEqual(self.cli.type, socket.SOCK_STREAM)
831 self.assertEqual(self.serv.type, socket.SOCK_STREAM)
832 self.assertEqual(self.cli.proto, 0)
833 self.assertEqual(self.serv.proto, 0)
834
Dave Cole331708b2004-08-09 04:51:41 +0000835 def testRecv(self):
836 msg = self.serv.recv(1024)
837 self.assertEqual(msg, MSG)
838
839 def _testRecv(self):
840 self.cli.send(MSG)
841
842 def testSend(self):
843 self.serv.send(MSG)
844
845 def _testSend(self):
846 msg = self.cli.recv(1024)
847 self.assertEqual(msg, MSG)
848
Victor Stinner45df8202010-04-28 22:31:17 +0000849@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850class NonBlockingTCPTests(ThreadedTCPSocketTest):
851
852 def __init__(self, methodName='runTest'):
853 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
854
855 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000856 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 self.serv.setblocking(0)
858 start = time.time()
859 try:
860 self.serv.accept()
861 except socket.error:
862 pass
863 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000864 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000865
866 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000867 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000868
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000870 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000872 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000873 conn, addr = self.serv.accept()
874 except socket.error:
875 pass
876 else:
877 self.fail("Error trying to do non-blocking accept.")
878 read, write, err = select.select([self.serv], [], [])
879 if self.serv in read:
880 conn, addr = self.serv.accept()
881 else:
882 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000883
Guido van Rossum24e4af82002-06-12 19:18:08 +0000884 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000885 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000886 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000887
888 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000889 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 conn, addr = self.serv.accept()
891
892 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000893 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000894 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895
896 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000897 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898 conn, addr = self.serv.accept()
899 conn.setblocking(0)
900 try:
901 msg = conn.recv(len(MSG))
902 except socket.error:
903 pass
904 else:
905 self.fail("Error trying to do non-blocking recv.")
906 read, write, err = select.select([conn], [], [])
907 if conn in read:
908 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000909 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000910 else:
911 self.fail("Error during select call to non-blocking socket.")
912
913 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000914 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000915 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000916 self.cli.send(MSG)
917
Victor Stinner45df8202010-04-28 22:31:17 +0000918@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000919class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000920 """Unit tests for the object returned by socket.makefile()
921
922 self.serv_file is the io object returned by makefile() on
923 the client connection. You can read from this file to
924 get output from the server.
925
926 self.cli_file is the io object returned by makefile() on the
927 server connection. You can write to this file to send output
928 to the client.
929 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000930
Guido van Rossume9f66142002-08-07 15:46:19 +0000931 bufsize = -1 # Use default buffer size
932
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 def __init__(self, methodName='runTest'):
934 SocketConnectedTest.__init__(self, methodName=methodName)
935
936 def setUp(self):
937 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000938 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939
940 def tearDown(self):
941 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000942 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000943 self.serv_file = None
944 SocketConnectedTest.tearDown(self)
945
946 def clientSetUp(self):
947 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000948 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949
950 def clientTearDown(self):
951 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000952 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000953 self.cli_file = None
954 SocketConnectedTest.clientTearDown(self)
955
956 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000957 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000958 first_seg = self.serv_file.read(len(MSG)-3)
959 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000960 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000961 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000962
963 def _testSmallRead(self):
964 self.cli_file.write(MSG)
965 self.cli_file.flush()
966
Guido van Rossum8c943832002-08-08 01:00:28 +0000967 def testFullRead(self):
968 # read until EOF
969 msg = self.serv_file.read()
970 self.assertEqual(msg, MSG)
971
972 def _testFullRead(self):
973 self.cli_file.write(MSG)
974 self.cli_file.close()
975
Guido van Rossum24e4af82002-06-12 19:18:08 +0000976 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000977 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000978 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979 while 1:
980 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000981 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000983 buf += char
984 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000985
986 def _testUnbufferedRead(self):
987 self.cli_file.write(MSG)
988 self.cli_file.flush()
989
990 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000991 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000993 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000994
995 def _testReadline(self):
996 self.cli_file.write(MSG)
997 self.cli_file.flush()
998
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000999 def testCloseAfterMakefile(self):
1000 # The file returned by makefile should keep the socket open.
1001 self.cli_conn.close()
1002 # read until EOF
1003 msg = self.serv_file.read()
1004 self.assertEqual(msg, MSG)
1005
1006 def _testCloseAfterMakefile(self):
1007 self.cli_file.write(MSG)
1008 self.cli_file.flush()
1009
1010 def testMakefileAfterMakefileClose(self):
1011 self.serv_file.close()
1012 msg = self.cli_conn.recv(len(MSG))
1013 self.assertEqual(msg, MSG)
1014
1015 def _testMakefileAfterMakefileClose(self):
1016 self.cli_file.write(MSG)
1017 self.cli_file.flush()
1018
Tim Peters116d83c2004-03-28 02:20:45 +00001019 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001020 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001021
1022 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001023 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001024
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001025 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001026 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001027 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
1028
1029 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001030 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001031 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
1032
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001033 def testRealClose(self):
1034 self.serv_file.close()
1035 self.assertRaises(ValueError, self.serv_file.fileno)
1036 self.cli_conn.close()
1037 self.assertRaises(socket.error, self.cli_conn.getsockname)
1038
1039 def _testRealClose(self):
1040 pass
1041
1042
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001043class FileObjectInterruptedTestCase(unittest.TestCase):
1044 """Test that the file object correctly handles EINTR internally."""
1045
1046 class MockSocket(object):
1047 def __init__(self, recv_funcs=()):
1048 # A generator that returns callables that we'll call for each
1049 # call to recv().
1050 self._recv_step = iter(recv_funcs)
1051
1052 def recv_into(self, buffer):
1053 data = next(self._recv_step)()
1054 assert len(buffer) >= len(data)
1055 buffer[:len(data)] = data
1056 return len(data)
1057
1058 def _decref_socketios(self):
1059 pass
1060
1061 def _textiowrap_for_test(self, buffering=-1):
1062 raw = socket.SocketIO(self, "r")
1063 if buffering < 0:
1064 buffering = io.DEFAULT_BUFFER_SIZE
1065 if buffering == 0:
1066 return raw
1067 buffer = io.BufferedReader(raw, buffering)
1068 text = io.TextIOWrapper(buffer, None, None)
1069 text.mode = "rb"
1070 return text
1071
1072 @staticmethod
1073 def _raise_eintr():
1074 raise socket.error(errno.EINTR)
1075
1076 def _textiowrap_mock_socket(self, mock, buffering=-1):
1077 raw = socket.SocketIO(mock, "r")
1078 if buffering < 0:
1079 buffering = io.DEFAULT_BUFFER_SIZE
1080 if buffering == 0:
1081 return raw
1082 buffer = io.BufferedReader(raw, buffering)
1083 text = io.TextIOWrapper(buffer, None, None)
1084 text.mode = "rb"
1085 return text
1086
1087 def _test_readline(self, size=-1, buffering=-1):
1088 mock_sock = self.MockSocket(recv_funcs=[
1089 lambda : b"This is the first line\nAnd the sec",
1090 self._raise_eintr,
1091 lambda : b"ond line is here\n",
1092 lambda : b"",
1093 lambda : b"", # XXX(gps): io library does an extra EOF read
1094 ])
1095 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1096 self.assertEquals(fo.readline(size), "This is the first line\n")
1097 self.assertEquals(fo.readline(size), "And the second line is here\n")
1098
1099 def _test_read(self, size=-1, buffering=-1):
1100 mock_sock = self.MockSocket(recv_funcs=[
1101 lambda : b"This is the first line\nAnd the sec",
1102 self._raise_eintr,
1103 lambda : b"ond line is here\n",
1104 lambda : b"",
1105 lambda : b"", # XXX(gps): io library does an extra EOF read
1106 ])
1107 expecting = (b"This is the first line\n"
1108 b"And the second line is here\n")
1109 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1110 if buffering == 0:
1111 data = b''
1112 else:
1113 data = ''
1114 expecting = expecting.decode('utf8')
1115 while len(data) != len(expecting):
1116 part = fo.read(size)
1117 if not part:
1118 break
1119 data += part
1120 self.assertEquals(data, expecting)
1121
1122 def test_default(self):
1123 self._test_readline()
1124 self._test_readline(size=100)
1125 self._test_read()
1126 self._test_read(size=100)
1127
1128 def test_with_1k_buffer(self):
1129 self._test_readline(buffering=1024)
1130 self._test_readline(size=100, buffering=1024)
1131 self._test_read(buffering=1024)
1132 self._test_read(size=100, buffering=1024)
1133
1134 def _test_readline_no_buffer(self, size=-1):
1135 mock_sock = self.MockSocket(recv_funcs=[
1136 lambda : b"a",
1137 lambda : b"\n",
1138 lambda : b"B",
1139 self._raise_eintr,
1140 lambda : b"b",
1141 lambda : b"",
1142 ])
1143 fo = mock_sock._textiowrap_for_test(buffering=0)
1144 self.assertEquals(fo.readline(size), b"a\n")
1145 self.assertEquals(fo.readline(size), b"Bb")
1146
1147 def test_no_buffer(self):
1148 self._test_readline_no_buffer()
1149 self._test_readline_no_buffer(size=4)
1150 self._test_read(buffering=0)
1151 self._test_read(size=100, buffering=0)
1152
1153
Guido van Rossume9f66142002-08-07 15:46:19 +00001154class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1155
1156 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001157
Guido van Rossume9f66142002-08-07 15:46:19 +00001158 In this case (and in this case only), it should be possible to
1159 create a file object, read a line from it, create another file
1160 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001161 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001162 when reading multiple requests from the same socket."""
1163
1164 bufsize = 0 # Use unbuffered mode
1165
1166 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001167 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001168 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001169 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001170 self.serv_file = self.cli_conn.makefile('rb', 0)
1171 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001172 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001173
1174 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001175 self.cli_file.write(b"A. " + MSG)
1176 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001177 self.cli_file.flush()
1178
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001179 def testMakefileClose(self):
1180 # The file returned by makefile should keep the socket open...
1181 self.cli_conn.close()
1182 msg = self.cli_conn.recv(1024)
1183 self.assertEqual(msg, MSG)
1184 # ...until the file is itself closed
1185 self.serv_file.close()
1186 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1187
1188 def _testMakefileClose(self):
1189 self.cli_file.write(MSG)
1190 self.cli_file.flush()
1191
1192 def testMakefileCloseSocketDestroy(self):
1193 refcount_before = sys.getrefcount(self.cli_conn)
1194 self.serv_file.close()
1195 refcount_after = sys.getrefcount(self.cli_conn)
1196 self.assertEqual(refcount_before - 1, refcount_after)
1197
1198 def _testMakefileCloseSocketDestroy(self):
1199 pass
1200
1201
Guido van Rossum8c943832002-08-08 01:00:28 +00001202class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1203
1204 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1205
1206
1207class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1208
1209 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001210
Thomas Woutersb2137042007-02-01 18:02:27 +00001211
Guido van Rossumd8faa362007-04-27 19:54:29 +00001212class NetworkConnectionTest(object):
1213 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001214
Guido van Rossumd8faa362007-04-27 19:54:29 +00001215 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001216 # We're inherited below by BasicTCPTest2, which also inherits
1217 # BasicTCPTest, which defines self.port referenced below.
1218 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001219 self.serv_conn = self.cli
1220
1221class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1222 """Tests that NetworkConnection does not break existing TCP functionality.
1223 """
1224
1225class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001226
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001227 class MockSocket(socket.socket):
1228 def connect(self, *args):
1229 raise socket.timeout('timed out')
1230
1231 @contextlib.contextmanager
1232 def mocked_socket_module(self):
1233 """Return a socket which times out on connect"""
1234 old_socket = socket.socket
1235 socket.socket = self.MockSocket
1236 try:
1237 yield
1238 finally:
1239 socket.socket = old_socket
1240
1241 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001242 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001243 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1244 with self.assertRaises(socket.error) as cm:
1245 cli.connect((HOST, port))
1246 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1247
1248 def test_create_connection(self):
1249 # Issue #9792: errors raised by create_connection() should have
1250 # a proper errno attribute.
1251 port = support.find_unused_port()
1252 with self.assertRaises(socket.error) as cm:
1253 socket.create_connection((HOST, port))
1254 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1255
1256 def test_create_connection_timeout(self):
1257 # Issue #9792: create_connection() should not recast timeout errors
1258 # as generic socket errors.
1259 with self.mocked_socket_module():
1260 with self.assertRaises(socket.timeout):
1261 socket.create_connection((HOST, 1234))
1262
Guido van Rossumd8faa362007-04-27 19:54:29 +00001263
Victor Stinner45df8202010-04-28 22:31:17 +00001264@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001265class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1266
1267 def __init__(self, methodName='runTest'):
1268 SocketTCPTest.__init__(self, methodName=methodName)
1269 ThreadableTest.__init__(self)
1270
1271 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001272 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001273
1274 def clientTearDown(self):
1275 self.cli.close()
1276 self.cli = None
1277 ThreadableTest.clientTearDown(self)
1278
1279 def _justAccept(self):
1280 conn, addr = self.serv.accept()
1281
1282 testFamily = _justAccept
1283 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001284 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001285 self.assertEqual(self.cli.family, 2)
1286
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001287 testSourceAddress = _justAccept
1288 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001289 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1290 source_address=('', self.source_port))
1291 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001292 # The port number being used is sufficient to show that the bind()
1293 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001294
Guido van Rossumd8faa362007-04-27 19:54:29 +00001295 testTimeoutDefault = _justAccept
1296 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001297 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001298 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001299 socket.setdefaulttimeout(42)
1300 try:
1301 self.cli = socket.create_connection((HOST, self.port))
1302 finally:
1303 socket.setdefaulttimeout(None)
1304 self.assertEquals(self.cli.gettimeout(), 42)
1305
1306 testTimeoutNone = _justAccept
1307 def _testTimeoutNone(self):
1308 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001309 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001310 socket.setdefaulttimeout(30)
1311 try:
1312 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1313 finally:
1314 socket.setdefaulttimeout(None)
1315 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001316
1317 testTimeoutValueNamed = _justAccept
1318 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001319 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001320 self.assertEqual(self.cli.gettimeout(), 30)
1321
1322 testTimeoutValueNonamed = _justAccept
1323 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001324 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001325 self.assertEqual(self.cli.gettimeout(), 30)
1326
Victor Stinner45df8202010-04-28 22:31:17 +00001327@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001328class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1329
1330 def __init__(self, methodName='runTest'):
1331 SocketTCPTest.__init__(self, methodName=methodName)
1332 ThreadableTest.__init__(self)
1333
1334 def clientSetUp(self):
1335 pass
1336
1337 def clientTearDown(self):
1338 self.cli.close()
1339 self.cli = None
1340 ThreadableTest.clientTearDown(self)
1341
1342 def testInsideTimeout(self):
1343 conn, addr = self.serv.accept()
1344 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001345 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001346 testOutsideTimeout = testInsideTimeout
1347
1348 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001349 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001350 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001351 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001352
1353 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001354 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001355 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001356
1357
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001358class TCPTimeoutTest(SocketTCPTest):
1359
1360 def testTCPTimeout(self):
1361 def raise_timeout(*args, **kwargs):
1362 self.serv.settimeout(1.0)
1363 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001364 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001365 "Error generating a timeout exception (TCP)")
1366
1367 def testTimeoutZero(self):
1368 ok = False
1369 try:
1370 self.serv.settimeout(0.0)
1371 foo = self.serv.accept()
1372 except socket.timeout:
1373 self.fail("caught timeout instead of error (TCP)")
1374 except socket.error:
1375 ok = True
1376 except:
1377 self.fail("caught unexpected exception (TCP)")
1378 if not ok:
1379 self.fail("accept() returned success when we did not expect it")
1380
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001381 def testInterruptedTimeout(self):
1382 # XXX I don't know how to do this test on MSWindows or any other
1383 # plaform that doesn't support signal.alarm() or os.kill(), though
1384 # the bug should have existed on all platforms.
1385 if not hasattr(signal, "alarm"):
1386 return # can only test on *nix
1387 self.serv.settimeout(5.0) # must be longer than alarm
1388 class Alarm(Exception):
1389 pass
1390 def alarm_handler(signal, frame):
1391 raise Alarm
1392 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1393 try:
1394 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1395 try:
1396 foo = self.serv.accept()
1397 except socket.timeout:
1398 self.fail("caught timeout instead of Alarm")
1399 except Alarm:
1400 pass
1401 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001402 self.fail("caught other exception instead of Alarm:"
1403 " %s(%s):\n%s" %
1404 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001405 else:
1406 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001407 finally:
1408 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001409 except Alarm:
1410 self.fail("got Alarm in wrong place")
1411 finally:
1412 # no alarm can be pending. Safe to restore old handler.
1413 signal.signal(signal.SIGALRM, old_alarm)
1414
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001415class UDPTimeoutTest(SocketTCPTest):
1416
1417 def testUDPTimeout(self):
1418 def raise_timeout(*args, **kwargs):
1419 self.serv.settimeout(1.0)
1420 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001421 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001422 "Error generating a timeout exception (UDP)")
1423
1424 def testTimeoutZero(self):
1425 ok = False
1426 try:
1427 self.serv.settimeout(0.0)
1428 foo = self.serv.recv(1024)
1429 except socket.timeout:
1430 self.fail("caught timeout instead of error (UDP)")
1431 except socket.error:
1432 ok = True
1433 except:
1434 self.fail("caught unexpected exception (UDP)")
1435 if not ok:
1436 self.fail("recv() returned success when we did not expect it")
1437
1438class TestExceptions(unittest.TestCase):
1439
1440 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001441 self.assertTrue(issubclass(socket.error, Exception))
1442 self.assertTrue(issubclass(socket.herror, socket.error))
1443 self.assertTrue(issubclass(socket.gaierror, socket.error))
1444 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001445
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001446class TestLinuxAbstractNamespace(unittest.TestCase):
1447
1448 UNIX_PATH_MAX = 108
1449
1450 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001451 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001452 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1453 s1.bind(address)
1454 s1.listen(1)
1455 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1456 s2.connect(s1.getsockname())
1457 s1.accept()
1458 self.assertEqual(s1.getsockname(), address)
1459 self.assertEqual(s2.getpeername(), address)
1460
1461 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001462 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001463 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1464 s.bind(address)
1465 self.assertEqual(s.getsockname(), address)
1466
1467 def testNameOverflow(self):
1468 address = "\x00" + "h" * self.UNIX_PATH_MAX
1469 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1470 self.assertRaises(socket.error, s.bind, address)
1471
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001472
Victor Stinner45df8202010-04-28 22:31:17 +00001473@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001474class BufferIOTest(SocketConnectedTest):
1475 """
1476 Test the buffer versions of socket.recv() and socket.send().
1477 """
1478 def __init__(self, methodName='runTest'):
1479 SocketConnectedTest.__init__(self, methodName=methodName)
1480
Antoine Pitrou25480782010-03-17 22:50:28 +00001481 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001482 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001483 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001484 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001485 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001486 self.assertEqual(msg, MSG)
1487
Antoine Pitrou25480782010-03-17 22:50:28 +00001488 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001489 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001490 self.serv_conn.send(buf)
1491
Antoine Pitrou25480782010-03-17 22:50:28 +00001492 def testRecvIntoBytearray(self):
1493 buf = bytearray(1024)
1494 nbytes = self.cli_conn.recv_into(buf)
1495 self.assertEqual(nbytes, len(MSG))
1496 msg = buf[:len(MSG)]
1497 self.assertEqual(msg, MSG)
1498
1499 _testRecvIntoBytearray = _testRecvIntoArray
1500
1501 def testRecvIntoMemoryview(self):
1502 buf = bytearray(1024)
1503 nbytes = self.cli_conn.recv_into(memoryview(buf))
1504 self.assertEqual(nbytes, len(MSG))
1505 msg = buf[:len(MSG)]
1506 self.assertEqual(msg, MSG)
1507
1508 _testRecvIntoMemoryview = _testRecvIntoArray
1509
1510 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001511 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001512 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001513 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001514 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001515 self.assertEqual(msg, MSG)
1516
Antoine Pitrou25480782010-03-17 22:50:28 +00001517 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001518 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001519 self.serv_conn.send(buf)
1520
Antoine Pitrou25480782010-03-17 22:50:28 +00001521 def testRecvFromIntoBytearray(self):
1522 buf = bytearray(1024)
1523 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1524 self.assertEqual(nbytes, len(MSG))
1525 msg = buf[:len(MSG)]
1526 self.assertEqual(msg, MSG)
1527
1528 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1529
1530 def testRecvFromIntoMemoryview(self):
1531 buf = bytearray(1024)
1532 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1533 self.assertEqual(nbytes, len(MSG))
1534 msg = buf[:len(MSG)]
1535 self.assertEqual(msg, MSG)
1536
1537 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1538
Christian Heimes043d6f62008-01-07 17:19:16 +00001539
1540TIPC_STYPE = 2000
1541TIPC_LOWER = 200
1542TIPC_UPPER = 210
1543
1544def isTipcAvailable():
1545 """Check if the TIPC module is loaded
1546
1547 The TIPC module is not loaded automatically on Ubuntu and probably
1548 other Linux distros.
1549 """
1550 if not hasattr(socket, "AF_TIPC"):
1551 return False
1552 if not os.path.isfile("/proc/modules"):
1553 return False
1554 with open("/proc/modules") as f:
1555 for line in f:
1556 if line.startswith("tipc "):
1557 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001558 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001559 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1560 return False
1561
1562class TIPCTest (unittest.TestCase):
1563 def testRDM(self):
1564 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1565 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1566
1567 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1568 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1569 TIPC_LOWER, TIPC_UPPER)
1570 srv.bind(srvaddr)
1571
1572 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1573 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1574 cli.sendto(MSG, sendaddr)
1575
1576 msg, recvaddr = srv.recvfrom(1024)
1577
1578 self.assertEqual(cli.getsockname(), recvaddr)
1579 self.assertEqual(msg, MSG)
1580
1581
1582class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1583 def __init__(self, methodName = 'runTest'):
1584 unittest.TestCase.__init__(self, methodName = methodName)
1585 ThreadableTest.__init__(self)
1586
1587 def setUp(self):
1588 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1589 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1590 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1591 TIPC_LOWER, TIPC_UPPER)
1592 self.srv.bind(srvaddr)
1593 self.srv.listen(5)
1594 self.serverExplicitReady()
1595 self.conn, self.connaddr = self.srv.accept()
1596
1597 def clientSetUp(self):
1598 # The is a hittable race between serverExplicitReady() and the
1599 # accept() call; sleep a little while to avoid it, otherwise
1600 # we could get an exception
1601 time.sleep(0.1)
1602 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1603 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1604 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1605 self.cli.connect(addr)
1606 self.cliaddr = self.cli.getsockname()
1607
1608 def testStream(self):
1609 msg = self.conn.recv(1024)
1610 self.assertEqual(msg, MSG)
1611 self.assertEqual(self.cliaddr, self.connaddr)
1612
1613 def _testStream(self):
1614 self.cli.send(MSG)
1615 self.cli.close()
1616
1617
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001618@unittest.skipUnless(thread, 'Threading required for this test.')
1619class ContextManagersTest(ThreadedTCPSocketTest):
1620
1621 def _testSocketClass(self):
1622 # base test
1623 with socket.socket() as sock:
1624 self.assertFalse(sock._closed)
1625 self.assertTrue(sock._closed)
1626 # close inside with block
1627 with socket.socket() as sock:
1628 sock.close()
1629 self.assertTrue(sock._closed)
1630 # exception inside with block
1631 with socket.socket() as sock:
1632 self.assertRaises(socket.error, sock.sendall, b'foo')
1633 self.assertTrue(sock._closed)
1634
1635 def testCreateConnectionBase(self):
1636 conn, addr = self.serv.accept()
1637 data = conn.recv(1024)
1638 conn.sendall(data)
1639
1640 def _testCreateConnectionBase(self):
1641 address = self.serv.getsockname()
1642 with socket.create_connection(address) as sock:
1643 self.assertFalse(sock._closed)
1644 sock.sendall(b'foo')
1645 self.assertEqual(sock.recv(1024), b'foo')
1646 self.assertTrue(sock._closed)
1647
1648 def testCreateConnectionClose(self):
1649 conn, addr = self.serv.accept()
1650 data = conn.recv(1024)
1651 conn.sendall(data)
1652
1653 def _testCreateConnectionClose(self):
1654 address = self.serv.getsockname()
1655 with socket.create_connection(address) as sock:
1656 sock.close()
1657 self.assertTrue(sock._closed)
1658 self.assertRaises(socket.error, sock.sendall, b'foo')
1659
1660
Guido van Rossumb995eb72002-07-31 16:08:40 +00001661def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001662 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001663 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001664
1665 tests.extend([
1666 NonBlockingTCPTests,
1667 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001668 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001669 UnbufferedFileObjectClassTestCase,
1670 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001671 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001672 NetworkConnectionNoServer,
1673 NetworkConnectionAttributesTest,
1674 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001675 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001676 ])
Dave Cole331708b2004-08-09 04:51:41 +00001677 if hasattr(socket, "socketpair"):
1678 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001679 if sys.platform == 'linux2':
1680 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001681 if isTipcAvailable():
1682 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001683 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001684
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001685 thread_info = support.threading_setup()
1686 support.run_unittest(*tests)
1687 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001688
1689if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001690 test_main()