blob: da8e155b0e179351cdf5112e916cc017423ec90e [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
Raymond Hettinger027bb632004-05-31 03:09:25 +000015from weakref import proxy
Neal Norwitz9b0ca792006-08-02 06:46:21 +000016import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Giampaolo Rodolà633e4742010-08-14 17:04:46 +000018def try_address(host, port=0, family=socket.AF_INET):
19 """Try to bind a socket on the given host:port and return True
20 if that has been possible."""
21 try:
22 sock = socket.socket(family, socket.SOCK_STREAM)
23 sock.bind((host, port))
24 except (socket.error, socket.gaierror):
25 return False
26 else:
27 sock.close()
28 return True
29
30HOST = test_support.HOST
31MSG = b'Michael Gilfix was here\n'
32SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
33
Victor Stinner6a102812010-04-27 23:55:59 +000034try:
35 import thread
36 import threading
37except ImportError:
38 thread = None
39 threading = None
40
Trent Nelsone41b0062008-04-08 23:47:30 +000041HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000042MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
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)
Trent Nelsone41b0062008-04-08 23:47:30 +000048 self.port = test_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)
Trent Nelsone41b0062008-04-08 23:47:30 +000059 self.port = test_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,
Facundo Batista07c78be2007-03-23 18:54:07 +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()
Georg Brandla6168f92008-05-25 07:20:14 +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 Peterson0fbcf692008-06-11 17:27:50 +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
140 if not self.queue.empty():
141 msg = self.queue.get()
142 self.fail(msg)
143
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()
Florent Xicluna07627882010-03-21 01:14:24 +0000148 with test_support.check_py3k_warnings():
149 if not callable(test_func):
150 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000151 try:
152 test_func()
153 except Exception, strerror:
154 self.queue.put(strerror)
155 self.clientTearDown()
156
157 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +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):
188
189 def __init__(self, methodName='runTest'):
190 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
191
192 def setUp(self):
193 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000194 # Indicate explicitly we're ready for the client thread to
195 # proceed and then perform the blocking call to accept
196 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197 conn, addr = self.serv.accept()
198 self.cli_conn = conn
199
200 def tearDown(self):
201 self.cli_conn.close()
202 self.cli_conn = None
203 ThreadedTCPSocketTest.tearDown(self)
204
205 def clientSetUp(self):
206 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000207 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000208 self.serv_conn = self.cli
209
210 def clientTearDown(self):
211 self.serv_conn.close()
212 self.serv_conn = None
213 ThreadedTCPSocketTest.clientTearDown(self)
214
Dave Cole331708b2004-08-09 04:51:41 +0000215class SocketPairTest(unittest.TestCase, ThreadableTest):
216
217 def __init__(self, methodName='runTest'):
218 unittest.TestCase.__init__(self, methodName=methodName)
219 ThreadableTest.__init__(self)
220
221 def setUp(self):
222 self.serv, self.cli = socket.socketpair()
223
224 def tearDown(self):
225 self.serv.close()
226 self.serv = None
227
228 def clientSetUp(self):
229 pass
230
231 def clientTearDown(self):
232 self.cli.close()
233 self.cli = None
234 ThreadableTest.clientTearDown(self)
235
Tim Peters494aaee2004-08-09 18:54:11 +0000236
Guido van Rossum24e4af82002-06-12 19:18:08 +0000237#######################################################################
238## Begin Tests
239
240class GeneralModuleTests(unittest.TestCase):
241
Raymond Hettinger027bb632004-05-31 03:09:25 +0000242 def test_weakref(self):
243 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
244 p = proxy(s)
245 self.assertEqual(p.fileno(), s.fileno())
246 s.close()
247 s = None
248 try:
249 p.fileno()
250 except ReferenceError:
251 pass
252 else:
253 self.fail('Socket proxy still exists')
254
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000256 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257 def raise_error(*args, **kwargs):
258 raise socket.error
259 def raise_herror(*args, **kwargs):
260 raise socket.herror
261 def raise_gaierror(*args, **kwargs):
262 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000263 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000265 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000267 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000268 "Error raising socket exception.")
269
270 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000271 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 socket.AF_INET
273 socket.SOCK_STREAM
274 socket.SOCK_DGRAM
275 socket.SOCK_RAW
276 socket.SOCK_RDM
277 socket.SOCK_SEQPACKET
278 socket.SOL_SOCKET
279 socket.SO_REUSEADDR
280
Guido van Rossum654c11e2002-06-13 20:24:17 +0000281 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000282 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000283 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000284 try:
285 ip = socket.gethostbyname(hostname)
286 except socket.error:
287 # Probably name lookup wasn't set up right; skip this test
288 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000289 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000290 try:
291 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
292 except socket.error:
293 # Probably a similar problem as above; skip this test
294 return
Brett Cannon01668a12005-03-11 00:04:17 +0000295 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000296 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000297 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000298 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000299
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000300 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000301 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000302 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000303 try:
304 # On some versions, this loses a reference
305 orig = sys.getrefcount(__name__)
306 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000307 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000308 self.assertEqual(sys.getrefcount(__name__), orig,
309 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000310
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000312 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000313 try:
314 # On some versions, this crashes the interpreter.
315 socket.getnameinfo(('x', 0, 0, 0), 0)
316 except socket.error:
317 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000318
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000319 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000320 # This just checks that htons etc. are their own inverse,
321 # when looking at the lower 16 or 32 bits.
322 sizes = {socket.htonl: 32, socket.ntohl: 32,
323 socket.htons: 16, socket.ntohs: 16}
324 for func, size in sizes.items():
325 mask = (1L<<size) - 1
326 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
327 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000328
Guido van Rossuma2627af2002-09-14 00:58:46 +0000329 swapped = func(mask)
330 self.assertEqual(swapped & mask, mask)
331 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000332
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000333 def testNtoHErrors(self):
334 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
335 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
336 for k in good_values:
337 socket.ntohl(k)
338 socket.ntohs(k)
339 socket.htonl(k)
340 socket.htons(k)
341 for k in bad_values:
342 self.assertRaises(OverflowError, socket.ntohl, k)
343 self.assertRaises(OverflowError, socket.ntohs, k)
344 self.assertRaises(OverflowError, socket.htonl, k)
345 self.assertRaises(OverflowError, socket.htons, k)
346
Barry Warsaw11b91a02004-06-28 00:50:43 +0000347 def testGetServBy(self):
348 eq = self.assertEqual
349 # Find one service that exists, then check all the related interfaces.
350 # I've ordered this by protocols that have both a tcp and udp
351 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000352 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000353 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000354 # avoid the 'echo' service on this platform, as there is an
355 # assumption breaking non-standard port/protocol entry
356 services = ('daytime', 'qotd', 'domain')
357 else:
358 services = ('echo', 'daytime', 'domain')
359 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000360 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000361 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000362 break
363 except socket.error:
364 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000365 else:
366 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000367 # Try same call with optional protocol omitted
368 port2 = socket.getservbyname(service)
369 eq(port, port2)
370 # Try udp, but don't barf it it doesn't exist
371 try:
372 udpport = socket.getservbyname(service, 'udp')
373 except socket.error:
374 udpport = None
375 else:
376 eq(udpport, port)
377 # Now make sure the lookup by port returns the same service name
378 eq(socket.getservbyport(port2), service)
379 eq(socket.getservbyport(port, 'tcp'), service)
380 if udpport is not None:
381 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000382 # Make sure getservbyport does not accept out of range ports.
383 self.assertRaises(OverflowError, socket.getservbyport, -1)
384 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000386 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000387 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000388 # The default timeout should initially be None
389 self.assertEqual(socket.getdefaulttimeout(), None)
390 s = socket.socket()
391 self.assertEqual(s.gettimeout(), None)
392 s.close()
393
394 # Set the default timeout to 10, and see if it propagates
395 socket.setdefaulttimeout(10)
396 self.assertEqual(socket.getdefaulttimeout(), 10)
397 s = socket.socket()
398 self.assertEqual(s.gettimeout(), 10)
399 s.close()
400
401 # Reset the default timeout to None, and see if it propagates
402 socket.setdefaulttimeout(None)
403 self.assertEqual(socket.getdefaulttimeout(), None)
404 s = socket.socket()
405 self.assertEqual(s.gettimeout(), None)
406 s.close()
407
408 # Check that setting it to an invalid value raises ValueError
409 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
410
411 # Check that setting it to an invalid type raises TypeError
412 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
413
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000414 def testIPv4_inet_aton_fourbytes(self):
415 if not hasattr(socket, 'inet_aton'):
416 return # No inet_aton, nothing to check
417 # Test that issue1008086 and issue767150 are fixed.
418 # It must return 4 bytes.
419 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
420 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
421
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000422 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000423 if not hasattr(socket, 'inet_pton'):
424 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000425 from socket import inet_aton as f, inet_pton, AF_INET
426 g = lambda a: inet_pton(AF_INET, a)
427
428 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
429 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
430 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
431 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000432 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000433
434 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
435 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
436 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000437 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000438
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000439 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000440 if not hasattr(socket, 'inet_pton'):
441 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442 try:
443 from socket import inet_pton, AF_INET6, has_ipv6
444 if not has_ipv6:
445 return
446 except ImportError:
447 return
448 f = lambda a: inet_pton(AF_INET6, a)
449
450 self.assertEquals('\x00' * 16, f('::'))
451 self.assertEquals('\x00' * 16, f('0::0'))
452 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
453 self.assertEquals(
454 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
455 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
456 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000457
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000458 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000459 if not hasattr(socket, 'inet_ntop'):
460 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000461 from socket import inet_ntoa as f, inet_ntop, AF_INET
462 g = lambda a: inet_ntop(AF_INET, a)
463
464 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
465 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
466 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
467 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000468
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000469 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
470 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
471 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
472
473 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000474 if not hasattr(socket, 'inet_ntop'):
475 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000476 try:
477 from socket import inet_ntop, AF_INET6, has_ipv6
478 if not has_ipv6:
479 return
480 except ImportError:
481 return
482 f = lambda a: inet_ntop(AF_INET6, a)
483
484 self.assertEquals('::', f('\x00' * 16))
485 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
486 self.assertEquals(
487 'aef:b01:506:1001:ffff:9997:55:170',
488 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
489 )
490
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000491 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000492
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000493 def _get_unused_port(self, bind_address='0.0.0.0'):
494 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000495
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000496 Args:
497 bind_address: Hostname or IP address to search for a port on.
498
499 Returns: A most likely to be unused port.
500 """
501 tempsock = socket.socket()
502 tempsock.bind((bind_address, 0))
503 host, port = tempsock.getsockname()
504 tempsock.close()
505 return port
506
507 def testSockName(self):
508 # Testing getsockname()
509 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000511 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000513 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
514 # it reasonable to get the host's addr in addition to 0.0.0.0.
515 # At least for eCos. This is required for the S/390 to pass.
516 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000517 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000518 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519
520 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000521 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 # We know a socket should start without reuse==0
523 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
524 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000525 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
527 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000528 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000529 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
530 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
531 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000532 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000534 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000535 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000536 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
537 sock.settimeout(1)
538 sock.close()
539 self.assertRaises(socket.error, sock.send, "spam")
540
Georg Brandlbb03ac02006-03-21 18:17:25 +0000541 def testNewAttributes(self):
542 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000543 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000544 self.assertEqual(sock.family, socket.AF_INET)
545 self.assertEqual(sock.type, socket.SOCK_STREAM)
546 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000547 sock.close()
548
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000549 def test_getsockaddrarg(self):
550 host = '0.0.0.0'
551 port = self._get_unused_port(bind_address=host)
552 big_port = port + 65536
553 neg_port = port - 65536
554 sock = socket.socket()
555 try:
556 self.assertRaises(OverflowError, sock.bind, (host, big_port))
557 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
558 sock.bind((host, port))
559 finally:
560 sock.close()
561
Christian Heimesa47b75b2008-01-04 15:48:06 +0000562 def test_sock_ioctl(self):
563 if os.name != "nt":
564 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000565 self.assertTrue(hasattr(socket.socket, 'ioctl'))
566 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
567 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
568 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000569 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
570 s = socket.socket()
571 self.assertRaises(ValueError, s.ioctl, -1, None)
572 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000573
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000574 def testGetaddrinfo(self):
575 try:
576 socket.getaddrinfo('localhost', 80)
577 except socket.gaierror as err:
578 if err.errno == socket.EAI_SERVICE:
579 # see http://bugs.python.org/issue1282647
580 self.skipTest("buggy libc version")
581 raise
582 # len of every sequence is supposed to be == 5
583 for info in socket.getaddrinfo(HOST, None):
584 self.assertEqual(len(info), 5)
585 # host can be a domain name, a string representation of an
586 # IPv4/v6 address or None
587 socket.getaddrinfo('localhost', 80)
588 socket.getaddrinfo('127.0.0.1', 80)
589 socket.getaddrinfo(None, 80)
590 if SUPPORTS_IPV6:
591 socket.getaddrinfo('::1', 80)
592 # port can be a string service name such as "http", a numeric
593 # port number or None
594 socket.getaddrinfo(HOST, "http")
595 socket.getaddrinfo(HOST, 80)
596 socket.getaddrinfo(HOST, None)
597 # test family and socktype filters
598 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
599 for family, _, _, _, _ in infos:
600 self.assertEqual(family, socket.AF_INET)
601 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
602 for _, socktype, _, _, _ in infos:
603 self.assertEqual(socktype, socket.SOCK_STREAM)
604 # test proto and flags arguments
Giampaolo Rodolà8a9b2222010-08-16 05:10:30 +0000605 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà633e4742010-08-14 17:04:46 +0000606 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
607 # a server willing to support both IPv4 and IPv6 will
608 # usually do this
609 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
610 socket.AI_PASSIVE)
611
Christian Heimesa47b75b2008-01-04 15:48:06 +0000612
Victor Stinner6a102812010-04-27 23:55:59 +0000613@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614class BasicTCPTest(SocketConnectedTest):
615
616 def __init__(self, methodName='runTest'):
617 SocketConnectedTest.__init__(self, methodName=methodName)
618
619 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000620 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000622 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000623
624 def _testRecv(self):
625 self.serv_conn.send(MSG)
626
627 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000628 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000629 seg1 = self.cli_conn.recv(len(MSG) - 3)
630 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000631 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000632 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000633
634 def _testOverFlowRecv(self):
635 self.serv_conn.send(MSG)
636
637 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000638 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000639 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000640 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641
642 def _testRecvFrom(self):
643 self.serv_conn.send(MSG)
644
645 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000646 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
648 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000649 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000650 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000651
652 def _testOverFlowRecvFrom(self):
653 self.serv_conn.send(MSG)
654
655 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000656 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000657 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000658 while 1:
659 read = self.cli_conn.recv(1024)
660 if not read:
661 break
Guido van Rossume531e292002-08-08 20:28:34 +0000662 msg += read
663 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000664
665 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000666 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 self.serv_conn.sendall(big_chunk)
668
669 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000670 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000671 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000672 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673 fd = self.cli_conn.fileno()
674 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
675 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000676 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000677
678 def _testFromFd(self):
679 self.serv_conn.send(MSG)
680
681 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000682 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000683 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000684 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000685 # wait for _testShutdown to finish: on OS X, when the server
686 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000687 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000688 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689
690 def _testShutdown(self):
691 self.serv_conn.send(MSG)
692 self.serv_conn.shutdown(2)
693
Victor Stinner6a102812010-04-27 23:55:59 +0000694@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000695class BasicUDPTest(ThreadedUDPSocketTest):
696
697 def __init__(self, methodName='runTest'):
698 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
699
700 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000701 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000703 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000704
705 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000706 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707
Guido van Rossum1c938012002-06-12 21:17:20 +0000708 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000709 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000711 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712
Guido van Rossum1c938012002-06-12 21:17:20 +0000713 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000714 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715
Facundo Batista1fe9f962007-03-28 03:45:20 +0000716 def testRecvFromNegative(self):
717 # Negative lengths passed to recvfrom should give ValueError.
718 self.assertRaises(ValueError, self.serv.recvfrom, -1)
719
720 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000721 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000722
Victor Stinner6a102812010-04-27 23:55:59 +0000723@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000724class TCPCloserTest(ThreadedTCPSocketTest):
725
726 def testClose(self):
727 conn, addr = self.serv.accept()
728 conn.close()
729
730 sd = self.cli
731 read, write, err = select.select([sd], [], [], 1.0)
732 self.assertEqual(read, [sd])
733 self.assertEqual(sd.recv(1), '')
734
735 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000736 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000737 time.sleep(1.0)
738
Victor Stinner6a102812010-04-27 23:55:59 +0000739@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000740class BasicSocketPairTest(SocketPairTest):
741
742 def __init__(self, methodName='runTest'):
743 SocketPairTest.__init__(self, methodName=methodName)
744
745 def testRecv(self):
746 msg = self.serv.recv(1024)
747 self.assertEqual(msg, MSG)
748
749 def _testRecv(self):
750 self.cli.send(MSG)
751
752 def testSend(self):
753 self.serv.send(MSG)
754
755 def _testSend(self):
756 msg = self.cli.recv(1024)
757 self.assertEqual(msg, MSG)
758
Victor Stinner6a102812010-04-27 23:55:59 +0000759@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760class NonBlockingTCPTests(ThreadedTCPSocketTest):
761
762 def __init__(self, methodName='runTest'):
763 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
764
765 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000766 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767 self.serv.setblocking(0)
768 start = time.time()
769 try:
770 self.serv.accept()
771 except socket.error:
772 pass
773 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000774 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775
776 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000777 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000778
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000780 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000782 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 conn, addr = self.serv.accept()
784 except socket.error:
785 pass
786 else:
787 self.fail("Error trying to do non-blocking accept.")
788 read, write, err = select.select([self.serv], [], [])
789 if self.serv in read:
790 conn, addr = self.serv.accept()
791 else:
792 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000793
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000795 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000796 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797
798 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000799 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 conn, addr = self.serv.accept()
801
802 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000803 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000804 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000805
806 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000807 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808 conn, addr = self.serv.accept()
809 conn.setblocking(0)
810 try:
811 msg = conn.recv(len(MSG))
812 except socket.error:
813 pass
814 else:
815 self.fail("Error trying to do non-blocking recv.")
816 read, write, err = select.select([conn], [], [])
817 if conn in read:
818 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000819 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 else:
821 self.fail("Error during select call to non-blocking socket.")
822
823 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000824 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000825 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 self.cli.send(MSG)
827
Victor Stinner6a102812010-04-27 23:55:59 +0000828@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829class FileObjectClassTestCase(SocketConnectedTest):
830
Guido van Rossume9f66142002-08-07 15:46:19 +0000831 bufsize = -1 # Use default buffer size
832
Guido van Rossum24e4af82002-06-12 19:18:08 +0000833 def __init__(self, methodName='runTest'):
834 SocketConnectedTest.__init__(self, methodName=methodName)
835
836 def setUp(self):
837 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000838 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000839
840 def tearDown(self):
841 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000842 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843 self.serv_file = None
844 SocketConnectedTest.tearDown(self)
845
846 def clientSetUp(self):
847 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000848 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849
850 def clientTearDown(self):
851 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000852 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000853 self.cli_file = None
854 SocketConnectedTest.clientTearDown(self)
855
856 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000857 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000858 first_seg = self.serv_file.read(len(MSG)-3)
859 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000860 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000861 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
863 def _testSmallRead(self):
864 self.cli_file.write(MSG)
865 self.cli_file.flush()
866
Guido van Rossum8c943832002-08-08 01:00:28 +0000867 def testFullRead(self):
868 # read until EOF
869 msg = self.serv_file.read()
870 self.assertEqual(msg, MSG)
871
872 def _testFullRead(self):
873 self.cli_file.write(MSG)
874 self.cli_file.close()
875
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000877 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000878 buf = ''
879 while 1:
880 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000881 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000882 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000883 buf += char
884 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000885
886 def _testUnbufferedRead(self):
887 self.cli_file.write(MSG)
888 self.cli_file.flush()
889
890 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000891 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000893 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000894
895 def _testReadline(self):
896 self.cli_file.write(MSG)
897 self.cli_file.flush()
898
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000899 def testReadlineAfterRead(self):
900 a_baloo_is = self.serv_file.read(len("A baloo is"))
901 self.assertEqual("A baloo is", a_baloo_is)
902 _a_bear = self.serv_file.read(len(" a bear"))
903 self.assertEqual(" a bear", _a_bear)
904 line = self.serv_file.readline()
905 self.assertEqual("\n", line)
906 line = self.serv_file.readline()
907 self.assertEqual("A BALOO IS A BEAR.\n", line)
908 line = self.serv_file.readline()
909 self.assertEqual(MSG, line)
910
911 def _testReadlineAfterRead(self):
912 self.cli_file.write("A baloo is a bear\n")
913 self.cli_file.write("A BALOO IS A BEAR.\n")
914 self.cli_file.write(MSG)
915 self.cli_file.flush()
916
917 def testReadlineAfterReadNoNewline(self):
918 end_of_ = self.serv_file.read(len("End Of "))
919 self.assertEqual("End Of ", end_of_)
920 line = self.serv_file.readline()
921 self.assertEqual("Line", line)
922
923 def _testReadlineAfterReadNoNewline(self):
924 self.cli_file.write("End Of Line")
925
Tim Peters116d83c2004-03-28 02:20:45 +0000926 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000927 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000928
929 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000930 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000931
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000932
933class FileObjectInterruptedTestCase(unittest.TestCase):
934 """Test that the file object correctly handles EINTR internally."""
935
936 class MockSocket(object):
937 def __init__(self, recv_funcs=()):
938 # A generator that returns callables that we'll call for each
939 # call to recv().
940 self._recv_step = iter(recv_funcs)
941
942 def recv(self, size):
943 return self._recv_step.next()()
944
945 @staticmethod
946 def _raise_eintr():
947 raise socket.error(errno.EINTR)
948
949 def _test_readline(self, size=-1, **kwargs):
950 mock_sock = self.MockSocket(recv_funcs=[
951 lambda : "This is the first line\nAnd the sec",
952 self._raise_eintr,
953 lambda : "ond line is here\n",
954 lambda : "",
955 ])
956 fo = socket._fileobject(mock_sock, **kwargs)
957 self.assertEquals(fo.readline(size), "This is the first line\n")
958 self.assertEquals(fo.readline(size), "And the second line is here\n")
959
960 def _test_read(self, size=-1, **kwargs):
961 mock_sock = self.MockSocket(recv_funcs=[
962 lambda : "This is the first line\nAnd the sec",
963 self._raise_eintr,
964 lambda : "ond line is here\n",
965 lambda : "",
966 ])
967 fo = socket._fileobject(mock_sock, **kwargs)
968 self.assertEquals(fo.read(size), "This is the first line\n"
969 "And the second line is here\n")
970
971 def test_default(self):
972 self._test_readline()
973 self._test_readline(size=100)
974 self._test_read()
975 self._test_read(size=100)
976
977 def test_with_1k_buffer(self):
978 self._test_readline(bufsize=1024)
979 self._test_readline(size=100, bufsize=1024)
980 self._test_read(bufsize=1024)
981 self._test_read(size=100, bufsize=1024)
982
983 def _test_readline_no_buffer(self, size=-1):
984 mock_sock = self.MockSocket(recv_funcs=[
985 lambda : "aa",
986 lambda : "\n",
987 lambda : "BB",
988 self._raise_eintr,
989 lambda : "bb",
990 lambda : "",
991 ])
992 fo = socket._fileobject(mock_sock, bufsize=0)
993 self.assertEquals(fo.readline(size), "aa\n")
994 self.assertEquals(fo.readline(size), "BBbb")
995
996 def test_no_buffer(self):
997 self._test_readline_no_buffer()
998 self._test_readline_no_buffer(size=4)
999 self._test_read(bufsize=0)
1000 self._test_read(size=100, bufsize=0)
1001
1002
Guido van Rossume9f66142002-08-07 15:46:19 +00001003class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1004
1005 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001006
Guido van Rossume9f66142002-08-07 15:46:19 +00001007 In this case (and in this case only), it should be possible to
1008 create a file object, read a line from it, create another file
1009 object, read another line from it, without loss of data in the
1010 first file object's buffer. Note that httplib relies on this
1011 when reading multiple requests from the same socket."""
1012
1013 bufsize = 0 # Use unbuffered mode
1014
1015 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001016 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001017 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001018 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001019 self.serv_file = self.cli_conn.makefile('rb', 0)
1020 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +00001021 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001022
1023 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +00001024 self.cli_file.write("A. " + MSG)
1025 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001026 self.cli_file.flush()
1027
Guido van Rossum8c943832002-08-08 01:00:28 +00001028class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1029
1030 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1031
1032
1033class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1034
1035 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001036
Georg Brandldd7b0522007-01-21 10:35:10 +00001037
Facundo Batista07c78be2007-03-23 18:54:07 +00001038class NetworkConnectionTest(object):
1039 """Prove network connection."""
1040 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001041 # We're inherited below by BasicTCPTest2, which also inherits
1042 # BasicTCPTest, which defines self.port referenced below.
1043 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001044 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001045
Facundo Batista07c78be2007-03-23 18:54:07 +00001046class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1047 """Tests that NetworkConnection does not break existing TCP functionality.
1048 """
1049
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001050class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +00001051 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001052 port = test_support.find_unused_port()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001053 self.assertRaises(
Trent Nelsone41b0062008-04-08 23:47:30 +00001054 socket.error,
1055 lambda: socket.create_connection((HOST, port))
1056 )
Facundo Batista07c78be2007-03-23 18:54:07 +00001057
Victor Stinner6a102812010-04-27 23:55:59 +00001058@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001059class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1060
1061 def __init__(self, methodName='runTest'):
1062 SocketTCPTest.__init__(self, methodName=methodName)
1063 ThreadableTest.__init__(self)
1064
1065 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001066 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001067
1068 def clientTearDown(self):
1069 self.cli.close()
1070 self.cli = None
1071 ThreadableTest.clientTearDown(self)
1072
1073 def _justAccept(self):
1074 conn, addr = self.serv.accept()
1075
1076 testFamily = _justAccept
1077 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001078 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001079 self.assertEqual(self.cli.family, 2)
1080
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001081 testSourceAddress = _justAccept
1082 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001083 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1084 source_address=('', self.source_port))
1085 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001086 # The port number being used is sufficient to show that the bind()
1087 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001088
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001089 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001090 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001091 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001092 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001093 socket.setdefaulttimeout(42)
1094 try:
1095 self.cli = socket.create_connection((HOST, self.port))
1096 finally:
1097 socket.setdefaulttimeout(None)
1098 self.assertEquals(self.cli.gettimeout(), 42)
1099
1100 testTimeoutNone = _justAccept
1101 def _testTimeoutNone(self):
1102 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001103 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001104 socket.setdefaulttimeout(30)
1105 try:
1106 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1107 finally:
1108 socket.setdefaulttimeout(None)
1109 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001110
1111 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001112 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001113 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001114 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001115
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001116 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001117 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001118 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001119 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001120
Victor Stinner6a102812010-04-27 23:55:59 +00001121@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001122class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1123
1124 def __init__(self, methodName='runTest'):
1125 SocketTCPTest.__init__(self, methodName=methodName)
1126 ThreadableTest.__init__(self)
1127
1128 def clientSetUp(self):
1129 pass
1130
1131 def clientTearDown(self):
1132 self.cli.close()
1133 self.cli = None
1134 ThreadableTest.clientTearDown(self)
1135
Facundo Batista07c78be2007-03-23 18:54:07 +00001136 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001137 conn, addr = self.serv.accept()
1138 time.sleep(3)
1139 conn.send("done!")
1140 testOutsideTimeout = testInsideTimeout
1141
1142 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001143 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001144 data = sock.recv(5)
1145 self.assertEqual(data, "done!")
1146
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001147 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001148 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001149 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001150
1151
Georg Brandldd7b0522007-01-21 10:35:10 +00001152class Urllib2FileobjectTest(unittest.TestCase):
1153
1154 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1155 # it close the socket if the close c'tor argument is true
1156
1157 def testClose(self):
1158 class MockSocket:
1159 closed = False
1160 def flush(self): pass
1161 def close(self): self.closed = True
1162
1163 # must not close unless we request it: the original use of _fileobject
1164 # by module socket requires that the underlying socket not be closed until
1165 # the _socketobject that created the _fileobject is closed
1166 s = MockSocket()
1167 f = socket._fileobject(s)
1168 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001169 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001170
1171 s = MockSocket()
1172 f = socket._fileobject(s, close=True)
1173 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001174 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001175
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001176class TCPTimeoutTest(SocketTCPTest):
1177
1178 def testTCPTimeout(self):
1179 def raise_timeout(*args, **kwargs):
1180 self.serv.settimeout(1.0)
1181 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001182 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001183 "Error generating a timeout exception (TCP)")
1184
1185 def testTimeoutZero(self):
1186 ok = False
1187 try:
1188 self.serv.settimeout(0.0)
1189 foo = self.serv.accept()
1190 except socket.timeout:
1191 self.fail("caught timeout instead of error (TCP)")
1192 except socket.error:
1193 ok = True
1194 except:
1195 self.fail("caught unexpected exception (TCP)")
1196 if not ok:
1197 self.fail("accept() returned success when we did not expect it")
1198
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001199 def testInterruptedTimeout(self):
1200 # XXX I don't know how to do this test on MSWindows or any other
1201 # plaform that doesn't support signal.alarm() or os.kill(), though
1202 # the bug should have existed on all platforms.
1203 if not hasattr(signal, "alarm"):
1204 return # can only test on *nix
1205 self.serv.settimeout(5.0) # must be longer than alarm
1206 class Alarm(Exception):
1207 pass
1208 def alarm_handler(signal, frame):
1209 raise Alarm
1210 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1211 try:
1212 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1213 try:
1214 foo = self.serv.accept()
1215 except socket.timeout:
1216 self.fail("caught timeout instead of Alarm")
1217 except Alarm:
1218 pass
1219 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001220 self.fail("caught other exception instead of Alarm:"
1221 " %s(%s):\n%s" %
1222 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001223 else:
1224 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001225 finally:
1226 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001227 except Alarm:
1228 self.fail("got Alarm in wrong place")
1229 finally:
1230 # no alarm can be pending. Safe to restore old handler.
1231 signal.signal(signal.SIGALRM, old_alarm)
1232
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001233class UDPTimeoutTest(SocketTCPTest):
1234
1235 def testUDPTimeout(self):
1236 def raise_timeout(*args, **kwargs):
1237 self.serv.settimeout(1.0)
1238 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001239 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001240 "Error generating a timeout exception (UDP)")
1241
1242 def testTimeoutZero(self):
1243 ok = False
1244 try:
1245 self.serv.settimeout(0.0)
1246 foo = self.serv.recv(1024)
1247 except socket.timeout:
1248 self.fail("caught timeout instead of error (UDP)")
1249 except socket.error:
1250 ok = True
1251 except:
1252 self.fail("caught unexpected exception (UDP)")
1253 if not ok:
1254 self.fail("recv() returned success when we did not expect it")
1255
1256class TestExceptions(unittest.TestCase):
1257
1258 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001259 self.assertTrue(issubclass(socket.error, Exception))
1260 self.assertTrue(issubclass(socket.herror, socket.error))
1261 self.assertTrue(issubclass(socket.gaierror, socket.error))
1262 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001263
Armin Rigoa9017c32006-04-19 11:50:27 +00001264class TestLinuxAbstractNamespace(unittest.TestCase):
1265
1266 UNIX_PATH_MAX = 108
1267
1268 def testLinuxAbstractNamespace(self):
1269 address = "\x00python-test-hello\x00\xff"
1270 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1271 s1.bind(address)
1272 s1.listen(1)
1273 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1274 s2.connect(s1.getsockname())
1275 s1.accept()
1276 self.assertEqual(s1.getsockname(), address)
1277 self.assertEqual(s2.getpeername(), address)
1278
1279 def testMaxName(self):
1280 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1281 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1282 s.bind(address)
1283 self.assertEqual(s.getsockname(), address)
1284
1285 def testNameOverflow(self):
1286 address = "\x00" + "h" * self.UNIX_PATH_MAX
1287 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1288 self.assertRaises(socket.error, s.bind, address)
1289
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001290
Victor Stinner6a102812010-04-27 23:55:59 +00001291@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001292class BufferIOTest(SocketConnectedTest):
1293 """
1294 Test the buffer versions of socket.recv() and socket.send().
1295 """
1296 def __init__(self, methodName='runTest'):
1297 SocketConnectedTest.__init__(self, methodName=methodName)
1298
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001299 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001300 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001301 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001302 self.assertEqual(nbytes, len(MSG))
1303 msg = buf.tostring()[:len(MSG)]
1304 self.assertEqual(msg, MSG)
1305
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001306 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001307 with test_support.check_py3k_warnings():
1308 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001309 self.serv_conn.send(buf)
1310
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001311 def testRecvIntoBytearray(self):
1312 buf = bytearray(1024)
1313 nbytes = self.cli_conn.recv_into(buf)
1314 self.assertEqual(nbytes, len(MSG))
1315 msg = buf[:len(MSG)]
1316 self.assertEqual(msg, MSG)
1317
1318 _testRecvIntoBytearray = _testRecvIntoArray
1319
1320 def testRecvIntoMemoryview(self):
1321 buf = bytearray(1024)
1322 nbytes = self.cli_conn.recv_into(memoryview(buf))
1323 self.assertEqual(nbytes, len(MSG))
1324 msg = buf[:len(MSG)]
1325 self.assertEqual(msg, MSG)
1326
1327 _testRecvIntoMemoryview = _testRecvIntoArray
1328
1329 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001330 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001331 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001332 self.assertEqual(nbytes, len(MSG))
1333 msg = buf.tostring()[:len(MSG)]
1334 self.assertEqual(msg, MSG)
1335
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001336 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001337 with test_support.check_py3k_warnings():
1338 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001339 self.serv_conn.send(buf)
1340
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001341 def testRecvFromIntoBytearray(self):
1342 buf = bytearray(1024)
1343 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1344 self.assertEqual(nbytes, len(MSG))
1345 msg = buf[:len(MSG)]
1346 self.assertEqual(msg, MSG)
1347
1348 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1349
1350 def testRecvFromIntoMemoryview(self):
1351 buf = bytearray(1024)
1352 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1353 self.assertEqual(nbytes, len(MSG))
1354 msg = buf[:len(MSG)]
1355 self.assertEqual(msg, MSG)
1356
1357 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1358
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001359
1360TIPC_STYPE = 2000
1361TIPC_LOWER = 200
1362TIPC_UPPER = 210
1363
1364def isTipcAvailable():
1365 """Check if the TIPC module is loaded
1366
1367 The TIPC module is not loaded automatically on Ubuntu and probably
1368 other Linux distros.
1369 """
1370 if not hasattr(socket, "AF_TIPC"):
1371 return False
1372 if not os.path.isfile("/proc/modules"):
1373 return False
1374 with open("/proc/modules") as f:
1375 for line in f:
1376 if line.startswith("tipc "):
1377 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001378 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001379 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1380 return False
1381
1382class TIPCTest (unittest.TestCase):
1383 def testRDM(self):
1384 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1385 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1386
1387 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1388 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1389 TIPC_LOWER, TIPC_UPPER)
1390 srv.bind(srvaddr)
1391
1392 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1393 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1394 cli.sendto(MSG, sendaddr)
1395
1396 msg, recvaddr = srv.recvfrom(1024)
1397
1398 self.assertEqual(cli.getsockname(), recvaddr)
1399 self.assertEqual(msg, MSG)
1400
1401
1402class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1403 def __init__(self, methodName = 'runTest'):
1404 unittest.TestCase.__init__(self, methodName = methodName)
1405 ThreadableTest.__init__(self)
1406
1407 def setUp(self):
1408 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1409 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1410 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1411 TIPC_LOWER, TIPC_UPPER)
1412 self.srv.bind(srvaddr)
1413 self.srv.listen(5)
1414 self.serverExplicitReady()
1415 self.conn, self.connaddr = self.srv.accept()
1416
1417 def clientSetUp(self):
1418 # The is a hittable race between serverExplicitReady() and the
1419 # accept() call; sleep a little while to avoid it, otherwise
1420 # we could get an exception
1421 time.sleep(0.1)
1422 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1423 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1424 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1425 self.cli.connect(addr)
1426 self.cliaddr = self.cli.getsockname()
1427
1428 def testStream(self):
1429 msg = self.conn.recv(1024)
1430 self.assertEqual(msg, MSG)
1431 self.assertEqual(self.cliaddr, self.connaddr)
1432
1433 def _testStream(self):
1434 self.cli.send(MSG)
1435 self.cli.close()
1436
1437
Guido van Rossumb995eb72002-07-31 16:08:40 +00001438def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001439 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001440 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1441 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001442
1443 tests.extend([
1444 NonBlockingTCPTests,
1445 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001446 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001447 UnbufferedFileObjectClassTestCase,
1448 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001449 SmallBufferedFileObjectClassTestCase,
1450 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001451 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001452 NetworkConnectionAttributesTest,
1453 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001454 ])
Dave Cole331708b2004-08-09 04:51:41 +00001455 if hasattr(socket, "socketpair"):
1456 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001457 if sys.platform == 'linux2':
1458 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001459 if isTipcAvailable():
1460 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001461 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001462
1463 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001464 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001465 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001466
1467if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001468 test_main()