blob: 511e590660283e97480a6935ad0c46131d2b0fb4 [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.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000365 if (sys.platform.startswith('linux') or
366 sys.platform.startswith('freebsd') or
367 sys.platform.startswith('netbsd') or
368 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000369 # avoid the 'echo' service on this platform, as there is an
370 # assumption breaking non-standard port/protocol entry
371 services = ('daytime', 'qotd', 'domain')
372 else:
373 services = ('echo', 'daytime', 'domain')
374 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000375 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000376 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000377 break
378 except socket.error:
379 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000380 else:
381 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000382 # Try same call with optional protocol omitted
383 port2 = socket.getservbyname(service)
384 eq(port, port2)
385 # Try udp, but don't barf it it doesn't exist
386 try:
387 udpport = socket.getservbyname(service, 'udp')
388 except socket.error:
389 udpport = None
390 else:
391 eq(udpport, port)
392 # Now make sure the lookup by port returns the same service name
393 eq(socket.getservbyport(port2), service)
394 eq(socket.getservbyport(port, 'tcp'), service)
395 if udpport is not None:
396 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000397 # Make sure getservbyport does not accept out of range ports.
398 self.assertRaises(OverflowError, socket.getservbyport, -1)
399 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000400
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000401 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000402 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000403 # The default timeout should initially be None
404 self.assertEqual(socket.getdefaulttimeout(), None)
405 s = socket.socket()
406 self.assertEqual(s.gettimeout(), None)
407 s.close()
408
409 # Set the default timeout to 10, and see if it propagates
410 socket.setdefaulttimeout(10)
411 self.assertEqual(socket.getdefaulttimeout(), 10)
412 s = socket.socket()
413 self.assertEqual(s.gettimeout(), 10)
414 s.close()
415
416 # Reset the default timeout to None, and see if it propagates
417 socket.setdefaulttimeout(None)
418 self.assertEqual(socket.getdefaulttimeout(), None)
419 s = socket.socket()
420 self.assertEqual(s.gettimeout(), None)
421 s.close()
422
423 # Check that setting it to an invalid value raises ValueError
424 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
425
426 # Check that setting it to an invalid type raises TypeError
427 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
428
Benjamin Petersonf91df042009-02-13 02:50:59 +0000429 def testIPv4_inet_aton_fourbytes(self):
430 if not hasattr(socket, 'inet_aton'):
431 return # No inet_aton, nothing to check
432 # Test that issue1008086 and issue767150 are fixed.
433 # It must return 4 bytes.
434 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
435 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
436
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000437 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000438 if not hasattr(socket, 'inet_pton'):
439 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000440 from socket import inet_aton as f, inet_pton, AF_INET
441 g = lambda a: inet_pton(AF_INET, a)
442
Guido van Rossumb5b22702007-05-18 18:55:53 +0000443 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
444 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
445 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
446 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
447 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000448
Guido van Rossumb5b22702007-05-18 18:55:53 +0000449 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
450 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
451 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
452 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000453
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000454 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000455 if not hasattr(socket, 'inet_pton'):
456 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000457 try:
458 from socket import inet_pton, AF_INET6, has_ipv6
459 if not has_ipv6:
460 return
461 except ImportError:
462 return
463 f = lambda a: inet_pton(AF_INET6, a)
464
Guido van Rossum540d9872007-08-17 03:51:09 +0000465 self.assertEquals(b'\x00' * 16, f('::'))
466 self.assertEquals(b'\x00' * 16, f('0::0'))
467 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000468 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000469 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 +0000470 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
471 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000472
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000473 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000474 if not hasattr(socket, 'inet_ntop'):
475 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000476 from socket import inet_ntoa as f, inet_ntop, AF_INET
477 g = lambda a: inet_ntop(AF_INET, a)
478
Guido van Rossumb5b22702007-05-18 18:55:53 +0000479 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
480 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
481 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
482 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000483
Guido van Rossumb5b22702007-05-18 18:55:53 +0000484 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
485 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
486 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000487
488 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000489 if not hasattr(socket, 'inet_ntop'):
490 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000491 try:
492 from socket import inet_ntop, AF_INET6, has_ipv6
493 if not has_ipv6:
494 return
495 except ImportError:
496 return
497 f = lambda a: inet_ntop(AF_INET6, a)
498
Guido van Rossum540d9872007-08-17 03:51:09 +0000499 self.assertEquals('::', f(b'\x00' * 16))
500 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000501 self.assertEquals(
502 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000503 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 +0000504 )
505
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000506 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000507
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000508 def _get_unused_port(self, bind_address='0.0.0.0'):
509 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000510
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000511 Args:
512 bind_address: Hostname or IP address to search for a port on.
513
514 Returns: A most likely to be unused port.
515 """
516 tempsock = socket.socket()
517 tempsock.bind((bind_address, 0))
518 host, port = tempsock.getsockname()
519 tempsock.close()
520 return port
521
522 def testSockName(self):
523 # Testing getsockname()
524 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000526 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000528 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
529 # it reasonable to get the host's addr in addition to 0.0.0.0.
530 # At least for eCos. This is required for the S/390 to pass.
531 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000532 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000533 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
535 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000536 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000537 # We know a socket should start without reuse==0
538 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
539 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000540 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000541
542 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000543 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000544 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
545 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
546 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000547 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000548
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000549 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000550 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000551 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
552 sock.settimeout(1)
553 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000554 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000555
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000556 def testNewAttributes(self):
557 # testing .family, .type and .protocol
558 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
559 self.assertEqual(sock.family, socket.AF_INET)
560 self.assertEqual(sock.type, socket.SOCK_STREAM)
561 self.assertEqual(sock.proto, 0)
562 sock.close()
563
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000564 def test_getsockaddrarg(self):
565 host = '0.0.0.0'
566 port = self._get_unused_port(bind_address=host)
567 big_port = port + 65536
568 neg_port = port - 65536
569 sock = socket.socket()
570 try:
571 self.assertRaises(OverflowError, sock.bind, (host, big_port))
572 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
573 sock.bind((host, port))
574 finally:
575 sock.close()
576
Christian Heimesfaf2f632008-01-06 16:59:19 +0000577 def test_sock_ioctl(self):
578 if os.name != "nt":
579 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000580 self.assertTrue(hasattr(socket.socket, 'ioctl'))
581 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
582 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
583 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000584 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
585 s = socket.socket()
586 self.assertRaises(ValueError, s.ioctl, -1, None)
587 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000588
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000589 def testGetaddrinfo(self):
590 try:
591 socket.getaddrinfo('localhost', 80)
592 except socket.gaierror as err:
593 if err.errno == socket.EAI_SERVICE:
594 # see http://bugs.python.org/issue1282647
595 self.skipTest("buggy libc version")
596 raise
597 # len of every sequence is supposed to be == 5
598 for info in socket.getaddrinfo(HOST, None):
599 self.assertEqual(len(info), 5)
600 # host can be a domain name, a string representation of an
601 # IPv4/v6 address or None
602 socket.getaddrinfo('localhost', 80)
603 socket.getaddrinfo('127.0.0.1', 80)
604 socket.getaddrinfo(None, 80)
605 if SUPPORTS_IPV6:
606 socket.getaddrinfo('::1', 80)
607 # port can be a string service name such as "http", a numeric
608 # port number or None
609 socket.getaddrinfo(HOST, "http")
610 socket.getaddrinfo(HOST, 80)
611 socket.getaddrinfo(HOST, None)
612 # test family and socktype filters
613 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
614 for family, _, _, _, _ in infos:
615 self.assertEqual(family, socket.AF_INET)
616 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
617 for _, socktype, _, _, _ in infos:
618 self.assertEqual(socktype, socket.SOCK_STREAM)
619 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000620 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000621 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
622 # a server willing to support both IPv4 and IPv6 will
623 # usually do this
624 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
625 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000626 # test keyword arguments
627 a = socket.getaddrinfo(HOST, None)
628 b = socket.getaddrinfo(host=HOST, port=None)
629 self.assertEqual(a, b)
630 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
631 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
632 self.assertEqual(a, b)
633 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
634 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
635 self.assertEqual(a, b)
636 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
637 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
638 self.assertEqual(a, b)
639 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
640 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
641 self.assertEqual(a, b)
642 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
643 socket.AI_PASSIVE)
644 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
645 type=socket.SOCK_STREAM, proto=0,
646 flags=socket.AI_PASSIVE)
647 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000648
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000649 def test_getnameinfo(self):
650 # only IP addresses are allowed
651 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
652
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000653 @unittest.skipUnless(support.is_resource_enabled('network'),
654 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000655 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000656 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000657 # these should all be successful
658 socket.gethostbyname('испытание.python.org')
659 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000660 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
661 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
662 # have a reverse entry yet
663 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000664
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000665 def check_sendall_interrupted(self, with_timeout):
666 # socketpair() is not stricly required, but it makes things easier.
667 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
668 self.skipTest("signal.alarm and socket.socketpair required for this test")
669 # Our signal handlers clobber the C errno by calling a math function
670 # with an invalid domain value.
671 def ok_handler(*args):
672 self.assertRaises(ValueError, math.acosh, 0)
673 def raising_handler(*args):
674 self.assertRaises(ValueError, math.acosh, 0)
675 1 // 0
676 c, s = socket.socketpair()
677 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
678 try:
679 if with_timeout:
680 # Just above the one second minimum for signal.alarm
681 c.settimeout(1.5)
682 with self.assertRaises(ZeroDivisionError):
683 signal.alarm(1)
684 c.sendall(b"x" * (1024**2))
685 if with_timeout:
686 signal.signal(signal.SIGALRM, ok_handler)
687 signal.alarm(1)
688 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
689 finally:
690 signal.signal(signal.SIGALRM, old_alarm)
691 c.close()
692 s.close()
693
694 def test_sendall_interrupted(self):
695 self.check_sendall_interrupted(False)
696
697 def test_sendall_interrupted_with_timeout(self):
698 self.check_sendall_interrupted(True)
699
700
Victor Stinner45df8202010-04-28 22:31:17 +0000701@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702class BasicTCPTest(SocketConnectedTest):
703
704 def __init__(self, methodName='runTest'):
705 SocketConnectedTest.__init__(self, methodName=methodName)
706
707 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000708 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000709 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000710 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711
712 def _testRecv(self):
713 self.serv_conn.send(MSG)
714
715 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000716 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717 seg1 = self.cli_conn.recv(len(MSG) - 3)
718 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000719 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000720 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
722 def _testOverFlowRecv(self):
723 self.serv_conn.send(MSG)
724
725 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000726 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000728 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729
730 def _testRecvFrom(self):
731 self.serv_conn.send(MSG)
732
733 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
736 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000737 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000738 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739
740 def _testOverFlowRecvFrom(self):
741 self.serv_conn.send(MSG)
742
743 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000744 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000745 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000746 while 1:
747 read = self.cli_conn.recv(1024)
748 if not read:
749 break
Guido van Rossume531e292002-08-08 20:28:34 +0000750 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000751 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752
753 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000754 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 self.serv_conn.sendall(big_chunk)
756
757 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000758 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000759 fd = self.cli_conn.fileno()
760 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000761 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000762 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000763 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764
765 def _testFromFd(self):
766 self.serv_conn.send(MSG)
767
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000768 def testDup(self):
769 # Testing dup()
770 sock = self.cli_conn.dup()
771 msg = sock.recv(1024)
772 self.assertEqual(msg, MSG)
773
774 def _testDup(self):
775 self.serv_conn.send(MSG)
776
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000780 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000781 # wait for _testShutdown to finish: on OS X, when the server
782 # closes the connection the client also becomes disconnected,
783 # and the client's shutdown call will fail. (Issue #4397.)
784 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785
786 def _testShutdown(self):
787 self.serv_conn.send(MSG)
788 self.serv_conn.shutdown(2)
789
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000790 def testDetach(self):
791 # Testing detach()
792 fileno = self.cli_conn.fileno()
793 f = self.cli_conn.detach()
794 self.assertEqual(f, fileno)
795 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000796 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
797 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000798 # ...but we can create another socket using the (still open)
799 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000800 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
801 msg = sock.recv(1024)
802 self.assertEqual(msg, MSG)
803
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000804 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000805 self.serv_conn.send(MSG)
806
Victor Stinner45df8202010-04-28 22:31:17 +0000807@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808class BasicUDPTest(ThreadedUDPSocketTest):
809
810 def __init__(self, methodName='runTest'):
811 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
812
813 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000814 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000816 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817
818 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000819 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820
Guido van Rossum1c938012002-06-12 21:17:20 +0000821 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000822 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000823 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000824 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000825
Guido van Rossum1c938012002-06-12 21:17:20 +0000826 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000827 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828
Guido van Rossumd8faa362007-04-27 19:54:29 +0000829 def testRecvFromNegative(self):
830 # Negative lengths passed to recvfrom should give ValueError.
831 self.assertRaises(ValueError, self.serv.recvfrom, -1)
832
833 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000834 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000835
Victor Stinner45df8202010-04-28 22:31:17 +0000836@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000837class TCPCloserTest(ThreadedTCPSocketTest):
838
839 def testClose(self):
840 conn, addr = self.serv.accept()
841 conn.close()
842
843 sd = self.cli
844 read, write, err = select.select([sd], [], [], 1.0)
845 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000846 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000847
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000848 # Calling close() many times should be safe.
849 conn.close()
850 conn.close()
851
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000852 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000853 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000854 time.sleep(1.0)
855
Victor Stinner45df8202010-04-28 22:31:17 +0000856@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000857class BasicSocketPairTest(SocketPairTest):
858
859 def __init__(self, methodName='runTest'):
860 SocketPairTest.__init__(self, methodName=methodName)
861
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000862 def _check_defaults(self, sock):
863 self.assertIsInstance(sock, socket.socket)
864 if hasattr(socket, 'AF_UNIX'):
865 self.assertEqual(sock.family, socket.AF_UNIX)
866 else:
867 self.assertEqual(sock.family, socket.AF_INET)
868 self.assertEqual(sock.type, socket.SOCK_STREAM)
869 self.assertEqual(sock.proto, 0)
870
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000871 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000872 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000873
874 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000875 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000876
Dave Cole331708b2004-08-09 04:51:41 +0000877 def testRecv(self):
878 msg = self.serv.recv(1024)
879 self.assertEqual(msg, MSG)
880
881 def _testRecv(self):
882 self.cli.send(MSG)
883
884 def testSend(self):
885 self.serv.send(MSG)
886
887 def _testSend(self):
888 msg = self.cli.recv(1024)
889 self.assertEqual(msg, MSG)
890
Victor Stinner45df8202010-04-28 22:31:17 +0000891@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892class NonBlockingTCPTests(ThreadedTCPSocketTest):
893
894 def __init__(self, methodName='runTest'):
895 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
896
897 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000898 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000899 self.serv.setblocking(0)
900 start = time.time()
901 try:
902 self.serv.accept()
903 except socket.error:
904 pass
905 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000906 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907
908 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000909 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000910
Antoine Pitroub1c54962010-10-14 15:05:38 +0000911 if hasattr(socket, "SOCK_NONBLOCK"):
912 def testInitNonBlocking(self):
913 # reinit server socket
914 self.serv.close()
915 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
916 socket.SOCK_NONBLOCK)
917 self.port = support.bind_port(self.serv)
918 self.serv.listen(1)
919 # actual testing
920 start = time.time()
921 try:
922 self.serv.accept()
923 except socket.error:
924 pass
925 end = time.time()
926 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
927
928 def _testInitNonBlocking(self):
929 pass
930
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000932 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000934 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 conn, addr = self.serv.accept()
936 except socket.error:
937 pass
938 else:
939 self.fail("Error trying to do non-blocking accept.")
940 read, write, err = select.select([self.serv], [], [])
941 if self.serv in read:
942 conn, addr = self.serv.accept()
943 else:
944 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000945
Guido van Rossum24e4af82002-06-12 19:18:08 +0000946 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000947 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000948 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000949
950 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000951 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000952 conn, addr = self.serv.accept()
953
954 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000955 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000956 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000957
958 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000959 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960 conn, addr = self.serv.accept()
961 conn.setblocking(0)
962 try:
963 msg = conn.recv(len(MSG))
964 except socket.error:
965 pass
966 else:
967 self.fail("Error trying to do non-blocking recv.")
968 read, write, err = select.select([conn], [], [])
969 if conn in read:
970 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000971 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000972 else:
973 self.fail("Error during select call to non-blocking socket.")
974
975 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000976 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000977 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000978 self.cli.send(MSG)
979
Victor Stinner45df8202010-04-28 22:31:17 +0000980@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000981class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000982 """Unit tests for the object returned by socket.makefile()
983
Antoine Pitrou834bd812010-10-13 16:17:14 +0000984 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000985 the client connection. You can read from this file to
986 get output from the server.
987
Antoine Pitrou834bd812010-10-13 16:17:14 +0000988 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000989 server connection. You can write to this file to send output
990 to the client.
991 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000992
Guido van Rossume9f66142002-08-07 15:46:19 +0000993 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +0000994 encoding = 'utf8'
995 errors = 'strict'
996 newline = None
997
998 read_mode = 'rb'
999 read_msg = MSG
1000 write_mode = 'wb'
1001 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001002
Guido van Rossum24e4af82002-06-12 19:18:08 +00001003 def __init__(self, methodName='runTest'):
1004 SocketConnectedTest.__init__(self, methodName=methodName)
1005
1006 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001007 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1008 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001009 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001010 self.read_file = self.cli_conn.makefile(
1011 self.read_mode, self.bufsize,
1012 encoding = self.encoding,
1013 errors = self.errors,
1014 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001015
1016 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001017 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001018 self.read_file.close()
1019 self.assertTrue(self.read_file.closed)
1020 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021 SocketConnectedTest.tearDown(self)
1022
1023 def clientSetUp(self):
1024 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001025 self.write_file = self.serv_conn.makefile(
1026 self.write_mode, self.bufsize,
1027 encoding = self.encoding,
1028 errors = self.errors,
1029 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001030
1031 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001032 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001033 self.write_file.close()
1034 self.assertTrue(self.write_file.closed)
1035 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001036 SocketConnectedTest.clientTearDown(self)
1037
1038 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001039 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001040 first_seg = self.read_file.read(len(self.read_msg)-3)
1041 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001042 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001043 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001044
1045 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001046 self.write_file.write(self.write_msg)
1047 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048
Guido van Rossum8c943832002-08-08 01:00:28 +00001049 def testFullRead(self):
1050 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001051 msg = self.read_file.read()
1052 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001053
1054 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001055 self.write_file.write(self.write_msg)
1056 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001057
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001059 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001060 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001062 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001064 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001065 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001066 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067
1068 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001069 self.write_file.write(self.write_msg)
1070 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001071
1072 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001073 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001074 line = self.read_file.readline()
1075 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076
1077 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001078 self.write_file.write(self.write_msg)
1079 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001080
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001081 def testCloseAfterMakefile(self):
1082 # The file returned by makefile should keep the socket open.
1083 self.cli_conn.close()
1084 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001085 msg = self.read_file.read()
1086 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001087
1088 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001089 self.write_file.write(self.write_msg)
1090 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001091
1092 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001093 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001094 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001095 if isinstance(self.read_msg, str):
1096 msg = msg.decode()
1097 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001098
1099 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001100 self.write_file.write(self.write_msg)
1101 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001102
Tim Peters116d83c2004-03-28 02:20:45 +00001103 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001104 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001105
1106 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001107 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001108
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001109 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001110 self.assertEqual(self.read_file.mode, self.read_mode)
1111 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001112
1113 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001114 self.assertEqual(self.write_file.mode, self.write_mode)
1115 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001116
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001117 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001118 self.read_file.close()
1119 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001120 self.cli_conn.close()
1121 self.assertRaises(socket.error, self.cli_conn.getsockname)
1122
1123 def _testRealClose(self):
1124 pass
1125
1126
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001127class FileObjectInterruptedTestCase(unittest.TestCase):
1128 """Test that the file object correctly handles EINTR internally."""
1129
1130 class MockSocket(object):
1131 def __init__(self, recv_funcs=()):
1132 # A generator that returns callables that we'll call for each
1133 # call to recv().
1134 self._recv_step = iter(recv_funcs)
1135
1136 def recv_into(self, buffer):
1137 data = next(self._recv_step)()
1138 assert len(buffer) >= len(data)
1139 buffer[:len(data)] = data
1140 return len(data)
1141
1142 def _decref_socketios(self):
1143 pass
1144
1145 def _textiowrap_for_test(self, buffering=-1):
1146 raw = socket.SocketIO(self, "r")
1147 if buffering < 0:
1148 buffering = io.DEFAULT_BUFFER_SIZE
1149 if buffering == 0:
1150 return raw
1151 buffer = io.BufferedReader(raw, buffering)
1152 text = io.TextIOWrapper(buffer, None, None)
1153 text.mode = "rb"
1154 return text
1155
1156 @staticmethod
1157 def _raise_eintr():
1158 raise socket.error(errno.EINTR)
1159
1160 def _textiowrap_mock_socket(self, mock, buffering=-1):
1161 raw = socket.SocketIO(mock, "r")
1162 if buffering < 0:
1163 buffering = io.DEFAULT_BUFFER_SIZE
1164 if buffering == 0:
1165 return raw
1166 buffer = io.BufferedReader(raw, buffering)
1167 text = io.TextIOWrapper(buffer, None, None)
1168 text.mode = "rb"
1169 return text
1170
1171 def _test_readline(self, size=-1, buffering=-1):
1172 mock_sock = self.MockSocket(recv_funcs=[
1173 lambda : b"This is the first line\nAnd the sec",
1174 self._raise_eintr,
1175 lambda : b"ond line is here\n",
1176 lambda : b"",
1177 lambda : b"", # XXX(gps): io library does an extra EOF read
1178 ])
1179 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1180 self.assertEquals(fo.readline(size), "This is the first line\n")
1181 self.assertEquals(fo.readline(size), "And the second line is here\n")
1182
1183 def _test_read(self, size=-1, buffering=-1):
1184 mock_sock = self.MockSocket(recv_funcs=[
1185 lambda : b"This is the first line\nAnd the sec",
1186 self._raise_eintr,
1187 lambda : b"ond line is here\n",
1188 lambda : b"",
1189 lambda : b"", # XXX(gps): io library does an extra EOF read
1190 ])
1191 expecting = (b"This is the first line\n"
1192 b"And the second line is here\n")
1193 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1194 if buffering == 0:
1195 data = b''
1196 else:
1197 data = ''
1198 expecting = expecting.decode('utf8')
1199 while len(data) != len(expecting):
1200 part = fo.read(size)
1201 if not part:
1202 break
1203 data += part
1204 self.assertEquals(data, expecting)
1205
1206 def test_default(self):
1207 self._test_readline()
1208 self._test_readline(size=100)
1209 self._test_read()
1210 self._test_read(size=100)
1211
1212 def test_with_1k_buffer(self):
1213 self._test_readline(buffering=1024)
1214 self._test_readline(size=100, buffering=1024)
1215 self._test_read(buffering=1024)
1216 self._test_read(size=100, buffering=1024)
1217
1218 def _test_readline_no_buffer(self, size=-1):
1219 mock_sock = self.MockSocket(recv_funcs=[
1220 lambda : b"a",
1221 lambda : b"\n",
1222 lambda : b"B",
1223 self._raise_eintr,
1224 lambda : b"b",
1225 lambda : b"",
1226 ])
1227 fo = mock_sock._textiowrap_for_test(buffering=0)
1228 self.assertEquals(fo.readline(size), b"a\n")
1229 self.assertEquals(fo.readline(size), b"Bb")
1230
1231 def test_no_buffer(self):
1232 self._test_readline_no_buffer()
1233 self._test_readline_no_buffer(size=4)
1234 self._test_read(buffering=0)
1235 self._test_read(size=100, buffering=0)
1236
1237
Guido van Rossume9f66142002-08-07 15:46:19 +00001238class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1239
1240 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001241
Guido van Rossume9f66142002-08-07 15:46:19 +00001242 In this case (and in this case only), it should be possible to
1243 create a file object, read a line from it, create another file
1244 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001245 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001246 when reading multiple requests from the same socket."""
1247
1248 bufsize = 0 # Use unbuffered mode
1249
1250 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001251 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 line = self.read_file.readline() # first line
1253 self.assertEqual(line, b"A. " + self.write_msg) # first line
1254 self.read_file = self.cli_conn.makefile('rb', 0)
1255 line = self.read_file.readline() # second line
1256 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001257
1258 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001259 self.write_file.write(b"A. " + self.write_msg)
1260 self.write_file.write(b"B. " + self.write_msg)
1261 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001262
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001263 def testMakefileClose(self):
1264 # The file returned by makefile should keep the socket open...
1265 self.cli_conn.close()
1266 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001267 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001268 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001269 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001270 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1271
1272 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001273 self.write_file.write(self.write_msg)
1274 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001275
1276 def testMakefileCloseSocketDestroy(self):
1277 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001278 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001279 refcount_after = sys.getrefcount(self.cli_conn)
1280 self.assertEqual(refcount_before - 1, refcount_after)
1281
1282 def _testMakefileCloseSocketDestroy(self):
1283 pass
1284
Antoine Pitrou98b46702010-09-18 22:59:00 +00001285 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001286 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001287 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1288
1289 def testSmallReadNonBlocking(self):
1290 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001291 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1292 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001293 self.evt1.set()
1294 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001295 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001296 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001297 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001298 self.assertEqual(n, 3)
1299 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001300 self.assertEqual(msg, self.read_msg)
1301 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1302 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001303
1304 def _testSmallReadNonBlocking(self):
1305 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001306 self.write_file.write(self.write_msg)
1307 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001308 self.evt2.set()
1309 # Avoid cloding the socket before the server test has finished,
1310 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1311 self.serv_finished.wait(5.0)
1312
1313 def testWriteNonBlocking(self):
1314 self.cli_finished.wait(5.0)
1315 # The client thread can't skip directly - the SkipTest exception
1316 # would appear as a failure.
1317 if self.serv_skipped:
1318 self.skipTest(self.serv_skipped)
1319
1320 def _testWriteNonBlocking(self):
1321 self.serv_skipped = None
1322 self.serv_conn.setblocking(False)
1323 # Try to saturate the socket buffer pipe with repeated large writes.
1324 BIG = b"x" * (1024 ** 2)
1325 LIMIT = 10
1326 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001327 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001328 self.assertGreater(n, 0)
1329 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001330 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001331 if n is None:
1332 # Succeeded
1333 break
1334 self.assertGreater(n, 0)
1335 else:
1336 # Let us know that this test didn't manage to establish
1337 # the expected conditions. This is not a failure in itself but,
1338 # if it happens repeatedly, the test should be fixed.
1339 self.serv_skipped = "failed to saturate the socket buffer"
1340
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001341
Guido van Rossum8c943832002-08-08 01:00:28 +00001342class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1343
1344 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1345
1346
1347class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1348
1349 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001350
Thomas Woutersb2137042007-02-01 18:02:27 +00001351
Antoine Pitrou834bd812010-10-13 16:17:14 +00001352class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1353 """Tests for socket.makefile() in text mode (rather than binary)"""
1354
1355 read_mode = 'r'
1356 read_msg = MSG.decode('utf8')
1357 write_mode = 'wb'
1358 write_msg = MSG
1359 newline = ''
1360
1361
1362class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1363 """Tests for socket.makefile() in text mode (rather than binary)"""
1364
1365 read_mode = 'rb'
1366 read_msg = MSG
1367 write_mode = 'w'
1368 write_msg = MSG.decode('utf8')
1369 newline = ''
1370
1371
1372class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1373 """Tests for socket.makefile() in text mode (rather than binary)"""
1374
1375 read_mode = 'r'
1376 read_msg = MSG.decode('utf8')
1377 write_mode = 'w'
1378 write_msg = MSG.decode('utf8')
1379 newline = ''
1380
1381
Guido van Rossumd8faa362007-04-27 19:54:29 +00001382class NetworkConnectionTest(object):
1383 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001384
Guido van Rossumd8faa362007-04-27 19:54:29 +00001385 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001386 # We're inherited below by BasicTCPTest2, which also inherits
1387 # BasicTCPTest, which defines self.port referenced below.
1388 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001389 self.serv_conn = self.cli
1390
1391class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1392 """Tests that NetworkConnection does not break existing TCP functionality.
1393 """
1394
1395class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001396
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001397 class MockSocket(socket.socket):
1398 def connect(self, *args):
1399 raise socket.timeout('timed out')
1400
1401 @contextlib.contextmanager
1402 def mocked_socket_module(self):
1403 """Return a socket which times out on connect"""
1404 old_socket = socket.socket
1405 socket.socket = self.MockSocket
1406 try:
1407 yield
1408 finally:
1409 socket.socket = old_socket
1410
1411 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001412 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001413 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1414 with self.assertRaises(socket.error) as cm:
1415 cli.connect((HOST, port))
1416 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1417
1418 def test_create_connection(self):
1419 # Issue #9792: errors raised by create_connection() should have
1420 # a proper errno attribute.
1421 port = support.find_unused_port()
1422 with self.assertRaises(socket.error) as cm:
1423 socket.create_connection((HOST, port))
1424 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1425
1426 def test_create_connection_timeout(self):
1427 # Issue #9792: create_connection() should not recast timeout errors
1428 # as generic socket errors.
1429 with self.mocked_socket_module():
1430 with self.assertRaises(socket.timeout):
1431 socket.create_connection((HOST, 1234))
1432
Guido van Rossumd8faa362007-04-27 19:54:29 +00001433
Victor Stinner45df8202010-04-28 22:31:17 +00001434@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001435class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1436
1437 def __init__(self, methodName='runTest'):
1438 SocketTCPTest.__init__(self, methodName=methodName)
1439 ThreadableTest.__init__(self)
1440
1441 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001442 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001443
1444 def clientTearDown(self):
1445 self.cli.close()
1446 self.cli = None
1447 ThreadableTest.clientTearDown(self)
1448
1449 def _justAccept(self):
1450 conn, addr = self.serv.accept()
1451
1452 testFamily = _justAccept
1453 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001454 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001455 self.assertEqual(self.cli.family, 2)
1456
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001457 testSourceAddress = _justAccept
1458 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001459 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1460 source_address=('', self.source_port))
1461 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001462 # The port number being used is sufficient to show that the bind()
1463 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001464
Guido van Rossumd8faa362007-04-27 19:54:29 +00001465 testTimeoutDefault = _justAccept
1466 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001467 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001468 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001469 socket.setdefaulttimeout(42)
1470 try:
1471 self.cli = socket.create_connection((HOST, self.port))
1472 finally:
1473 socket.setdefaulttimeout(None)
1474 self.assertEquals(self.cli.gettimeout(), 42)
1475
1476 testTimeoutNone = _justAccept
1477 def _testTimeoutNone(self):
1478 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001479 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001480 socket.setdefaulttimeout(30)
1481 try:
1482 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1483 finally:
1484 socket.setdefaulttimeout(None)
1485 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001486
1487 testTimeoutValueNamed = _justAccept
1488 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001489 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001490 self.assertEqual(self.cli.gettimeout(), 30)
1491
1492 testTimeoutValueNonamed = _justAccept
1493 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001494 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001495 self.assertEqual(self.cli.gettimeout(), 30)
1496
Victor Stinner45df8202010-04-28 22:31:17 +00001497@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001498class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1499
1500 def __init__(self, methodName='runTest'):
1501 SocketTCPTest.__init__(self, methodName=methodName)
1502 ThreadableTest.__init__(self)
1503
1504 def clientSetUp(self):
1505 pass
1506
1507 def clientTearDown(self):
1508 self.cli.close()
1509 self.cli = None
1510 ThreadableTest.clientTearDown(self)
1511
1512 def testInsideTimeout(self):
1513 conn, addr = self.serv.accept()
1514 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001515 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001516 testOutsideTimeout = testInsideTimeout
1517
1518 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001519 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001520 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001521 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001522
1523 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001524 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001525 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001526
1527
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001528class TCPTimeoutTest(SocketTCPTest):
1529
1530 def testTCPTimeout(self):
1531 def raise_timeout(*args, **kwargs):
1532 self.serv.settimeout(1.0)
1533 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001534 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001535 "Error generating a timeout exception (TCP)")
1536
1537 def testTimeoutZero(self):
1538 ok = False
1539 try:
1540 self.serv.settimeout(0.0)
1541 foo = self.serv.accept()
1542 except socket.timeout:
1543 self.fail("caught timeout instead of error (TCP)")
1544 except socket.error:
1545 ok = True
1546 except:
1547 self.fail("caught unexpected exception (TCP)")
1548 if not ok:
1549 self.fail("accept() returned success when we did not expect it")
1550
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001551 def testInterruptedTimeout(self):
1552 # XXX I don't know how to do this test on MSWindows or any other
1553 # plaform that doesn't support signal.alarm() or os.kill(), though
1554 # the bug should have existed on all platforms.
1555 if not hasattr(signal, "alarm"):
1556 return # can only test on *nix
1557 self.serv.settimeout(5.0) # must be longer than alarm
1558 class Alarm(Exception):
1559 pass
1560 def alarm_handler(signal, frame):
1561 raise Alarm
1562 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1563 try:
1564 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1565 try:
1566 foo = self.serv.accept()
1567 except socket.timeout:
1568 self.fail("caught timeout instead of Alarm")
1569 except Alarm:
1570 pass
1571 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001572 self.fail("caught other exception instead of Alarm:"
1573 " %s(%s):\n%s" %
1574 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001575 else:
1576 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001577 finally:
1578 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001579 except Alarm:
1580 self.fail("got Alarm in wrong place")
1581 finally:
1582 # no alarm can be pending. Safe to restore old handler.
1583 signal.signal(signal.SIGALRM, old_alarm)
1584
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001585class UDPTimeoutTest(SocketTCPTest):
1586
1587 def testUDPTimeout(self):
1588 def raise_timeout(*args, **kwargs):
1589 self.serv.settimeout(1.0)
1590 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001591 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001592 "Error generating a timeout exception (UDP)")
1593
1594 def testTimeoutZero(self):
1595 ok = False
1596 try:
1597 self.serv.settimeout(0.0)
1598 foo = self.serv.recv(1024)
1599 except socket.timeout:
1600 self.fail("caught timeout instead of error (UDP)")
1601 except socket.error:
1602 ok = True
1603 except:
1604 self.fail("caught unexpected exception (UDP)")
1605 if not ok:
1606 self.fail("recv() returned success when we did not expect it")
1607
1608class TestExceptions(unittest.TestCase):
1609
1610 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001611 self.assertTrue(issubclass(socket.error, Exception))
1612 self.assertTrue(issubclass(socket.herror, socket.error))
1613 self.assertTrue(issubclass(socket.gaierror, socket.error))
1614 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001615
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001616class TestLinuxAbstractNamespace(unittest.TestCase):
1617
1618 UNIX_PATH_MAX = 108
1619
1620 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001621 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001622 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1623 s1.bind(address)
1624 s1.listen(1)
1625 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1626 s2.connect(s1.getsockname())
1627 s1.accept()
1628 self.assertEqual(s1.getsockname(), address)
1629 self.assertEqual(s2.getpeername(), address)
1630
1631 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001632 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001633 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1634 s.bind(address)
1635 self.assertEqual(s.getsockname(), address)
1636
1637 def testNameOverflow(self):
1638 address = "\x00" + "h" * self.UNIX_PATH_MAX
1639 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1640 self.assertRaises(socket.error, s.bind, address)
1641
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001642
Victor Stinner45df8202010-04-28 22:31:17 +00001643@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001644class BufferIOTest(SocketConnectedTest):
1645 """
1646 Test the buffer versions of socket.recv() and socket.send().
1647 """
1648 def __init__(self, methodName='runTest'):
1649 SocketConnectedTest.__init__(self, methodName=methodName)
1650
Antoine Pitrou25480782010-03-17 22:50:28 +00001651 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001652 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001653 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001654 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001655 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001656 self.assertEqual(msg, MSG)
1657
Antoine Pitrou25480782010-03-17 22:50:28 +00001658 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001659 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001660 self.serv_conn.send(buf)
1661
Antoine Pitrou25480782010-03-17 22:50:28 +00001662 def testRecvIntoBytearray(self):
1663 buf = bytearray(1024)
1664 nbytes = self.cli_conn.recv_into(buf)
1665 self.assertEqual(nbytes, len(MSG))
1666 msg = buf[:len(MSG)]
1667 self.assertEqual(msg, MSG)
1668
1669 _testRecvIntoBytearray = _testRecvIntoArray
1670
1671 def testRecvIntoMemoryview(self):
1672 buf = bytearray(1024)
1673 nbytes = self.cli_conn.recv_into(memoryview(buf))
1674 self.assertEqual(nbytes, len(MSG))
1675 msg = buf[:len(MSG)]
1676 self.assertEqual(msg, MSG)
1677
1678 _testRecvIntoMemoryview = _testRecvIntoArray
1679
1680 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001681 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001682 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001683 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001684 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001685 self.assertEqual(msg, MSG)
1686
Antoine Pitrou25480782010-03-17 22:50:28 +00001687 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001688 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001689 self.serv_conn.send(buf)
1690
Antoine Pitrou25480782010-03-17 22:50:28 +00001691 def testRecvFromIntoBytearray(self):
1692 buf = bytearray(1024)
1693 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1694 self.assertEqual(nbytes, len(MSG))
1695 msg = buf[:len(MSG)]
1696 self.assertEqual(msg, MSG)
1697
1698 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1699
1700 def testRecvFromIntoMemoryview(self):
1701 buf = bytearray(1024)
1702 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1703 self.assertEqual(nbytes, len(MSG))
1704 msg = buf[:len(MSG)]
1705 self.assertEqual(msg, MSG)
1706
1707 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1708
Christian Heimes043d6f62008-01-07 17:19:16 +00001709
1710TIPC_STYPE = 2000
1711TIPC_LOWER = 200
1712TIPC_UPPER = 210
1713
1714def isTipcAvailable():
1715 """Check if the TIPC module is loaded
1716
1717 The TIPC module is not loaded automatically on Ubuntu and probably
1718 other Linux distros.
1719 """
1720 if not hasattr(socket, "AF_TIPC"):
1721 return False
1722 if not os.path.isfile("/proc/modules"):
1723 return False
1724 with open("/proc/modules") as f:
1725 for line in f:
1726 if line.startswith("tipc "):
1727 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001728 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001729 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1730 return False
1731
1732class TIPCTest (unittest.TestCase):
1733 def testRDM(self):
1734 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1735 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1736
1737 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1738 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1739 TIPC_LOWER, TIPC_UPPER)
1740 srv.bind(srvaddr)
1741
1742 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1743 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1744 cli.sendto(MSG, sendaddr)
1745
1746 msg, recvaddr = srv.recvfrom(1024)
1747
1748 self.assertEqual(cli.getsockname(), recvaddr)
1749 self.assertEqual(msg, MSG)
1750
1751
1752class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1753 def __init__(self, methodName = 'runTest'):
1754 unittest.TestCase.__init__(self, methodName = methodName)
1755 ThreadableTest.__init__(self)
1756
1757 def setUp(self):
1758 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1759 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1760 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1761 TIPC_LOWER, TIPC_UPPER)
1762 self.srv.bind(srvaddr)
1763 self.srv.listen(5)
1764 self.serverExplicitReady()
1765 self.conn, self.connaddr = self.srv.accept()
1766
1767 def clientSetUp(self):
1768 # The is a hittable race between serverExplicitReady() and the
1769 # accept() call; sleep a little while to avoid it, otherwise
1770 # we could get an exception
1771 time.sleep(0.1)
1772 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1773 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1774 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1775 self.cli.connect(addr)
1776 self.cliaddr = self.cli.getsockname()
1777
1778 def testStream(self):
1779 msg = self.conn.recv(1024)
1780 self.assertEqual(msg, MSG)
1781 self.assertEqual(self.cliaddr, self.connaddr)
1782
1783 def _testStream(self):
1784 self.cli.send(MSG)
1785 self.cli.close()
1786
1787
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001788@unittest.skipUnless(thread, 'Threading required for this test.')
1789class ContextManagersTest(ThreadedTCPSocketTest):
1790
1791 def _testSocketClass(self):
1792 # base test
1793 with socket.socket() as sock:
1794 self.assertFalse(sock._closed)
1795 self.assertTrue(sock._closed)
1796 # close inside with block
1797 with socket.socket() as sock:
1798 sock.close()
1799 self.assertTrue(sock._closed)
1800 # exception inside with block
1801 with socket.socket() as sock:
1802 self.assertRaises(socket.error, sock.sendall, b'foo')
1803 self.assertTrue(sock._closed)
1804
1805 def testCreateConnectionBase(self):
1806 conn, addr = self.serv.accept()
1807 data = conn.recv(1024)
1808 conn.sendall(data)
1809
1810 def _testCreateConnectionBase(self):
1811 address = self.serv.getsockname()
1812 with socket.create_connection(address) as sock:
1813 self.assertFalse(sock._closed)
1814 sock.sendall(b'foo')
1815 self.assertEqual(sock.recv(1024), b'foo')
1816 self.assertTrue(sock._closed)
1817
1818 def testCreateConnectionClose(self):
1819 conn, addr = self.serv.accept()
1820 data = conn.recv(1024)
1821 conn.sendall(data)
1822
1823 def _testCreateConnectionClose(self):
1824 address = self.serv.getsockname()
1825 with socket.create_connection(address) as sock:
1826 sock.close()
1827 self.assertTrue(sock._closed)
1828 self.assertRaises(socket.error, sock.sendall, b'foo')
1829
Antoine Pitroub1c54962010-10-14 15:05:38 +00001830@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1831 "SOCK_CLOEXEC not defined")
1832@unittest.skipUnless(fcntl, "module fcntl not available")
1833class CloexecConstantTest(unittest.TestCase):
1834 def test_SOCK_CLOEXEC(self):
1835 s = socket.socket(socket.AF_INET,
1836 socket.SOCK_STREAM | socket.SOCK_CLOEXEC)
1837 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
1838 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
1839
1840
1841@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
1842 "SOCK_NONBLOCK not defined")
1843class NonblockConstantTest(unittest.TestCase):
1844 def checkNonblock(self, s, nonblock=True, timeout=0.0):
1845 if nonblock:
1846 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
1847 self.assertEqual(s.gettimeout(), timeout)
1848 else:
1849 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
1850 self.assertEqual(s.gettimeout(), None)
1851
1852 def test_SOCK_NONBLOCK(self):
1853 # a lot of it seems silly and redundant, but I wanted to test that
1854 # changing back and forth worked ok
1855 s = socket.socket(socket.AF_INET,
1856 socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
1857 self.checkNonblock(s)
1858 s.setblocking(1)
1859 self.checkNonblock(s, False)
1860 s.setblocking(0)
1861 self.checkNonblock(s)
1862 s.settimeout(None)
1863 self.checkNonblock(s, False)
1864 s.settimeout(2.0)
1865 self.checkNonblock(s, timeout=2.0)
1866 s.setblocking(1)
1867 self.checkNonblock(s, False)
1868 # defaulttimeout
1869 t = socket.getdefaulttimeout()
1870 socket.setdefaulttimeout(0.0)
1871 self.checkNonblock(socket.socket())
1872 socket.setdefaulttimeout(None)
1873 self.checkNonblock(socket.socket(), False)
1874 socket.setdefaulttimeout(2.0)
1875 self.checkNonblock(socket.socket(), timeout=2.0)
1876 socket.setdefaulttimeout(None)
1877 self.checkNonblock(socket.socket(), False)
1878 socket.setdefaulttimeout(t)
1879
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001880
Guido van Rossumb995eb72002-07-31 16:08:40 +00001881def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001882 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001883 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001884
1885 tests.extend([
1886 NonBlockingTCPTests,
1887 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001888 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001889 UnbufferedFileObjectClassTestCase,
1890 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001891 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001892 UnicodeReadFileObjectClassTestCase,
1893 UnicodeWriteFileObjectClassTestCase,
1894 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001895 NetworkConnectionNoServer,
1896 NetworkConnectionAttributesTest,
1897 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001898 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00001899 CloexecConstantTest,
1900 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00001901 ])
Dave Cole331708b2004-08-09 04:51:41 +00001902 if hasattr(socket, "socketpair"):
1903 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001904 if sys.platform == 'linux2':
1905 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001906 if isTipcAvailable():
1907 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001908 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001909
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001910 thread_info = support.threading_setup()
1911 support.run_unittest(*tests)
1912 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001913
1914if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001915 test_main()