blob: 05b6ca784922637a2c4734854f213104d72ab9b0 [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)
717 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000718 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719
720 def _testFromFd(self):
721 self.serv_conn.send(MSG)
722
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000723 def testDup(self):
724 # Testing dup()
725 sock = self.cli_conn.dup()
726 msg = sock.recv(1024)
727 self.assertEqual(msg, MSG)
728
729 def _testDup(self):
730 self.serv_conn.send(MSG)
731
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000733 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000734 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000735 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000736 # wait for _testShutdown to finish: on OS X, when the server
737 # closes the connection the client also becomes disconnected,
738 # and the client's shutdown call will fail. (Issue #4397.)
739 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740
741 def _testShutdown(self):
742 self.serv_conn.send(MSG)
743 self.serv_conn.shutdown(2)
744
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000745 def testDetach(self):
746 # Testing detach()
747 fileno = self.cli_conn.fileno()
748 f = self.cli_conn.detach()
749 self.assertEqual(f, fileno)
750 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000751 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
752 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000753 # ...but we can create another socket using the (still open)
754 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000755 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
756 msg = sock.recv(1024)
757 self.assertEqual(msg, MSG)
758
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000759 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000760 self.serv_conn.send(MSG)
761
Victor Stinner45df8202010-04-28 22:31:17 +0000762@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763class BasicUDPTest(ThreadedUDPSocketTest):
764
765 def __init__(self, methodName='runTest'):
766 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
767
768 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000769 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000771 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772
773 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000774 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775
Guido van Rossum1c938012002-06-12 21:17:20 +0000776 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000777 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000779 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780
Guido van Rossum1c938012002-06-12 21:17:20 +0000781 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000782 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783
Guido van Rossumd8faa362007-04-27 19:54:29 +0000784 def testRecvFromNegative(self):
785 # Negative lengths passed to recvfrom should give ValueError.
786 self.assertRaises(ValueError, self.serv.recvfrom, -1)
787
788 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000789 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000790
Victor Stinner45df8202010-04-28 22:31:17 +0000791@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000792class TCPCloserTest(ThreadedTCPSocketTest):
793
794 def testClose(self):
795 conn, addr = self.serv.accept()
796 conn.close()
797
798 sd = self.cli
799 read, write, err = select.select([sd], [], [], 1.0)
800 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000801 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000802
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000803 # Calling close() many times should be safe.
804 conn.close()
805 conn.close()
806
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000807 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000808 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000809 time.sleep(1.0)
810
Victor Stinner45df8202010-04-28 22:31:17 +0000811@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000812class BasicSocketPairTest(SocketPairTest):
813
814 def __init__(self, methodName='runTest'):
815 SocketPairTest.__init__(self, methodName=methodName)
816
817 def testRecv(self):
818 msg = self.serv.recv(1024)
819 self.assertEqual(msg, MSG)
820
821 def _testRecv(self):
822 self.cli.send(MSG)
823
824 def testSend(self):
825 self.serv.send(MSG)
826
827 def _testSend(self):
828 msg = self.cli.recv(1024)
829 self.assertEqual(msg, MSG)
830
Victor Stinner45df8202010-04-28 22:31:17 +0000831@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832class NonBlockingTCPTests(ThreadedTCPSocketTest):
833
834 def __init__(self, methodName='runTest'):
835 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
836
837 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000838 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839 self.serv.setblocking(0)
840 start = time.time()
841 try:
842 self.serv.accept()
843 except socket.error:
844 pass
845 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000846 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000847
848 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000849 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000850
Guido van Rossum24e4af82002-06-12 19:18:08 +0000851 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000852 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000854 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 conn, addr = self.serv.accept()
856 except socket.error:
857 pass
858 else:
859 self.fail("Error trying to do non-blocking accept.")
860 read, write, err = select.select([self.serv], [], [])
861 if self.serv in read:
862 conn, addr = self.serv.accept()
863 else:
864 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000865
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000867 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000868 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869
870 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000871 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 conn, addr = self.serv.accept()
873
874 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000875 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000876 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877
878 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000879 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000880 conn, addr = self.serv.accept()
881 conn.setblocking(0)
882 try:
883 msg = conn.recv(len(MSG))
884 except socket.error:
885 pass
886 else:
887 self.fail("Error trying to do non-blocking recv.")
888 read, write, err = select.select([conn], [], [])
889 if conn in read:
890 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000891 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892 else:
893 self.fail("Error during select call to non-blocking socket.")
894
895 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000896 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000897 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898 self.cli.send(MSG)
899
Victor Stinner45df8202010-04-28 22:31:17 +0000900@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000902 """Unit tests for the object returned by socket.makefile()
903
904 self.serv_file is the io object returned by makefile() on
905 the client connection. You can read from this file to
906 get output from the server.
907
908 self.cli_file is the io object returned by makefile() on the
909 server connection. You can write to this file to send output
910 to the client.
911 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000912
Guido van Rossume9f66142002-08-07 15:46:19 +0000913 bufsize = -1 # Use default buffer size
914
Guido van Rossum24e4af82002-06-12 19:18:08 +0000915 def __init__(self, methodName='runTest'):
916 SocketConnectedTest.__init__(self, methodName=methodName)
917
918 def setUp(self):
919 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000920 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000921
922 def tearDown(self):
923 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000924 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925 self.serv_file = None
926 SocketConnectedTest.tearDown(self)
927
928 def clientSetUp(self):
929 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000930 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
932 def clientTearDown(self):
933 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000934 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 self.cli_file = None
936 SocketConnectedTest.clientTearDown(self)
937
938 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000939 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940 first_seg = self.serv_file.read(len(MSG)-3)
941 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000942 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000943 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000944
945 def _testSmallRead(self):
946 self.cli_file.write(MSG)
947 self.cli_file.flush()
948
Guido van Rossum8c943832002-08-08 01:00:28 +0000949 def testFullRead(self):
950 # read until EOF
951 msg = self.serv_file.read()
952 self.assertEqual(msg, MSG)
953
954 def _testFullRead(self):
955 self.cli_file.write(MSG)
956 self.cli_file.close()
957
Guido van Rossum24e4af82002-06-12 19:18:08 +0000958 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000959 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000960 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000961 while 1:
962 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000963 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000964 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000965 buf += char
966 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000967
968 def _testUnbufferedRead(self):
969 self.cli_file.write(MSG)
970 self.cli_file.flush()
971
972 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000973 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000974 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000975 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000976
977 def _testReadline(self):
978 self.cli_file.write(MSG)
979 self.cli_file.flush()
980
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000981 def testCloseAfterMakefile(self):
982 # The file returned by makefile should keep the socket open.
983 self.cli_conn.close()
984 # read until EOF
985 msg = self.serv_file.read()
986 self.assertEqual(msg, MSG)
987
988 def _testCloseAfterMakefile(self):
989 self.cli_file.write(MSG)
990 self.cli_file.flush()
991
992 def testMakefileAfterMakefileClose(self):
993 self.serv_file.close()
994 msg = self.cli_conn.recv(len(MSG))
995 self.assertEqual(msg, MSG)
996
997 def _testMakefileAfterMakefileClose(self):
998 self.cli_file.write(MSG)
999 self.cli_file.flush()
1000
Tim Peters116d83c2004-03-28 02:20:45 +00001001 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001002 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001003
1004 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001005 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001006
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001007 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001008 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001009 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
1010
1011 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001012 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001013 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
1014
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001015 def testRealClose(self):
1016 self.serv_file.close()
1017 self.assertRaises(ValueError, self.serv_file.fileno)
1018 self.cli_conn.close()
1019 self.assertRaises(socket.error, self.cli_conn.getsockname)
1020
1021 def _testRealClose(self):
1022 pass
1023
1024
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001025class FileObjectInterruptedTestCase(unittest.TestCase):
1026 """Test that the file object correctly handles EINTR internally."""
1027
1028 class MockSocket(object):
1029 def __init__(self, recv_funcs=()):
1030 # A generator that returns callables that we'll call for each
1031 # call to recv().
1032 self._recv_step = iter(recv_funcs)
1033
1034 def recv_into(self, buffer):
1035 data = next(self._recv_step)()
1036 assert len(buffer) >= len(data)
1037 buffer[:len(data)] = data
1038 return len(data)
1039
1040 def _decref_socketios(self):
1041 pass
1042
1043 def _textiowrap_for_test(self, buffering=-1):
1044 raw = socket.SocketIO(self, "r")
1045 if buffering < 0:
1046 buffering = io.DEFAULT_BUFFER_SIZE
1047 if buffering == 0:
1048 return raw
1049 buffer = io.BufferedReader(raw, buffering)
1050 text = io.TextIOWrapper(buffer, None, None)
1051 text.mode = "rb"
1052 return text
1053
1054 @staticmethod
1055 def _raise_eintr():
1056 raise socket.error(errno.EINTR)
1057
1058 def _textiowrap_mock_socket(self, mock, buffering=-1):
1059 raw = socket.SocketIO(mock, "r")
1060 if buffering < 0:
1061 buffering = io.DEFAULT_BUFFER_SIZE
1062 if buffering == 0:
1063 return raw
1064 buffer = io.BufferedReader(raw, buffering)
1065 text = io.TextIOWrapper(buffer, None, None)
1066 text.mode = "rb"
1067 return text
1068
1069 def _test_readline(self, size=-1, buffering=-1):
1070 mock_sock = self.MockSocket(recv_funcs=[
1071 lambda : b"This is the first line\nAnd the sec",
1072 self._raise_eintr,
1073 lambda : b"ond line is here\n",
1074 lambda : b"",
1075 lambda : b"", # XXX(gps): io library does an extra EOF read
1076 ])
1077 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1078 self.assertEquals(fo.readline(size), "This is the first line\n")
1079 self.assertEquals(fo.readline(size), "And the second line is here\n")
1080
1081 def _test_read(self, size=-1, buffering=-1):
1082 mock_sock = self.MockSocket(recv_funcs=[
1083 lambda : b"This is the first line\nAnd the sec",
1084 self._raise_eintr,
1085 lambda : b"ond line is here\n",
1086 lambda : b"",
1087 lambda : b"", # XXX(gps): io library does an extra EOF read
1088 ])
1089 expecting = (b"This is the first line\n"
1090 b"And the second line is here\n")
1091 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1092 if buffering == 0:
1093 data = b''
1094 else:
1095 data = ''
1096 expecting = expecting.decode('utf8')
1097 while len(data) != len(expecting):
1098 part = fo.read(size)
1099 if not part:
1100 break
1101 data += part
1102 self.assertEquals(data, expecting)
1103
1104 def test_default(self):
1105 self._test_readline()
1106 self._test_readline(size=100)
1107 self._test_read()
1108 self._test_read(size=100)
1109
1110 def test_with_1k_buffer(self):
1111 self._test_readline(buffering=1024)
1112 self._test_readline(size=100, buffering=1024)
1113 self._test_read(buffering=1024)
1114 self._test_read(size=100, buffering=1024)
1115
1116 def _test_readline_no_buffer(self, size=-1):
1117 mock_sock = self.MockSocket(recv_funcs=[
1118 lambda : b"a",
1119 lambda : b"\n",
1120 lambda : b"B",
1121 self._raise_eintr,
1122 lambda : b"b",
1123 lambda : b"",
1124 ])
1125 fo = mock_sock._textiowrap_for_test(buffering=0)
1126 self.assertEquals(fo.readline(size), b"a\n")
1127 self.assertEquals(fo.readline(size), b"Bb")
1128
1129 def test_no_buffer(self):
1130 self._test_readline_no_buffer()
1131 self._test_readline_no_buffer(size=4)
1132 self._test_read(buffering=0)
1133 self._test_read(size=100, buffering=0)
1134
1135
Guido van Rossume9f66142002-08-07 15:46:19 +00001136class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1137
1138 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001139
Guido van Rossume9f66142002-08-07 15:46:19 +00001140 In this case (and in this case only), it should be possible to
1141 create a file object, read a line from it, create another file
1142 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001143 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001144 when reading multiple requests from the same socket."""
1145
1146 bufsize = 0 # Use unbuffered mode
1147
1148 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001149 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001150 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001151 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001152 self.serv_file = self.cli_conn.makefile('rb', 0)
1153 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001154 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001155
1156 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001157 self.cli_file.write(b"A. " + MSG)
1158 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001159 self.cli_file.flush()
1160
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001161 def testMakefileClose(self):
1162 # The file returned by makefile should keep the socket open...
1163 self.cli_conn.close()
1164 msg = self.cli_conn.recv(1024)
1165 self.assertEqual(msg, MSG)
1166 # ...until the file is itself closed
1167 self.serv_file.close()
1168 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1169
1170 def _testMakefileClose(self):
1171 self.cli_file.write(MSG)
1172 self.cli_file.flush()
1173
1174 def testMakefileCloseSocketDestroy(self):
1175 refcount_before = sys.getrefcount(self.cli_conn)
1176 self.serv_file.close()
1177 refcount_after = sys.getrefcount(self.cli_conn)
1178 self.assertEqual(refcount_before - 1, refcount_after)
1179
1180 def _testMakefileCloseSocketDestroy(self):
1181 pass
1182
1183
Guido van Rossum8c943832002-08-08 01:00:28 +00001184class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1185
1186 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1187
1188
1189class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1190
1191 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001192
Thomas Woutersb2137042007-02-01 18:02:27 +00001193
Guido van Rossumd8faa362007-04-27 19:54:29 +00001194class NetworkConnectionTest(object):
1195 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001196
Guido van Rossumd8faa362007-04-27 19:54:29 +00001197 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001198 # We're inherited below by BasicTCPTest2, which also inherits
1199 # BasicTCPTest, which defines self.port referenced below.
1200 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001201 self.serv_conn = self.cli
1202
1203class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1204 """Tests that NetworkConnection does not break existing TCP functionality.
1205 """
1206
1207class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001208
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001209 class MockSocket(socket.socket):
1210 def connect(self, *args):
1211 raise socket.timeout('timed out')
1212
1213 @contextlib.contextmanager
1214 def mocked_socket_module(self):
1215 """Return a socket which times out on connect"""
1216 old_socket = socket.socket
1217 socket.socket = self.MockSocket
1218 try:
1219 yield
1220 finally:
1221 socket.socket = old_socket
1222
1223 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001224 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001225 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1226 with self.assertRaises(socket.error) as cm:
1227 cli.connect((HOST, port))
1228 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1229
1230 def test_create_connection(self):
1231 # Issue #9792: errors raised by create_connection() should have
1232 # a proper errno attribute.
1233 port = support.find_unused_port()
1234 with self.assertRaises(socket.error) as cm:
1235 socket.create_connection((HOST, port))
1236 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1237
1238 def test_create_connection_timeout(self):
1239 # Issue #9792: create_connection() should not recast timeout errors
1240 # as generic socket errors.
1241 with self.mocked_socket_module():
1242 with self.assertRaises(socket.timeout):
1243 socket.create_connection((HOST, 1234))
1244
Guido van Rossumd8faa362007-04-27 19:54:29 +00001245
Victor Stinner45df8202010-04-28 22:31:17 +00001246@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001247class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1248
1249 def __init__(self, methodName='runTest'):
1250 SocketTCPTest.__init__(self, methodName=methodName)
1251 ThreadableTest.__init__(self)
1252
1253 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001254 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001255
1256 def clientTearDown(self):
1257 self.cli.close()
1258 self.cli = None
1259 ThreadableTest.clientTearDown(self)
1260
1261 def _justAccept(self):
1262 conn, addr = self.serv.accept()
1263
1264 testFamily = _justAccept
1265 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001266 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001267 self.assertEqual(self.cli.family, 2)
1268
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001269 testSourceAddress = _justAccept
1270 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001271 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1272 source_address=('', self.source_port))
1273 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001274 # The port number being used is sufficient to show that the bind()
1275 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001276
Guido van Rossumd8faa362007-04-27 19:54:29 +00001277 testTimeoutDefault = _justAccept
1278 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001279 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001280 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001281 socket.setdefaulttimeout(42)
1282 try:
1283 self.cli = socket.create_connection((HOST, self.port))
1284 finally:
1285 socket.setdefaulttimeout(None)
1286 self.assertEquals(self.cli.gettimeout(), 42)
1287
1288 testTimeoutNone = _justAccept
1289 def _testTimeoutNone(self):
1290 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001291 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001292 socket.setdefaulttimeout(30)
1293 try:
1294 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1295 finally:
1296 socket.setdefaulttimeout(None)
1297 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001298
1299 testTimeoutValueNamed = _justAccept
1300 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001301 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001302 self.assertEqual(self.cli.gettimeout(), 30)
1303
1304 testTimeoutValueNonamed = _justAccept
1305 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001306 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001307 self.assertEqual(self.cli.gettimeout(), 30)
1308
Victor Stinner45df8202010-04-28 22:31:17 +00001309@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001310class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1311
1312 def __init__(self, methodName='runTest'):
1313 SocketTCPTest.__init__(self, methodName=methodName)
1314 ThreadableTest.__init__(self)
1315
1316 def clientSetUp(self):
1317 pass
1318
1319 def clientTearDown(self):
1320 self.cli.close()
1321 self.cli = None
1322 ThreadableTest.clientTearDown(self)
1323
1324 def testInsideTimeout(self):
1325 conn, addr = self.serv.accept()
1326 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001327 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001328 testOutsideTimeout = testInsideTimeout
1329
1330 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001331 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001332 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001333 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001334
1335 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001336 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001337 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001338
1339
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001340class TCPTimeoutTest(SocketTCPTest):
1341
1342 def testTCPTimeout(self):
1343 def raise_timeout(*args, **kwargs):
1344 self.serv.settimeout(1.0)
1345 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001346 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001347 "Error generating a timeout exception (TCP)")
1348
1349 def testTimeoutZero(self):
1350 ok = False
1351 try:
1352 self.serv.settimeout(0.0)
1353 foo = self.serv.accept()
1354 except socket.timeout:
1355 self.fail("caught timeout instead of error (TCP)")
1356 except socket.error:
1357 ok = True
1358 except:
1359 self.fail("caught unexpected exception (TCP)")
1360 if not ok:
1361 self.fail("accept() returned success when we did not expect it")
1362
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001363 def testInterruptedTimeout(self):
1364 # XXX I don't know how to do this test on MSWindows or any other
1365 # plaform that doesn't support signal.alarm() or os.kill(), though
1366 # the bug should have existed on all platforms.
1367 if not hasattr(signal, "alarm"):
1368 return # can only test on *nix
1369 self.serv.settimeout(5.0) # must be longer than alarm
1370 class Alarm(Exception):
1371 pass
1372 def alarm_handler(signal, frame):
1373 raise Alarm
1374 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1375 try:
1376 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1377 try:
1378 foo = self.serv.accept()
1379 except socket.timeout:
1380 self.fail("caught timeout instead of Alarm")
1381 except Alarm:
1382 pass
1383 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001384 self.fail("caught other exception instead of Alarm:"
1385 " %s(%s):\n%s" %
1386 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001387 else:
1388 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001389 finally:
1390 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001391 except Alarm:
1392 self.fail("got Alarm in wrong place")
1393 finally:
1394 # no alarm can be pending. Safe to restore old handler.
1395 signal.signal(signal.SIGALRM, old_alarm)
1396
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001397class UDPTimeoutTest(SocketTCPTest):
1398
1399 def testUDPTimeout(self):
1400 def raise_timeout(*args, **kwargs):
1401 self.serv.settimeout(1.0)
1402 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001403 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001404 "Error generating a timeout exception (UDP)")
1405
1406 def testTimeoutZero(self):
1407 ok = False
1408 try:
1409 self.serv.settimeout(0.0)
1410 foo = self.serv.recv(1024)
1411 except socket.timeout:
1412 self.fail("caught timeout instead of error (UDP)")
1413 except socket.error:
1414 ok = True
1415 except:
1416 self.fail("caught unexpected exception (UDP)")
1417 if not ok:
1418 self.fail("recv() returned success when we did not expect it")
1419
1420class TestExceptions(unittest.TestCase):
1421
1422 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001423 self.assertTrue(issubclass(socket.error, Exception))
1424 self.assertTrue(issubclass(socket.herror, socket.error))
1425 self.assertTrue(issubclass(socket.gaierror, socket.error))
1426 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001427
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001428class TestLinuxAbstractNamespace(unittest.TestCase):
1429
1430 UNIX_PATH_MAX = 108
1431
1432 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001433 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001434 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1435 s1.bind(address)
1436 s1.listen(1)
1437 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1438 s2.connect(s1.getsockname())
1439 s1.accept()
1440 self.assertEqual(s1.getsockname(), address)
1441 self.assertEqual(s2.getpeername(), address)
1442
1443 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001444 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001445 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1446 s.bind(address)
1447 self.assertEqual(s.getsockname(), address)
1448
1449 def testNameOverflow(self):
1450 address = "\x00" + "h" * self.UNIX_PATH_MAX
1451 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1452 self.assertRaises(socket.error, s.bind, address)
1453
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001454
Victor Stinner45df8202010-04-28 22:31:17 +00001455@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001456class BufferIOTest(SocketConnectedTest):
1457 """
1458 Test the buffer versions of socket.recv() and socket.send().
1459 """
1460 def __init__(self, methodName='runTest'):
1461 SocketConnectedTest.__init__(self, methodName=methodName)
1462
Antoine Pitrou25480782010-03-17 22:50:28 +00001463 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001464 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001465 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001466 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001467 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001468 self.assertEqual(msg, MSG)
1469
Antoine Pitrou25480782010-03-17 22:50:28 +00001470 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001471 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001472 self.serv_conn.send(buf)
1473
Antoine Pitrou25480782010-03-17 22:50:28 +00001474 def testRecvIntoBytearray(self):
1475 buf = bytearray(1024)
1476 nbytes = self.cli_conn.recv_into(buf)
1477 self.assertEqual(nbytes, len(MSG))
1478 msg = buf[:len(MSG)]
1479 self.assertEqual(msg, MSG)
1480
1481 _testRecvIntoBytearray = _testRecvIntoArray
1482
1483 def testRecvIntoMemoryview(self):
1484 buf = bytearray(1024)
1485 nbytes = self.cli_conn.recv_into(memoryview(buf))
1486 self.assertEqual(nbytes, len(MSG))
1487 msg = buf[:len(MSG)]
1488 self.assertEqual(msg, MSG)
1489
1490 _testRecvIntoMemoryview = _testRecvIntoArray
1491
1492 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001493 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001494 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001495 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001496 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001497 self.assertEqual(msg, MSG)
1498
Antoine Pitrou25480782010-03-17 22:50:28 +00001499 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001500 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001501 self.serv_conn.send(buf)
1502
Antoine Pitrou25480782010-03-17 22:50:28 +00001503 def testRecvFromIntoBytearray(self):
1504 buf = bytearray(1024)
1505 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1506 self.assertEqual(nbytes, len(MSG))
1507 msg = buf[:len(MSG)]
1508 self.assertEqual(msg, MSG)
1509
1510 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1511
1512 def testRecvFromIntoMemoryview(self):
1513 buf = bytearray(1024)
1514 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1515 self.assertEqual(nbytes, len(MSG))
1516 msg = buf[:len(MSG)]
1517 self.assertEqual(msg, MSG)
1518
1519 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1520
Christian Heimes043d6f62008-01-07 17:19:16 +00001521
1522TIPC_STYPE = 2000
1523TIPC_LOWER = 200
1524TIPC_UPPER = 210
1525
1526def isTipcAvailable():
1527 """Check if the TIPC module is loaded
1528
1529 The TIPC module is not loaded automatically on Ubuntu and probably
1530 other Linux distros.
1531 """
1532 if not hasattr(socket, "AF_TIPC"):
1533 return False
1534 if not os.path.isfile("/proc/modules"):
1535 return False
1536 with open("/proc/modules") as f:
1537 for line in f:
1538 if line.startswith("tipc "):
1539 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001540 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001541 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1542 return False
1543
1544class TIPCTest (unittest.TestCase):
1545 def testRDM(self):
1546 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1547 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1548
1549 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1550 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1551 TIPC_LOWER, TIPC_UPPER)
1552 srv.bind(srvaddr)
1553
1554 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1555 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1556 cli.sendto(MSG, sendaddr)
1557
1558 msg, recvaddr = srv.recvfrom(1024)
1559
1560 self.assertEqual(cli.getsockname(), recvaddr)
1561 self.assertEqual(msg, MSG)
1562
1563
1564class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1565 def __init__(self, methodName = 'runTest'):
1566 unittest.TestCase.__init__(self, methodName = methodName)
1567 ThreadableTest.__init__(self)
1568
1569 def setUp(self):
1570 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1571 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1572 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1573 TIPC_LOWER, TIPC_UPPER)
1574 self.srv.bind(srvaddr)
1575 self.srv.listen(5)
1576 self.serverExplicitReady()
1577 self.conn, self.connaddr = self.srv.accept()
1578
1579 def clientSetUp(self):
1580 # The is a hittable race between serverExplicitReady() and the
1581 # accept() call; sleep a little while to avoid it, otherwise
1582 # we could get an exception
1583 time.sleep(0.1)
1584 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1585 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1586 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1587 self.cli.connect(addr)
1588 self.cliaddr = self.cli.getsockname()
1589
1590 def testStream(self):
1591 msg = self.conn.recv(1024)
1592 self.assertEqual(msg, MSG)
1593 self.assertEqual(self.cliaddr, self.connaddr)
1594
1595 def _testStream(self):
1596 self.cli.send(MSG)
1597 self.cli.close()
1598
1599
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001600@unittest.skipUnless(thread, 'Threading required for this test.')
1601class ContextManagersTest(ThreadedTCPSocketTest):
1602
1603 def _testSocketClass(self):
1604 # base test
1605 with socket.socket() as sock:
1606 self.assertFalse(sock._closed)
1607 self.assertTrue(sock._closed)
1608 # close inside with block
1609 with socket.socket() as sock:
1610 sock.close()
1611 self.assertTrue(sock._closed)
1612 # exception inside with block
1613 with socket.socket() as sock:
1614 self.assertRaises(socket.error, sock.sendall, b'foo')
1615 self.assertTrue(sock._closed)
1616
1617 def testCreateConnectionBase(self):
1618 conn, addr = self.serv.accept()
1619 data = conn.recv(1024)
1620 conn.sendall(data)
1621
1622 def _testCreateConnectionBase(self):
1623 address = self.serv.getsockname()
1624 with socket.create_connection(address) as sock:
1625 self.assertFalse(sock._closed)
1626 sock.sendall(b'foo')
1627 self.assertEqual(sock.recv(1024), b'foo')
1628 self.assertTrue(sock._closed)
1629
1630 def testCreateConnectionClose(self):
1631 conn, addr = self.serv.accept()
1632 data = conn.recv(1024)
1633 conn.sendall(data)
1634
1635 def _testCreateConnectionClose(self):
1636 address = self.serv.getsockname()
1637 with socket.create_connection(address) as sock:
1638 sock.close()
1639 self.assertTrue(sock._closed)
1640 self.assertRaises(socket.error, sock.sendall, b'foo')
1641
1642
Guido van Rossumb995eb72002-07-31 16:08:40 +00001643def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001644 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001645 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001646
1647 tests.extend([
1648 NonBlockingTCPTests,
1649 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001650 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001651 UnbufferedFileObjectClassTestCase,
1652 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001653 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001654 NetworkConnectionNoServer,
1655 NetworkConnectionAttributesTest,
1656 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001657 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001658 ])
Dave Cole331708b2004-08-09 04:51:41 +00001659 if hasattr(socket, "socketpair"):
1660 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001661 if sys.platform == 'linux2':
1662 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001663 if isTipcAvailable():
1664 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001665 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001666
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001667 thread_info = support.threading_setup()
1668 support.run_unittest(*tests)
1669 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001670
1671if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001672 test_main()