blob: 718ea5c595dec81d8df0722a9f8c698d8aa1187e [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 Pitrou2e55fec2010-09-14 21:24:25 +0000818 def _check_defaults(self, sock):
819 self.assertIsInstance(sock, socket.socket)
820 if hasattr(socket, 'AF_UNIX'):
821 self.assertEqual(sock.family, socket.AF_UNIX)
822 else:
823 self.assertEqual(sock.family, socket.AF_INET)
824 self.assertEqual(sock.type, socket.SOCK_STREAM)
825 self.assertEqual(sock.proto, 0)
826
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000827 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000828 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000829
830 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000831 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000832
Dave Cole331708b2004-08-09 04:51:41 +0000833 def testRecv(self):
834 msg = self.serv.recv(1024)
835 self.assertEqual(msg, MSG)
836
837 def _testRecv(self):
838 self.cli.send(MSG)
839
840 def testSend(self):
841 self.serv.send(MSG)
842
843 def _testSend(self):
844 msg = self.cli.recv(1024)
845 self.assertEqual(msg, MSG)
846
Victor Stinner45df8202010-04-28 22:31:17 +0000847@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848class NonBlockingTCPTests(ThreadedTCPSocketTest):
849
850 def __init__(self, methodName='runTest'):
851 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
852
853 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000854 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 self.serv.setblocking(0)
856 start = time.time()
857 try:
858 self.serv.accept()
859 except socket.error:
860 pass
861 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000862 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
864 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000865 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000866
Guido van Rossum24e4af82002-06-12 19:18:08 +0000867 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000870 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 conn, addr = self.serv.accept()
872 except socket.error:
873 pass
874 else:
875 self.fail("Error trying to do non-blocking accept.")
876 read, write, err = select.select([self.serv], [], [])
877 if self.serv in read:
878 conn, addr = self.serv.accept()
879 else:
880 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000881
Guido van Rossum24e4af82002-06-12 19:18:08 +0000882 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000883 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000884 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885
886 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000887 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 conn, addr = self.serv.accept()
889
890 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000891 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000892 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893
894 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000895 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896 conn, addr = self.serv.accept()
897 conn.setblocking(0)
898 try:
899 msg = conn.recv(len(MSG))
900 except socket.error:
901 pass
902 else:
903 self.fail("Error trying to do non-blocking recv.")
904 read, write, err = select.select([conn], [], [])
905 if conn in read:
906 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000907 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000908 else:
909 self.fail("Error during select call to non-blocking socket.")
910
911 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000912 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000913 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914 self.cli.send(MSG)
915
Victor Stinner45df8202010-04-28 22:31:17 +0000916@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000917class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000918 """Unit tests for the object returned by socket.makefile()
919
920 self.serv_file is the io object returned by makefile() on
921 the client connection. You can read from this file to
922 get output from the server.
923
924 self.cli_file is the io object returned by makefile() on the
925 server connection. You can write to this file to send output
926 to the client.
927 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928
Guido van Rossume9f66142002-08-07 15:46:19 +0000929 bufsize = -1 # Use default buffer size
930
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 def __init__(self, methodName='runTest'):
932 SocketConnectedTest.__init__(self, methodName=methodName)
933
934 def setUp(self):
935 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000936 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937
938 def tearDown(self):
939 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000940 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000941 self.serv_file = None
942 SocketConnectedTest.tearDown(self)
943
944 def clientSetUp(self):
945 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000946 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947
948 def clientTearDown(self):
949 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000950 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000951 self.cli_file = None
952 SocketConnectedTest.clientTearDown(self)
953
954 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000955 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956 first_seg = self.serv_file.read(len(MSG)-3)
957 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000958 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000959 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960
961 def _testSmallRead(self):
962 self.cli_file.write(MSG)
963 self.cli_file.flush()
964
Guido van Rossum8c943832002-08-08 01:00:28 +0000965 def testFullRead(self):
966 # read until EOF
967 msg = self.serv_file.read()
968 self.assertEqual(msg, MSG)
969
970 def _testFullRead(self):
971 self.cli_file.write(MSG)
972 self.cli_file.close()
973
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000975 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000976 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 while 1:
978 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000979 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000981 buf += char
982 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983
984 def _testUnbufferedRead(self):
985 self.cli_file.write(MSG)
986 self.cli_file.flush()
987
988 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000989 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000990 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000991 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992
993 def _testReadline(self):
994 self.cli_file.write(MSG)
995 self.cli_file.flush()
996
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000997 def testCloseAfterMakefile(self):
998 # The file returned by makefile should keep the socket open.
999 self.cli_conn.close()
1000 # read until EOF
1001 msg = self.serv_file.read()
1002 self.assertEqual(msg, MSG)
1003
1004 def _testCloseAfterMakefile(self):
1005 self.cli_file.write(MSG)
1006 self.cli_file.flush()
1007
1008 def testMakefileAfterMakefileClose(self):
1009 self.serv_file.close()
1010 msg = self.cli_conn.recv(len(MSG))
1011 self.assertEqual(msg, MSG)
1012
1013 def _testMakefileAfterMakefileClose(self):
1014 self.cli_file.write(MSG)
1015 self.cli_file.flush()
1016
Tim Peters116d83c2004-03-28 02:20:45 +00001017 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001018 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001019
1020 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001021 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001022
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001023 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001024 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001025 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
1026
1027 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001028 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001029 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
1030
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001031 def testRealClose(self):
1032 self.serv_file.close()
1033 self.assertRaises(ValueError, self.serv_file.fileno)
1034 self.cli_conn.close()
1035 self.assertRaises(socket.error, self.cli_conn.getsockname)
1036
1037 def _testRealClose(self):
1038 pass
1039
1040
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001041class FileObjectInterruptedTestCase(unittest.TestCase):
1042 """Test that the file object correctly handles EINTR internally."""
1043
1044 class MockSocket(object):
1045 def __init__(self, recv_funcs=()):
1046 # A generator that returns callables that we'll call for each
1047 # call to recv().
1048 self._recv_step = iter(recv_funcs)
1049
1050 def recv_into(self, buffer):
1051 data = next(self._recv_step)()
1052 assert len(buffer) >= len(data)
1053 buffer[:len(data)] = data
1054 return len(data)
1055
1056 def _decref_socketios(self):
1057 pass
1058
1059 def _textiowrap_for_test(self, buffering=-1):
1060 raw = socket.SocketIO(self, "r")
1061 if buffering < 0:
1062 buffering = io.DEFAULT_BUFFER_SIZE
1063 if buffering == 0:
1064 return raw
1065 buffer = io.BufferedReader(raw, buffering)
1066 text = io.TextIOWrapper(buffer, None, None)
1067 text.mode = "rb"
1068 return text
1069
1070 @staticmethod
1071 def _raise_eintr():
1072 raise socket.error(errno.EINTR)
1073
1074 def _textiowrap_mock_socket(self, mock, buffering=-1):
1075 raw = socket.SocketIO(mock, "r")
1076 if buffering < 0:
1077 buffering = io.DEFAULT_BUFFER_SIZE
1078 if buffering == 0:
1079 return raw
1080 buffer = io.BufferedReader(raw, buffering)
1081 text = io.TextIOWrapper(buffer, None, None)
1082 text.mode = "rb"
1083 return text
1084
1085 def _test_readline(self, size=-1, buffering=-1):
1086 mock_sock = self.MockSocket(recv_funcs=[
1087 lambda : b"This is the first line\nAnd the sec",
1088 self._raise_eintr,
1089 lambda : b"ond line is here\n",
1090 lambda : b"",
1091 lambda : b"", # XXX(gps): io library does an extra EOF read
1092 ])
1093 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1094 self.assertEquals(fo.readline(size), "This is the first line\n")
1095 self.assertEquals(fo.readline(size), "And the second line is here\n")
1096
1097 def _test_read(self, size=-1, buffering=-1):
1098 mock_sock = self.MockSocket(recv_funcs=[
1099 lambda : b"This is the first line\nAnd the sec",
1100 self._raise_eintr,
1101 lambda : b"ond line is here\n",
1102 lambda : b"",
1103 lambda : b"", # XXX(gps): io library does an extra EOF read
1104 ])
1105 expecting = (b"This is the first line\n"
1106 b"And the second line is here\n")
1107 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1108 if buffering == 0:
1109 data = b''
1110 else:
1111 data = ''
1112 expecting = expecting.decode('utf8')
1113 while len(data) != len(expecting):
1114 part = fo.read(size)
1115 if not part:
1116 break
1117 data += part
1118 self.assertEquals(data, expecting)
1119
1120 def test_default(self):
1121 self._test_readline()
1122 self._test_readline(size=100)
1123 self._test_read()
1124 self._test_read(size=100)
1125
1126 def test_with_1k_buffer(self):
1127 self._test_readline(buffering=1024)
1128 self._test_readline(size=100, buffering=1024)
1129 self._test_read(buffering=1024)
1130 self._test_read(size=100, buffering=1024)
1131
1132 def _test_readline_no_buffer(self, size=-1):
1133 mock_sock = self.MockSocket(recv_funcs=[
1134 lambda : b"a",
1135 lambda : b"\n",
1136 lambda : b"B",
1137 self._raise_eintr,
1138 lambda : b"b",
1139 lambda : b"",
1140 ])
1141 fo = mock_sock._textiowrap_for_test(buffering=0)
1142 self.assertEquals(fo.readline(size), b"a\n")
1143 self.assertEquals(fo.readline(size), b"Bb")
1144
1145 def test_no_buffer(self):
1146 self._test_readline_no_buffer()
1147 self._test_readline_no_buffer(size=4)
1148 self._test_read(buffering=0)
1149 self._test_read(size=100, buffering=0)
1150
1151
Guido van Rossume9f66142002-08-07 15:46:19 +00001152class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1153
1154 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001155
Guido van Rossume9f66142002-08-07 15:46:19 +00001156 In this case (and in this case only), it should be possible to
1157 create a file object, read a line from it, create another file
1158 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001159 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001160 when reading multiple requests from the same socket."""
1161
1162 bufsize = 0 # Use unbuffered mode
1163
1164 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001165 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001166 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001167 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001168 self.serv_file = self.cli_conn.makefile('rb', 0)
1169 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001170 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001171
1172 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001173 self.cli_file.write(b"A. " + MSG)
1174 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001175 self.cli_file.flush()
1176
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001177 def testMakefileClose(self):
1178 # The file returned by makefile should keep the socket open...
1179 self.cli_conn.close()
1180 msg = self.cli_conn.recv(1024)
1181 self.assertEqual(msg, MSG)
1182 # ...until the file is itself closed
1183 self.serv_file.close()
1184 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1185
1186 def _testMakefileClose(self):
1187 self.cli_file.write(MSG)
1188 self.cli_file.flush()
1189
1190 def testMakefileCloseSocketDestroy(self):
1191 refcount_before = sys.getrefcount(self.cli_conn)
1192 self.serv_file.close()
1193 refcount_after = sys.getrefcount(self.cli_conn)
1194 self.assertEqual(refcount_before - 1, refcount_after)
1195
1196 def _testMakefileCloseSocketDestroy(self):
1197 pass
1198
1199
Guido van Rossum8c943832002-08-08 01:00:28 +00001200class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1201
1202 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1203
1204
1205class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1206
1207 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001208
Thomas Woutersb2137042007-02-01 18:02:27 +00001209
Guido van Rossumd8faa362007-04-27 19:54:29 +00001210class NetworkConnectionTest(object):
1211 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001212
Guido van Rossumd8faa362007-04-27 19:54:29 +00001213 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001214 # We're inherited below by BasicTCPTest2, which also inherits
1215 # BasicTCPTest, which defines self.port referenced below.
1216 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001217 self.serv_conn = self.cli
1218
1219class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1220 """Tests that NetworkConnection does not break existing TCP functionality.
1221 """
1222
1223class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001224
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001225 class MockSocket(socket.socket):
1226 def connect(self, *args):
1227 raise socket.timeout('timed out')
1228
1229 @contextlib.contextmanager
1230 def mocked_socket_module(self):
1231 """Return a socket which times out on connect"""
1232 old_socket = socket.socket
1233 socket.socket = self.MockSocket
1234 try:
1235 yield
1236 finally:
1237 socket.socket = old_socket
1238
1239 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001240 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001241 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1242 with self.assertRaises(socket.error) as cm:
1243 cli.connect((HOST, port))
1244 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1245
1246 def test_create_connection(self):
1247 # Issue #9792: errors raised by create_connection() should have
1248 # a proper errno attribute.
1249 port = support.find_unused_port()
1250 with self.assertRaises(socket.error) as cm:
1251 socket.create_connection((HOST, port))
1252 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1253
1254 def test_create_connection_timeout(self):
1255 # Issue #9792: create_connection() should not recast timeout errors
1256 # as generic socket errors.
1257 with self.mocked_socket_module():
1258 with self.assertRaises(socket.timeout):
1259 socket.create_connection((HOST, 1234))
1260
Guido van Rossumd8faa362007-04-27 19:54:29 +00001261
Victor Stinner45df8202010-04-28 22:31:17 +00001262@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001263class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1264
1265 def __init__(self, methodName='runTest'):
1266 SocketTCPTest.__init__(self, methodName=methodName)
1267 ThreadableTest.__init__(self)
1268
1269 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001270 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001271
1272 def clientTearDown(self):
1273 self.cli.close()
1274 self.cli = None
1275 ThreadableTest.clientTearDown(self)
1276
1277 def _justAccept(self):
1278 conn, addr = self.serv.accept()
1279
1280 testFamily = _justAccept
1281 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001282 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001283 self.assertEqual(self.cli.family, 2)
1284
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001285 testSourceAddress = _justAccept
1286 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001287 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1288 source_address=('', self.source_port))
1289 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001290 # The port number being used is sufficient to show that the bind()
1291 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001292
Guido van Rossumd8faa362007-04-27 19:54:29 +00001293 testTimeoutDefault = _justAccept
1294 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001295 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001296 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001297 socket.setdefaulttimeout(42)
1298 try:
1299 self.cli = socket.create_connection((HOST, self.port))
1300 finally:
1301 socket.setdefaulttimeout(None)
1302 self.assertEquals(self.cli.gettimeout(), 42)
1303
1304 testTimeoutNone = _justAccept
1305 def _testTimeoutNone(self):
1306 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001307 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001308 socket.setdefaulttimeout(30)
1309 try:
1310 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1311 finally:
1312 socket.setdefaulttimeout(None)
1313 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001314
1315 testTimeoutValueNamed = _justAccept
1316 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001317 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001318 self.assertEqual(self.cli.gettimeout(), 30)
1319
1320 testTimeoutValueNonamed = _justAccept
1321 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001322 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001323 self.assertEqual(self.cli.gettimeout(), 30)
1324
Victor Stinner45df8202010-04-28 22:31:17 +00001325@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001326class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1327
1328 def __init__(self, methodName='runTest'):
1329 SocketTCPTest.__init__(self, methodName=methodName)
1330 ThreadableTest.__init__(self)
1331
1332 def clientSetUp(self):
1333 pass
1334
1335 def clientTearDown(self):
1336 self.cli.close()
1337 self.cli = None
1338 ThreadableTest.clientTearDown(self)
1339
1340 def testInsideTimeout(self):
1341 conn, addr = self.serv.accept()
1342 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001343 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001344 testOutsideTimeout = testInsideTimeout
1345
1346 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001347 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001348 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001349 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001350
1351 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001352 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001353 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001354
1355
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001356class TCPTimeoutTest(SocketTCPTest):
1357
1358 def testTCPTimeout(self):
1359 def raise_timeout(*args, **kwargs):
1360 self.serv.settimeout(1.0)
1361 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001362 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001363 "Error generating a timeout exception (TCP)")
1364
1365 def testTimeoutZero(self):
1366 ok = False
1367 try:
1368 self.serv.settimeout(0.0)
1369 foo = self.serv.accept()
1370 except socket.timeout:
1371 self.fail("caught timeout instead of error (TCP)")
1372 except socket.error:
1373 ok = True
1374 except:
1375 self.fail("caught unexpected exception (TCP)")
1376 if not ok:
1377 self.fail("accept() returned success when we did not expect it")
1378
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001379 def testInterruptedTimeout(self):
1380 # XXX I don't know how to do this test on MSWindows or any other
1381 # plaform that doesn't support signal.alarm() or os.kill(), though
1382 # the bug should have existed on all platforms.
1383 if not hasattr(signal, "alarm"):
1384 return # can only test on *nix
1385 self.serv.settimeout(5.0) # must be longer than alarm
1386 class Alarm(Exception):
1387 pass
1388 def alarm_handler(signal, frame):
1389 raise Alarm
1390 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1391 try:
1392 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1393 try:
1394 foo = self.serv.accept()
1395 except socket.timeout:
1396 self.fail("caught timeout instead of Alarm")
1397 except Alarm:
1398 pass
1399 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001400 self.fail("caught other exception instead of Alarm:"
1401 " %s(%s):\n%s" %
1402 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001403 else:
1404 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001405 finally:
1406 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001407 except Alarm:
1408 self.fail("got Alarm in wrong place")
1409 finally:
1410 # no alarm can be pending. Safe to restore old handler.
1411 signal.signal(signal.SIGALRM, old_alarm)
1412
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001413class UDPTimeoutTest(SocketTCPTest):
1414
1415 def testUDPTimeout(self):
1416 def raise_timeout(*args, **kwargs):
1417 self.serv.settimeout(1.0)
1418 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001419 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001420 "Error generating a timeout exception (UDP)")
1421
1422 def testTimeoutZero(self):
1423 ok = False
1424 try:
1425 self.serv.settimeout(0.0)
1426 foo = self.serv.recv(1024)
1427 except socket.timeout:
1428 self.fail("caught timeout instead of error (UDP)")
1429 except socket.error:
1430 ok = True
1431 except:
1432 self.fail("caught unexpected exception (UDP)")
1433 if not ok:
1434 self.fail("recv() returned success when we did not expect it")
1435
1436class TestExceptions(unittest.TestCase):
1437
1438 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001439 self.assertTrue(issubclass(socket.error, Exception))
1440 self.assertTrue(issubclass(socket.herror, socket.error))
1441 self.assertTrue(issubclass(socket.gaierror, socket.error))
1442 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001443
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001444class TestLinuxAbstractNamespace(unittest.TestCase):
1445
1446 UNIX_PATH_MAX = 108
1447
1448 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001449 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001450 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1451 s1.bind(address)
1452 s1.listen(1)
1453 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1454 s2.connect(s1.getsockname())
1455 s1.accept()
1456 self.assertEqual(s1.getsockname(), address)
1457 self.assertEqual(s2.getpeername(), address)
1458
1459 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001460 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001461 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1462 s.bind(address)
1463 self.assertEqual(s.getsockname(), address)
1464
1465 def testNameOverflow(self):
1466 address = "\x00" + "h" * self.UNIX_PATH_MAX
1467 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1468 self.assertRaises(socket.error, s.bind, address)
1469
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001470
Victor Stinner45df8202010-04-28 22:31:17 +00001471@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001472class BufferIOTest(SocketConnectedTest):
1473 """
1474 Test the buffer versions of socket.recv() and socket.send().
1475 """
1476 def __init__(self, methodName='runTest'):
1477 SocketConnectedTest.__init__(self, methodName=methodName)
1478
Antoine Pitrou25480782010-03-17 22:50:28 +00001479 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001480 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001481 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001482 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001483 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001484 self.assertEqual(msg, MSG)
1485
Antoine Pitrou25480782010-03-17 22:50:28 +00001486 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001487 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001488 self.serv_conn.send(buf)
1489
Antoine Pitrou25480782010-03-17 22:50:28 +00001490 def testRecvIntoBytearray(self):
1491 buf = bytearray(1024)
1492 nbytes = self.cli_conn.recv_into(buf)
1493 self.assertEqual(nbytes, len(MSG))
1494 msg = buf[:len(MSG)]
1495 self.assertEqual(msg, MSG)
1496
1497 _testRecvIntoBytearray = _testRecvIntoArray
1498
1499 def testRecvIntoMemoryview(self):
1500 buf = bytearray(1024)
1501 nbytes = self.cli_conn.recv_into(memoryview(buf))
1502 self.assertEqual(nbytes, len(MSG))
1503 msg = buf[:len(MSG)]
1504 self.assertEqual(msg, MSG)
1505
1506 _testRecvIntoMemoryview = _testRecvIntoArray
1507
1508 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001509 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001510 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001511 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001512 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001513 self.assertEqual(msg, MSG)
1514
Antoine Pitrou25480782010-03-17 22:50:28 +00001515 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001516 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001517 self.serv_conn.send(buf)
1518
Antoine Pitrou25480782010-03-17 22:50:28 +00001519 def testRecvFromIntoBytearray(self):
1520 buf = bytearray(1024)
1521 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1522 self.assertEqual(nbytes, len(MSG))
1523 msg = buf[:len(MSG)]
1524 self.assertEqual(msg, MSG)
1525
1526 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1527
1528 def testRecvFromIntoMemoryview(self):
1529 buf = bytearray(1024)
1530 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1531 self.assertEqual(nbytes, len(MSG))
1532 msg = buf[:len(MSG)]
1533 self.assertEqual(msg, MSG)
1534
1535 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1536
Christian Heimes043d6f62008-01-07 17:19:16 +00001537
1538TIPC_STYPE = 2000
1539TIPC_LOWER = 200
1540TIPC_UPPER = 210
1541
1542def isTipcAvailable():
1543 """Check if the TIPC module is loaded
1544
1545 The TIPC module is not loaded automatically on Ubuntu and probably
1546 other Linux distros.
1547 """
1548 if not hasattr(socket, "AF_TIPC"):
1549 return False
1550 if not os.path.isfile("/proc/modules"):
1551 return False
1552 with open("/proc/modules") as f:
1553 for line in f:
1554 if line.startswith("tipc "):
1555 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001556 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001557 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1558 return False
1559
1560class TIPCTest (unittest.TestCase):
1561 def testRDM(self):
1562 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1563 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1564
1565 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1566 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1567 TIPC_LOWER, TIPC_UPPER)
1568 srv.bind(srvaddr)
1569
1570 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1571 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1572 cli.sendto(MSG, sendaddr)
1573
1574 msg, recvaddr = srv.recvfrom(1024)
1575
1576 self.assertEqual(cli.getsockname(), recvaddr)
1577 self.assertEqual(msg, MSG)
1578
1579
1580class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1581 def __init__(self, methodName = 'runTest'):
1582 unittest.TestCase.__init__(self, methodName = methodName)
1583 ThreadableTest.__init__(self)
1584
1585 def setUp(self):
1586 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1587 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1588 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1589 TIPC_LOWER, TIPC_UPPER)
1590 self.srv.bind(srvaddr)
1591 self.srv.listen(5)
1592 self.serverExplicitReady()
1593 self.conn, self.connaddr = self.srv.accept()
1594
1595 def clientSetUp(self):
1596 # The is a hittable race between serverExplicitReady() and the
1597 # accept() call; sleep a little while to avoid it, otherwise
1598 # we could get an exception
1599 time.sleep(0.1)
1600 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1601 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1602 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1603 self.cli.connect(addr)
1604 self.cliaddr = self.cli.getsockname()
1605
1606 def testStream(self):
1607 msg = self.conn.recv(1024)
1608 self.assertEqual(msg, MSG)
1609 self.assertEqual(self.cliaddr, self.connaddr)
1610
1611 def _testStream(self):
1612 self.cli.send(MSG)
1613 self.cli.close()
1614
1615
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001616@unittest.skipUnless(thread, 'Threading required for this test.')
1617class ContextManagersTest(ThreadedTCPSocketTest):
1618
1619 def _testSocketClass(self):
1620 # base test
1621 with socket.socket() as sock:
1622 self.assertFalse(sock._closed)
1623 self.assertTrue(sock._closed)
1624 # close inside with block
1625 with socket.socket() as sock:
1626 sock.close()
1627 self.assertTrue(sock._closed)
1628 # exception inside with block
1629 with socket.socket() as sock:
1630 self.assertRaises(socket.error, sock.sendall, b'foo')
1631 self.assertTrue(sock._closed)
1632
1633 def testCreateConnectionBase(self):
1634 conn, addr = self.serv.accept()
1635 data = conn.recv(1024)
1636 conn.sendall(data)
1637
1638 def _testCreateConnectionBase(self):
1639 address = self.serv.getsockname()
1640 with socket.create_connection(address) as sock:
1641 self.assertFalse(sock._closed)
1642 sock.sendall(b'foo')
1643 self.assertEqual(sock.recv(1024), b'foo')
1644 self.assertTrue(sock._closed)
1645
1646 def testCreateConnectionClose(self):
1647 conn, addr = self.serv.accept()
1648 data = conn.recv(1024)
1649 conn.sendall(data)
1650
1651 def _testCreateConnectionClose(self):
1652 address = self.serv.getsockname()
1653 with socket.create_connection(address) as sock:
1654 sock.close()
1655 self.assertTrue(sock._closed)
1656 self.assertRaises(socket.error, sock.sendall, b'foo')
1657
1658
Guido van Rossumb995eb72002-07-31 16:08:40 +00001659def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001660 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001661 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001662
1663 tests.extend([
1664 NonBlockingTCPTests,
1665 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001666 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001667 UnbufferedFileObjectClassTestCase,
1668 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001669 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001670 NetworkConnectionNoServer,
1671 NetworkConnectionAttributesTest,
1672 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001673 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001674 ])
Dave Cole331708b2004-08-09 04:51:41 +00001675 if hasattr(socket, "socketpair"):
1676 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001677 if sys.platform == 'linux2':
1678 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001679 if isTipcAvailable():
1680 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001681 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001682
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001683 thread_info = support.threading_setup()
1684 support.run_unittest(*tests)
1685 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001686
1687if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001688 test_main()