blob: aadfdfaf206adb9cbc2844c3a7ede79e270ee71c [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
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitroub1c54962010-10-14 15:05:38 +000020try:
21 import fcntl
22except ImportError:
23 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000024
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000025def try_address(host, port=0, family=socket.AF_INET):
26 """Try to bind a socket on the given host:port and return True
27 if that has been possible."""
28 try:
29 sock = socket.socket(family, socket.SOCK_STREAM)
30 sock.bind((host, port))
31 except (socket.error, socket.gaierror):
32 return False
33 else:
34 sock.close()
35 return True
36
Benjamin Petersonee8712c2008-05-20 21:35:26 +000037HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000038MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000039SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000040
Victor Stinner45df8202010-04-28 22:31:17 +000041try:
42 import _thread as thread
43 import threading
44except ImportError:
45 thread = None
46 threading = None
47
Guido van Rossum24e4af82002-06-12 19:18:08 +000048class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000049
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 def setUp(self):
51 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000052 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000053 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000054
Guido van Rossum24e4af82002-06-12 19:18:08 +000055 def tearDown(self):
56 self.serv.close()
57 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000058
Guido van Rossum24e4af82002-06-12 19:18:08 +000059class SocketUDPTest(unittest.TestCase):
60
61 def setUp(self):
62 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000063 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000064
65 def tearDown(self):
66 self.serv.close()
67 self.serv = None
68
69class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000070 """Threadable Test class
71
72 The ThreadableTest class makes it easy to create a threaded
73 client/server pair from an existing unit test. To create a
74 new threaded class from an existing unit test, use multiple
75 inheritance:
76
77 class NewClass (OldClass, ThreadableTest):
78 pass
79
80 This class defines two new fixture functions with obvious
81 purposes for overriding:
82
83 clientSetUp ()
84 clientTearDown ()
85
86 Any new test functions within the class must then define
87 tests in pairs, where the test name is preceeded with a
88 '_' to indicate the client portion of the test. Ex:
89
90 def testFoo(self):
91 # Server portion
92
93 def _testFoo(self):
94 # Client portion
95
96 Any exceptions raised by the clients during their tests
97 are caught and transferred to the main thread to alert
98 the testing framework.
99
100 Note, the server setup function cannot call any blocking
101 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000102 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000103 the blocking call (such as in setting up a client/server
104 connection and performing the accept() in setUp().
105 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106
107 def __init__(self):
108 # Swap the true setup function
109 self.__setUp = self.setUp
110 self.__tearDown = self.tearDown
111 self.setUp = self._setUp
112 self.tearDown = self._tearDown
113
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000114 def serverExplicitReady(self):
115 """This method allows the server to explicitly indicate that
116 it wants the client thread to proceed. This is useful if the
117 server is about to execute a blocking routine that is
118 dependent upon the client thread during its setup routine."""
119 self.server_ready.set()
120
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000122 self.server_ready = threading.Event()
123 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000125 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126
127 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000128 methodname = self.id()
129 i = methodname.rfind('.')
130 methodname = methodname[i+1:]
131 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000132 self.client_thread = thread.start_new_thread(
133 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000134
135 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000136 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000137 self.server_ready.set()
138 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000139
140 def _tearDown(self):
141 self.__tearDown()
142 self.done.wait()
143
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000144 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000145 exc = self.queue.get()
146 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147
148 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000149 self.server_ready.wait()
150 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000152 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000153 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000154 try:
155 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000156 except BaseException as e:
157 self.queue.put(e)
158 finally:
159 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000162 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000163
164 def clientTearDown(self):
165 self.done.set()
166 thread.exit()
167
168class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
169
170 def __init__(self, methodName='runTest'):
171 SocketTCPTest.__init__(self, methodName=methodName)
172 ThreadableTest.__init__(self)
173
174 def clientSetUp(self):
175 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
176
177 def clientTearDown(self):
178 self.cli.close()
179 self.cli = None
180 ThreadableTest.clientTearDown(self)
181
182class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
183
184 def __init__(self, methodName='runTest'):
185 SocketUDPTest.__init__(self, methodName=methodName)
186 ThreadableTest.__init__(self)
187
188 def clientSetUp(self):
189 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
190
191class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000192 """Socket tests for client-server connection.
193
194 self.cli_conn is a client socket connected to the server. The
195 setUp() method guarantees that it is connected to the server.
196 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197
198 def __init__(self, methodName='runTest'):
199 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
200
201 def setUp(self):
202 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000203 # Indicate explicitly we're ready for the client thread to
204 # proceed and then perform the blocking call to accept
205 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000206 conn, addr = self.serv.accept()
207 self.cli_conn = conn
208
209 def tearDown(self):
210 self.cli_conn.close()
211 self.cli_conn = None
212 ThreadedTCPSocketTest.tearDown(self)
213
214 def clientSetUp(self):
215 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000216 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000217 self.serv_conn = self.cli
218
219 def clientTearDown(self):
220 self.serv_conn.close()
221 self.serv_conn = None
222 ThreadedTCPSocketTest.clientTearDown(self)
223
Dave Cole331708b2004-08-09 04:51:41 +0000224class SocketPairTest(unittest.TestCase, ThreadableTest):
225
226 def __init__(self, methodName='runTest'):
227 unittest.TestCase.__init__(self, methodName=methodName)
228 ThreadableTest.__init__(self)
229
230 def setUp(self):
231 self.serv, self.cli = socket.socketpair()
232
233 def tearDown(self):
234 self.serv.close()
235 self.serv = None
236
237 def clientSetUp(self):
238 pass
239
240 def clientTearDown(self):
241 self.cli.close()
242 self.cli = None
243 ThreadableTest.clientTearDown(self)
244
Tim Peters494aaee2004-08-09 18:54:11 +0000245
Guido van Rossum24e4af82002-06-12 19:18:08 +0000246#######################################################################
247## Begin Tests
248
249class GeneralModuleTests(unittest.TestCase):
250
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000251 def test_repr(self):
252 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000253 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000254
Raymond Hettinger027bb632004-05-31 03:09:25 +0000255 def test_weakref(self):
256 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
257 p = proxy(s)
258 self.assertEqual(p.fileno(), s.fileno())
259 s.close()
260 s = None
261 try:
262 p.fileno()
263 except ReferenceError:
264 pass
265 else:
266 self.fail('Socket proxy still exists')
267
Guido van Rossum24e4af82002-06-12 19:18:08 +0000268 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000269 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270 def raise_error(*args, **kwargs):
271 raise socket.error
272 def raise_herror(*args, **kwargs):
273 raise socket.herror
274 def raise_gaierror(*args, **kwargs):
275 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000278 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000280 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 "Error raising socket exception.")
282
283 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000284 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 socket.AF_INET
286 socket.SOCK_STREAM
287 socket.SOCK_DGRAM
288 socket.SOCK_RAW
289 socket.SOCK_RDM
290 socket.SOCK_SEQPACKET
291 socket.SOL_SOCKET
292 socket.SO_REUSEADDR
293
Guido van Rossum654c11e2002-06-13 20:24:17 +0000294 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000295 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000296 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000297 try:
298 ip = socket.gethostbyname(hostname)
299 except socket.error:
300 # Probably name lookup wasn't set up right; skip this test
301 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000302 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000303 try:
304 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
305 except socket.error:
306 # Probably a similar problem as above; skip this test
307 return
Brett Cannon01668a12005-03-11 00:04:17 +0000308 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000309 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000310 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000311 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000312
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000313 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000314 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000315 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316 try:
317 # On some versions, this loses a reference
318 orig = sys.getrefcount(__name__)
319 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000320 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000321 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000322 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000323
Guido van Rossum24e4af82002-06-12 19:18:08 +0000324 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000325 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000326 try:
327 # On some versions, this crashes the interpreter.
328 socket.getnameinfo(('x', 0, 0, 0), 0)
329 except socket.error:
330 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000331
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000332 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000333 # This just checks that htons etc. are their own inverse,
334 # when looking at the lower 16 or 32 bits.
335 sizes = {socket.htonl: 32, socket.ntohl: 32,
336 socket.htons: 16, socket.ntohs: 16}
337 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000338 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000339 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
340 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000341
Guido van Rossuma2627af2002-09-14 00:58:46 +0000342 swapped = func(mask)
343 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000344 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000345
Guido van Rossum018919a2007-01-15 00:07:32 +0000346 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000347 good_values = [ 1, 2, 3, 1, 2, 3 ]
348 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000349 for k in good_values:
350 socket.ntohl(k)
351 socket.ntohs(k)
352 socket.htonl(k)
353 socket.htons(k)
354 for k in bad_values:
355 self.assertRaises(OverflowError, socket.ntohl, k)
356 self.assertRaises(OverflowError, socket.ntohs, k)
357 self.assertRaises(OverflowError, socket.htonl, k)
358 self.assertRaises(OverflowError, socket.htons, k)
359
Barry Warsaw11b91a02004-06-28 00:50:43 +0000360 def testGetServBy(self):
361 eq = self.assertEqual
362 # Find one service that exists, then check all the related interfaces.
363 # I've ordered this by protocols that have both a tcp and udp
364 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000365 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000366 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000367 # avoid the 'echo' service on this platform, as there is an
368 # assumption breaking non-standard port/protocol entry
369 services = ('daytime', 'qotd', 'domain')
370 else:
371 services = ('echo', 'daytime', 'domain')
372 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000373 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000374 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000375 break
376 except socket.error:
377 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000378 else:
379 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000380 # Try same call with optional protocol omitted
381 port2 = socket.getservbyname(service)
382 eq(port, port2)
383 # Try udp, but don't barf it it doesn't exist
384 try:
385 udpport = socket.getservbyname(service, 'udp')
386 except socket.error:
387 udpport = None
388 else:
389 eq(udpport, port)
390 # Now make sure the lookup by port returns the same service name
391 eq(socket.getservbyport(port2), service)
392 eq(socket.getservbyport(port, 'tcp'), service)
393 if udpport is not None:
394 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000395 # Make sure getservbyport does not accept out of range ports.
396 self.assertRaises(OverflowError, socket.getservbyport, -1)
397 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000398
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000399 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000400 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000401 # The default timeout should initially be None
402 self.assertEqual(socket.getdefaulttimeout(), None)
403 s = socket.socket()
404 self.assertEqual(s.gettimeout(), None)
405 s.close()
406
407 # Set the default timeout to 10, and see if it propagates
408 socket.setdefaulttimeout(10)
409 self.assertEqual(socket.getdefaulttimeout(), 10)
410 s = socket.socket()
411 self.assertEqual(s.gettimeout(), 10)
412 s.close()
413
414 # Reset the default timeout to None, and see if it propagates
415 socket.setdefaulttimeout(None)
416 self.assertEqual(socket.getdefaulttimeout(), None)
417 s = socket.socket()
418 self.assertEqual(s.gettimeout(), None)
419 s.close()
420
421 # Check that setting it to an invalid value raises ValueError
422 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
423
424 # Check that setting it to an invalid type raises TypeError
425 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
426
Benjamin Petersonf91df042009-02-13 02:50:59 +0000427 def testIPv4_inet_aton_fourbytes(self):
428 if not hasattr(socket, 'inet_aton'):
429 return # No inet_aton, nothing to check
430 # Test that issue1008086 and issue767150 are fixed.
431 # It must return 4 bytes.
432 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
433 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
434
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000435 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000436 if not hasattr(socket, 'inet_pton'):
437 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000438 from socket import inet_aton as f, inet_pton, AF_INET
439 g = lambda a: inet_pton(AF_INET, a)
440
Guido van Rossumb5b22702007-05-18 18:55:53 +0000441 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
442 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
443 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
444 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
445 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446
Guido van Rossumb5b22702007-05-18 18:55:53 +0000447 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
448 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
449 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
450 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000451
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000452 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000453 if not hasattr(socket, 'inet_pton'):
454 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000455 try:
456 from socket import inet_pton, AF_INET6, has_ipv6
457 if not has_ipv6:
458 return
459 except ImportError:
460 return
461 f = lambda a: inet_pton(AF_INET6, a)
462
Guido van Rossum540d9872007-08-17 03:51:09 +0000463 self.assertEquals(b'\x00' * 16, f('::'))
464 self.assertEquals(b'\x00' * 16, f('0::0'))
465 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000466 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000467 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 +0000468 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
469 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000470
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000471 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000472 if not hasattr(socket, 'inet_ntop'):
473 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000474 from socket import inet_ntoa as f, inet_ntop, AF_INET
475 g = lambda a: inet_ntop(AF_INET, a)
476
Guido van Rossumb5b22702007-05-18 18:55:53 +0000477 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
478 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
479 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
480 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000481
Guido van Rossumb5b22702007-05-18 18:55:53 +0000482 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
483 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
484 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000485
486 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000487 if not hasattr(socket, 'inet_ntop'):
488 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000489 try:
490 from socket import inet_ntop, AF_INET6, has_ipv6
491 if not has_ipv6:
492 return
493 except ImportError:
494 return
495 f = lambda a: inet_ntop(AF_INET6, a)
496
Guido van Rossum540d9872007-08-17 03:51:09 +0000497 self.assertEquals('::', f(b'\x00' * 16))
498 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000499 self.assertEquals(
500 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000501 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 +0000502 )
503
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000504 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000505
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000506 def _get_unused_port(self, bind_address='0.0.0.0'):
507 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000508
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000509 Args:
510 bind_address: Hostname or IP address to search for a port on.
511
512 Returns: A most likely to be unused port.
513 """
514 tempsock = socket.socket()
515 tempsock.bind((bind_address, 0))
516 host, port = tempsock.getsockname()
517 tempsock.close()
518 return port
519
520 def testSockName(self):
521 # Testing getsockname()
522 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000523 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000524 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000526 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
527 # it reasonable to get the host's addr in addition to 0.0.0.0.
528 # At least for eCos. This is required for the S/390 to pass.
529 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000530 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000531 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000532
533 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000534 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 # We know a socket should start without reuse==0
536 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
537 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000538 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539
540 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000541 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
543 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
544 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000545 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000546
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000547 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000548 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000549 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
550 sock.settimeout(1)
551 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000552 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000553
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000554 def testNewAttributes(self):
555 # testing .family, .type and .protocol
556 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
557 self.assertEqual(sock.family, socket.AF_INET)
558 self.assertEqual(sock.type, socket.SOCK_STREAM)
559 self.assertEqual(sock.proto, 0)
560 sock.close()
561
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000562 def test_getsockaddrarg(self):
563 host = '0.0.0.0'
564 port = self._get_unused_port(bind_address=host)
565 big_port = port + 65536
566 neg_port = port - 65536
567 sock = socket.socket()
568 try:
569 self.assertRaises(OverflowError, sock.bind, (host, big_port))
570 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
571 sock.bind((host, port))
572 finally:
573 sock.close()
574
Christian Heimesfaf2f632008-01-06 16:59:19 +0000575 def test_sock_ioctl(self):
576 if os.name != "nt":
577 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000578 self.assertTrue(hasattr(socket.socket, 'ioctl'))
579 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
580 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
581 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000582 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
583 s = socket.socket()
584 self.assertRaises(ValueError, s.ioctl, -1, None)
585 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000586
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000587 def testGetaddrinfo(self):
588 try:
589 socket.getaddrinfo('localhost', 80)
590 except socket.gaierror as err:
591 if err.errno == socket.EAI_SERVICE:
592 # see http://bugs.python.org/issue1282647
593 self.skipTest("buggy libc version")
594 raise
595 # len of every sequence is supposed to be == 5
596 for info in socket.getaddrinfo(HOST, None):
597 self.assertEqual(len(info), 5)
598 # host can be a domain name, a string representation of an
599 # IPv4/v6 address or None
600 socket.getaddrinfo('localhost', 80)
601 socket.getaddrinfo('127.0.0.1', 80)
602 socket.getaddrinfo(None, 80)
603 if SUPPORTS_IPV6:
604 socket.getaddrinfo('::1', 80)
605 # port can be a string service name such as "http", a numeric
606 # port number or None
607 socket.getaddrinfo(HOST, "http")
608 socket.getaddrinfo(HOST, 80)
609 socket.getaddrinfo(HOST, None)
610 # test family and socktype filters
611 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
612 for family, _, _, _, _ in infos:
613 self.assertEqual(family, socket.AF_INET)
614 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
615 for _, socktype, _, _, _ in infos:
616 self.assertEqual(socktype, socket.SOCK_STREAM)
617 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000618 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000619 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
620 # a server willing to support both IPv4 and IPv6 will
621 # usually do this
622 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
623 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000624 # test keyword arguments
625 a = socket.getaddrinfo(HOST, None)
626 b = socket.getaddrinfo(host=HOST, port=None)
627 self.assertEqual(a, b)
628 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
629 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
630 self.assertEqual(a, b)
631 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
632 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
633 self.assertEqual(a, b)
634 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
635 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
636 self.assertEqual(a, b)
637 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
638 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
639 self.assertEqual(a, b)
640 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
641 socket.AI_PASSIVE)
642 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
643 type=socket.SOCK_STREAM, proto=0,
644 flags=socket.AI_PASSIVE)
645 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000646
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000647 def test_getnameinfo(self):
648 # only IP addresses are allowed
649 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
650
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000651 @unittest.skipUnless(support.is_resource_enabled('network'),
652 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000653 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000654 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000655 # these should all be successful
656 socket.gethostbyname('испытание.python.org')
657 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000658 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
659 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
660 # have a reverse entry yet
661 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000662
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000663 def check_sendall_interrupted(self, with_timeout):
664 # socketpair() is not stricly required, but it makes things easier.
665 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
666 self.skipTest("signal.alarm and socket.socketpair required for this test")
667 # Our signal handlers clobber the C errno by calling a math function
668 # with an invalid domain value.
669 def ok_handler(*args):
670 self.assertRaises(ValueError, math.acosh, 0)
671 def raising_handler(*args):
672 self.assertRaises(ValueError, math.acosh, 0)
673 1 // 0
674 c, s = socket.socketpair()
675 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
676 try:
677 if with_timeout:
678 # Just above the one second minimum for signal.alarm
679 c.settimeout(1.5)
680 with self.assertRaises(ZeroDivisionError):
681 signal.alarm(1)
682 c.sendall(b"x" * (1024**2))
683 if with_timeout:
684 signal.signal(signal.SIGALRM, ok_handler)
685 signal.alarm(1)
686 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
687 finally:
688 signal.signal(signal.SIGALRM, old_alarm)
689 c.close()
690 s.close()
691
692 def test_sendall_interrupted(self):
693 self.check_sendall_interrupted(False)
694
695 def test_sendall_interrupted_with_timeout(self):
696 self.check_sendall_interrupted(True)
697
698
Victor Stinner45df8202010-04-28 22:31:17 +0000699@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700class BasicTCPTest(SocketConnectedTest):
701
702 def __init__(self, methodName='runTest'):
703 SocketConnectedTest.__init__(self, methodName=methodName)
704
705 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000706 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000708 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709
710 def _testRecv(self):
711 self.serv_conn.send(MSG)
712
713 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000714 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715 seg1 = self.cli_conn.recv(len(MSG) - 3)
716 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000717 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000718 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719
720 def _testOverFlowRecv(self):
721 self.serv_conn.send(MSG)
722
723 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000724 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000725 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000726 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727
728 def _testRecvFrom(self):
729 self.serv_conn.send(MSG)
730
731 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000732 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
734 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000735 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000736 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737
738 def _testOverFlowRecvFrom(self):
739 self.serv_conn.send(MSG)
740
741 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000742 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000743 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744 while 1:
745 read = self.cli_conn.recv(1024)
746 if not read:
747 break
Guido van Rossume531e292002-08-08 20:28:34 +0000748 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000749 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750
751 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000752 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753 self.serv_conn.sendall(big_chunk)
754
755 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000757 fd = self.cli_conn.fileno()
758 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000759 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000761 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762
763 def _testFromFd(self):
764 self.serv_conn.send(MSG)
765
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000766 def testDup(self):
767 # Testing dup()
768 sock = self.cli_conn.dup()
769 msg = sock.recv(1024)
770 self.assertEqual(msg, MSG)
771
772 def _testDup(self):
773 self.serv_conn.send(MSG)
774
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000776 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000778 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000779 # wait for _testShutdown to finish: on OS X, when the server
780 # closes the connection the client also becomes disconnected,
781 # and the client's shutdown call will fail. (Issue #4397.)
782 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783
784 def _testShutdown(self):
785 self.serv_conn.send(MSG)
786 self.serv_conn.shutdown(2)
787
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000788 def testDetach(self):
789 # Testing detach()
790 fileno = self.cli_conn.fileno()
791 f = self.cli_conn.detach()
792 self.assertEqual(f, fileno)
793 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000794 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
795 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000796 # ...but we can create another socket using the (still open)
797 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000798 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
799 msg = sock.recv(1024)
800 self.assertEqual(msg, MSG)
801
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000802 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000803 self.serv_conn.send(MSG)
804
Victor Stinner45df8202010-04-28 22:31:17 +0000805@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806class BasicUDPTest(ThreadedUDPSocketTest):
807
808 def __init__(self, methodName='runTest'):
809 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
810
811 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000812 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000814 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815
816 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000817 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818
Guido van Rossum1c938012002-06-12 21:17:20 +0000819 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000820 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000822 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823
Guido van Rossum1c938012002-06-12 21:17:20 +0000824 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000825 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826
Guido van Rossumd8faa362007-04-27 19:54:29 +0000827 def testRecvFromNegative(self):
828 # Negative lengths passed to recvfrom should give ValueError.
829 self.assertRaises(ValueError, self.serv.recvfrom, -1)
830
831 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000832 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000833
Victor Stinner45df8202010-04-28 22:31:17 +0000834@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000835class TCPCloserTest(ThreadedTCPSocketTest):
836
837 def testClose(self):
838 conn, addr = self.serv.accept()
839 conn.close()
840
841 sd = self.cli
842 read, write, err = select.select([sd], [], [], 1.0)
843 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000844 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000845
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000846 # Calling close() many times should be safe.
847 conn.close()
848 conn.close()
849
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000850 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000851 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000852 time.sleep(1.0)
853
Victor Stinner45df8202010-04-28 22:31:17 +0000854@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000855class BasicSocketPairTest(SocketPairTest):
856
857 def __init__(self, methodName='runTest'):
858 SocketPairTest.__init__(self, methodName=methodName)
859
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000860 def _check_defaults(self, sock):
861 self.assertIsInstance(sock, socket.socket)
862 if hasattr(socket, 'AF_UNIX'):
863 self.assertEqual(sock.family, socket.AF_UNIX)
864 else:
865 self.assertEqual(sock.family, socket.AF_INET)
866 self.assertEqual(sock.type, socket.SOCK_STREAM)
867 self.assertEqual(sock.proto, 0)
868
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000869 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000870 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000871
872 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000873 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000874
Dave Cole331708b2004-08-09 04:51:41 +0000875 def testRecv(self):
876 msg = self.serv.recv(1024)
877 self.assertEqual(msg, MSG)
878
879 def _testRecv(self):
880 self.cli.send(MSG)
881
882 def testSend(self):
883 self.serv.send(MSG)
884
885 def _testSend(self):
886 msg = self.cli.recv(1024)
887 self.assertEqual(msg, MSG)
888
Victor Stinner45df8202010-04-28 22:31:17 +0000889@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890class NonBlockingTCPTests(ThreadedTCPSocketTest):
891
892 def __init__(self, methodName='runTest'):
893 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
894
895 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000896 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000897 self.serv.setblocking(0)
898 start = time.time()
899 try:
900 self.serv.accept()
901 except socket.error:
902 pass
903 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000904 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905
906 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000907 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000908
Antoine Pitroub1c54962010-10-14 15:05:38 +0000909 if hasattr(socket, "SOCK_NONBLOCK"):
910 def testInitNonBlocking(self):
911 # reinit server socket
912 self.serv.close()
913 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
914 socket.SOCK_NONBLOCK)
915 self.port = support.bind_port(self.serv)
916 self.serv.listen(1)
917 # actual testing
918 start = time.time()
919 try:
920 self.serv.accept()
921 except socket.error:
922 pass
923 end = time.time()
924 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
925
926 def _testInitNonBlocking(self):
927 pass
928
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000930 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000932 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 conn, addr = self.serv.accept()
934 except socket.error:
935 pass
936 else:
937 self.fail("Error trying to do non-blocking accept.")
938 read, write, err = select.select([self.serv], [], [])
939 if self.serv in read:
940 conn, addr = self.serv.accept()
941 else:
942 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000943
Guido van Rossum24e4af82002-06-12 19:18:08 +0000944 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000945 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000946 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000947
948 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000949 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000950 conn, addr = self.serv.accept()
951
952 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000953 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000954 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955
956 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000957 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000958 conn, addr = self.serv.accept()
959 conn.setblocking(0)
960 try:
961 msg = conn.recv(len(MSG))
962 except socket.error:
963 pass
964 else:
965 self.fail("Error trying to do non-blocking recv.")
966 read, write, err = select.select([conn], [], [])
967 if conn in read:
968 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000969 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000970 else:
971 self.fail("Error during select call to non-blocking socket.")
972
973 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000974 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000975 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000976 self.cli.send(MSG)
977
Victor Stinner45df8202010-04-28 22:31:17 +0000978@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000979class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000980 """Unit tests for the object returned by socket.makefile()
981
Antoine Pitrou834bd812010-10-13 16:17:14 +0000982 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000983 the client connection. You can read from this file to
984 get output from the server.
985
Antoine Pitrou834bd812010-10-13 16:17:14 +0000986 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000987 server connection. You can write to this file to send output
988 to the client.
989 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000990
Guido van Rossume9f66142002-08-07 15:46:19 +0000991 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +0000992 encoding = 'utf8'
993 errors = 'strict'
994 newline = None
995
996 read_mode = 'rb'
997 read_msg = MSG
998 write_mode = 'wb'
999 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001000
Guido van Rossum24e4af82002-06-12 19:18:08 +00001001 def __init__(self, methodName='runTest'):
1002 SocketConnectedTest.__init__(self, methodName=methodName)
1003
1004 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001005 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1006 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001007 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001008 self.read_file = self.cli_conn.makefile(
1009 self.read_mode, self.bufsize,
1010 encoding = self.encoding,
1011 errors = self.errors,
1012 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001013
1014 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001015 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001016 self.read_file.close()
1017 self.assertTrue(self.read_file.closed)
1018 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001019 SocketConnectedTest.tearDown(self)
1020
1021 def clientSetUp(self):
1022 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001023 self.write_file = self.serv_conn.makefile(
1024 self.write_mode, self.bufsize,
1025 encoding = self.encoding,
1026 errors = self.errors,
1027 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001028
1029 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001030 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001031 self.write_file.close()
1032 self.assertTrue(self.write_file.closed)
1033 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034 SocketConnectedTest.clientTearDown(self)
1035
1036 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001037 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001038 first_seg = self.read_file.read(len(self.read_msg)-3)
1039 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001040 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001041 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001042
1043 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001044 self.write_file.write(self.write_msg)
1045 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001046
Guido van Rossum8c943832002-08-08 01:00:28 +00001047 def testFullRead(self):
1048 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001049 msg = self.read_file.read()
1050 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001051
1052 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001053 self.write_file.write(self.write_msg)
1054 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001055
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001057 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001058 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001059 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001060 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001061 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001062 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001064 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065
1066 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001067 self.write_file.write(self.write_msg)
1068 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001069
1070 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001071 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001072 line = self.read_file.readline()
1073 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074
1075 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001076 self.write_file.write(self.write_msg)
1077 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001078
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001079 def testCloseAfterMakefile(self):
1080 # The file returned by makefile should keep the socket open.
1081 self.cli_conn.close()
1082 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001083 msg = self.read_file.read()
1084 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001085
1086 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001087 self.write_file.write(self.write_msg)
1088 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001089
1090 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001091 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001092 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001093 if isinstance(self.read_msg, str):
1094 msg = msg.decode()
1095 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001096
1097 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001098 self.write_file.write(self.write_msg)
1099 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001100
Tim Peters116d83c2004-03-28 02:20:45 +00001101 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001102 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001103
1104 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001105 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001106
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001107 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001108 self.assertEqual(self.read_file.mode, self.read_mode)
1109 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001110
1111 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001112 self.assertEqual(self.write_file.mode, self.write_mode)
1113 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001114
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001115 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001116 self.read_file.close()
1117 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001118 self.cli_conn.close()
1119 self.assertRaises(socket.error, self.cli_conn.getsockname)
1120
1121 def _testRealClose(self):
1122 pass
1123
1124
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001125class FileObjectInterruptedTestCase(unittest.TestCase):
1126 """Test that the file object correctly handles EINTR internally."""
1127
1128 class MockSocket(object):
1129 def __init__(self, recv_funcs=()):
1130 # A generator that returns callables that we'll call for each
1131 # call to recv().
1132 self._recv_step = iter(recv_funcs)
1133
1134 def recv_into(self, buffer):
1135 data = next(self._recv_step)()
1136 assert len(buffer) >= len(data)
1137 buffer[:len(data)] = data
1138 return len(data)
1139
1140 def _decref_socketios(self):
1141 pass
1142
1143 def _textiowrap_for_test(self, buffering=-1):
1144 raw = socket.SocketIO(self, "r")
1145 if buffering < 0:
1146 buffering = io.DEFAULT_BUFFER_SIZE
1147 if buffering == 0:
1148 return raw
1149 buffer = io.BufferedReader(raw, buffering)
1150 text = io.TextIOWrapper(buffer, None, None)
1151 text.mode = "rb"
1152 return text
1153
1154 @staticmethod
1155 def _raise_eintr():
1156 raise socket.error(errno.EINTR)
1157
1158 def _textiowrap_mock_socket(self, mock, buffering=-1):
1159 raw = socket.SocketIO(mock, "r")
1160 if buffering < 0:
1161 buffering = io.DEFAULT_BUFFER_SIZE
1162 if buffering == 0:
1163 return raw
1164 buffer = io.BufferedReader(raw, buffering)
1165 text = io.TextIOWrapper(buffer, None, None)
1166 text.mode = "rb"
1167 return text
1168
1169 def _test_readline(self, size=-1, buffering=-1):
1170 mock_sock = self.MockSocket(recv_funcs=[
1171 lambda : b"This is the first line\nAnd the sec",
1172 self._raise_eintr,
1173 lambda : b"ond line is here\n",
1174 lambda : b"",
1175 lambda : b"", # XXX(gps): io library does an extra EOF read
1176 ])
1177 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1178 self.assertEquals(fo.readline(size), "This is the first line\n")
1179 self.assertEquals(fo.readline(size), "And the second line is here\n")
1180
1181 def _test_read(self, size=-1, buffering=-1):
1182 mock_sock = self.MockSocket(recv_funcs=[
1183 lambda : b"This is the first line\nAnd the sec",
1184 self._raise_eintr,
1185 lambda : b"ond line is here\n",
1186 lambda : b"",
1187 lambda : b"", # XXX(gps): io library does an extra EOF read
1188 ])
1189 expecting = (b"This is the first line\n"
1190 b"And the second line is here\n")
1191 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1192 if buffering == 0:
1193 data = b''
1194 else:
1195 data = ''
1196 expecting = expecting.decode('utf8')
1197 while len(data) != len(expecting):
1198 part = fo.read(size)
1199 if not part:
1200 break
1201 data += part
1202 self.assertEquals(data, expecting)
1203
1204 def test_default(self):
1205 self._test_readline()
1206 self._test_readline(size=100)
1207 self._test_read()
1208 self._test_read(size=100)
1209
1210 def test_with_1k_buffer(self):
1211 self._test_readline(buffering=1024)
1212 self._test_readline(size=100, buffering=1024)
1213 self._test_read(buffering=1024)
1214 self._test_read(size=100, buffering=1024)
1215
1216 def _test_readline_no_buffer(self, size=-1):
1217 mock_sock = self.MockSocket(recv_funcs=[
1218 lambda : b"a",
1219 lambda : b"\n",
1220 lambda : b"B",
1221 self._raise_eintr,
1222 lambda : b"b",
1223 lambda : b"",
1224 ])
1225 fo = mock_sock._textiowrap_for_test(buffering=0)
1226 self.assertEquals(fo.readline(size), b"a\n")
1227 self.assertEquals(fo.readline(size), b"Bb")
1228
1229 def test_no_buffer(self):
1230 self._test_readline_no_buffer()
1231 self._test_readline_no_buffer(size=4)
1232 self._test_read(buffering=0)
1233 self._test_read(size=100, buffering=0)
1234
1235
Guido van Rossume9f66142002-08-07 15:46:19 +00001236class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1237
1238 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001239
Guido van Rossume9f66142002-08-07 15:46:19 +00001240 In this case (and in this case only), it should be possible to
1241 create a file object, read a line from it, create another file
1242 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001243 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001244 when reading multiple requests from the same socket."""
1245
1246 bufsize = 0 # Use unbuffered mode
1247
1248 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001249 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001250 line = self.read_file.readline() # first line
1251 self.assertEqual(line, b"A. " + self.write_msg) # first line
1252 self.read_file = self.cli_conn.makefile('rb', 0)
1253 line = self.read_file.readline() # second line
1254 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001255
1256 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001257 self.write_file.write(b"A. " + self.write_msg)
1258 self.write_file.write(b"B. " + self.write_msg)
1259 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001260
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001261 def testMakefileClose(self):
1262 # The file returned by makefile should keep the socket open...
1263 self.cli_conn.close()
1264 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001265 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001266 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001268 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1269
1270 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001271 self.write_file.write(self.write_msg)
1272 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001273
1274 def testMakefileCloseSocketDestroy(self):
1275 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001276 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001277 refcount_after = sys.getrefcount(self.cli_conn)
1278 self.assertEqual(refcount_before - 1, refcount_after)
1279
1280 def _testMakefileCloseSocketDestroy(self):
1281 pass
1282
Antoine Pitrou98b46702010-09-18 22:59:00 +00001283 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001284 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001285 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1286
1287 def testSmallReadNonBlocking(self):
1288 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001289 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1290 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001291 self.evt1.set()
1292 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001293 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001294 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001295 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001296 self.assertEqual(n, 3)
1297 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001298 self.assertEqual(msg, self.read_msg)
1299 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1300 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001301
1302 def _testSmallReadNonBlocking(self):
1303 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001304 self.write_file.write(self.write_msg)
1305 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001306 self.evt2.set()
1307 # Avoid cloding the socket before the server test has finished,
1308 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1309 self.serv_finished.wait(5.0)
1310
1311 def testWriteNonBlocking(self):
1312 self.cli_finished.wait(5.0)
1313 # The client thread can't skip directly - the SkipTest exception
1314 # would appear as a failure.
1315 if self.serv_skipped:
1316 self.skipTest(self.serv_skipped)
1317
1318 def _testWriteNonBlocking(self):
1319 self.serv_skipped = None
1320 self.serv_conn.setblocking(False)
1321 # Try to saturate the socket buffer pipe with repeated large writes.
1322 BIG = b"x" * (1024 ** 2)
1323 LIMIT = 10
1324 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001325 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001326 self.assertGreater(n, 0)
1327 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001328 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001329 if n is None:
1330 # Succeeded
1331 break
1332 self.assertGreater(n, 0)
1333 else:
1334 # Let us know that this test didn't manage to establish
1335 # the expected conditions. This is not a failure in itself but,
1336 # if it happens repeatedly, the test should be fixed.
1337 self.serv_skipped = "failed to saturate the socket buffer"
1338
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001339
Guido van Rossum8c943832002-08-08 01:00:28 +00001340class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1341
1342 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1343
1344
1345class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1346
1347 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001348
Thomas Woutersb2137042007-02-01 18:02:27 +00001349
Antoine Pitrou834bd812010-10-13 16:17:14 +00001350class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1351 """Tests for socket.makefile() in text mode (rather than binary)"""
1352
1353 read_mode = 'r'
1354 read_msg = MSG.decode('utf8')
1355 write_mode = 'wb'
1356 write_msg = MSG
1357 newline = ''
1358
1359
1360class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1361 """Tests for socket.makefile() in text mode (rather than binary)"""
1362
1363 read_mode = 'rb'
1364 read_msg = MSG
1365 write_mode = 'w'
1366 write_msg = MSG.decode('utf8')
1367 newline = ''
1368
1369
1370class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1371 """Tests for socket.makefile() in text mode (rather than binary)"""
1372
1373 read_mode = 'r'
1374 read_msg = MSG.decode('utf8')
1375 write_mode = 'w'
1376 write_msg = MSG.decode('utf8')
1377 newline = ''
1378
1379
Guido van Rossumd8faa362007-04-27 19:54:29 +00001380class NetworkConnectionTest(object):
1381 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001382
Guido van Rossumd8faa362007-04-27 19:54:29 +00001383 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001384 # We're inherited below by BasicTCPTest2, which also inherits
1385 # BasicTCPTest, which defines self.port referenced below.
1386 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001387 self.serv_conn = self.cli
1388
1389class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1390 """Tests that NetworkConnection does not break existing TCP functionality.
1391 """
1392
1393class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001394
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001395 class MockSocket(socket.socket):
1396 def connect(self, *args):
1397 raise socket.timeout('timed out')
1398
1399 @contextlib.contextmanager
1400 def mocked_socket_module(self):
1401 """Return a socket which times out on connect"""
1402 old_socket = socket.socket
1403 socket.socket = self.MockSocket
1404 try:
1405 yield
1406 finally:
1407 socket.socket = old_socket
1408
1409 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001410 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001411 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1412 with self.assertRaises(socket.error) as cm:
1413 cli.connect((HOST, port))
1414 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1415
1416 def test_create_connection(self):
1417 # Issue #9792: errors raised by create_connection() should have
1418 # a proper errno attribute.
1419 port = support.find_unused_port()
1420 with self.assertRaises(socket.error) as cm:
1421 socket.create_connection((HOST, port))
1422 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1423
1424 def test_create_connection_timeout(self):
1425 # Issue #9792: create_connection() should not recast timeout errors
1426 # as generic socket errors.
1427 with self.mocked_socket_module():
1428 with self.assertRaises(socket.timeout):
1429 socket.create_connection((HOST, 1234))
1430
Guido van Rossumd8faa362007-04-27 19:54:29 +00001431
Victor Stinner45df8202010-04-28 22:31:17 +00001432@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001433class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1434
1435 def __init__(self, methodName='runTest'):
1436 SocketTCPTest.__init__(self, methodName=methodName)
1437 ThreadableTest.__init__(self)
1438
1439 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001440 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001441
1442 def clientTearDown(self):
1443 self.cli.close()
1444 self.cli = None
1445 ThreadableTest.clientTearDown(self)
1446
1447 def _justAccept(self):
1448 conn, addr = self.serv.accept()
1449
1450 testFamily = _justAccept
1451 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001452 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001453 self.assertEqual(self.cli.family, 2)
1454
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001455 testSourceAddress = _justAccept
1456 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001457 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1458 source_address=('', self.source_port))
1459 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001460 # The port number being used is sufficient to show that the bind()
1461 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001462
Guido van Rossumd8faa362007-04-27 19:54:29 +00001463 testTimeoutDefault = _justAccept
1464 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001465 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001466 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001467 socket.setdefaulttimeout(42)
1468 try:
1469 self.cli = socket.create_connection((HOST, self.port))
1470 finally:
1471 socket.setdefaulttimeout(None)
1472 self.assertEquals(self.cli.gettimeout(), 42)
1473
1474 testTimeoutNone = _justAccept
1475 def _testTimeoutNone(self):
1476 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001477 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001478 socket.setdefaulttimeout(30)
1479 try:
1480 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1481 finally:
1482 socket.setdefaulttimeout(None)
1483 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001484
1485 testTimeoutValueNamed = _justAccept
1486 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001487 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001488 self.assertEqual(self.cli.gettimeout(), 30)
1489
1490 testTimeoutValueNonamed = _justAccept
1491 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001492 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001493 self.assertEqual(self.cli.gettimeout(), 30)
1494
Victor Stinner45df8202010-04-28 22:31:17 +00001495@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001496class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1497
1498 def __init__(self, methodName='runTest'):
1499 SocketTCPTest.__init__(self, methodName=methodName)
1500 ThreadableTest.__init__(self)
1501
1502 def clientSetUp(self):
1503 pass
1504
1505 def clientTearDown(self):
1506 self.cli.close()
1507 self.cli = None
1508 ThreadableTest.clientTearDown(self)
1509
1510 def testInsideTimeout(self):
1511 conn, addr = self.serv.accept()
1512 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001513 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001514 testOutsideTimeout = testInsideTimeout
1515
1516 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001517 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001518 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001519 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001520
1521 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001522 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001523 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001524
1525
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001526class TCPTimeoutTest(SocketTCPTest):
1527
1528 def testTCPTimeout(self):
1529 def raise_timeout(*args, **kwargs):
1530 self.serv.settimeout(1.0)
1531 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001532 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001533 "Error generating a timeout exception (TCP)")
1534
1535 def testTimeoutZero(self):
1536 ok = False
1537 try:
1538 self.serv.settimeout(0.0)
1539 foo = self.serv.accept()
1540 except socket.timeout:
1541 self.fail("caught timeout instead of error (TCP)")
1542 except socket.error:
1543 ok = True
1544 except:
1545 self.fail("caught unexpected exception (TCP)")
1546 if not ok:
1547 self.fail("accept() returned success when we did not expect it")
1548
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001549 def testInterruptedTimeout(self):
1550 # XXX I don't know how to do this test on MSWindows or any other
1551 # plaform that doesn't support signal.alarm() or os.kill(), though
1552 # the bug should have existed on all platforms.
1553 if not hasattr(signal, "alarm"):
1554 return # can only test on *nix
1555 self.serv.settimeout(5.0) # must be longer than alarm
1556 class Alarm(Exception):
1557 pass
1558 def alarm_handler(signal, frame):
1559 raise Alarm
1560 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1561 try:
1562 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1563 try:
1564 foo = self.serv.accept()
1565 except socket.timeout:
1566 self.fail("caught timeout instead of Alarm")
1567 except Alarm:
1568 pass
1569 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001570 self.fail("caught other exception instead of Alarm:"
1571 " %s(%s):\n%s" %
1572 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001573 else:
1574 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001575 finally:
1576 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001577 except Alarm:
1578 self.fail("got Alarm in wrong place")
1579 finally:
1580 # no alarm can be pending. Safe to restore old handler.
1581 signal.signal(signal.SIGALRM, old_alarm)
1582
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001583class UDPTimeoutTest(SocketTCPTest):
1584
1585 def testUDPTimeout(self):
1586 def raise_timeout(*args, **kwargs):
1587 self.serv.settimeout(1.0)
1588 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001589 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001590 "Error generating a timeout exception (UDP)")
1591
1592 def testTimeoutZero(self):
1593 ok = False
1594 try:
1595 self.serv.settimeout(0.0)
1596 foo = self.serv.recv(1024)
1597 except socket.timeout:
1598 self.fail("caught timeout instead of error (UDP)")
1599 except socket.error:
1600 ok = True
1601 except:
1602 self.fail("caught unexpected exception (UDP)")
1603 if not ok:
1604 self.fail("recv() returned success when we did not expect it")
1605
1606class TestExceptions(unittest.TestCase):
1607
1608 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001609 self.assertTrue(issubclass(socket.error, Exception))
1610 self.assertTrue(issubclass(socket.herror, socket.error))
1611 self.assertTrue(issubclass(socket.gaierror, socket.error))
1612 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001613
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001614class TestLinuxAbstractNamespace(unittest.TestCase):
1615
1616 UNIX_PATH_MAX = 108
1617
1618 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001619 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001620 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1621 s1.bind(address)
1622 s1.listen(1)
1623 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1624 s2.connect(s1.getsockname())
1625 s1.accept()
1626 self.assertEqual(s1.getsockname(), address)
1627 self.assertEqual(s2.getpeername(), address)
1628
1629 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001630 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001631 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1632 s.bind(address)
1633 self.assertEqual(s.getsockname(), address)
1634
1635 def testNameOverflow(self):
1636 address = "\x00" + "h" * self.UNIX_PATH_MAX
1637 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1638 self.assertRaises(socket.error, s.bind, address)
1639
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001640
Victor Stinner45df8202010-04-28 22:31:17 +00001641@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001642class BufferIOTest(SocketConnectedTest):
1643 """
1644 Test the buffer versions of socket.recv() and socket.send().
1645 """
1646 def __init__(self, methodName='runTest'):
1647 SocketConnectedTest.__init__(self, methodName=methodName)
1648
Antoine Pitrou25480782010-03-17 22:50:28 +00001649 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001650 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001651 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001652 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001653 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001654 self.assertEqual(msg, MSG)
1655
Antoine Pitrou25480782010-03-17 22:50:28 +00001656 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001657 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001658 self.serv_conn.send(buf)
1659
Antoine Pitrou25480782010-03-17 22:50:28 +00001660 def testRecvIntoBytearray(self):
1661 buf = bytearray(1024)
1662 nbytes = self.cli_conn.recv_into(buf)
1663 self.assertEqual(nbytes, len(MSG))
1664 msg = buf[:len(MSG)]
1665 self.assertEqual(msg, MSG)
1666
1667 _testRecvIntoBytearray = _testRecvIntoArray
1668
1669 def testRecvIntoMemoryview(self):
1670 buf = bytearray(1024)
1671 nbytes = self.cli_conn.recv_into(memoryview(buf))
1672 self.assertEqual(nbytes, len(MSG))
1673 msg = buf[:len(MSG)]
1674 self.assertEqual(msg, MSG)
1675
1676 _testRecvIntoMemoryview = _testRecvIntoArray
1677
1678 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001679 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001680 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001681 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001682 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001683 self.assertEqual(msg, MSG)
1684
Antoine Pitrou25480782010-03-17 22:50:28 +00001685 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001686 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001687 self.serv_conn.send(buf)
1688
Antoine Pitrou25480782010-03-17 22:50:28 +00001689 def testRecvFromIntoBytearray(self):
1690 buf = bytearray(1024)
1691 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1692 self.assertEqual(nbytes, len(MSG))
1693 msg = buf[:len(MSG)]
1694 self.assertEqual(msg, MSG)
1695
1696 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1697
1698 def testRecvFromIntoMemoryview(self):
1699 buf = bytearray(1024)
1700 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1701 self.assertEqual(nbytes, len(MSG))
1702 msg = buf[:len(MSG)]
1703 self.assertEqual(msg, MSG)
1704
1705 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1706
Christian Heimes043d6f62008-01-07 17:19:16 +00001707
1708TIPC_STYPE = 2000
1709TIPC_LOWER = 200
1710TIPC_UPPER = 210
1711
1712def isTipcAvailable():
1713 """Check if the TIPC module is loaded
1714
1715 The TIPC module is not loaded automatically on Ubuntu and probably
1716 other Linux distros.
1717 """
1718 if not hasattr(socket, "AF_TIPC"):
1719 return False
1720 if not os.path.isfile("/proc/modules"):
1721 return False
1722 with open("/proc/modules") as f:
1723 for line in f:
1724 if line.startswith("tipc "):
1725 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001726 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001727 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1728 return False
1729
1730class TIPCTest (unittest.TestCase):
1731 def testRDM(self):
1732 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1733 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1734
1735 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1736 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1737 TIPC_LOWER, TIPC_UPPER)
1738 srv.bind(srvaddr)
1739
1740 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1741 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1742 cli.sendto(MSG, sendaddr)
1743
1744 msg, recvaddr = srv.recvfrom(1024)
1745
1746 self.assertEqual(cli.getsockname(), recvaddr)
1747 self.assertEqual(msg, MSG)
1748
1749
1750class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1751 def __init__(self, methodName = 'runTest'):
1752 unittest.TestCase.__init__(self, methodName = methodName)
1753 ThreadableTest.__init__(self)
1754
1755 def setUp(self):
1756 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1757 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1758 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1759 TIPC_LOWER, TIPC_UPPER)
1760 self.srv.bind(srvaddr)
1761 self.srv.listen(5)
1762 self.serverExplicitReady()
1763 self.conn, self.connaddr = self.srv.accept()
1764
1765 def clientSetUp(self):
1766 # The is a hittable race between serverExplicitReady() and the
1767 # accept() call; sleep a little while to avoid it, otherwise
1768 # we could get an exception
1769 time.sleep(0.1)
1770 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1771 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1772 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1773 self.cli.connect(addr)
1774 self.cliaddr = self.cli.getsockname()
1775
1776 def testStream(self):
1777 msg = self.conn.recv(1024)
1778 self.assertEqual(msg, MSG)
1779 self.assertEqual(self.cliaddr, self.connaddr)
1780
1781 def _testStream(self):
1782 self.cli.send(MSG)
1783 self.cli.close()
1784
1785
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001786@unittest.skipUnless(thread, 'Threading required for this test.')
1787class ContextManagersTest(ThreadedTCPSocketTest):
1788
1789 def _testSocketClass(self):
1790 # base test
1791 with socket.socket() as sock:
1792 self.assertFalse(sock._closed)
1793 self.assertTrue(sock._closed)
1794 # close inside with block
1795 with socket.socket() as sock:
1796 sock.close()
1797 self.assertTrue(sock._closed)
1798 # exception inside with block
1799 with socket.socket() as sock:
1800 self.assertRaises(socket.error, sock.sendall, b'foo')
1801 self.assertTrue(sock._closed)
1802
1803 def testCreateConnectionBase(self):
1804 conn, addr = self.serv.accept()
1805 data = conn.recv(1024)
1806 conn.sendall(data)
1807
1808 def _testCreateConnectionBase(self):
1809 address = self.serv.getsockname()
1810 with socket.create_connection(address) as sock:
1811 self.assertFalse(sock._closed)
1812 sock.sendall(b'foo')
1813 self.assertEqual(sock.recv(1024), b'foo')
1814 self.assertTrue(sock._closed)
1815
1816 def testCreateConnectionClose(self):
1817 conn, addr = self.serv.accept()
1818 data = conn.recv(1024)
1819 conn.sendall(data)
1820
1821 def _testCreateConnectionClose(self):
1822 address = self.serv.getsockname()
1823 with socket.create_connection(address) as sock:
1824 sock.close()
1825 self.assertTrue(sock._closed)
1826 self.assertRaises(socket.error, sock.sendall, b'foo')
1827
Antoine Pitroub1c54962010-10-14 15:05:38 +00001828@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1829 "SOCK_CLOEXEC not defined")
1830@unittest.skipUnless(fcntl, "module fcntl not available")
1831class CloexecConstantTest(unittest.TestCase):
1832 def test_SOCK_CLOEXEC(self):
1833 s = socket.socket(socket.AF_INET,
1834 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1835 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1836 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1837
1838
1839@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1840 "SOCK_NONBLOCK not defined")
1841class NonblockConstantTest(unittest.TestCase):
1842 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1843 if nonblock:
1844 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1845 self.assertEqual(s.gettimeout(), timeout)
1846 else:
1847 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1848 self.assertEqual(s.gettimeout(), None)
1849
1850 def test_SOCK_NONBLOCK(self):
1851 # a lot of it seems silly and redundant, but I wanted to test that
1852 # changing back and forth worked ok
1853 s = socket.socket(socket.AF_INET,
1854 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1855 self.checkNonblock(s)
1856 s.setblocking(1)
1857 self.checkNonblock(s, False)
1858 s.setblocking(0)
1859 self.checkNonblock(s)
1860 s.settimeout(None)
1861 self.checkNonblock(s, False)
1862 s.settimeout(2.0)
1863 self.checkNonblock(s, timeout=2.0)
1864 s.setblocking(1)
1865 self.checkNonblock(s, False)
1866 # defaulttimeout
1867 t = socket.getdefaulttimeout()
1868 socket.setdefaulttimeout(0.0)
1869 self.checkNonblock(socket.socket())
1870 socket.setdefaulttimeout(None)
1871 self.checkNonblock(socket.socket(), False)
1872 socket.setdefaulttimeout(2.0)
1873 self.checkNonblock(socket.socket(), timeout=2.0)
1874 socket.setdefaulttimeout(None)
1875 self.checkNonblock(socket.socket(), False)
1876 socket.setdefaulttimeout(t)
1877
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001878
Guido van Rossumb995eb72002-07-31 16:08:40 +00001879def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001880 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001881 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001882
1883 tests.extend([
1884 NonBlockingTCPTests,
1885 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001886 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001887 UnbufferedFileObjectClassTestCase,
1888 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001889 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001890 UnicodeReadFileObjectClassTestCase,
1891 UnicodeWriteFileObjectClassTestCase,
1892 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001893 NetworkConnectionNoServer,
1894 NetworkConnectionAttributesTest,
1895 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001896 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001897 CloexecConstantTest,
1898 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001899 ])
Dave Cole331708b2004-08-09 04:51:41 +00001900 if hasattr(socket, "socketpair"):
1901 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001902 if sys.platform == 'linux2':
1903 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001904 if isTipcAvailable():
1905 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001906 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001907
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001908 thread_info = support.threading_setup()
1909 support.run_unittest(*tests)
1910 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001911
1912if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001913 test_main()