blob: 959e72a9e40a1c86f0983a7cdf07ba1e2962fd20 [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
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000021def try_address(host, port=0, family=socket.AF_INET):
22 """Try to bind a socket on the given host:port and return True
23 if that has been possible."""
24 try:
25 sock = socket.socket(family, socket.SOCK_STREAM)
26 sock.bind((host, port))
27 except (socket.error, socket.gaierror):
28 return False
29 else:
30 sock.close()
31 return True
32
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Antoine Pitrou834bd812010-10-13 16:17:14 +000034MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000035SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
43
Guido van Rossum24e4af82002-06-12 19:18:08 +000044class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000045
Guido van Rossum24e4af82002-06-12 19:18:08 +000046 def setUp(self):
47 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000048 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000049 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000050
Guido van Rossum24e4af82002-06-12 19:18:08 +000051 def tearDown(self):
52 self.serv.close()
53 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000054
Guido van Rossum24e4af82002-06-12 19:18:08 +000055class SocketUDPTest(unittest.TestCase):
56
57 def setUp(self):
58 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000059 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000060
61 def tearDown(self):
62 self.serv.close()
63 self.serv = None
64
65class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000066 """Threadable Test class
67
68 The ThreadableTest class makes it easy to create a threaded
69 client/server pair from an existing unit test. To create a
70 new threaded class from an existing unit test, use multiple
71 inheritance:
72
73 class NewClass (OldClass, ThreadableTest):
74 pass
75
76 This class defines two new fixture functions with obvious
77 purposes for overriding:
78
79 clientSetUp ()
80 clientTearDown ()
81
82 Any new test functions within the class must then define
83 tests in pairs, where the test name is preceeded with a
84 '_' to indicate the client portion of the test. Ex:
85
86 def testFoo(self):
87 # Server portion
88
89 def _testFoo(self):
90 # Client portion
91
92 Any exceptions raised by the clients during their tests
93 are caught and transferred to the main thread to alert
94 the testing framework.
95
96 Note, the server setup function cannot call any blocking
97 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000098 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000099 the blocking call (such as in setting up a client/server
100 connection and performing the accept() in setUp().
101 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000102
103 def __init__(self):
104 # Swap the true setup function
105 self.__setUp = self.setUp
106 self.__tearDown = self.tearDown
107 self.setUp = self._setUp
108 self.tearDown = self._tearDown
109
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000110 def serverExplicitReady(self):
111 """This method allows the server to explicitly indicate that
112 it wants the client thread to proceed. This is useful if the
113 server is about to execute a blocking routine that is
114 dependent upon the client thread during its setup routine."""
115 self.server_ready.set()
116
Guido van Rossum24e4af82002-06-12 19:18:08 +0000117 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000118 self.server_ready = threading.Event()
119 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000121 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122
123 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000124 methodname = self.id()
125 i = methodname.rfind('.')
126 methodname = methodname[i+1:]
127 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000128 self.client_thread = thread.start_new_thread(
129 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130
131 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000132 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000133 self.server_ready.set()
134 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 def _tearDown(self):
137 self.__tearDown()
138 self.done.wait()
139
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000140 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000141 exc = self.queue.get()
142 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000145 self.server_ready.wait()
146 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000148 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000149 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000150 try:
151 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000152 except BaseException as e:
153 self.queue.put(e)
154 finally:
155 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000158 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000159
160 def clientTearDown(self):
161 self.done.set()
162 thread.exit()
163
164class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
165
166 def __init__(self, methodName='runTest'):
167 SocketTCPTest.__init__(self, methodName=methodName)
168 ThreadableTest.__init__(self)
169
170 def clientSetUp(self):
171 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
172
173 def clientTearDown(self):
174 self.cli.close()
175 self.cli = None
176 ThreadableTest.clientTearDown(self)
177
178class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
179
180 def __init__(self, methodName='runTest'):
181 SocketUDPTest.__init__(self, methodName=methodName)
182 ThreadableTest.__init__(self)
183
184 def clientSetUp(self):
185 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
186
187class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000188 """Socket tests for client-server connection.
189
190 self.cli_conn is a client socket connected to the server. The
191 setUp() method guarantees that it is connected to the server.
192 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193
194 def __init__(self, methodName='runTest'):
195 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
196
197 def setUp(self):
198 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000199 # Indicate explicitly we're ready for the client thread to
200 # proceed and then perform the blocking call to accept
201 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 conn, addr = self.serv.accept()
203 self.cli_conn = conn
204
205 def tearDown(self):
206 self.cli_conn.close()
207 self.cli_conn = None
208 ThreadedTCPSocketTest.tearDown(self)
209
210 def clientSetUp(self):
211 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000212 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213 self.serv_conn = self.cli
214
215 def clientTearDown(self):
216 self.serv_conn.close()
217 self.serv_conn = None
218 ThreadedTCPSocketTest.clientTearDown(self)
219
Dave Cole331708b2004-08-09 04:51:41 +0000220class SocketPairTest(unittest.TestCase, ThreadableTest):
221
222 def __init__(self, methodName='runTest'):
223 unittest.TestCase.__init__(self, methodName=methodName)
224 ThreadableTest.__init__(self)
225
226 def setUp(self):
227 self.serv, self.cli = socket.socketpair()
228
229 def tearDown(self):
230 self.serv.close()
231 self.serv = None
232
233 def clientSetUp(self):
234 pass
235
236 def clientTearDown(self):
237 self.cli.close()
238 self.cli = None
239 ThreadableTest.clientTearDown(self)
240
Tim Peters494aaee2004-08-09 18:54:11 +0000241
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242#######################################################################
243## Begin Tests
244
245class GeneralModuleTests(unittest.TestCase):
246
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000247 def test_repr(self):
248 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000249 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000250
Raymond Hettinger027bb632004-05-31 03:09:25 +0000251 def test_weakref(self):
252 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
253 p = proxy(s)
254 self.assertEqual(p.fileno(), s.fileno())
255 s.close()
256 s = None
257 try:
258 p.fileno()
259 except ReferenceError:
260 pass
261 else:
262 self.fail('Socket proxy still exists')
263
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000265 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266 def raise_error(*args, **kwargs):
267 raise socket.error
268 def raise_herror(*args, **kwargs):
269 raise socket.herror
270 def raise_gaierror(*args, **kwargs):
271 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000272 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 "Error raising socket exception.")
278
279 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000280 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 socket.AF_INET
282 socket.SOCK_STREAM
283 socket.SOCK_DGRAM
284 socket.SOCK_RAW
285 socket.SOCK_RDM
286 socket.SOCK_SEQPACKET
287 socket.SOL_SOCKET
288 socket.SO_REUSEADDR
289
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000291 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000292 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000293 try:
294 ip = socket.gethostbyname(hostname)
295 except socket.error:
296 # Probably name lookup wasn't set up right; skip this test
297 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000298 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000299 try:
300 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
301 except socket.error:
302 # Probably a similar problem as above; skip this test
303 return
Brett Cannon01668a12005-03-11 00:04:17 +0000304 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000305 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000306 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000307 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000308
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000309 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000310 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000311 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000312 try:
313 # On some versions, this loses a reference
314 orig = sys.getrefcount(__name__)
315 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000316 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000317 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000319
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000321 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000322 try:
323 # On some versions, this crashes the interpreter.
324 socket.getnameinfo(('x', 0, 0, 0), 0)
325 except socket.error:
326 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000327
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000328 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000329 # This just checks that htons etc. are their own inverse,
330 # when looking at the lower 16 or 32 bits.
331 sizes = {socket.htonl: 32, socket.ntohl: 32,
332 socket.htons: 16, socket.ntohs: 16}
333 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000334 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000335 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
336 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000337
Guido van Rossuma2627af2002-09-14 00:58:46 +0000338 swapped = func(mask)
339 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000340 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000341
Guido van Rossum018919a2007-01-15 00:07:32 +0000342 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000343 good_values = [ 1, 2, 3, 1, 2, 3 ]
344 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000345 for k in good_values:
346 socket.ntohl(k)
347 socket.ntohs(k)
348 socket.htonl(k)
349 socket.htons(k)
350 for k in bad_values:
351 self.assertRaises(OverflowError, socket.ntohl, k)
352 self.assertRaises(OverflowError, socket.ntohs, k)
353 self.assertRaises(OverflowError, socket.htonl, k)
354 self.assertRaises(OverflowError, socket.htons, k)
355
Barry Warsaw11b91a02004-06-28 00:50:43 +0000356 def testGetServBy(self):
357 eq = self.assertEqual
358 # Find one service that exists, then check all the related interfaces.
359 # I've ordered this by protocols that have both a tcp and udp
360 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000361 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000362 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000363 # avoid the 'echo' service on this platform, as there is an
364 # assumption breaking non-standard port/protocol entry
365 services = ('daytime', 'qotd', 'domain')
366 else:
367 services = ('echo', 'daytime', 'domain')
368 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000369 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000370 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000371 break
372 except socket.error:
373 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000374 else:
375 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000376 # Try same call with optional protocol omitted
377 port2 = socket.getservbyname(service)
378 eq(port, port2)
379 # Try udp, but don't barf it it doesn't exist
380 try:
381 udpport = socket.getservbyname(service, 'udp')
382 except socket.error:
383 udpport = None
384 else:
385 eq(udpport, port)
386 # Now make sure the lookup by port returns the same service name
387 eq(socket.getservbyport(port2), service)
388 eq(socket.getservbyport(port, 'tcp'), service)
389 if udpport is not None:
390 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000391 # Make sure getservbyport does not accept out of range ports.
392 self.assertRaises(OverflowError, socket.getservbyport, -1)
393 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000395 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000396 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000397 # The default timeout should initially be None
398 self.assertEqual(socket.getdefaulttimeout(), None)
399 s = socket.socket()
400 self.assertEqual(s.gettimeout(), None)
401 s.close()
402
403 # Set the default timeout to 10, and see if it propagates
404 socket.setdefaulttimeout(10)
405 self.assertEqual(socket.getdefaulttimeout(), 10)
406 s = socket.socket()
407 self.assertEqual(s.gettimeout(), 10)
408 s.close()
409
410 # Reset the default timeout to None, and see if it propagates
411 socket.setdefaulttimeout(None)
412 self.assertEqual(socket.getdefaulttimeout(), None)
413 s = socket.socket()
414 self.assertEqual(s.gettimeout(), None)
415 s.close()
416
417 # Check that setting it to an invalid value raises ValueError
418 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
419
420 # Check that setting it to an invalid type raises TypeError
421 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
422
Benjamin Petersonf91df042009-02-13 02:50:59 +0000423 def testIPv4_inet_aton_fourbytes(self):
424 if not hasattr(socket, 'inet_aton'):
425 return # No inet_aton, nothing to check
426 # Test that issue1008086 and issue767150 are fixed.
427 # It must return 4 bytes.
428 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
429 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
430
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000431 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000432 if not hasattr(socket, 'inet_pton'):
433 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000434 from socket import inet_aton as f, inet_pton, AF_INET
435 g = lambda a: inet_pton(AF_INET, a)
436
Guido van Rossumb5b22702007-05-18 18:55:53 +0000437 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
438 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
439 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
440 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
441 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442
Guido van Rossumb5b22702007-05-18 18:55:53 +0000443 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
444 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
445 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
446 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000447
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000448 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000449 if not hasattr(socket, 'inet_pton'):
450 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000451 try:
452 from socket import inet_pton, AF_INET6, has_ipv6
453 if not has_ipv6:
454 return
455 except ImportError:
456 return
457 f = lambda a: inet_pton(AF_INET6, a)
458
Guido van Rossum540d9872007-08-17 03:51:09 +0000459 self.assertEquals(b'\x00' * 16, f('::'))
460 self.assertEquals(b'\x00' * 16, f('0::0'))
461 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000462 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000463 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 +0000464 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
465 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000466
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000467 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000468 if not hasattr(socket, 'inet_ntop'):
469 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 from socket import inet_ntoa as f, inet_ntop, AF_INET
471 g = lambda a: inet_ntop(AF_INET, a)
472
Guido van Rossumb5b22702007-05-18 18:55:53 +0000473 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
474 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
475 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
476 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000477
Guido van Rossumb5b22702007-05-18 18:55:53 +0000478 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
479 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
480 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000481
482 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000483 if not hasattr(socket, 'inet_ntop'):
484 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000485 try:
486 from socket import inet_ntop, AF_INET6, has_ipv6
487 if not has_ipv6:
488 return
489 except ImportError:
490 return
491 f = lambda a: inet_ntop(AF_INET6, a)
492
Guido van Rossum540d9872007-08-17 03:51:09 +0000493 self.assertEquals('::', f(b'\x00' * 16))
494 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000495 self.assertEquals(
496 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000497 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 +0000498 )
499
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000500 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000501
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000502 def _get_unused_port(self, bind_address='0.0.0.0'):
503 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000504
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000505 Args:
506 bind_address: Hostname or IP address to search for a port on.
507
508 Returns: A most likely to be unused port.
509 """
510 tempsock = socket.socket()
511 tempsock.bind((bind_address, 0))
512 host, port = tempsock.getsockname()
513 tempsock.close()
514 return port
515
516 def testSockName(self):
517 # Testing getsockname()
518 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000520 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000522 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
523 # it reasonable to get the host's addr in addition to 0.0.0.0.
524 # At least for eCos. This is required for the S/390 to pass.
525 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000526 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000527 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528
529 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 # We know a socket should start without reuse==0
532 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
533 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000534 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535
536 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
539 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
540 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000541 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000543 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000545 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
546 sock.settimeout(1)
547 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000548 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000549
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 def testNewAttributes(self):
551 # testing .family, .type and .protocol
552 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
553 self.assertEqual(sock.family, socket.AF_INET)
554 self.assertEqual(sock.type, socket.SOCK_STREAM)
555 self.assertEqual(sock.proto, 0)
556 sock.close()
557
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000558 def test_getsockaddrarg(self):
559 host = '0.0.0.0'
560 port = self._get_unused_port(bind_address=host)
561 big_port = port + 65536
562 neg_port = port - 65536
563 sock = socket.socket()
564 try:
565 self.assertRaises(OverflowError, sock.bind, (host, big_port))
566 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
567 sock.bind((host, port))
568 finally:
569 sock.close()
570
Christian Heimesfaf2f632008-01-06 16:59:19 +0000571 def test_sock_ioctl(self):
572 if os.name != "nt":
573 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000574 self.assertTrue(hasattr(socket.socket, 'ioctl'))
575 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
576 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
577 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000578 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
579 s = socket.socket()
580 self.assertRaises(ValueError, s.ioctl, -1, None)
581 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000582
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000583 def testGetaddrinfo(self):
584 try:
585 socket.getaddrinfo('localhost', 80)
586 except socket.gaierror as err:
587 if err.errno == socket.EAI_SERVICE:
588 # see http://bugs.python.org/issue1282647
589 self.skipTest("buggy libc version")
590 raise
591 # len of every sequence is supposed to be == 5
592 for info in socket.getaddrinfo(HOST, None):
593 self.assertEqual(len(info), 5)
594 # host can be a domain name, a string representation of an
595 # IPv4/v6 address or None
596 socket.getaddrinfo('localhost', 80)
597 socket.getaddrinfo('127.0.0.1', 80)
598 socket.getaddrinfo(None, 80)
599 if SUPPORTS_IPV6:
600 socket.getaddrinfo('::1', 80)
601 # port can be a string service name such as "http", a numeric
602 # port number or None
603 socket.getaddrinfo(HOST, "http")
604 socket.getaddrinfo(HOST, 80)
605 socket.getaddrinfo(HOST, None)
606 # test family and socktype filters
607 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
608 for family, _, _, _, _ in infos:
609 self.assertEqual(family, socket.AF_INET)
610 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
611 for _, socktype, _, _, _ in infos:
612 self.assertEqual(socktype, socket.SOCK_STREAM)
613 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000614 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000615 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
616 # a server willing to support both IPv4 and IPv6 will
617 # usually do this
618 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
619 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000620 # test keyword arguments
621 a = socket.getaddrinfo(HOST, None)
622 b = socket.getaddrinfo(host=HOST, port=None)
623 self.assertEqual(a, b)
624 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
625 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
626 self.assertEqual(a, b)
627 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
628 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
629 self.assertEqual(a, b)
630 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
631 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
632 self.assertEqual(a, b)
633 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
634 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
635 self.assertEqual(a, b)
636 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
637 socket.AI_PASSIVE)
638 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
639 type=socket.SOCK_STREAM, proto=0,
640 flags=socket.AI_PASSIVE)
641 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000642
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000643 def test_getnameinfo(self):
644 # only IP addresses are allowed
645 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
646
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000647 @unittest.skipUnless(support.is_resource_enabled('network'),
648 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000649 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000650 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000651 # these should all be successful
652 socket.gethostbyname('испытание.python.org')
653 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000654 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
655 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
656 # have a reverse entry yet
657 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000658
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000659 def check_sendall_interrupted(self, with_timeout):
660 # socketpair() is not stricly required, but it makes things easier.
661 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
662 self.skipTest("signal.alarm and socket.socketpair required for this test")
663 # Our signal handlers clobber the C errno by calling a math function
664 # with an invalid domain value.
665 def ok_handler(*args):
666 self.assertRaises(ValueError, math.acosh, 0)
667 def raising_handler(*args):
668 self.assertRaises(ValueError, math.acosh, 0)
669 1 // 0
670 c, s = socket.socketpair()
671 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
672 try:
673 if with_timeout:
674 # Just above the one second minimum for signal.alarm
675 c.settimeout(1.5)
676 with self.assertRaises(ZeroDivisionError):
677 signal.alarm(1)
678 c.sendall(b"x" * (1024**2))
679 if with_timeout:
680 signal.signal(signal.SIGALRM, ok_handler)
681 signal.alarm(1)
682 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
683 finally:
684 signal.signal(signal.SIGALRM, old_alarm)
685 c.close()
686 s.close()
687
688 def test_sendall_interrupted(self):
689 self.check_sendall_interrupted(False)
690
691 def test_sendall_interrupted_with_timeout(self):
692 self.check_sendall_interrupted(True)
693
694
Victor Stinner45df8202010-04-28 22:31:17 +0000695@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696class BasicTCPTest(SocketConnectedTest):
697
698 def __init__(self, methodName='runTest'):
699 SocketConnectedTest.__init__(self, methodName=methodName)
700
701 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000704 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705
706 def _testRecv(self):
707 self.serv_conn.send(MSG)
708
709 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 seg1 = self.cli_conn.recv(len(MSG) - 3)
712 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000713 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715
716 def _testOverFlowRecv(self):
717 self.serv_conn.send(MSG)
718
719 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000720 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000722 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000723
724 def _testRecvFrom(self):
725 self.serv_conn.send(MSG)
726
727 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000728 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
730 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000731 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000732 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733
734 def _testOverFlowRecvFrom(self):
735 self.serv_conn.send(MSG)
736
737 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000738 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000739 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740 while 1:
741 read = self.cli_conn.recv(1024)
742 if not read:
743 break
Guido van Rossume531e292002-08-08 20:28:34 +0000744 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000745 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000746
747 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000748 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749 self.serv_conn.sendall(big_chunk)
750
751 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000752 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753 fd = self.cli_conn.fileno()
754 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000755 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000757 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758
759 def _testFromFd(self):
760 self.serv_conn.send(MSG)
761
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000762 def testDup(self):
763 # Testing dup()
764 sock = self.cli_conn.dup()
765 msg = sock.recv(1024)
766 self.assertEqual(msg, MSG)
767
768 def _testDup(self):
769 self.serv_conn.send(MSG)
770
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000774 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000775 # wait for _testShutdown to finish: on OS X, when the server
776 # closes the connection the client also becomes disconnected,
777 # and the client's shutdown call will fail. (Issue #4397.)
778 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779
780 def _testShutdown(self):
781 self.serv_conn.send(MSG)
782 self.serv_conn.shutdown(2)
783
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000784 def testDetach(self):
785 # Testing detach()
786 fileno = self.cli_conn.fileno()
787 f = self.cli_conn.detach()
788 self.assertEqual(f, fileno)
789 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000790 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
791 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000792 # ...but we can create another socket using the (still open)
793 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000794 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
795 msg = sock.recv(1024)
796 self.assertEqual(msg, MSG)
797
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000798 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000799 self.serv_conn.send(MSG)
800
Victor Stinner45df8202010-04-28 22:31:17 +0000801@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802class BasicUDPTest(ThreadedUDPSocketTest):
803
804 def __init__(self, methodName='runTest'):
805 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
806
807 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000808 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000810 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811
812 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000813 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814
Guido van Rossum1c938012002-06-12 21:17:20 +0000815 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000816 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000818 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819
Guido van Rossum1c938012002-06-12 21:17:20 +0000820 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000821 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
Guido van Rossumd8faa362007-04-27 19:54:29 +0000823 def testRecvFromNegative(self):
824 # Negative lengths passed to recvfrom should give ValueError.
825 self.assertRaises(ValueError, self.serv.recvfrom, -1)
826
827 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000828 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000829
Victor Stinner45df8202010-04-28 22:31:17 +0000830@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000831class TCPCloserTest(ThreadedTCPSocketTest):
832
833 def testClose(self):
834 conn, addr = self.serv.accept()
835 conn.close()
836
837 sd = self.cli
838 read, write, err = select.select([sd], [], [], 1.0)
839 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000840 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000841
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000842 # Calling close() many times should be safe.
843 conn.close()
844 conn.close()
845
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000846 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000847 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000848 time.sleep(1.0)
849
Victor Stinner45df8202010-04-28 22:31:17 +0000850@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000851class BasicSocketPairTest(SocketPairTest):
852
853 def __init__(self, methodName='runTest'):
854 SocketPairTest.__init__(self, methodName=methodName)
855
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000856 def _check_defaults(self, sock):
857 self.assertIsInstance(sock, socket.socket)
858 if hasattr(socket, 'AF_UNIX'):
859 self.assertEqual(sock.family, socket.AF_UNIX)
860 else:
861 self.assertEqual(sock.family, socket.AF_INET)
862 self.assertEqual(sock.type, socket.SOCK_STREAM)
863 self.assertEqual(sock.proto, 0)
864
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000865 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000866 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000867
868 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000869 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000870
Dave Cole331708b2004-08-09 04:51:41 +0000871 def testRecv(self):
872 msg = self.serv.recv(1024)
873 self.assertEqual(msg, MSG)
874
875 def _testRecv(self):
876 self.cli.send(MSG)
877
878 def testSend(self):
879 self.serv.send(MSG)
880
881 def _testSend(self):
882 msg = self.cli.recv(1024)
883 self.assertEqual(msg, MSG)
884
Victor Stinner45df8202010-04-28 22:31:17 +0000885@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886class NonBlockingTCPTests(ThreadedTCPSocketTest):
887
888 def __init__(self, methodName='runTest'):
889 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
890
891 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000892 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 self.serv.setblocking(0)
894 start = time.time()
895 try:
896 self.serv.accept()
897 except socket.error:
898 pass
899 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000900 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901
902 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000903 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000904
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000906 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000908 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909 conn, addr = self.serv.accept()
910 except socket.error:
911 pass
912 else:
913 self.fail("Error trying to do non-blocking accept.")
914 read, write, err = select.select([self.serv], [], [])
915 if self.serv in read:
916 conn, addr = self.serv.accept()
917 else:
918 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000919
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000921 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000922 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923
924 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000925 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926 conn, addr = self.serv.accept()
927
928 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000929 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000930 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
932 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 conn, addr = self.serv.accept()
935 conn.setblocking(0)
936 try:
937 msg = conn.recv(len(MSG))
938 except socket.error:
939 pass
940 else:
941 self.fail("Error trying to do non-blocking recv.")
942 read, write, err = select.select([conn], [], [])
943 if conn in read:
944 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000945 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000946 else:
947 self.fail("Error during select call to non-blocking socket.")
948
949 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000950 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000951 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000952 self.cli.send(MSG)
953
Victor Stinner45df8202010-04-28 22:31:17 +0000954@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000956 """Unit tests for the object returned by socket.makefile()
957
Antoine Pitrou834bd812010-10-13 16:17:14 +0000958 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000959 the client connection. You can read from this file to
960 get output from the server.
961
Antoine Pitrou834bd812010-10-13 16:17:14 +0000962 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000963 server connection. You can write to this file to send output
964 to the client.
965 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966
Guido van Rossume9f66142002-08-07 15:46:19 +0000967 bufsize = -1 # Use default buffer size
Antoine Pitrou834bd812010-10-13 16:17:14 +0000968 encoding = 'utf8'
969 errors = 'strict'
970 newline = None
971
972 read_mode = 'rb'
973 read_msg = MSG
974 write_mode = 'wb'
975 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +0000976
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977 def __init__(self, methodName='runTest'):
978 SocketConnectedTest.__init__(self, methodName=methodName)
979
980 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000981 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
982 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +0000983 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +0000984 self.read_file = self.cli_conn.makefile(
985 self.read_mode, self.bufsize,
986 encoding = self.encoding,
987 errors = self.errors,
988 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000989
990 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000991 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +0000992 self.read_file.close()
993 self.assertTrue(self.read_file.closed)
994 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +0000995 SocketConnectedTest.tearDown(self)
996
997 def clientSetUp(self):
998 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +0000999 self.write_file = self.serv_conn.makefile(
1000 self.write_mode, self.bufsize,
1001 encoding = self.encoding,
1002 errors = self.errors,
1003 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004
1005 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001006 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001007 self.write_file.close()
1008 self.assertTrue(self.write_file.closed)
1009 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001010 SocketConnectedTest.clientTearDown(self)
1011
1012 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001013 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001014 first_seg = self.read_file.read(len(self.read_msg)-3)
1015 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001016 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001017 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001018
1019 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001020 self.write_file.write(self.write_msg)
1021 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022
Guido van Rossum8c943832002-08-08 01:00:28 +00001023 def testFullRead(self):
1024 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001025 msg = self.read_file.read()
1026 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001027
1028 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001029 self.write_file.write(self.write_msg)
1030 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001031
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001033 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001034 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001035 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001036 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001037 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001038 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001039 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001040 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001041
1042 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001043 self.write_file.write(self.write_msg)
1044 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001045
1046 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001047 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001048 line = self.read_file.readline()
1049 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001050
1051 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001052 self.write_file.write(self.write_msg)
1053 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001054
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001055 def testCloseAfterMakefile(self):
1056 # The file returned by makefile should keep the socket open.
1057 self.cli_conn.close()
1058 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001059 msg = self.read_file.read()
1060 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001061
1062 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001063 self.write_file.write(self.write_msg)
1064 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001065
1066 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001067 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001068 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001069 if isinstance(self.read_msg, str):
1070 msg = msg.decode()
1071 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001072
1073 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001074 self.write_file.write(self.write_msg)
1075 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001076
Tim Peters116d83c2004-03-28 02:20:45 +00001077 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001078 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001079
1080 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001081 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001082
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001083 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001084 self.assertEqual(self.read_file.mode, self.read_mode)
1085 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001086
1087 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001088 self.assertEqual(self.write_file.mode, self.write_mode)
1089 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001090
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001091 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001092 self.read_file.close()
1093 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001094 self.cli_conn.close()
1095 self.assertRaises(socket.error, self.cli_conn.getsockname)
1096
1097 def _testRealClose(self):
1098 pass
1099
1100
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001101class FileObjectInterruptedTestCase(unittest.TestCase):
1102 """Test that the file object correctly handles EINTR internally."""
1103
1104 class MockSocket(object):
1105 def __init__(self, recv_funcs=()):
1106 # A generator that returns callables that we'll call for each
1107 # call to recv().
1108 self._recv_step = iter(recv_funcs)
1109
1110 def recv_into(self, buffer):
1111 data = next(self._recv_step)()
1112 assert len(buffer) >= len(data)
1113 buffer[:len(data)] = data
1114 return len(data)
1115
1116 def _decref_socketios(self):
1117 pass
1118
1119 def _textiowrap_for_test(self, buffering=-1):
1120 raw = socket.SocketIO(self, "r")
1121 if buffering < 0:
1122 buffering = io.DEFAULT_BUFFER_SIZE
1123 if buffering == 0:
1124 return raw
1125 buffer = io.BufferedReader(raw, buffering)
1126 text = io.TextIOWrapper(buffer, None, None)
1127 text.mode = "rb"
1128 return text
1129
1130 @staticmethod
1131 def _raise_eintr():
1132 raise socket.error(errno.EINTR)
1133
1134 def _textiowrap_mock_socket(self, mock, buffering=-1):
1135 raw = socket.SocketIO(mock, "r")
1136 if buffering < 0:
1137 buffering = io.DEFAULT_BUFFER_SIZE
1138 if buffering == 0:
1139 return raw
1140 buffer = io.BufferedReader(raw, buffering)
1141 text = io.TextIOWrapper(buffer, None, None)
1142 text.mode = "rb"
1143 return text
1144
1145 def _test_readline(self, size=-1, buffering=-1):
1146 mock_sock = self.MockSocket(recv_funcs=[
1147 lambda : b"This is the first line\nAnd the sec",
1148 self._raise_eintr,
1149 lambda : b"ond line is here\n",
1150 lambda : b"",
1151 lambda : b"", # XXX(gps): io library does an extra EOF read
1152 ])
1153 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1154 self.assertEquals(fo.readline(size), "This is the first line\n")
1155 self.assertEquals(fo.readline(size), "And the second line is here\n")
1156
1157 def _test_read(self, size=-1, buffering=-1):
1158 mock_sock = self.MockSocket(recv_funcs=[
1159 lambda : b"This is the first line\nAnd the sec",
1160 self._raise_eintr,
1161 lambda : b"ond line is here\n",
1162 lambda : b"",
1163 lambda : b"", # XXX(gps): io library does an extra EOF read
1164 ])
1165 expecting = (b"This is the first line\n"
1166 b"And the second line is here\n")
1167 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1168 if buffering == 0:
1169 data = b''
1170 else:
1171 data = ''
1172 expecting = expecting.decode('utf8')
1173 while len(data) != len(expecting):
1174 part = fo.read(size)
1175 if not part:
1176 break
1177 data += part
1178 self.assertEquals(data, expecting)
1179
1180 def test_default(self):
1181 self._test_readline()
1182 self._test_readline(size=100)
1183 self._test_read()
1184 self._test_read(size=100)
1185
1186 def test_with_1k_buffer(self):
1187 self._test_readline(buffering=1024)
1188 self._test_readline(size=100, buffering=1024)
1189 self._test_read(buffering=1024)
1190 self._test_read(size=100, buffering=1024)
1191
1192 def _test_readline_no_buffer(self, size=-1):
1193 mock_sock = self.MockSocket(recv_funcs=[
1194 lambda : b"a",
1195 lambda : b"\n",
1196 lambda : b"B",
1197 self._raise_eintr,
1198 lambda : b"b",
1199 lambda : b"",
1200 ])
1201 fo = mock_sock._textiowrap_for_test(buffering=0)
1202 self.assertEquals(fo.readline(size), b"a\n")
1203 self.assertEquals(fo.readline(size), b"Bb")
1204
1205 def test_no_buffer(self):
1206 self._test_readline_no_buffer()
1207 self._test_readline_no_buffer(size=4)
1208 self._test_read(buffering=0)
1209 self._test_read(size=100, buffering=0)
1210
1211
Guido van Rossume9f66142002-08-07 15:46:19 +00001212class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1213
1214 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001215
Guido van Rossume9f66142002-08-07 15:46:19 +00001216 In this case (and in this case only), it should be possible to
1217 create a file object, read a line from it, create another file
1218 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001219 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001220 when reading multiple requests from the same socket."""
1221
1222 bufsize = 0 # Use unbuffered mode
1223
1224 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001225 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001226 line = self.read_file.readline() # first line
1227 self.assertEqual(line, b"A. " + self.write_msg) # first line
1228 self.read_file = self.cli_conn.makefile('rb', 0)
1229 line = self.read_file.readline() # second line
1230 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001231
1232 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001233 self.write_file.write(b"A. " + self.write_msg)
1234 self.write_file.write(b"B. " + self.write_msg)
1235 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001236
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001237 def testMakefileClose(self):
1238 # The file returned by makefile should keep the socket open...
1239 self.cli_conn.close()
1240 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001241 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001242 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001243 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001244 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1245
1246 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001247 self.write_file.write(self.write_msg)
1248 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001249
1250 def testMakefileCloseSocketDestroy(self):
1251 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001253 refcount_after = sys.getrefcount(self.cli_conn)
1254 self.assertEqual(refcount_before - 1, refcount_after)
1255
1256 def _testMakefileCloseSocketDestroy(self):
1257 pass
1258
Antoine Pitrou98b46702010-09-18 22:59:00 +00001259 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001260 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001261 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1262
1263 def testSmallReadNonBlocking(self):
1264 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001265 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1266 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001267 self.evt1.set()
1268 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001269 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001270 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001271 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001272 self.assertEqual(n, 3)
1273 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001274 self.assertEqual(msg, self.read_msg)
1275 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1276 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001277
1278 def _testSmallReadNonBlocking(self):
1279 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001280 self.write_file.write(self.write_msg)
1281 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001282 self.evt2.set()
1283 # Avoid cloding the socket before the server test has finished,
1284 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1285 self.serv_finished.wait(5.0)
1286
1287 def testWriteNonBlocking(self):
1288 self.cli_finished.wait(5.0)
1289 # The client thread can't skip directly - the SkipTest exception
1290 # would appear as a failure.
1291 if self.serv_skipped:
1292 self.skipTest(self.serv_skipped)
1293
1294 def _testWriteNonBlocking(self):
1295 self.serv_skipped = None
1296 self.serv_conn.setblocking(False)
1297 # Try to saturate the socket buffer pipe with repeated large writes.
1298 BIG = b"x" * (1024 ** 2)
1299 LIMIT = 10
1300 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001301 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001302 self.assertGreater(n, 0)
1303 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001304 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001305 if n is None:
1306 # Succeeded
1307 break
1308 self.assertGreater(n, 0)
1309 else:
1310 # Let us know that this test didn't manage to establish
1311 # the expected conditions. This is not a failure in itself but,
1312 # if it happens repeatedly, the test should be fixed.
1313 self.serv_skipped = "failed to saturate the socket buffer"
1314
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001315
Guido van Rossum8c943832002-08-08 01:00:28 +00001316class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1317
1318 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1319
1320
1321class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1322
1323 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001324
Thomas Woutersb2137042007-02-01 18:02:27 +00001325
Antoine Pitrou834bd812010-10-13 16:17:14 +00001326class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1327 """Tests for socket.makefile() in text mode (rather than binary)"""
1328
1329 read_mode = 'r'
1330 read_msg = MSG.decode('utf8')
1331 write_mode = 'wb'
1332 write_msg = MSG
1333 newline = ''
1334
1335
1336class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1337 """Tests for socket.makefile() in text mode (rather than binary)"""
1338
1339 read_mode = 'rb'
1340 read_msg = MSG
1341 write_mode = 'w'
1342 write_msg = MSG.decode('utf8')
1343 newline = ''
1344
1345
1346class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1347 """Tests for socket.makefile() in text mode (rather than binary)"""
1348
1349 read_mode = 'r'
1350 read_msg = MSG.decode('utf8')
1351 write_mode = 'w'
1352 write_msg = MSG.decode('utf8')
1353 newline = ''
1354
1355
Guido van Rossumd8faa362007-04-27 19:54:29 +00001356class NetworkConnectionTest(object):
1357 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001358
Guido van Rossumd8faa362007-04-27 19:54:29 +00001359 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001360 # We're inherited below by BasicTCPTest2, which also inherits
1361 # BasicTCPTest, which defines self.port referenced below.
1362 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001363 self.serv_conn = self.cli
1364
1365class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1366 """Tests that NetworkConnection does not break existing TCP functionality.
1367 """
1368
1369class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001370
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001371 class MockSocket(socket.socket):
1372 def connect(self, *args):
1373 raise socket.timeout('timed out')
1374
1375 @contextlib.contextmanager
1376 def mocked_socket_module(self):
1377 """Return a socket which times out on connect"""
1378 old_socket = socket.socket
1379 socket.socket = self.MockSocket
1380 try:
1381 yield
1382 finally:
1383 socket.socket = old_socket
1384
1385 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001386 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001387 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1388 with self.assertRaises(socket.error) as cm:
1389 cli.connect((HOST, port))
1390 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1391
1392 def test_create_connection(self):
1393 # Issue #9792: errors raised by create_connection() should have
1394 # a proper errno attribute.
1395 port = support.find_unused_port()
1396 with self.assertRaises(socket.error) as cm:
1397 socket.create_connection((HOST, port))
1398 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1399
1400 def test_create_connection_timeout(self):
1401 # Issue #9792: create_connection() should not recast timeout errors
1402 # as generic socket errors.
1403 with self.mocked_socket_module():
1404 with self.assertRaises(socket.timeout):
1405 socket.create_connection((HOST, 1234))
1406
Guido van Rossumd8faa362007-04-27 19:54:29 +00001407
Victor Stinner45df8202010-04-28 22:31:17 +00001408@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001409class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1410
1411 def __init__(self, methodName='runTest'):
1412 SocketTCPTest.__init__(self, methodName=methodName)
1413 ThreadableTest.__init__(self)
1414
1415 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001416 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001417
1418 def clientTearDown(self):
1419 self.cli.close()
1420 self.cli = None
1421 ThreadableTest.clientTearDown(self)
1422
1423 def _justAccept(self):
1424 conn, addr = self.serv.accept()
1425
1426 testFamily = _justAccept
1427 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001428 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001429 self.assertEqual(self.cli.family, 2)
1430
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001431 testSourceAddress = _justAccept
1432 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001433 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1434 source_address=('', self.source_port))
1435 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001436 # The port number being used is sufficient to show that the bind()
1437 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001438
Guido van Rossumd8faa362007-04-27 19:54:29 +00001439 testTimeoutDefault = _justAccept
1440 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001441 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001442 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001443 socket.setdefaulttimeout(42)
1444 try:
1445 self.cli = socket.create_connection((HOST, self.port))
1446 finally:
1447 socket.setdefaulttimeout(None)
1448 self.assertEquals(self.cli.gettimeout(), 42)
1449
1450 testTimeoutNone = _justAccept
1451 def _testTimeoutNone(self):
1452 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001453 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001454 socket.setdefaulttimeout(30)
1455 try:
1456 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1457 finally:
1458 socket.setdefaulttimeout(None)
1459 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001460
1461 testTimeoutValueNamed = _justAccept
1462 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001463 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001464 self.assertEqual(self.cli.gettimeout(), 30)
1465
1466 testTimeoutValueNonamed = _justAccept
1467 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001468 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001469 self.assertEqual(self.cli.gettimeout(), 30)
1470
Victor Stinner45df8202010-04-28 22:31:17 +00001471@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001472class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1473
1474 def __init__(self, methodName='runTest'):
1475 SocketTCPTest.__init__(self, methodName=methodName)
1476 ThreadableTest.__init__(self)
1477
1478 def clientSetUp(self):
1479 pass
1480
1481 def clientTearDown(self):
1482 self.cli.close()
1483 self.cli = None
1484 ThreadableTest.clientTearDown(self)
1485
1486 def testInsideTimeout(self):
1487 conn, addr = self.serv.accept()
1488 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001489 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001490 testOutsideTimeout = testInsideTimeout
1491
1492 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001493 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001494 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001495 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001496
1497 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001498 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001499 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001500
1501
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001502class TCPTimeoutTest(SocketTCPTest):
1503
1504 def testTCPTimeout(self):
1505 def raise_timeout(*args, **kwargs):
1506 self.serv.settimeout(1.0)
1507 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001508 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001509 "Error generating a timeout exception (TCP)")
1510
1511 def testTimeoutZero(self):
1512 ok = False
1513 try:
1514 self.serv.settimeout(0.0)
1515 foo = self.serv.accept()
1516 except socket.timeout:
1517 self.fail("caught timeout instead of error (TCP)")
1518 except socket.error:
1519 ok = True
1520 except:
1521 self.fail("caught unexpected exception (TCP)")
1522 if not ok:
1523 self.fail("accept() returned success when we did not expect it")
1524
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001525 def testInterruptedTimeout(self):
1526 # XXX I don't know how to do this test on MSWindows or any other
1527 # plaform that doesn't support signal.alarm() or os.kill(), though
1528 # the bug should have existed on all platforms.
1529 if not hasattr(signal, "alarm"):
1530 return # can only test on *nix
1531 self.serv.settimeout(5.0) # must be longer than alarm
1532 class Alarm(Exception):
1533 pass
1534 def alarm_handler(signal, frame):
1535 raise Alarm
1536 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1537 try:
1538 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1539 try:
1540 foo = self.serv.accept()
1541 except socket.timeout:
1542 self.fail("caught timeout instead of Alarm")
1543 except Alarm:
1544 pass
1545 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001546 self.fail("caught other exception instead of Alarm:"
1547 " %s(%s):\n%s" %
1548 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001549 else:
1550 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001551 finally:
1552 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001553 except Alarm:
1554 self.fail("got Alarm in wrong place")
1555 finally:
1556 # no alarm can be pending. Safe to restore old handler.
1557 signal.signal(signal.SIGALRM, old_alarm)
1558
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001559class UDPTimeoutTest(SocketTCPTest):
1560
1561 def testUDPTimeout(self):
1562 def raise_timeout(*args, **kwargs):
1563 self.serv.settimeout(1.0)
1564 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001565 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001566 "Error generating a timeout exception (UDP)")
1567
1568 def testTimeoutZero(self):
1569 ok = False
1570 try:
1571 self.serv.settimeout(0.0)
1572 foo = self.serv.recv(1024)
1573 except socket.timeout:
1574 self.fail("caught timeout instead of error (UDP)")
1575 except socket.error:
1576 ok = True
1577 except:
1578 self.fail("caught unexpected exception (UDP)")
1579 if not ok:
1580 self.fail("recv() returned success when we did not expect it")
1581
1582class TestExceptions(unittest.TestCase):
1583
1584 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001585 self.assertTrue(issubclass(socket.error, Exception))
1586 self.assertTrue(issubclass(socket.herror, socket.error))
1587 self.assertTrue(issubclass(socket.gaierror, socket.error))
1588 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001589
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001590class TestLinuxAbstractNamespace(unittest.TestCase):
1591
1592 UNIX_PATH_MAX = 108
1593
1594 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001595 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001596 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1597 s1.bind(address)
1598 s1.listen(1)
1599 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1600 s2.connect(s1.getsockname())
1601 s1.accept()
1602 self.assertEqual(s1.getsockname(), address)
1603 self.assertEqual(s2.getpeername(), address)
1604
1605 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001606 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001607 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1608 s.bind(address)
1609 self.assertEqual(s.getsockname(), address)
1610
1611 def testNameOverflow(self):
1612 address = "\x00" + "h" * self.UNIX_PATH_MAX
1613 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1614 self.assertRaises(socket.error, s.bind, address)
1615
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001616
Victor Stinner45df8202010-04-28 22:31:17 +00001617@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001618class BufferIOTest(SocketConnectedTest):
1619 """
1620 Test the buffer versions of socket.recv() and socket.send().
1621 """
1622 def __init__(self, methodName='runTest'):
1623 SocketConnectedTest.__init__(self, methodName=methodName)
1624
Antoine Pitrou25480782010-03-17 22:50:28 +00001625 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001626 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001627 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001628 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001629 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001630 self.assertEqual(msg, MSG)
1631
Antoine Pitrou25480782010-03-17 22:50:28 +00001632 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001633 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001634 self.serv_conn.send(buf)
1635
Antoine Pitrou25480782010-03-17 22:50:28 +00001636 def testRecvIntoBytearray(self):
1637 buf = bytearray(1024)
1638 nbytes = self.cli_conn.recv_into(buf)
1639 self.assertEqual(nbytes, len(MSG))
1640 msg = buf[:len(MSG)]
1641 self.assertEqual(msg, MSG)
1642
1643 _testRecvIntoBytearray = _testRecvIntoArray
1644
1645 def testRecvIntoMemoryview(self):
1646 buf = bytearray(1024)
1647 nbytes = self.cli_conn.recv_into(memoryview(buf))
1648 self.assertEqual(nbytes, len(MSG))
1649 msg = buf[:len(MSG)]
1650 self.assertEqual(msg, MSG)
1651
1652 _testRecvIntoMemoryview = _testRecvIntoArray
1653
1654 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001655 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001656 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001657 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001658 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001659 self.assertEqual(msg, MSG)
1660
Antoine Pitrou25480782010-03-17 22:50:28 +00001661 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001662 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001663 self.serv_conn.send(buf)
1664
Antoine Pitrou25480782010-03-17 22:50:28 +00001665 def testRecvFromIntoBytearray(self):
1666 buf = bytearray(1024)
1667 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1668 self.assertEqual(nbytes, len(MSG))
1669 msg = buf[:len(MSG)]
1670 self.assertEqual(msg, MSG)
1671
1672 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1673
1674 def testRecvFromIntoMemoryview(self):
1675 buf = bytearray(1024)
1676 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1677 self.assertEqual(nbytes, len(MSG))
1678 msg = buf[:len(MSG)]
1679 self.assertEqual(msg, MSG)
1680
1681 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1682
Christian Heimes043d6f62008-01-07 17:19:16 +00001683
1684TIPC_STYPE = 2000
1685TIPC_LOWER = 200
1686TIPC_UPPER = 210
1687
1688def isTipcAvailable():
1689 """Check if the TIPC module is loaded
1690
1691 The TIPC module is not loaded automatically on Ubuntu and probably
1692 other Linux distros.
1693 """
1694 if not hasattr(socket, "AF_TIPC"):
1695 return False
1696 if not os.path.isfile("/proc/modules"):
1697 return False
1698 with open("/proc/modules") as f:
1699 for line in f:
1700 if line.startswith("tipc "):
1701 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001702 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001703 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1704 return False
1705
1706class TIPCTest (unittest.TestCase):
1707 def testRDM(self):
1708 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1709 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1710
1711 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1712 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1713 TIPC_LOWER, TIPC_UPPER)
1714 srv.bind(srvaddr)
1715
1716 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1717 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1718 cli.sendto(MSG, sendaddr)
1719
1720 msg, recvaddr = srv.recvfrom(1024)
1721
1722 self.assertEqual(cli.getsockname(), recvaddr)
1723 self.assertEqual(msg, MSG)
1724
1725
1726class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1727 def __init__(self, methodName = 'runTest'):
1728 unittest.TestCase.__init__(self, methodName = methodName)
1729 ThreadableTest.__init__(self)
1730
1731 def setUp(self):
1732 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1733 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1734 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1735 TIPC_LOWER, TIPC_UPPER)
1736 self.srv.bind(srvaddr)
1737 self.srv.listen(5)
1738 self.serverExplicitReady()
1739 self.conn, self.connaddr = self.srv.accept()
1740
1741 def clientSetUp(self):
1742 # The is a hittable race between serverExplicitReady() and the
1743 # accept() call; sleep a little while to avoid it, otherwise
1744 # we could get an exception
1745 time.sleep(0.1)
1746 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1747 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1748 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1749 self.cli.connect(addr)
1750 self.cliaddr = self.cli.getsockname()
1751
1752 def testStream(self):
1753 msg = self.conn.recv(1024)
1754 self.assertEqual(msg, MSG)
1755 self.assertEqual(self.cliaddr, self.connaddr)
1756
1757 def _testStream(self):
1758 self.cli.send(MSG)
1759 self.cli.close()
1760
1761
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001762@unittest.skipUnless(thread, 'Threading required for this test.')
1763class ContextManagersTest(ThreadedTCPSocketTest):
1764
1765 def _testSocketClass(self):
1766 # base test
1767 with socket.socket() as sock:
1768 self.assertFalse(sock._closed)
1769 self.assertTrue(sock._closed)
1770 # close inside with block
1771 with socket.socket() as sock:
1772 sock.close()
1773 self.assertTrue(sock._closed)
1774 # exception inside with block
1775 with socket.socket() as sock:
1776 self.assertRaises(socket.error, sock.sendall, b'foo')
1777 self.assertTrue(sock._closed)
1778
1779 def testCreateConnectionBase(self):
1780 conn, addr = self.serv.accept()
1781 data = conn.recv(1024)
1782 conn.sendall(data)
1783
1784 def _testCreateConnectionBase(self):
1785 address = self.serv.getsockname()
1786 with socket.create_connection(address) as sock:
1787 self.assertFalse(sock._closed)
1788 sock.sendall(b'foo')
1789 self.assertEqual(sock.recv(1024), b'foo')
1790 self.assertTrue(sock._closed)
1791
1792 def testCreateConnectionClose(self):
1793 conn, addr = self.serv.accept()
1794 data = conn.recv(1024)
1795 conn.sendall(data)
1796
1797 def _testCreateConnectionClose(self):
1798 address = self.serv.getsockname()
1799 with socket.create_connection(address) as sock:
1800 sock.close()
1801 self.assertTrue(sock._closed)
1802 self.assertRaises(socket.error, sock.sendall, b'foo')
1803
1804
Guido van Rossumb995eb72002-07-31 16:08:40 +00001805def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001806 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001807 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001808
1809 tests.extend([
1810 NonBlockingTCPTests,
1811 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001812 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001813 UnbufferedFileObjectClassTestCase,
1814 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001815 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00001816 UnicodeReadFileObjectClassTestCase,
1817 UnicodeWriteFileObjectClassTestCase,
1818 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001819 NetworkConnectionNoServer,
1820 NetworkConnectionAttributesTest,
1821 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001822 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001823 ])
Dave Cole331708b2004-08-09 04:51:41 +00001824 if hasattr(socket, "socketpair"):
1825 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001826 if sys.platform == 'linux2':
1827 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001828 if isTipcAvailable():
1829 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001830 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001831
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001832 thread_info = support.threading_setup()
1833 support.run_unittest(*tests)
1834 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001835
1836if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001837 test_main()