blob: 5b5d4fb237ce8c91d4a31e10edec498cb0cb109b [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001#!/usr/bin/env python
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Trent Nelsone41b0062008-04-08 23:47:30 +00006import errno
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00009import time
10import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000011import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000012import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000013import os
Martin Blais2856e5f2006-05-26 12:03:27 +000014import array
Antoine Pitrouc818ed42010-09-07 21:40:25 +000015import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000016from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000017import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000019def try_address(host, port=0, family=socket.AF_INET):
20 """Try to bind a socket on the given host:port and return True
21 if that has been possible."""
22 try:
23 sock = socket.socket(family, socket.SOCK_STREAM)
24 sock.bind((host, port))
25 except (socket.error, socket.gaierror):
26 return False
27 else:
28 sock.close()
29 return True
30
31HOST = test_support.HOST
32MSG = b'Michael Gilfix was here\n'
33SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
34
Victor Stinner6a102812010-04-27 23:55:59 +000035try:
36 import thread
37 import threading
38except ImportError:
39 thread = None
40 threading = None
41
Trent Nelsone41b0062008-04-08 23:47:30 +000042HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000043MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000044
Guido van Rossum24e4af82002-06-12 19:18:08 +000045class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047 def setUp(self):
48 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000049 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000050 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000051
Guido van Rossum24e4af82002-06-12 19:18:08 +000052 def tearDown(self):
53 self.serv.close()
54 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000055
Guido van Rossum24e4af82002-06-12 19:18:08 +000056class SocketUDPTest(unittest.TestCase):
57
58 def setUp(self):
59 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000060 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000061
62 def tearDown(self):
63 self.serv.close()
64 self.serv = None
65
66class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000067 """Threadable Test class
68
69 The ThreadableTest class makes it easy to create a threaded
70 client/server pair from an existing unit test. To create a
71 new threaded class from an existing unit test, use multiple
72 inheritance:
73
74 class NewClass (OldClass, ThreadableTest):
75 pass
76
77 This class defines two new fixture functions with obvious
78 purposes for overriding:
79
80 clientSetUp ()
81 clientTearDown ()
82
83 Any new test functions within the class must then define
84 tests in pairs, where the test name is preceeded with a
85 '_' to indicate the client portion of the test. Ex:
86
87 def testFoo(self):
88 # Server portion
89
90 def _testFoo(self):
91 # Client portion
92
93 Any exceptions raised by the clients during their tests
94 are caught and transferred to the main thread to alert
95 the testing framework.
96
97 Note, the server setup function cannot call any blocking
98 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000099 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000100 the blocking call (such as in setting up a client/server
101 connection and performing the accept() in setUp().
102 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000103
104 def __init__(self):
105 # Swap the true setup function
106 self.__setUp = self.setUp
107 self.__tearDown = self.tearDown
108 self.setUp = self._setUp
109 self.tearDown = self._tearDown
110
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 def serverExplicitReady(self):
112 """This method allows the server to explicitly indicate that
113 it wants the client thread to proceed. This is useful if the
114 server is about to execute a blocking routine that is
115 dependent upon the client thread during its setup routine."""
116 self.server_ready.set()
117
Guido van Rossum24e4af82002-06-12 19:18:08 +0000118 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000119 self.server_ready = threading.Event()
120 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000122 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000125 methodname = self.id()
126 i = methodname.rfind('.')
127 methodname = methodname[i+1:]
128 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000129 self.client_thread = thread.start_new_thread(
130 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131
132 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000133 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000134 self.server_ready.set()
135 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def _tearDown(self):
138 self.__tearDown()
139 self.done.wait()
140
141 if not self.queue.empty():
142 msg = self.queue.get()
143 self.fail(msg)
144
145 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 self.server_ready.wait()
147 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000148 self.clientSetUp()
Florent Xicluna07627882010-03-21 01:14:24 +0000149 with test_support.check_py3k_warnings():
150 if not callable(test_func):
151 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152 try:
153 test_func()
154 except Exception, strerror:
155 self.queue.put(strerror)
156 self.clientTearDown()
157
158 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000159 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000160
161 def clientTearDown(self):
162 self.done.set()
163 thread.exit()
164
165class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
166
167 def __init__(self, methodName='runTest'):
168 SocketTCPTest.__init__(self, methodName=methodName)
169 ThreadableTest.__init__(self)
170
171 def clientSetUp(self):
172 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
173
174 def clientTearDown(self):
175 self.cli.close()
176 self.cli = None
177 ThreadableTest.clientTearDown(self)
178
179class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
180
181 def __init__(self, methodName='runTest'):
182 SocketUDPTest.__init__(self, methodName=methodName)
183 ThreadableTest.__init__(self)
184
185 def clientSetUp(self):
186 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
187
188class SocketConnectedTest(ThreadedTCPSocketTest):
189
190 def __init__(self, methodName='runTest'):
191 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
192
193 def setUp(self):
194 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000195 # Indicate explicitly we're ready for the client thread to
196 # proceed and then perform the blocking call to accept
197 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000198 conn, addr = self.serv.accept()
199 self.cli_conn = conn
200
201 def tearDown(self):
202 self.cli_conn.close()
203 self.cli_conn = None
204 ThreadedTCPSocketTest.tearDown(self)
205
206 def clientSetUp(self):
207 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000208 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000209 self.serv_conn = self.cli
210
211 def clientTearDown(self):
212 self.serv_conn.close()
213 self.serv_conn = None
214 ThreadedTCPSocketTest.clientTearDown(self)
215
Dave Cole331708b2004-08-09 04:51:41 +0000216class SocketPairTest(unittest.TestCase, ThreadableTest):
217
218 def __init__(self, methodName='runTest'):
219 unittest.TestCase.__init__(self, methodName=methodName)
220 ThreadableTest.__init__(self)
221
222 def setUp(self):
223 self.serv, self.cli = socket.socketpair()
224
225 def tearDown(self):
226 self.serv.close()
227 self.serv = None
228
229 def clientSetUp(self):
230 pass
231
232 def clientTearDown(self):
233 self.cli.close()
234 self.cli = None
235 ThreadableTest.clientTearDown(self)
236
Tim Peters494aaee2004-08-09 18:54:11 +0000237
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238#######################################################################
239## Begin Tests
240
241class GeneralModuleTests(unittest.TestCase):
242
Raymond Hettinger027bb632004-05-31 03:09:25 +0000243 def test_weakref(self):
244 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
245 p = proxy(s)
246 self.assertEqual(p.fileno(), s.fileno())
247 s.close()
248 s = None
249 try:
250 p.fileno()
251 except ReferenceError:
252 pass
253 else:
254 self.fail('Socket proxy still exists')
255
Guido van Rossum24e4af82002-06-12 19:18:08 +0000256 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000257 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000258 def raise_error(*args, **kwargs):
259 raise socket.error
260 def raise_herror(*args, **kwargs):
261 raise socket.herror
262 def raise_gaierror(*args, **kwargs):
263 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000264 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000265 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000266 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000268 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 "Error raising socket exception.")
270
271 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000272 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 socket.AF_INET
274 socket.SOCK_STREAM
275 socket.SOCK_DGRAM
276 socket.SOCK_RAW
277 socket.SOCK_RDM
278 socket.SOCK_SEQPACKET
279 socket.SOL_SOCKET
280 socket.SO_REUSEADDR
281
Guido van Rossum654c11e2002-06-13 20:24:17 +0000282 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000283 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000284 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000285 try:
286 ip = socket.gethostbyname(hostname)
287 except socket.error:
288 # Probably name lookup wasn't set up right; skip this test
289 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000290 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000291 try:
292 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
293 except socket.error:
294 # Probably a similar problem as above; skip this test
295 return
Brett Cannon01668a12005-03-11 00:04:17 +0000296 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000297 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000298 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000299 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000300
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000301 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000302 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000303 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000304 try:
305 # On some versions, this loses a reference
306 orig = sys.getrefcount(__name__)
307 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000308 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000309 self.assertEqual(sys.getrefcount(__name__), orig,
310 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000311
Guido van Rossum24e4af82002-06-12 19:18:08 +0000312 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000313 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000314 try:
315 # On some versions, this crashes the interpreter.
316 socket.getnameinfo(('x', 0, 0, 0), 0)
317 except socket.error:
318 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000319
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000320 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000321 # This just checks that htons etc. are their own inverse,
322 # when looking at the lower 16 or 32 bits.
323 sizes = {socket.htonl: 32, socket.ntohl: 32,
324 socket.htons: 16, socket.ntohs: 16}
325 for func, size in sizes.items():
326 mask = (1L<<size) - 1
327 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
328 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000329
Guido van Rossuma2627af2002-09-14 00:58:46 +0000330 swapped = func(mask)
331 self.assertEqual(swapped & mask, mask)
332 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000333
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000334 def testNtoHErrors(self):
335 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
336 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
337 for k in good_values:
338 socket.ntohl(k)
339 socket.ntohs(k)
340 socket.htonl(k)
341 socket.htons(k)
342 for k in bad_values:
343 self.assertRaises(OverflowError, socket.ntohl, k)
344 self.assertRaises(OverflowError, socket.ntohs, k)
345 self.assertRaises(OverflowError, socket.htonl, k)
346 self.assertRaises(OverflowError, socket.htons, k)
347
Barry Warsaw11b91a02004-06-28 00:50:43 +0000348 def testGetServBy(self):
349 eq = self.assertEqual
350 # Find one service that exists, then check all the related interfaces.
351 # I've ordered this by protocols that have both a tcp and udp
352 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000353 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000354 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000355 # avoid the 'echo' service on this platform, as there is an
356 # assumption breaking non-standard port/protocol entry
357 services = ('daytime', 'qotd', 'domain')
358 else:
359 services = ('echo', 'daytime', 'domain')
360 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000361 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000362 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000363 break
364 except socket.error:
365 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000366 else:
367 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000368 # Try same call with optional protocol omitted
369 port2 = socket.getservbyname(service)
370 eq(port, port2)
371 # Try udp, but don't barf it it doesn't exist
372 try:
373 udpport = socket.getservbyname(service, 'udp')
374 except socket.error:
375 udpport = None
376 else:
377 eq(udpport, port)
378 # Now make sure the lookup by port returns the same service name
379 eq(socket.getservbyport(port2), service)
380 eq(socket.getservbyport(port, 'tcp'), service)
381 if udpport is not None:
382 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000383 # Make sure getservbyport does not accept out of range ports.
384 self.assertRaises(OverflowError, socket.getservbyport, -1)
385 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000386
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000387 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000388 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000389 # The default timeout should initially be None
390 self.assertEqual(socket.getdefaulttimeout(), None)
391 s = socket.socket()
392 self.assertEqual(s.gettimeout(), None)
393 s.close()
394
395 # Set the default timeout to 10, and see if it propagates
396 socket.setdefaulttimeout(10)
397 self.assertEqual(socket.getdefaulttimeout(), 10)
398 s = socket.socket()
399 self.assertEqual(s.gettimeout(), 10)
400 s.close()
401
402 # Reset the default timeout to None, and see if it propagates
403 socket.setdefaulttimeout(None)
404 self.assertEqual(socket.getdefaulttimeout(), None)
405 s = socket.socket()
406 self.assertEqual(s.gettimeout(), None)
407 s.close()
408
409 # Check that setting it to an invalid value raises ValueError
410 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
411
412 # Check that setting it to an invalid type raises TypeError
413 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
414
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000415 def testIPv4_inet_aton_fourbytes(self):
416 if not hasattr(socket, 'inet_aton'):
417 return # No inet_aton, nothing to check
418 # Test that issue1008086 and issue767150 are fixed.
419 # It must return 4 bytes.
420 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
421 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
422
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000423 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000424 if not hasattr(socket, 'inet_pton'):
425 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000426 from socket import inet_aton as f, inet_pton, AF_INET
427 g = lambda a: inet_pton(AF_INET, a)
428
429 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
430 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
431 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
432 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000433 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000434
435 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
436 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
437 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000438 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000439
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000440 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000441 if not hasattr(socket, 'inet_pton'):
442 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000443 try:
444 from socket import inet_pton, AF_INET6, has_ipv6
445 if not has_ipv6:
446 return
447 except ImportError:
448 return
449 f = lambda a: inet_pton(AF_INET6, a)
450
451 self.assertEquals('\x00' * 16, f('::'))
452 self.assertEquals('\x00' * 16, f('0::0'))
453 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
454 self.assertEquals(
455 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
456 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
457 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000458
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000459 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000460 if not hasattr(socket, 'inet_ntop'):
461 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000462 from socket import inet_ntoa as f, inet_ntop, AF_INET
463 g = lambda a: inet_ntop(AF_INET, a)
464
465 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
466 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
467 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
468 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000469
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
471 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
472 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
473
474 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000475 if not hasattr(socket, 'inet_ntop'):
476 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000477 try:
478 from socket import inet_ntop, AF_INET6, has_ipv6
479 if not has_ipv6:
480 return
481 except ImportError:
482 return
483 f = lambda a: inet_ntop(AF_INET6, a)
484
485 self.assertEquals('::', f('\x00' * 16))
486 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
487 self.assertEquals(
488 'aef:b01:506:1001:ffff:9997:55:170',
489 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
490 )
491
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000492 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000493
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000494 def _get_unused_port(self, bind_address='0.0.0.0'):
495 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000496
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000497 Args:
498 bind_address: Hostname or IP address to search for a port on.
499
500 Returns: A most likely to be unused port.
501 """
502 tempsock = socket.socket()
503 tempsock.bind((bind_address, 0))
504 host, port = tempsock.getsockname()
505 tempsock.close()
506 return port
507
508 def testSockName(self):
509 # Testing getsockname()
510 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000511 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000512 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000514 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
515 # it reasonable to get the host's addr in addition to 0.0.0.0.
516 # At least for eCos. This is required for the S/390 to pass.
517 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000518 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000519 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000520
521 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000522 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000523 # We know a socket should start without reuse==0
524 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
525 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000526 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527
528 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000529 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
531 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
532 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000533 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000535 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000536 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000537 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
538 sock.settimeout(1)
539 sock.close()
540 self.assertRaises(socket.error, sock.send, "spam")
541
Georg Brandlbb03ac02006-03-21 18:17:25 +0000542 def testNewAttributes(self):
543 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000544 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000545 self.assertEqual(sock.family, socket.AF_INET)
546 self.assertEqual(sock.type, socket.SOCK_STREAM)
547 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000548 sock.close()
549
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000550 def test_getsockaddrarg(self):
551 host = '0.0.0.0'
552 port = self._get_unused_port(bind_address=host)
553 big_port = port + 65536
554 neg_port = port - 65536
555 sock = socket.socket()
556 try:
557 self.assertRaises(OverflowError, sock.bind, (host, big_port))
558 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
559 sock.bind((host, port))
560 finally:
561 sock.close()
562
Christian Heimesa47b75b2008-01-04 15:48:06 +0000563 def test_sock_ioctl(self):
564 if os.name != "nt":
565 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000566 self.assertTrue(hasattr(socket.socket, 'ioctl'))
567 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
568 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
569 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000570 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
571 s = socket.socket()
572 self.assertRaises(ValueError, s.ioctl, -1, None)
573 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000574
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000575 def testGetaddrinfo(self):
576 try:
577 socket.getaddrinfo('localhost', 80)
578 except socket.gaierror as err:
579 if err.errno == socket.EAI_SERVICE:
580 # see http://bugs.python.org/issue1282647
581 self.skipTest("buggy libc version")
582 raise
583 # len of every sequence is supposed to be == 5
584 for info in socket.getaddrinfo(HOST, None):
585 self.assertEqual(len(info), 5)
586 # host can be a domain name, a string representation of an
587 # IPv4/v6 address or None
588 socket.getaddrinfo('localhost', 80)
589 socket.getaddrinfo('127.0.0.1', 80)
590 socket.getaddrinfo(None, 80)
591 if SUPPORTS_IPV6:
592 socket.getaddrinfo('::1', 80)
593 # port can be a string service name such as "http", a numeric
594 # port number or None
595 socket.getaddrinfo(HOST, "http")
596 socket.getaddrinfo(HOST, 80)
597 socket.getaddrinfo(HOST, None)
598 # test family and socktype filters
599 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
600 for family, _, _, _, _ in infos:
601 self.assertEqual(family, socket.AF_INET)
602 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
603 for _, socktype, _, _, _ in infos:
604 self.assertEqual(socktype, socket.SOCK_STREAM)
605 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000606 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000607 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
608 # a server willing to support both IPv4 and IPv6 will
609 # usually do this
610 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
611 socket.AI_PASSIVE)
612
Christian Heimesa47b75b2008-01-04 15:48:06 +0000613
Victor Stinner6a102812010-04-27 23:55:59 +0000614@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000615class BasicTCPTest(SocketConnectedTest):
616
617 def __init__(self, methodName='runTest'):
618 SocketConnectedTest.__init__(self, methodName=methodName)
619
620 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000621 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000623 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000624
625 def _testRecv(self):
626 self.serv_conn.send(MSG)
627
628 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000629 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000630 seg1 = self.cli_conn.recv(len(MSG) - 3)
631 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000632 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000633 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000634
635 def _testOverFlowRecv(self):
636 self.serv_conn.send(MSG)
637
638 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000639 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000641 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642
643 def _testRecvFrom(self):
644 self.serv_conn.send(MSG)
645
646 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000647 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
649 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000650 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000651 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000652
653 def _testOverFlowRecvFrom(self):
654 self.serv_conn.send(MSG)
655
656 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000657 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000658 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 while 1:
660 read = self.cli_conn.recv(1024)
661 if not read:
662 break
Guido van Rossume531e292002-08-08 20:28:34 +0000663 msg += read
664 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000665
666 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000667 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668 self.serv_conn.sendall(big_chunk)
669
670 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000671 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000672 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000673 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 fd = self.cli_conn.fileno()
675 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
676 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000677 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000678
679 def _testFromFd(self):
680 self.serv_conn.send(MSG)
681
682 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000683 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000685 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000686 # wait for _testShutdown to finish: on OS X, when the server
687 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000688 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000689 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000690
691 def _testShutdown(self):
692 self.serv_conn.send(MSG)
693 self.serv_conn.shutdown(2)
694
Victor Stinner6a102812010-04-27 23:55:59 +0000695@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696class BasicUDPTest(ThreadedUDPSocketTest):
697
698 def __init__(self, methodName='runTest'):
699 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
700
701 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000704 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705
706 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000707 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000708
Guido van Rossum1c938012002-06-12 21:17:20 +0000709 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000712 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713
Guido van Rossum1c938012002-06-12 21:17:20 +0000714 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000715 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716
Facundo Batista1fe9f962007-03-28 03:45:20 +0000717 def testRecvFromNegative(self):
718 # Negative lengths passed to recvfrom should give ValueError.
719 self.assertRaises(ValueError, self.serv.recvfrom, -1)
720
721 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000722 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000723
Victor Stinner6a102812010-04-27 23:55:59 +0000724@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000725class TCPCloserTest(ThreadedTCPSocketTest):
726
727 def testClose(self):
728 conn, addr = self.serv.accept()
729 conn.close()
730
731 sd = self.cli
732 read, write, err = select.select([sd], [], [], 1.0)
733 self.assertEqual(read, [sd])
734 self.assertEqual(sd.recv(1), '')
735
736 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000737 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000738 time.sleep(1.0)
739
Victor Stinner6a102812010-04-27 23:55:59 +0000740@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000741class BasicSocketPairTest(SocketPairTest):
742
743 def __init__(self, methodName='runTest'):
744 SocketPairTest.__init__(self, methodName=methodName)
745
746 def testRecv(self):
747 msg = self.serv.recv(1024)
748 self.assertEqual(msg, MSG)
749
750 def _testRecv(self):
751 self.cli.send(MSG)
752
753 def testSend(self):
754 self.serv.send(MSG)
755
756 def _testSend(self):
757 msg = self.cli.recv(1024)
758 self.assertEqual(msg, MSG)
759
Victor Stinner6a102812010-04-27 23:55:59 +0000760@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761class NonBlockingTCPTests(ThreadedTCPSocketTest):
762
763 def __init__(self, methodName='runTest'):
764 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
765
766 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000767 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000768 self.serv.setblocking(0)
769 start = time.time()
770 try:
771 self.serv.accept()
772 except socket.error:
773 pass
774 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000775 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000776
777 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000778 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000779
Guido van Rossum24e4af82002-06-12 19:18:08 +0000780 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000781 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000782 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000783 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 conn, addr = self.serv.accept()
785 except socket.error:
786 pass
787 else:
788 self.fail("Error trying to do non-blocking accept.")
789 read, write, err = select.select([self.serv], [], [])
790 if self.serv in read:
791 conn, addr = self.serv.accept()
792 else:
793 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000794
Guido van Rossum24e4af82002-06-12 19:18:08 +0000795 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000796 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000797 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798
799 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000800 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801 conn, addr = self.serv.accept()
802
803 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000804 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000805 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806
807 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000808 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 conn, addr = self.serv.accept()
810 conn.setblocking(0)
811 try:
812 msg = conn.recv(len(MSG))
813 except socket.error:
814 pass
815 else:
816 self.fail("Error trying to do non-blocking recv.")
817 read, write, err = select.select([conn], [], [])
818 if conn in read:
819 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000820 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000821 else:
822 self.fail("Error during select call to non-blocking socket.")
823
824 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000825 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000826 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000827 self.cli.send(MSG)
828
Victor Stinner6a102812010-04-27 23:55:59 +0000829@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830class FileObjectClassTestCase(SocketConnectedTest):
831
Guido van Rossume9f66142002-08-07 15:46:19 +0000832 bufsize = -1 # Use default buffer size
833
Guido van Rossum24e4af82002-06-12 19:18:08 +0000834 def __init__(self, methodName='runTest'):
835 SocketConnectedTest.__init__(self, methodName=methodName)
836
837 def setUp(self):
838 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000839 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def tearDown(self):
842 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000843 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 self.serv_file = None
845 SocketConnectedTest.tearDown(self)
846
847 def clientSetUp(self):
848 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000849 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850
851 def clientTearDown(self):
852 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000853 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854 self.cli_file = None
855 SocketConnectedTest.clientTearDown(self)
856
857 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 first_seg = self.serv_file.read(len(MSG)-3)
860 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000861 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000862 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
864 def _testSmallRead(self):
865 self.cli_file.write(MSG)
866 self.cli_file.flush()
867
Guido van Rossum8c943832002-08-08 01:00:28 +0000868 def testFullRead(self):
869 # read until EOF
870 msg = self.serv_file.read()
871 self.assertEqual(msg, MSG)
872
873 def _testFullRead(self):
874 self.cli_file.write(MSG)
875 self.cli_file.close()
876
Guido van Rossum24e4af82002-06-12 19:18:08 +0000877 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000878 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000879 buf = ''
880 while 1:
881 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000882 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000883 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000884 buf += char
885 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886
887 def _testUnbufferedRead(self):
888 self.cli_file.write(MSG)
889 self.cli_file.flush()
890
891 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000892 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000894 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895
896 def _testReadline(self):
897 self.cli_file.write(MSG)
898 self.cli_file.flush()
899
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000900 def testReadlineAfterRead(self):
901 a_baloo_is = self.serv_file.read(len("A baloo is"))
902 self.assertEqual("A baloo is", a_baloo_is)
903 _a_bear = self.serv_file.read(len(" a bear"))
904 self.assertEqual(" a bear", _a_bear)
905 line = self.serv_file.readline()
906 self.assertEqual("\n", line)
907 line = self.serv_file.readline()
908 self.assertEqual("A BALOO IS A BEAR.\n", line)
909 line = self.serv_file.readline()
910 self.assertEqual(MSG, line)
911
912 def _testReadlineAfterRead(self):
913 self.cli_file.write("A baloo is a bear\n")
914 self.cli_file.write("A BALOO IS A BEAR.\n")
915 self.cli_file.write(MSG)
916 self.cli_file.flush()
917
918 def testReadlineAfterReadNoNewline(self):
919 end_of_ = self.serv_file.read(len("End Of "))
920 self.assertEqual("End Of ", end_of_)
921 line = self.serv_file.readline()
922 self.assertEqual("Line", line)
923
924 def _testReadlineAfterReadNoNewline(self):
925 self.cli_file.write("End Of Line")
926
Tim Peters116d83c2004-03-28 02:20:45 +0000927 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000928 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000929
930 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000931 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000932
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000933
934class FileObjectInterruptedTestCase(unittest.TestCase):
935 """Test that the file object correctly handles EINTR internally."""
936
937 class MockSocket(object):
938 def __init__(self, recv_funcs=()):
939 # A generator that returns callables that we'll call for each
940 # call to recv().
941 self._recv_step = iter(recv_funcs)
942
943 def recv(self, size):
944 return self._recv_step.next()()
945
946 @staticmethod
947 def _raise_eintr():
948 raise socket.error(errno.EINTR)
949
950 def _test_readline(self, size=-1, **kwargs):
951 mock_sock = self.MockSocket(recv_funcs=[
952 lambda : "This is the first line\nAnd the sec",
953 self._raise_eintr,
954 lambda : "ond line is here\n",
955 lambda : "",
956 ])
957 fo = socket._fileobject(mock_sock, **kwargs)
958 self.assertEquals(fo.readline(size), "This is the first line\n")
959 self.assertEquals(fo.readline(size), "And the second line is here\n")
960
961 def _test_read(self, size=-1, **kwargs):
962 mock_sock = self.MockSocket(recv_funcs=[
963 lambda : "This is the first line\nAnd the sec",
964 self._raise_eintr,
965 lambda : "ond line is here\n",
966 lambda : "",
967 ])
968 fo = socket._fileobject(mock_sock, **kwargs)
969 self.assertEquals(fo.read(size), "This is the first line\n"
970 "And the second line is here\n")
971
972 def test_default(self):
973 self._test_readline()
974 self._test_readline(size=100)
975 self._test_read()
976 self._test_read(size=100)
977
978 def test_with_1k_buffer(self):
979 self._test_readline(bufsize=1024)
980 self._test_readline(size=100, bufsize=1024)
981 self._test_read(bufsize=1024)
982 self._test_read(size=100, bufsize=1024)
983
984 def _test_readline_no_buffer(self, size=-1):
985 mock_sock = self.MockSocket(recv_funcs=[
986 lambda : "aa",
987 lambda : "\n",
988 lambda : "BB",
989 self._raise_eintr,
990 lambda : "bb",
991 lambda : "",
992 ])
993 fo = socket._fileobject(mock_sock, bufsize=0)
994 self.assertEquals(fo.readline(size), "aa\n")
995 self.assertEquals(fo.readline(size), "BBbb")
996
997 def test_no_buffer(self):
998 self._test_readline_no_buffer()
999 self._test_readline_no_buffer(size=4)
1000 self._test_read(bufsize=0)
1001 self._test_read(size=100, bufsize=0)
1002
1003
Guido van Rossume9f66142002-08-07 15:46:19 +00001004class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1005
1006 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001007
Guido van Rossume9f66142002-08-07 15:46:19 +00001008 In this case (and in this case only), it should be possible to
1009 create a file object, read a line from it, create another file
1010 object, read another line from it, without loss of data in the
1011 first file object's buffer. Note that httplib relies on this
1012 when reading multiple requests from the same socket."""
1013
1014 bufsize = 0 # Use unbuffered mode
1015
1016 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001017 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001018 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001019 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001020 self.serv_file = self.cli_conn.makefile('rb', 0)
1021 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001022 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001023
1024 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001025 self.cli_file.write("A. " + MSG)
1026 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001027 self.cli_file.flush()
1028
Guido van Rossum8c943832002-08-08 01:00:28 +00001029class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1030
1031 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1032
1033
1034class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1035
1036 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001037
Georg Brandldd7b0522007-01-21 10:35:10 +00001038
Facundo Batista07c78be2007-03-23 18:54:07 +00001039class NetworkConnectionTest(object):
1040 """Prove network connection."""
1041 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001042 # We're inherited below by BasicTCPTest2, which also inherits
1043 # BasicTCPTest, which defines self.port referenced below.
1044 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001045 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001046
Facundo Batista07c78be2007-03-23 18:54:07 +00001047class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1048 """Tests that NetworkConnection does not break existing TCP functionality.
1049 """
1050
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001051class NetworkConnectionNoServer(unittest.TestCase):
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001052 class MockSocket(socket.socket):
1053 def connect(self, *args):
1054 raise socket.timeout('timed out')
1055
1056 @contextlib.contextmanager
1057 def mocked_socket_module(self):
1058 """Return a socket which times out on connect"""
1059 old_socket = socket.socket
1060 socket.socket = self.MockSocket
1061 try:
1062 yield
1063 finally:
1064 socket.socket = old_socket
1065
1066 def test_connect(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001067 port = test_support.find_unused_port()
Antoine Pitrouc818ed42010-09-07 21:40:25 +00001068 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1069 with self.assertRaises(socket.error) as cm:
1070 cli.connect((HOST, port))
1071 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1072
1073 def test_create_connection(self):
1074 # Issue #9792: errors raised by create_connection() should have
1075 # a proper errno attribute.
1076 port = test_support.find_unused_port()
1077 with self.assertRaises(socket.error) as cm:
1078 socket.create_connection((HOST, port))
1079 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1080
1081 def test_create_connection_timeout(self):
1082 # Issue #9792: create_connection() should not recast timeout errors
1083 # as generic socket errors.
1084 with self.mocked_socket_module():
1085 with self.assertRaises(socket.timeout):
1086 socket.create_connection((HOST, 1234))
1087
Facundo Batista07c78be2007-03-23 18:54:07 +00001088
Victor Stinner6a102812010-04-27 23:55:59 +00001089@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001090class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1091
1092 def __init__(self, methodName='runTest'):
1093 SocketTCPTest.__init__(self, methodName=methodName)
1094 ThreadableTest.__init__(self)
1095
1096 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001097 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001098
1099 def clientTearDown(self):
1100 self.cli.close()
1101 self.cli = None
1102 ThreadableTest.clientTearDown(self)
1103
1104 def _justAccept(self):
1105 conn, addr = self.serv.accept()
1106
1107 testFamily = _justAccept
1108 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001109 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001110 self.assertEqual(self.cli.family, 2)
1111
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001112 testSourceAddress = _justAccept
1113 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001114 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1115 source_address=('', self.source_port))
1116 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001117 # The port number being used is sufficient to show that the bind()
1118 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001119
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001120 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001121 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001122 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001123 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001124 socket.setdefaulttimeout(42)
1125 try:
1126 self.cli = socket.create_connection((HOST, self.port))
1127 finally:
1128 socket.setdefaulttimeout(None)
1129 self.assertEquals(self.cli.gettimeout(), 42)
1130
1131 testTimeoutNone = _justAccept
1132 def _testTimeoutNone(self):
1133 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001134 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001135 socket.setdefaulttimeout(30)
1136 try:
1137 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1138 finally:
1139 socket.setdefaulttimeout(None)
1140 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001141
1142 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001143 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001144 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001145 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001146
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001147 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001148 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001149 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001150 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001151
Victor Stinner6a102812010-04-27 23:55:59 +00001152@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001153class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1154
1155 def __init__(self, methodName='runTest'):
1156 SocketTCPTest.__init__(self, methodName=methodName)
1157 ThreadableTest.__init__(self)
1158
1159 def clientSetUp(self):
1160 pass
1161
1162 def clientTearDown(self):
1163 self.cli.close()
1164 self.cli = None
1165 ThreadableTest.clientTearDown(self)
1166
Facundo Batista07c78be2007-03-23 18:54:07 +00001167 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001168 conn, addr = self.serv.accept()
1169 time.sleep(3)
1170 conn.send("done!")
1171 testOutsideTimeout = testInsideTimeout
1172
1173 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001174 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001175 data = sock.recv(5)
1176 self.assertEqual(data, "done!")
1177
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001178 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001179 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001180 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001181
1182
Georg Brandldd7b0522007-01-21 10:35:10 +00001183class Urllib2FileobjectTest(unittest.TestCase):
1184
1185 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1186 # it close the socket if the close c'tor argument is true
1187
1188 def testClose(self):
1189 class MockSocket:
1190 closed = False
1191 def flush(self): pass
1192 def close(self): self.closed = True
1193
1194 # must not close unless we request it: the original use of _fileobject
1195 # by module socket requires that the underlying socket not be closed until
1196 # the _socketobject that created the _fileobject is closed
1197 s = MockSocket()
1198 f = socket._fileobject(s)
1199 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001200 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001201
1202 s = MockSocket()
1203 f = socket._fileobject(s, close=True)
1204 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001205 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001206
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001207class TCPTimeoutTest(SocketTCPTest):
1208
1209 def testTCPTimeout(self):
1210 def raise_timeout(*args, **kwargs):
1211 self.serv.settimeout(1.0)
1212 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001213 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001214 "Error generating a timeout exception (TCP)")
1215
1216 def testTimeoutZero(self):
1217 ok = False
1218 try:
1219 self.serv.settimeout(0.0)
1220 foo = self.serv.accept()
1221 except socket.timeout:
1222 self.fail("caught timeout instead of error (TCP)")
1223 except socket.error:
1224 ok = True
1225 except:
1226 self.fail("caught unexpected exception (TCP)")
1227 if not ok:
1228 self.fail("accept() returned success when we did not expect it")
1229
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001230 def testInterruptedTimeout(self):
1231 # XXX I don't know how to do this test on MSWindows or any other
1232 # plaform that doesn't support signal.alarm() or os.kill(), though
1233 # the bug should have existed on all platforms.
1234 if not hasattr(signal, "alarm"):
1235 return # can only test on *nix
1236 self.serv.settimeout(5.0) # must be longer than alarm
1237 class Alarm(Exception):
1238 pass
1239 def alarm_handler(signal, frame):
1240 raise Alarm
1241 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1242 try:
1243 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1244 try:
1245 foo = self.serv.accept()
1246 except socket.timeout:
1247 self.fail("caught timeout instead of Alarm")
1248 except Alarm:
1249 pass
1250 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001251 self.fail("caught other exception instead of Alarm:"
1252 " %s(%s):\n%s" %
1253 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001254 else:
1255 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001256 finally:
1257 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001258 except Alarm:
1259 self.fail("got Alarm in wrong place")
1260 finally:
1261 # no alarm can be pending. Safe to restore old handler.
1262 signal.signal(signal.SIGALRM, old_alarm)
1263
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001264class UDPTimeoutTest(SocketTCPTest):
1265
1266 def testUDPTimeout(self):
1267 def raise_timeout(*args, **kwargs):
1268 self.serv.settimeout(1.0)
1269 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001270 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001271 "Error generating a timeout exception (UDP)")
1272
1273 def testTimeoutZero(self):
1274 ok = False
1275 try:
1276 self.serv.settimeout(0.0)
1277 foo = self.serv.recv(1024)
1278 except socket.timeout:
1279 self.fail("caught timeout instead of error (UDP)")
1280 except socket.error:
1281 ok = True
1282 except:
1283 self.fail("caught unexpected exception (UDP)")
1284 if not ok:
1285 self.fail("recv() returned success when we did not expect it")
1286
1287class TestExceptions(unittest.TestCase):
1288
1289 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001290 self.assertTrue(issubclass(socket.error, Exception))
1291 self.assertTrue(issubclass(socket.herror, socket.error))
1292 self.assertTrue(issubclass(socket.gaierror, socket.error))
1293 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001294
Armin Rigoa9017c32006-04-19 11:50:27 +00001295class TestLinuxAbstractNamespace(unittest.TestCase):
1296
1297 UNIX_PATH_MAX = 108
1298
1299 def testLinuxAbstractNamespace(self):
1300 address = "\x00python-test-hello\x00\xff"
1301 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1302 s1.bind(address)
1303 s1.listen(1)
1304 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1305 s2.connect(s1.getsockname())
1306 s1.accept()
1307 self.assertEqual(s1.getsockname(), address)
1308 self.assertEqual(s2.getpeername(), address)
1309
1310 def testMaxName(self):
1311 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1312 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1313 s.bind(address)
1314 self.assertEqual(s.getsockname(), address)
1315
1316 def testNameOverflow(self):
1317 address = "\x00" + "h" * self.UNIX_PATH_MAX
1318 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1319 self.assertRaises(socket.error, s.bind, address)
1320
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001321
Victor Stinner6a102812010-04-27 23:55:59 +00001322@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001323class BufferIOTest(SocketConnectedTest):
1324 """
1325 Test the buffer versions of socket.recv() and socket.send().
1326 """
1327 def __init__(self, methodName='runTest'):
1328 SocketConnectedTest.__init__(self, methodName=methodName)
1329
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001330 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001331 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001332 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001333 self.assertEqual(nbytes, len(MSG))
1334 msg = buf.tostring()[:len(MSG)]
1335 self.assertEqual(msg, MSG)
1336
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001337 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001338 with test_support.check_py3k_warnings():
1339 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001340 self.serv_conn.send(buf)
1341
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001342 def testRecvIntoBytearray(self):
1343 buf = bytearray(1024)
1344 nbytes = self.cli_conn.recv_into(buf)
1345 self.assertEqual(nbytes, len(MSG))
1346 msg = buf[:len(MSG)]
1347 self.assertEqual(msg, MSG)
1348
1349 _testRecvIntoBytearray = _testRecvIntoArray
1350
1351 def testRecvIntoMemoryview(self):
1352 buf = bytearray(1024)
1353 nbytes = self.cli_conn.recv_into(memoryview(buf))
1354 self.assertEqual(nbytes, len(MSG))
1355 msg = buf[:len(MSG)]
1356 self.assertEqual(msg, MSG)
1357
1358 _testRecvIntoMemoryview = _testRecvIntoArray
1359
1360 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001361 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001362 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001363 self.assertEqual(nbytes, len(MSG))
1364 msg = buf.tostring()[:len(MSG)]
1365 self.assertEqual(msg, MSG)
1366
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001367 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001368 with test_support.check_py3k_warnings():
1369 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001370 self.serv_conn.send(buf)
1371
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001372 def testRecvFromIntoBytearray(self):
1373 buf = bytearray(1024)
1374 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1375 self.assertEqual(nbytes, len(MSG))
1376 msg = buf[:len(MSG)]
1377 self.assertEqual(msg, MSG)
1378
1379 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1380
1381 def testRecvFromIntoMemoryview(self):
1382 buf = bytearray(1024)
1383 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1384 self.assertEqual(nbytes, len(MSG))
1385 msg = buf[:len(MSG)]
1386 self.assertEqual(msg, MSG)
1387
1388 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1389
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001390
1391TIPC_STYPE = 2000
1392TIPC_LOWER = 200
1393TIPC_UPPER = 210
1394
1395def isTipcAvailable():
1396 """Check if the TIPC module is loaded
1397
1398 The TIPC module is not loaded automatically on Ubuntu and probably
1399 other Linux distros.
1400 """
1401 if not hasattr(socket, "AF_TIPC"):
1402 return False
1403 if not os.path.isfile("/proc/modules"):
1404 return False
1405 with open("/proc/modules") as f:
1406 for line in f:
1407 if line.startswith("tipc "):
1408 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001409 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001410 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1411 return False
1412
1413class TIPCTest (unittest.TestCase):
1414 def testRDM(self):
1415 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1416 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1417
1418 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1419 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1420 TIPC_LOWER, TIPC_UPPER)
1421 srv.bind(srvaddr)
1422
1423 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1424 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1425 cli.sendto(MSG, sendaddr)
1426
1427 msg, recvaddr = srv.recvfrom(1024)
1428
1429 self.assertEqual(cli.getsockname(), recvaddr)
1430 self.assertEqual(msg, MSG)
1431
1432
1433class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1434 def __init__(self, methodName = 'runTest'):
1435 unittest.TestCase.__init__(self, methodName = methodName)
1436 ThreadableTest.__init__(self)
1437
1438 def setUp(self):
1439 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1440 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1441 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1442 TIPC_LOWER, TIPC_UPPER)
1443 self.srv.bind(srvaddr)
1444 self.srv.listen(5)
1445 self.serverExplicitReady()
1446 self.conn, self.connaddr = self.srv.accept()
1447
1448 def clientSetUp(self):
1449 # The is a hittable race between serverExplicitReady() and the
1450 # accept() call; sleep a little while to avoid it, otherwise
1451 # we could get an exception
1452 time.sleep(0.1)
1453 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1454 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1455 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1456 self.cli.connect(addr)
1457 self.cliaddr = self.cli.getsockname()
1458
1459 def testStream(self):
1460 msg = self.conn.recv(1024)
1461 self.assertEqual(msg, MSG)
1462 self.assertEqual(self.cliaddr, self.connaddr)
1463
1464 def _testStream(self):
1465 self.cli.send(MSG)
1466 self.cli.close()
1467
1468
Guido van Rossumb995eb72002-07-31 16:08:40 +00001469def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001470 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001471 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1472 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001473
1474 tests.extend([
1475 NonBlockingTCPTests,
1476 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001477 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001478 UnbufferedFileObjectClassTestCase,
1479 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001480 SmallBufferedFileObjectClassTestCase,
1481 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001482 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001483 NetworkConnectionAttributesTest,
1484 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001485 ])
Dave Cole331708b2004-08-09 04:51:41 +00001486 if hasattr(socket, "socketpair"):
1487 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001488 if sys.platform == 'linux2':
1489 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001490 if isTipcAvailable():
1491 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001492 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001493
1494 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001495 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001496 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001497
1498if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001499 test_main()