blob: f699e3c083c9d6822c73c1add7465da332806603 [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
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +000010import time
11import traceback
Georg Brandla6168f92008-05-25 07:20:14 +000012import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesa47b75b2008-01-04 15:48:06 +000014import os
Martin Blais2856e5f2006-05-26 12:03:27 +000015import array
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
Trent Nelsone41b0062008-04-08 23:47:30 +000019HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000020MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000021
Guido van Rossum24e4af82002-06-12 19:18:08 +000022class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Guido van Rossum24e4af82002-06-12 19:18:08 +000024 def setUp(self):
25 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000026 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000027 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000028
Guido van Rossum24e4af82002-06-12 19:18:08 +000029 def tearDown(self):
30 self.serv.close()
31 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Guido van Rossum24e4af82002-06-12 19:18:08 +000033class SocketUDPTest(unittest.TestCase):
34
35 def setUp(self):
36 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000037 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000038
39 def tearDown(self):
40 self.serv.close()
41 self.serv = None
42
43class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000044 """Threadable Test class
45
46 The ThreadableTest class makes it easy to create a threaded
47 client/server pair from an existing unit test. To create a
48 new threaded class from an existing unit test, use multiple
49 inheritance:
50
51 class NewClass (OldClass, ThreadableTest):
52 pass
53
54 This class defines two new fixture functions with obvious
55 purposes for overriding:
56
57 clientSetUp ()
58 clientTearDown ()
59
60 Any new test functions within the class must then define
61 tests in pairs, where the test name is preceeded with a
62 '_' to indicate the client portion of the test. Ex:
63
64 def testFoo(self):
65 # Server portion
66
67 def _testFoo(self):
68 # Client portion
69
70 Any exceptions raised by the clients during their tests
71 are caught and transferred to the main thread to alert
72 the testing framework.
73
74 Note, the server setup function cannot call any blocking
75 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000076 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000077 the blocking call (such as in setting up a client/server
78 connection and performing the accept() in setUp().
79 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000080
81 def __init__(self):
82 # Swap the true setup function
83 self.__setUp = self.setUp
84 self.__tearDown = self.tearDown
85 self.setUp = self._setUp
86 self.tearDown = self._tearDown
87
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000088 def serverExplicitReady(self):
89 """This method allows the server to explicitly indicate that
90 it wants the client thread to proceed. This is useful if the
91 server is about to execute a blocking routine that is
92 dependent upon the client thread during its setup routine."""
93 self.server_ready.set()
94
Guido van Rossum24e4af82002-06-12 19:18:08 +000095 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000096 self.server_ready = threading.Event()
97 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000098 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +000099 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000100
101 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000102 methodname = self.id()
103 i = methodname.rfind('.')
104 methodname = methodname[i+1:]
105 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000106 self.client_thread = thread.start_new_thread(
107 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000108
109 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000110 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 self.server_ready.set()
112 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000113
114 def _tearDown(self):
115 self.__tearDown()
116 self.done.wait()
117
118 if not self.queue.empty():
119 msg = self.queue.get()
120 self.fail(msg)
121
122 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000123 self.server_ready.wait()
124 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125 self.clientSetUp()
Florent Xicluna07627882010-03-21 01:14:24 +0000126 with test_support.check_py3k_warnings():
127 if not callable(test_func):
128 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129 try:
130 test_func()
131 except Exception, strerror:
132 self.queue.put(strerror)
133 self.clientTearDown()
134
135 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000136 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000137
138 def clientTearDown(self):
139 self.done.set()
140 thread.exit()
141
142class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
143
144 def __init__(self, methodName='runTest'):
145 SocketTCPTest.__init__(self, methodName=methodName)
146 ThreadableTest.__init__(self)
147
148 def clientSetUp(self):
149 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
150
151 def clientTearDown(self):
152 self.cli.close()
153 self.cli = None
154 ThreadableTest.clientTearDown(self)
155
156class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
157
158 def __init__(self, methodName='runTest'):
159 SocketUDPTest.__init__(self, methodName=methodName)
160 ThreadableTest.__init__(self)
161
162 def clientSetUp(self):
163 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
164
165class SocketConnectedTest(ThreadedTCPSocketTest):
166
167 def __init__(self, methodName='runTest'):
168 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
169
170 def setUp(self):
171 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000172 # Indicate explicitly we're ready for the client thread to
173 # proceed and then perform the blocking call to accept
174 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 conn, addr = self.serv.accept()
176 self.cli_conn = conn
177
178 def tearDown(self):
179 self.cli_conn.close()
180 self.cli_conn = None
181 ThreadedTCPSocketTest.tearDown(self)
182
183 def clientSetUp(self):
184 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000185 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186 self.serv_conn = self.cli
187
188 def clientTearDown(self):
189 self.serv_conn.close()
190 self.serv_conn = None
191 ThreadedTCPSocketTest.clientTearDown(self)
192
Dave Cole331708b2004-08-09 04:51:41 +0000193class SocketPairTest(unittest.TestCase, ThreadableTest):
194
195 def __init__(self, methodName='runTest'):
196 unittest.TestCase.__init__(self, methodName=methodName)
197 ThreadableTest.__init__(self)
198
199 def setUp(self):
200 self.serv, self.cli = socket.socketpair()
201
202 def tearDown(self):
203 self.serv.close()
204 self.serv = None
205
206 def clientSetUp(self):
207 pass
208
209 def clientTearDown(self):
210 self.cli.close()
211 self.cli = None
212 ThreadableTest.clientTearDown(self)
213
Tim Peters494aaee2004-08-09 18:54:11 +0000214
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215#######################################################################
216## Begin Tests
217
218class GeneralModuleTests(unittest.TestCase):
219
Raymond Hettinger027bb632004-05-31 03:09:25 +0000220 def test_weakref(self):
221 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
222 p = proxy(s)
223 self.assertEqual(p.fileno(), s.fileno())
224 s.close()
225 s = None
226 try:
227 p.fileno()
228 except ReferenceError:
229 pass
230 else:
231 self.fail('Socket proxy still exists')
232
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000234 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 def raise_error(*args, **kwargs):
236 raise socket.error
237 def raise_herror(*args, **kwargs):
238 raise socket.herror
239 def raise_gaierror(*args, **kwargs):
240 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000241 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000243 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000244 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000245 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000246 "Error raising socket exception.")
247
248 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000249 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 socket.AF_INET
251 socket.SOCK_STREAM
252 socket.SOCK_DGRAM
253 socket.SOCK_RAW
254 socket.SOCK_RDM
255 socket.SOCK_SEQPACKET
256 socket.SOL_SOCKET
257 socket.SO_REUSEADDR
258
Guido van Rossum654c11e2002-06-13 20:24:17 +0000259 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000260 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000261 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000262 try:
263 ip = socket.gethostbyname(hostname)
264 except socket.error:
265 # Probably name lookup wasn't set up right; skip this test
266 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000267 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000268 try:
269 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
270 except socket.error:
271 # Probably a similar problem as above; skip this test
272 return
Brett Cannon01668a12005-03-11 00:04:17 +0000273 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000274 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000275 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000276 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000277
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000278 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000280 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 try:
282 # On some versions, this loses a reference
283 orig = sys.getrefcount(__name__)
284 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000285 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000286 self.assertEqual(sys.getrefcount(__name__), orig,
287 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000288
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000290 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 try:
292 # On some versions, this crashes the interpreter.
293 socket.getnameinfo(('x', 0, 0, 0), 0)
294 except socket.error:
295 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000296
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000297 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000298 # This just checks that htons etc. are their own inverse,
299 # when looking at the lower 16 or 32 bits.
300 sizes = {socket.htonl: 32, socket.ntohl: 32,
301 socket.htons: 16, socket.ntohs: 16}
302 for func, size in sizes.items():
303 mask = (1L<<size) - 1
304 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
305 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000306
Guido van Rossuma2627af2002-09-14 00:58:46 +0000307 swapped = func(mask)
308 self.assertEqual(swapped & mask, mask)
309 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000310
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000311 def testNtoHErrors(self):
312 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
313 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
314 for k in good_values:
315 socket.ntohl(k)
316 socket.ntohs(k)
317 socket.htonl(k)
318 socket.htons(k)
319 for k in bad_values:
320 self.assertRaises(OverflowError, socket.ntohl, k)
321 self.assertRaises(OverflowError, socket.ntohs, k)
322 self.assertRaises(OverflowError, socket.htonl, k)
323 self.assertRaises(OverflowError, socket.htons, k)
324
Barry Warsaw11b91a02004-06-28 00:50:43 +0000325 def testGetServBy(self):
326 eq = self.assertEqual
327 # Find one service that exists, then check all the related interfaces.
328 # I've ordered this by protocols that have both a tcp and udp
329 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000330 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000331 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000332 # avoid the 'echo' service on this platform, as there is an
333 # assumption breaking non-standard port/protocol entry
334 services = ('daytime', 'qotd', 'domain')
335 else:
336 services = ('echo', 'daytime', 'domain')
337 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000338 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000339 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000340 break
341 except socket.error:
342 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000343 else:
344 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000345 # Try same call with optional protocol omitted
346 port2 = socket.getservbyname(service)
347 eq(port, port2)
348 # Try udp, but don't barf it it doesn't exist
349 try:
350 udpport = socket.getservbyname(service, 'udp')
351 except socket.error:
352 udpport = None
353 else:
354 eq(udpport, port)
355 # Now make sure the lookup by port returns the same service name
356 eq(socket.getservbyport(port2), service)
357 eq(socket.getservbyport(port, 'tcp'), service)
358 if udpport is not None:
359 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000360 # Make sure getservbyport does not accept out of range ports.
361 self.assertRaises(OverflowError, socket.getservbyport, -1)
362 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000363
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000364 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000365 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000366 # The default timeout should initially be None
367 self.assertEqual(socket.getdefaulttimeout(), None)
368 s = socket.socket()
369 self.assertEqual(s.gettimeout(), None)
370 s.close()
371
372 # Set the default timeout to 10, and see if it propagates
373 socket.setdefaulttimeout(10)
374 self.assertEqual(socket.getdefaulttimeout(), 10)
375 s = socket.socket()
376 self.assertEqual(s.gettimeout(), 10)
377 s.close()
378
379 # Reset the default timeout to None, and see if it propagates
380 socket.setdefaulttimeout(None)
381 self.assertEqual(socket.getdefaulttimeout(), None)
382 s = socket.socket()
383 self.assertEqual(s.gettimeout(), None)
384 s.close()
385
386 # Check that setting it to an invalid value raises ValueError
387 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
388
389 # Check that setting it to an invalid type raises TypeError
390 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
391
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000392 def testIPv4_inet_aton_fourbytes(self):
393 if not hasattr(socket, 'inet_aton'):
394 return # No inet_aton, nothing to check
395 # Test that issue1008086 and issue767150 are fixed.
396 # It must return 4 bytes.
397 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
398 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
399
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000400 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000401 if not hasattr(socket, 'inet_pton'):
402 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000403 from socket import inet_aton as f, inet_pton, AF_INET
404 g = lambda a: inet_pton(AF_INET, a)
405
406 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
407 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
408 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
409 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000410 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000411
412 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
413 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
414 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000415 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000416
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000417 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000418 if not hasattr(socket, 'inet_pton'):
419 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000420 try:
421 from socket import inet_pton, AF_INET6, has_ipv6
422 if not has_ipv6:
423 return
424 except ImportError:
425 return
426 f = lambda a: inet_pton(AF_INET6, a)
427
428 self.assertEquals('\x00' * 16, f('::'))
429 self.assertEquals('\x00' * 16, f('0::0'))
430 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
431 self.assertEquals(
432 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
433 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
434 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000435
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000436 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000437 if not hasattr(socket, 'inet_ntop'):
438 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000439 from socket import inet_ntoa as f, inet_ntop, AF_INET
440 g = lambda a: inet_ntop(AF_INET, a)
441
442 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
443 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
444 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
445 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000446
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000447 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
448 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
449 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
450
451 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000452 if not hasattr(socket, 'inet_ntop'):
453 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000454 try:
455 from socket import inet_ntop, AF_INET6, has_ipv6
456 if not has_ipv6:
457 return
458 except ImportError:
459 return
460 f = lambda a: inet_ntop(AF_INET6, a)
461
462 self.assertEquals('::', f('\x00' * 16))
463 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
464 self.assertEquals(
465 'aef:b01:506:1001:ffff:9997:55:170',
466 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
467 )
468
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000469 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000470
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000471 def _get_unused_port(self, bind_address='0.0.0.0'):
472 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000473
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000474 Args:
475 bind_address: Hostname or IP address to search for a port on.
476
477 Returns: A most likely to be unused port.
478 """
479 tempsock = socket.socket()
480 tempsock.bind((bind_address, 0))
481 host, port = tempsock.getsockname()
482 tempsock.close()
483 return port
484
485 def testSockName(self):
486 # Testing getsockname()
487 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000489 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000490 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000491 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
492 # it reasonable to get the host's addr in addition to 0.0.0.0.
493 # At least for eCos. This is required for the S/390 to pass.
494 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000495 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000496 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000497
498 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000499 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500 # We know a socket should start without reuse==0
501 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
502 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000503 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000504
505 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000506 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000507 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
508 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
509 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000510 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000511
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000512 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000513 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000514 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
515 sock.settimeout(1)
516 sock.close()
517 self.assertRaises(socket.error, sock.send, "spam")
518
Georg Brandlbb03ac02006-03-21 18:17:25 +0000519 def testNewAttributes(self):
520 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000521 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000522 self.assertEqual(sock.family, socket.AF_INET)
523 self.assertEqual(sock.type, socket.SOCK_STREAM)
524 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000525 sock.close()
526
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000527 def test_getsockaddrarg(self):
528 host = '0.0.0.0'
529 port = self._get_unused_port(bind_address=host)
530 big_port = port + 65536
531 neg_port = port - 65536
532 sock = socket.socket()
533 try:
534 self.assertRaises(OverflowError, sock.bind, (host, big_port))
535 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
536 sock.bind((host, port))
537 finally:
538 sock.close()
539
Christian Heimesa47b75b2008-01-04 15:48:06 +0000540 def test_sock_ioctl(self):
541 if os.name != "nt":
542 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000543 self.assertTrue(hasattr(socket.socket, 'ioctl'))
544 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
545 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
546 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000547 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
548 s = socket.socket()
549 self.assertRaises(ValueError, s.ioctl, -1, None)
550 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000551
552
Guido van Rossum24e4af82002-06-12 19:18:08 +0000553class BasicTCPTest(SocketConnectedTest):
554
555 def __init__(self, methodName='runTest'):
556 SocketConnectedTest.__init__(self, methodName=methodName)
557
558 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000559 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000561 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562
563 def _testRecv(self):
564 self.serv_conn.send(MSG)
565
566 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000567 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000568 seg1 = self.cli_conn.recv(len(MSG) - 3)
569 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000570 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000571 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572
573 def _testOverFlowRecv(self):
574 self.serv_conn.send(MSG)
575
576 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000577 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000579 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000580
581 def _testRecvFrom(self):
582 self.serv_conn.send(MSG)
583
584 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000585 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000586 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
587 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000588 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000589 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590
591 def _testOverFlowRecvFrom(self):
592 self.serv_conn.send(MSG)
593
594 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000595 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000596 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597 while 1:
598 read = self.cli_conn.recv(1024)
599 if not read:
600 break
Guido van Rossume531e292002-08-08 20:28:34 +0000601 msg += read
602 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603
604 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000605 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606 self.serv_conn.sendall(big_chunk)
607
608 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000609 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000610 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000611 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000612 fd = self.cli_conn.fileno()
613 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
614 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000615 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616
617 def _testFromFd(self):
618 self.serv_conn.send(MSG)
619
620 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000621 # Testing shutdown()
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)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000624 # wait for _testShutdown to finish: on OS X, when the server
625 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000626 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000627 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000628
629 def _testShutdown(self):
630 self.serv_conn.send(MSG)
631 self.serv_conn.shutdown(2)
632
633class BasicUDPTest(ThreadedUDPSocketTest):
634
635 def __init__(self, methodName='runTest'):
636 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
637
638 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000639 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000641 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642
643 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000644 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645
Guido van Rossum1c938012002-06-12 21:17:20 +0000646 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000647 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000649 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650
Guido van Rossum1c938012002-06-12 21:17:20 +0000651 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000652 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653
Facundo Batista1fe9f962007-03-28 03:45:20 +0000654 def testRecvFromNegative(self):
655 # Negative lengths passed to recvfrom should give ValueError.
656 self.assertRaises(ValueError, self.serv.recvfrom, -1)
657
658 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000659 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000660
Martin v. Löwis7596e832006-07-01 15:33:37 +0000661class TCPCloserTest(ThreadedTCPSocketTest):
662
663 def testClose(self):
664 conn, addr = self.serv.accept()
665 conn.close()
666
667 sd = self.cli
668 read, write, err = select.select([sd], [], [], 1.0)
669 self.assertEqual(read, [sd])
670 self.assertEqual(sd.recv(1), '')
671
672 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000673 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000674 time.sleep(1.0)
675
Dave Cole331708b2004-08-09 04:51:41 +0000676class BasicSocketPairTest(SocketPairTest):
677
678 def __init__(self, methodName='runTest'):
679 SocketPairTest.__init__(self, methodName=methodName)
680
681 def testRecv(self):
682 msg = self.serv.recv(1024)
683 self.assertEqual(msg, MSG)
684
685 def _testRecv(self):
686 self.cli.send(MSG)
687
688 def testSend(self):
689 self.serv.send(MSG)
690
691 def _testSend(self):
692 msg = self.cli.recv(1024)
693 self.assertEqual(msg, MSG)
694
Guido van Rossum24e4af82002-06-12 19:18:08 +0000695class NonBlockingTCPTests(ThreadedTCPSocketTest):
696
697 def __init__(self, methodName='runTest'):
698 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
699
700 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000701 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000702 self.serv.setblocking(0)
703 start = time.time()
704 try:
705 self.serv.accept()
706 except socket.error:
707 pass
708 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000709 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
711 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000712 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000713
Guido van Rossum24e4af82002-06-12 19:18:08 +0000714 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000715 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000717 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 conn, addr = self.serv.accept()
719 except socket.error:
720 pass
721 else:
722 self.fail("Error trying to do non-blocking accept.")
723 read, write, err = select.select([self.serv], [], [])
724 if self.serv in read:
725 conn, addr = self.serv.accept()
726 else:
727 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000728
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000730 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000731 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732
733 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000734 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000735 conn, addr = self.serv.accept()
736
737 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000738 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000739 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740
741 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000742 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743 conn, addr = self.serv.accept()
744 conn.setblocking(0)
745 try:
746 msg = conn.recv(len(MSG))
747 except socket.error:
748 pass
749 else:
750 self.fail("Error trying to do non-blocking recv.")
751 read, write, err = select.select([conn], [], [])
752 if conn in read:
753 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000754 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 else:
756 self.fail("Error during select call to non-blocking socket.")
757
758 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000759 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000760 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761 self.cli.send(MSG)
762
763class FileObjectClassTestCase(SocketConnectedTest):
764
Guido van Rossume9f66142002-08-07 15:46:19 +0000765 bufsize = -1 # Use default buffer size
766
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767 def __init__(self, methodName='runTest'):
768 SocketConnectedTest.__init__(self, methodName=methodName)
769
770 def setUp(self):
771 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000772 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773
774 def tearDown(self):
775 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000776 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000777 self.serv_file = None
778 SocketConnectedTest.tearDown(self)
779
780 def clientSetUp(self):
781 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000782 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783
784 def clientTearDown(self):
785 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000786 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 self.cli_file = None
788 SocketConnectedTest.clientTearDown(self)
789
790 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000791 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000792 first_seg = self.serv_file.read(len(MSG)-3)
793 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000794 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000795 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796
797 def _testSmallRead(self):
798 self.cli_file.write(MSG)
799 self.cli_file.flush()
800
Guido van Rossum8c943832002-08-08 01:00:28 +0000801 def testFullRead(self):
802 # read until EOF
803 msg = self.serv_file.read()
804 self.assertEqual(msg, MSG)
805
806 def _testFullRead(self):
807 self.cli_file.write(MSG)
808 self.cli_file.close()
809
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000811 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 buf = ''
813 while 1:
814 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000815 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000817 buf += char
818 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819
820 def _testUnbufferedRead(self):
821 self.cli_file.write(MSG)
822 self.cli_file.flush()
823
824 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000825 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000827 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828
829 def _testReadline(self):
830 self.cli_file.write(MSG)
831 self.cli_file.flush()
832
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000833 def testReadlineAfterRead(self):
834 a_baloo_is = self.serv_file.read(len("A baloo is"))
835 self.assertEqual("A baloo is", a_baloo_is)
836 _a_bear = self.serv_file.read(len(" a bear"))
837 self.assertEqual(" a bear", _a_bear)
838 line = self.serv_file.readline()
839 self.assertEqual("\n", line)
840 line = self.serv_file.readline()
841 self.assertEqual("A BALOO IS A BEAR.\n", line)
842 line = self.serv_file.readline()
843 self.assertEqual(MSG, line)
844
845 def _testReadlineAfterRead(self):
846 self.cli_file.write("A baloo is a bear\n")
847 self.cli_file.write("A BALOO IS A BEAR.\n")
848 self.cli_file.write(MSG)
849 self.cli_file.flush()
850
851 def testReadlineAfterReadNoNewline(self):
852 end_of_ = self.serv_file.read(len("End Of "))
853 self.assertEqual("End Of ", end_of_)
854 line = self.serv_file.readline()
855 self.assertEqual("Line", line)
856
857 def _testReadlineAfterReadNoNewline(self):
858 self.cli_file.write("End Of Line")
859
Tim Peters116d83c2004-03-28 02:20:45 +0000860 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000861 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000862
863 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000864 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000865
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000866
867class FileObjectInterruptedTestCase(unittest.TestCase):
868 """Test that the file object correctly handles EINTR internally."""
869
870 class MockSocket(object):
871 def __init__(self, recv_funcs=()):
872 # A generator that returns callables that we'll call for each
873 # call to recv().
874 self._recv_step = iter(recv_funcs)
875
876 def recv(self, size):
877 return self._recv_step.next()()
878
879 @staticmethod
880 def _raise_eintr():
881 raise socket.error(errno.EINTR)
882
883 def _test_readline(self, size=-1, **kwargs):
884 mock_sock = self.MockSocket(recv_funcs=[
885 lambda : "This is the first line\nAnd the sec",
886 self._raise_eintr,
887 lambda : "ond line is here\n",
888 lambda : "",
889 ])
890 fo = socket._fileobject(mock_sock, **kwargs)
891 self.assertEquals(fo.readline(size), "This is the first line\n")
892 self.assertEquals(fo.readline(size), "And the second line is here\n")
893
894 def _test_read(self, size=-1, **kwargs):
895 mock_sock = self.MockSocket(recv_funcs=[
896 lambda : "This is the first line\nAnd the sec",
897 self._raise_eintr,
898 lambda : "ond line is here\n",
899 lambda : "",
900 ])
901 fo = socket._fileobject(mock_sock, **kwargs)
902 self.assertEquals(fo.read(size), "This is the first line\n"
903 "And the second line is here\n")
904
905 def test_default(self):
906 self._test_readline()
907 self._test_readline(size=100)
908 self._test_read()
909 self._test_read(size=100)
910
911 def test_with_1k_buffer(self):
912 self._test_readline(bufsize=1024)
913 self._test_readline(size=100, bufsize=1024)
914 self._test_read(bufsize=1024)
915 self._test_read(size=100, bufsize=1024)
916
917 def _test_readline_no_buffer(self, size=-1):
918 mock_sock = self.MockSocket(recv_funcs=[
919 lambda : "aa",
920 lambda : "\n",
921 lambda : "BB",
922 self._raise_eintr,
923 lambda : "bb",
924 lambda : "",
925 ])
926 fo = socket._fileobject(mock_sock, bufsize=0)
927 self.assertEquals(fo.readline(size), "aa\n")
928 self.assertEquals(fo.readline(size), "BBbb")
929
930 def test_no_buffer(self):
931 self._test_readline_no_buffer()
932 self._test_readline_no_buffer(size=4)
933 self._test_read(bufsize=0)
934 self._test_read(size=100, bufsize=0)
935
936
Guido van Rossume9f66142002-08-07 15:46:19 +0000937class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
938
939 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000940
Guido van Rossume9f66142002-08-07 15:46:19 +0000941 In this case (and in this case only), it should be possible to
942 create a file object, read a line from it, create another file
943 object, read another line from it, without loss of data in the
944 first file object's buffer. Note that httplib relies on this
945 when reading multiple requests from the same socket."""
946
947 bufsize = 0 # Use unbuffered mode
948
949 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000950 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000951 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000952 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000953 self.serv_file = self.cli_conn.makefile('rb', 0)
954 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000955 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000956
957 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000958 self.cli_file.write("A. " + MSG)
959 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000960 self.cli_file.flush()
961
Guido van Rossum8c943832002-08-08 01:00:28 +0000962class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
963
964 bufsize = 1 # Default-buffered for reading; line-buffered for writing
965
966
967class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
968
969 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000970
Georg Brandldd7b0522007-01-21 10:35:10 +0000971
Facundo Batista07c78be2007-03-23 18:54:07 +0000972class NetworkConnectionTest(object):
973 """Prove network connection."""
974 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000975 # We're inherited below by BasicTCPTest2, which also inherits
976 # BasicTCPTest, which defines self.port referenced below.
977 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000978 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000979
Facundo Batista07c78be2007-03-23 18:54:07 +0000980class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
981 """Tests that NetworkConnection does not break existing TCP functionality.
982 """
983
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000984class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000985 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000986 port = test_support.find_unused_port()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000987 self.assertRaises(
Trent Nelsone41b0062008-04-08 23:47:30 +0000988 socket.error,
989 lambda: socket.create_connection((HOST, port))
990 )
Facundo Batista07c78be2007-03-23 18:54:07 +0000991
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000992class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
993
994 def __init__(self, methodName='runTest'):
995 SocketTCPTest.__init__(self, methodName=methodName)
996 ThreadableTest.__init__(self)
997
998 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +0000999 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001000
1001 def clientTearDown(self):
1002 self.cli.close()
1003 self.cli = None
1004 ThreadableTest.clientTearDown(self)
1005
1006 def _justAccept(self):
1007 conn, addr = self.serv.accept()
1008
1009 testFamily = _justAccept
1010 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001011 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001012 self.assertEqual(self.cli.family, 2)
1013
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001014 testSourceAddress = _justAccept
1015 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001016 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1017 source_address=('', self.source_port))
1018 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001019 # The port number being used is sufficient to show that the bind()
1020 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001021
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001022 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001023 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001024 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001025 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001026 socket.setdefaulttimeout(42)
1027 try:
1028 self.cli = socket.create_connection((HOST, self.port))
1029 finally:
1030 socket.setdefaulttimeout(None)
1031 self.assertEquals(self.cli.gettimeout(), 42)
1032
1033 testTimeoutNone = _justAccept
1034 def _testTimeoutNone(self):
1035 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001036 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001037 socket.setdefaulttimeout(30)
1038 try:
1039 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1040 finally:
1041 socket.setdefaulttimeout(None)
1042 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001043
1044 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001045 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001046 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001047 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001048
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001049 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001050 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001051 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001052 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001053
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001054class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1055
1056 def __init__(self, methodName='runTest'):
1057 SocketTCPTest.__init__(self, methodName=methodName)
1058 ThreadableTest.__init__(self)
1059
1060 def clientSetUp(self):
1061 pass
1062
1063 def clientTearDown(self):
1064 self.cli.close()
1065 self.cli = None
1066 ThreadableTest.clientTearDown(self)
1067
Facundo Batista07c78be2007-03-23 18:54:07 +00001068 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001069 conn, addr = self.serv.accept()
1070 time.sleep(3)
1071 conn.send("done!")
1072 testOutsideTimeout = testInsideTimeout
1073
1074 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001075 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001076 data = sock.recv(5)
1077 self.assertEqual(data, "done!")
1078
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001079 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001080 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001081 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001082
1083
Georg Brandldd7b0522007-01-21 10:35:10 +00001084class Urllib2FileobjectTest(unittest.TestCase):
1085
1086 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1087 # it close the socket if the close c'tor argument is true
1088
1089 def testClose(self):
1090 class MockSocket:
1091 closed = False
1092 def flush(self): pass
1093 def close(self): self.closed = True
1094
1095 # must not close unless we request it: the original use of _fileobject
1096 # by module socket requires that the underlying socket not be closed until
1097 # the _socketobject that created the _fileobject is closed
1098 s = MockSocket()
1099 f = socket._fileobject(s)
1100 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001101 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001102
1103 s = MockSocket()
1104 f = socket._fileobject(s, close=True)
1105 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001106 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001107
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001108class TCPTimeoutTest(SocketTCPTest):
1109
1110 def testTCPTimeout(self):
1111 def raise_timeout(*args, **kwargs):
1112 self.serv.settimeout(1.0)
1113 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001114 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001115 "Error generating a timeout exception (TCP)")
1116
1117 def testTimeoutZero(self):
1118 ok = False
1119 try:
1120 self.serv.settimeout(0.0)
1121 foo = self.serv.accept()
1122 except socket.timeout:
1123 self.fail("caught timeout instead of error (TCP)")
1124 except socket.error:
1125 ok = True
1126 except:
1127 self.fail("caught unexpected exception (TCP)")
1128 if not ok:
1129 self.fail("accept() returned success when we did not expect it")
1130
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001131 def testInterruptedTimeout(self):
1132 # XXX I don't know how to do this test on MSWindows or any other
1133 # plaform that doesn't support signal.alarm() or os.kill(), though
1134 # the bug should have existed on all platforms.
1135 if not hasattr(signal, "alarm"):
1136 return # can only test on *nix
1137 self.serv.settimeout(5.0) # must be longer than alarm
1138 class Alarm(Exception):
1139 pass
1140 def alarm_handler(signal, frame):
1141 raise Alarm
1142 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1143 try:
1144 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1145 try:
1146 foo = self.serv.accept()
1147 except socket.timeout:
1148 self.fail("caught timeout instead of Alarm")
1149 except Alarm:
1150 pass
1151 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001152 self.fail("caught other exception instead of Alarm:"
1153 " %s(%s):\n%s" %
1154 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001155 else:
1156 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001157 finally:
1158 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001159 except Alarm:
1160 self.fail("got Alarm in wrong place")
1161 finally:
1162 # no alarm can be pending. Safe to restore old handler.
1163 signal.signal(signal.SIGALRM, old_alarm)
1164
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001165class UDPTimeoutTest(SocketTCPTest):
1166
1167 def testUDPTimeout(self):
1168 def raise_timeout(*args, **kwargs):
1169 self.serv.settimeout(1.0)
1170 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001171 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001172 "Error generating a timeout exception (UDP)")
1173
1174 def testTimeoutZero(self):
1175 ok = False
1176 try:
1177 self.serv.settimeout(0.0)
1178 foo = self.serv.recv(1024)
1179 except socket.timeout:
1180 self.fail("caught timeout instead of error (UDP)")
1181 except socket.error:
1182 ok = True
1183 except:
1184 self.fail("caught unexpected exception (UDP)")
1185 if not ok:
1186 self.fail("recv() returned success when we did not expect it")
1187
1188class TestExceptions(unittest.TestCase):
1189
1190 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001191 self.assertTrue(issubclass(socket.error, Exception))
1192 self.assertTrue(issubclass(socket.herror, socket.error))
1193 self.assertTrue(issubclass(socket.gaierror, socket.error))
1194 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001195
Armin Rigoa9017c32006-04-19 11:50:27 +00001196class TestLinuxAbstractNamespace(unittest.TestCase):
1197
1198 UNIX_PATH_MAX = 108
1199
1200 def testLinuxAbstractNamespace(self):
1201 address = "\x00python-test-hello\x00\xff"
1202 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1203 s1.bind(address)
1204 s1.listen(1)
1205 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1206 s2.connect(s1.getsockname())
1207 s1.accept()
1208 self.assertEqual(s1.getsockname(), address)
1209 self.assertEqual(s2.getpeername(), address)
1210
1211 def testMaxName(self):
1212 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1213 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1214 s.bind(address)
1215 self.assertEqual(s.getsockname(), address)
1216
1217 def testNameOverflow(self):
1218 address = "\x00" + "h" * self.UNIX_PATH_MAX
1219 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1220 self.assertRaises(socket.error, s.bind, address)
1221
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001222
Martin Blais2856e5f2006-05-26 12:03:27 +00001223class BufferIOTest(SocketConnectedTest):
1224 """
1225 Test the buffer versions of socket.recv() and socket.send().
1226 """
1227 def __init__(self, methodName='runTest'):
1228 SocketConnectedTest.__init__(self, methodName=methodName)
1229
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001230 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001231 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001232 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001233 self.assertEqual(nbytes, len(MSG))
1234 msg = buf.tostring()[:len(MSG)]
1235 self.assertEqual(msg, MSG)
1236
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001237 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001238 with test_support.check_py3k_warnings():
1239 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001240 self.serv_conn.send(buf)
1241
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001242 def testRecvIntoBytearray(self):
1243 buf = bytearray(1024)
1244 nbytes = self.cli_conn.recv_into(buf)
1245 self.assertEqual(nbytes, len(MSG))
1246 msg = buf[:len(MSG)]
1247 self.assertEqual(msg, MSG)
1248
1249 _testRecvIntoBytearray = _testRecvIntoArray
1250
1251 def testRecvIntoMemoryview(self):
1252 buf = bytearray(1024)
1253 nbytes = self.cli_conn.recv_into(memoryview(buf))
1254 self.assertEqual(nbytes, len(MSG))
1255 msg = buf[:len(MSG)]
1256 self.assertEqual(msg, MSG)
1257
1258 _testRecvIntoMemoryview = _testRecvIntoArray
1259
1260 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001261 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001262 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001263 self.assertEqual(nbytes, len(MSG))
1264 msg = buf.tostring()[:len(MSG)]
1265 self.assertEqual(msg, MSG)
1266
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001267 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001268 with test_support.check_py3k_warnings():
1269 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001270 self.serv_conn.send(buf)
1271
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001272 def testRecvFromIntoBytearray(self):
1273 buf = bytearray(1024)
1274 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1275 self.assertEqual(nbytes, len(MSG))
1276 msg = buf[:len(MSG)]
1277 self.assertEqual(msg, MSG)
1278
1279 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1280
1281 def testRecvFromIntoMemoryview(self):
1282 buf = bytearray(1024)
1283 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1284 self.assertEqual(nbytes, len(MSG))
1285 msg = buf[:len(MSG)]
1286 self.assertEqual(msg, MSG)
1287
1288 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1289
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001290
1291TIPC_STYPE = 2000
1292TIPC_LOWER = 200
1293TIPC_UPPER = 210
1294
1295def isTipcAvailable():
1296 """Check if the TIPC module is loaded
1297
1298 The TIPC module is not loaded automatically on Ubuntu and probably
1299 other Linux distros.
1300 """
1301 if not hasattr(socket, "AF_TIPC"):
1302 return False
1303 if not os.path.isfile("/proc/modules"):
1304 return False
1305 with open("/proc/modules") as f:
1306 for line in f:
1307 if line.startswith("tipc "):
1308 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001309 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001310 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1311 return False
1312
1313class TIPCTest (unittest.TestCase):
1314 def testRDM(self):
1315 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1316 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1317
1318 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1319 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1320 TIPC_LOWER, TIPC_UPPER)
1321 srv.bind(srvaddr)
1322
1323 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1324 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1325 cli.sendto(MSG, sendaddr)
1326
1327 msg, recvaddr = srv.recvfrom(1024)
1328
1329 self.assertEqual(cli.getsockname(), recvaddr)
1330 self.assertEqual(msg, MSG)
1331
1332
1333class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1334 def __init__(self, methodName = 'runTest'):
1335 unittest.TestCase.__init__(self, methodName = methodName)
1336 ThreadableTest.__init__(self)
1337
1338 def setUp(self):
1339 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1340 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1341 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1342 TIPC_LOWER, TIPC_UPPER)
1343 self.srv.bind(srvaddr)
1344 self.srv.listen(5)
1345 self.serverExplicitReady()
1346 self.conn, self.connaddr = self.srv.accept()
1347
1348 def clientSetUp(self):
1349 # The is a hittable race between serverExplicitReady() and the
1350 # accept() call; sleep a little while to avoid it, otherwise
1351 # we could get an exception
1352 time.sleep(0.1)
1353 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1354 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1355 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1356 self.cli.connect(addr)
1357 self.cliaddr = self.cli.getsockname()
1358
1359 def testStream(self):
1360 msg = self.conn.recv(1024)
1361 self.assertEqual(msg, MSG)
1362 self.assertEqual(self.cliaddr, self.connaddr)
1363
1364 def _testStream(self):
1365 self.cli.send(MSG)
1366 self.cli.close()
1367
1368
Guido van Rossumb995eb72002-07-31 16:08:40 +00001369def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001370 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001371 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001372 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001373 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001374
1375 tests.extend([
1376 NonBlockingTCPTests,
1377 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001378 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001379 UnbufferedFileObjectClassTestCase,
1380 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001381 SmallBufferedFileObjectClassTestCase,
1382 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001383 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001384 NetworkConnectionAttributesTest,
1385 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001386 ])
Dave Cole331708b2004-08-09 04:51:41 +00001387 if hasattr(socket, "socketpair"):
1388 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001389 if sys.platform == 'linux2':
1390 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001391 if isTipcAvailable():
1392 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001393 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001394
1395 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001396 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001397 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001398
1399if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001400 test_main()