blob: 430a6474ed1555a5cb3005a3815daa48698f1889 [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
Victor Stinner6a102812010-04-27 23:55:59 +000018try:
19 import thread
20 import threading
21except ImportError:
22 thread = None
23 threading = None
24
Trent Nelsone41b0062008-04-08 23:47:30 +000025HOST = test_support.HOST
Guido van Rossum24e4af82002-06-12 19:18:08 +000026MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000027
Guido van Rossum24e4af82002-06-12 19:18:08 +000028class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030 def setUp(self):
31 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000032 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000033 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Guido van Rossum24e4af82002-06-12 19:18:08 +000035 def tearDown(self):
36 self.serv.close()
37 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
Guido van Rossum24e4af82002-06-12 19:18:08 +000039class SocketUDPTest(unittest.TestCase):
40
41 def setUp(self):
42 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Trent Nelsone41b0062008-04-08 23:47:30 +000043 self.port = test_support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000044
45 def tearDown(self):
46 self.serv.close()
47 self.serv = None
48
49class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000050 """Threadable Test class
51
52 The ThreadableTest class makes it easy to create a threaded
53 client/server pair from an existing unit test. To create a
54 new threaded class from an existing unit test, use multiple
55 inheritance:
56
57 class NewClass (OldClass, ThreadableTest):
58 pass
59
60 This class defines two new fixture functions with obvious
61 purposes for overriding:
62
63 clientSetUp ()
64 clientTearDown ()
65
66 Any new test functions within the class must then define
67 tests in pairs, where the test name is preceeded with a
68 '_' to indicate the client portion of the test. Ex:
69
70 def testFoo(self):
71 # Server portion
72
73 def _testFoo(self):
74 # Client portion
75
76 Any exceptions raised by the clients during their tests
77 are caught and transferred to the main thread to alert
78 the testing framework.
79
80 Note, the server setup function cannot call any blocking
81 functions that rely on the client thread during setup,
Facundo Batista07c78be2007-03-23 18:54:07 +000082 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000083 the blocking call (such as in setting up a client/server
84 connection and performing the accept() in setUp().
85 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000086
87 def __init__(self):
88 # Swap the true setup function
89 self.__setUp = self.setUp
90 self.__tearDown = self.tearDown
91 self.setUp = self._setUp
92 self.tearDown = self._tearDown
93
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000094 def serverExplicitReady(self):
95 """This method allows the server to explicitly indicate that
96 it wants the client thread to proceed. This is useful if the
97 server is about to execute a blocking routine that is
98 dependent upon the client thread during its setup routine."""
99 self.server_ready.set()
100
Guido van Rossum24e4af82002-06-12 19:18:08 +0000101 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000102 self.server_ready = threading.Event()
103 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000104 self.done = threading.Event()
Georg Brandla6168f92008-05-25 07:20:14 +0000105 self.queue = Queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106
107 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000108 methodname = self.id()
109 i = methodname.rfind('.')
110 methodname = methodname[i+1:]
111 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000112 self.client_thread = thread.start_new_thread(
113 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114
115 self.__setUp()
Benjamin Peterson0fbcf692008-06-11 17:27:50 +0000116 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000117 self.server_ready.set()
118 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000119
120 def _tearDown(self):
121 self.__tearDown()
122 self.done.wait()
123
124 if not self.queue.empty():
125 msg = self.queue.get()
126 self.fail(msg)
127
128 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000129 self.server_ready.wait()
130 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000131 self.clientSetUp()
Florent Xicluna07627882010-03-21 01:14:24 +0000132 with test_support.check_py3k_warnings():
133 if not callable(test_func):
134 raise TypeError("test_func must be a callable function.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135 try:
136 test_func()
137 except Exception, strerror:
138 self.queue.put(strerror)
139 self.clientTearDown()
140
141 def clientSetUp(self):
Florent Xicluna07627882010-03-21 01:14:24 +0000142 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 def clientTearDown(self):
145 self.done.set()
146 thread.exit()
147
148class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
149
150 def __init__(self, methodName='runTest'):
151 SocketTCPTest.__init__(self, methodName=methodName)
152 ThreadableTest.__init__(self)
153
154 def clientSetUp(self):
155 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
156
157 def clientTearDown(self):
158 self.cli.close()
159 self.cli = None
160 ThreadableTest.clientTearDown(self)
161
162class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
163
164 def __init__(self, methodName='runTest'):
165 SocketUDPTest.__init__(self, methodName=methodName)
166 ThreadableTest.__init__(self)
167
168 def clientSetUp(self):
169 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
170
171class SocketConnectedTest(ThreadedTCPSocketTest):
172
173 def __init__(self, methodName='runTest'):
174 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
175
176 def setUp(self):
177 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000178 # Indicate explicitly we're ready for the client thread to
179 # proceed and then perform the blocking call to accept
180 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000181 conn, addr = self.serv.accept()
182 self.cli_conn = conn
183
184 def tearDown(self):
185 self.cli_conn.close()
186 self.cli_conn = None
187 ThreadedTCPSocketTest.tearDown(self)
188
189 def clientSetUp(self):
190 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000191 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000192 self.serv_conn = self.cli
193
194 def clientTearDown(self):
195 self.serv_conn.close()
196 self.serv_conn = None
197 ThreadedTCPSocketTest.clientTearDown(self)
198
Dave Cole331708b2004-08-09 04:51:41 +0000199class SocketPairTest(unittest.TestCase, ThreadableTest):
200
201 def __init__(self, methodName='runTest'):
202 unittest.TestCase.__init__(self, methodName=methodName)
203 ThreadableTest.__init__(self)
204
205 def setUp(self):
206 self.serv, self.cli = socket.socketpair()
207
208 def tearDown(self):
209 self.serv.close()
210 self.serv = None
211
212 def clientSetUp(self):
213 pass
214
215 def clientTearDown(self):
216 self.cli.close()
217 self.cli = None
218 ThreadableTest.clientTearDown(self)
219
Tim Peters494aaee2004-08-09 18:54:11 +0000220
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221#######################################################################
222## Begin Tests
223
224class GeneralModuleTests(unittest.TestCase):
225
Raymond Hettinger027bb632004-05-31 03:09:25 +0000226 def test_weakref(self):
227 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
228 p = proxy(s)
229 self.assertEqual(p.fileno(), s.fileno())
230 s.close()
231 s = None
232 try:
233 p.fileno()
234 except ReferenceError:
235 pass
236 else:
237 self.fail('Socket proxy still exists')
238
Guido van Rossum24e4af82002-06-12 19:18:08 +0000239 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000240 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000241 def raise_error(*args, **kwargs):
242 raise socket.error
243 def raise_herror(*args, **kwargs):
244 raise socket.herror
245 def raise_gaierror(*args, **kwargs):
246 raise socket.gaierror
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000247 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000249 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 "Error raising socket exception.")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000251 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252 "Error raising socket exception.")
253
254 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000255 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000256 socket.AF_INET
257 socket.SOCK_STREAM
258 socket.SOCK_DGRAM
259 socket.SOCK_RAW
260 socket.SOCK_RDM
261 socket.SOCK_SEQPACKET
262 socket.SOL_SOCKET
263 socket.SO_REUSEADDR
264
Guido van Rossum654c11e2002-06-13 20:24:17 +0000265 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000266 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000267 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000268 try:
269 ip = socket.gethostbyname(hostname)
270 except socket.error:
271 # Probably name lookup wasn't set up right; skip this test
272 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000273 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000274 try:
275 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
276 except socket.error:
277 # Probably a similar problem as above; skip this test
278 return
Brett Cannon01668a12005-03-11 00:04:17 +0000279 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000280 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000281 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000282 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000283
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000284 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000285 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000286 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 try:
288 # On some versions, this loses a reference
289 orig = sys.getrefcount(__name__)
290 socket.getnameinfo(__name__,0)
Georg Brandlab849892009-09-19 07:35:07 +0000291 except TypeError:
Florent Xicluna07627882010-03-21 01:14:24 +0000292 self.assertEqual(sys.getrefcount(__name__), orig,
293 "socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000294
Guido van Rossum24e4af82002-06-12 19:18:08 +0000295 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000296 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297 try:
298 # On some versions, this crashes the interpreter.
299 socket.getnameinfo(('x', 0, 0, 0), 0)
300 except socket.error:
301 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000302
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000303 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000304 # This just checks that htons etc. are their own inverse,
305 # when looking at the lower 16 or 32 bits.
306 sizes = {socket.htonl: 32, socket.ntohl: 32,
307 socket.htons: 16, socket.ntohs: 16}
308 for func, size in sizes.items():
309 mask = (1L<<size) - 1
310 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
311 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000312
Guido van Rossuma2627af2002-09-14 00:58:46 +0000313 swapped = func(mask)
314 self.assertEqual(swapped & mask, mask)
315 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000316
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000317 def testNtoHErrors(self):
318 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
319 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
320 for k in good_values:
321 socket.ntohl(k)
322 socket.ntohs(k)
323 socket.htonl(k)
324 socket.htons(k)
325 for k in bad_values:
326 self.assertRaises(OverflowError, socket.ntohl, k)
327 self.assertRaises(OverflowError, socket.ntohs, k)
328 self.assertRaises(OverflowError, socket.htonl, k)
329 self.assertRaises(OverflowError, socket.htons, k)
330
Barry Warsaw11b91a02004-06-28 00:50:43 +0000331 def testGetServBy(self):
332 eq = self.assertEqual
333 # Find one service that exists, then check all the related interfaces.
334 # I've ordered this by protocols that have both a tcp and udp
335 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000336 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000337 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000338 # avoid the 'echo' service on this platform, as there is an
339 # assumption breaking non-standard port/protocol entry
340 services = ('daytime', 'qotd', 'domain')
341 else:
342 services = ('echo', 'daytime', 'domain')
343 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000344 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000345 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000346 break
347 except socket.error:
348 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000349 else:
350 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000351 # Try same call with optional protocol omitted
352 port2 = socket.getservbyname(service)
353 eq(port, port2)
354 # Try udp, but don't barf it it doesn't exist
355 try:
356 udpport = socket.getservbyname(service, 'udp')
357 except socket.error:
358 udpport = None
359 else:
360 eq(udpport, port)
361 # Now make sure the lookup by port returns the same service name
362 eq(socket.getservbyport(port2), service)
363 eq(socket.getservbyport(port, 'tcp'), service)
364 if udpport is not None:
365 eq(socket.getservbyport(udpport, 'udp'), service)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000366 # Make sure getservbyport does not accept out of range ports.
367 self.assertRaises(OverflowError, socket.getservbyport, -1)
368 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000369
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000370 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000371 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000372 # The default timeout should initially be None
373 self.assertEqual(socket.getdefaulttimeout(), None)
374 s = socket.socket()
375 self.assertEqual(s.gettimeout(), None)
376 s.close()
377
378 # Set the default timeout to 10, and see if it propagates
379 socket.setdefaulttimeout(10)
380 self.assertEqual(socket.getdefaulttimeout(), 10)
381 s = socket.socket()
382 self.assertEqual(s.gettimeout(), 10)
383 s.close()
384
385 # Reset the default timeout to None, and see if it propagates
386 socket.setdefaulttimeout(None)
387 self.assertEqual(socket.getdefaulttimeout(), None)
388 s = socket.socket()
389 self.assertEqual(s.gettimeout(), None)
390 s.close()
391
392 # Check that setting it to an invalid value raises ValueError
393 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
394
395 # Check that setting it to an invalid type raises TypeError
396 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
397
Gregory P. Smith3605b5c2009-02-11 23:45:25 +0000398 def testIPv4_inet_aton_fourbytes(self):
399 if not hasattr(socket, 'inet_aton'):
400 return # No inet_aton, nothing to check
401 # Test that issue1008086 and issue767150 are fixed.
402 # It must return 4 bytes.
403 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
404 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
405
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000406 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000407 if not hasattr(socket, 'inet_pton'):
408 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000409 from socket import inet_aton as f, inet_pton, AF_INET
410 g = lambda a: inet_pton(AF_INET, a)
411
412 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
413 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
414 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
415 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000416 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000417
418 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
419 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
420 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000421 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000422
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000423 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000424 if not hasattr(socket, 'inet_pton'):
425 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000426 try:
427 from socket import inet_pton, AF_INET6, has_ipv6
428 if not has_ipv6:
429 return
430 except ImportError:
431 return
432 f = lambda a: inet_pton(AF_INET6, a)
433
434 self.assertEquals('\x00' * 16, f('::'))
435 self.assertEquals('\x00' * 16, f('0::0'))
436 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
437 self.assertEquals(
438 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
439 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
440 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000441
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000443 if not hasattr(socket, 'inet_ntop'):
444 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000445 from socket import inet_ntoa as f, inet_ntop, AF_INET
446 g = lambda a: inet_ntop(AF_INET, a)
447
448 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
449 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
450 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
451 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000452
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000453 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
454 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
455 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
456
457 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000458 if not hasattr(socket, 'inet_ntop'):
459 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000460 try:
461 from socket import inet_ntop, AF_INET6, has_ipv6
462 if not has_ipv6:
463 return
464 except ImportError:
465 return
466 f = lambda a: inet_ntop(AF_INET6, a)
467
468 self.assertEquals('::', f('\x00' * 16))
469 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
470 self.assertEquals(
471 'aef:b01:506:1001:ffff:9997:55:170',
472 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
473 )
474
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000475 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000476
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000477 def _get_unused_port(self, bind_address='0.0.0.0'):
478 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000479
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000480 Args:
481 bind_address: Hostname or IP address to search for a port on.
482
483 Returns: A most likely to be unused port.
484 """
485 tempsock = socket.socket()
486 tempsock.bind((bind_address, 0))
487 host, port = tempsock.getsockname()
488 tempsock.close()
489 return port
490
491 def testSockName(self):
492 # Testing getsockname()
493 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000494 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000495 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000497 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
498 # it reasonable to get the host's addr in addition to 0.0.0.0.
499 # At least for eCos. This is required for the S/390 to pass.
500 my_ip_addr = socket.gethostbyname(socket.gethostname())
Ezio Melottiaa980582010-01-23 23:04:36 +0000501 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000502 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000503
504 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000505 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506 # We know a socket should start without reuse==0
507 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
508 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000509 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510
511 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000512 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
514 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
515 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000516 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000518 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000519 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000520 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
521 sock.settimeout(1)
522 sock.close()
523 self.assertRaises(socket.error, sock.send, "spam")
524
Georg Brandlbb03ac02006-03-21 18:17:25 +0000525 def testNewAttributes(self):
526 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000527 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000528 self.assertEqual(sock.family, socket.AF_INET)
529 self.assertEqual(sock.type, socket.SOCK_STREAM)
530 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000531 sock.close()
532
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000533 def test_getsockaddrarg(self):
534 host = '0.0.0.0'
535 port = self._get_unused_port(bind_address=host)
536 big_port = port + 65536
537 neg_port = port - 65536
538 sock = socket.socket()
539 try:
540 self.assertRaises(OverflowError, sock.bind, (host, big_port))
541 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
542 sock.bind((host, port))
543 finally:
544 sock.close()
545
Christian Heimesa47b75b2008-01-04 15:48:06 +0000546 def test_sock_ioctl(self):
547 if os.name != "nt":
548 return
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000549 self.assertTrue(hasattr(socket.socket, 'ioctl'))
550 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
551 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
552 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson2fcd03b2009-09-25 15:19:51 +0000553 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
554 s = socket.socket()
555 self.assertRaises(ValueError, s.ioctl, -1, None)
556 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesa47b75b2008-01-04 15:48:06 +0000557
558
Victor Stinner6a102812010-04-27 23:55:59 +0000559@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000560class BasicTCPTest(SocketConnectedTest):
561
562 def __init__(self, methodName='runTest'):
563 SocketConnectedTest.__init__(self, methodName=methodName)
564
565 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000566 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000568 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000569
570 def _testRecv(self):
571 self.serv_conn.send(MSG)
572
573 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000574 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 seg1 = self.cli_conn.recv(len(MSG) - 3)
576 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000577 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000578 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000579
580 def _testOverFlowRecv(self):
581 self.serv_conn.send(MSG)
582
583 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000584 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000586 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587
588 def _testRecvFrom(self):
589 self.serv_conn.send(MSG)
590
591 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000592 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
594 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000595 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000596 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597
598 def _testOverFlowRecvFrom(self):
599 self.serv_conn.send(MSG)
600
601 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000602 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000603 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 while 1:
605 read = self.cli_conn.recv(1024)
606 if not read:
607 break
Guido van Rossume531e292002-08-08 20:28:34 +0000608 msg += read
609 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000610
611 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000612 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613 self.serv_conn.sendall(big_chunk)
614
615 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000617 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000618 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 fd = self.cli_conn.fileno()
620 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
621 msg = sock.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 _testFromFd(self):
625 self.serv_conn.send(MSG)
626
627 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000628 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000629 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000630 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000631 # wait for _testShutdown to finish: on OS X, when the server
632 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000633 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000634 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000635
636 def _testShutdown(self):
637 self.serv_conn.send(MSG)
638 self.serv_conn.shutdown(2)
639
Victor Stinner6a102812010-04-27 23:55:59 +0000640@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641class BasicUDPTest(ThreadedUDPSocketTest):
642
643 def __init__(self, methodName='runTest'):
644 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
645
646 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000647 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000649 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000650
651 def _testSendtoAndRecv(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
Guido van Rossum1c938012002-06-12 21:17:20 +0000654 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000655 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000656 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000657 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000658
Guido van Rossum1c938012002-06-12 21:17:20 +0000659 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000660 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661
Facundo Batista1fe9f962007-03-28 03:45:20 +0000662 def testRecvFromNegative(self):
663 # Negative lengths passed to recvfrom should give ValueError.
664 self.assertRaises(ValueError, self.serv.recvfrom, -1)
665
666 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000667 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000668
Victor Stinner6a102812010-04-27 23:55:59 +0000669@unittest.skipUnless(thread, 'Threading required for this test.')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000670class TCPCloserTest(ThreadedTCPSocketTest):
671
672 def testClose(self):
673 conn, addr = self.serv.accept()
674 conn.close()
675
676 sd = self.cli
677 read, write, err = select.select([sd], [], [], 1.0)
678 self.assertEqual(read, [sd])
679 self.assertEqual(sd.recv(1), '')
680
681 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000682 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000683 time.sleep(1.0)
684
Victor Stinner6a102812010-04-27 23:55:59 +0000685@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000686class BasicSocketPairTest(SocketPairTest):
687
688 def __init__(self, methodName='runTest'):
689 SocketPairTest.__init__(self, methodName=methodName)
690
691 def testRecv(self):
692 msg = self.serv.recv(1024)
693 self.assertEqual(msg, MSG)
694
695 def _testRecv(self):
696 self.cli.send(MSG)
697
698 def testSend(self):
699 self.serv.send(MSG)
700
701 def _testSend(self):
702 msg = self.cli.recv(1024)
703 self.assertEqual(msg, MSG)
704
Victor Stinner6a102812010-04-27 23:55:59 +0000705@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706class NonBlockingTCPTests(ThreadedTCPSocketTest):
707
708 def __init__(self, methodName='runTest'):
709 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
710
711 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000712 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 self.serv.setblocking(0)
714 start = time.time()
715 try:
716 self.serv.accept()
717 except socket.error:
718 pass
719 end = time.time()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000720 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
722 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000723 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000724
Guido van Rossum24e4af82002-06-12 19:18:08 +0000725 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000726 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000728 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 conn, addr = self.serv.accept()
730 except socket.error:
731 pass
732 else:
733 self.fail("Error trying to do non-blocking accept.")
734 read, write, err = select.select([self.serv], [], [])
735 if self.serv in read:
736 conn, addr = self.serv.accept()
737 else:
738 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000741 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000742 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000743
744 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000745 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000746 conn, addr = self.serv.accept()
747
748 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000749 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000750 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000751
752 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000753 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000754 conn, addr = self.serv.accept()
755 conn.setblocking(0)
756 try:
757 msg = conn.recv(len(MSG))
758 except socket.error:
759 pass
760 else:
761 self.fail("Error trying to do non-blocking recv.")
762 read, write, err = select.select([conn], [], [])
763 if conn in read:
764 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000765 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 else:
767 self.fail("Error during select call to non-blocking socket.")
768
769 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000770 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000771 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000772 self.cli.send(MSG)
773
Victor Stinner6a102812010-04-27 23:55:59 +0000774@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000775class FileObjectClassTestCase(SocketConnectedTest):
776
Guido van Rossume9f66142002-08-07 15:46:19 +0000777 bufsize = -1 # Use default buffer size
778
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 def __init__(self, methodName='runTest'):
780 SocketConnectedTest.__init__(self, methodName=methodName)
781
782 def setUp(self):
783 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000784 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785
786 def tearDown(self):
787 self.serv_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000788 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000789 self.serv_file = None
790 SocketConnectedTest.tearDown(self)
791
792 def clientSetUp(self):
793 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000794 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000795
796 def clientTearDown(self):
797 self.cli_file.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000798 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 self.cli_file = None
800 SocketConnectedTest.clientTearDown(self)
801
802 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000803 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804 first_seg = self.serv_file.read(len(MSG)-3)
805 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000806 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000807 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000808
809 def _testSmallRead(self):
810 self.cli_file.write(MSG)
811 self.cli_file.flush()
812
Guido van Rossum8c943832002-08-08 01:00:28 +0000813 def testFullRead(self):
814 # read until EOF
815 msg = self.serv_file.read()
816 self.assertEqual(msg, MSG)
817
818 def _testFullRead(self):
819 self.cli_file.write(MSG)
820 self.cli_file.close()
821
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000823 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 buf = ''
825 while 1:
826 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000829 buf += char
830 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000831
832 def _testUnbufferedRead(self):
833 self.cli_file.write(MSG)
834 self.cli_file.flush()
835
836 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000839 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def _testReadline(self):
842 self.cli_file.write(MSG)
843 self.cli_file.flush()
844
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000845 def testReadlineAfterRead(self):
846 a_baloo_is = self.serv_file.read(len("A baloo is"))
847 self.assertEqual("A baloo is", a_baloo_is)
848 _a_bear = self.serv_file.read(len(" a bear"))
849 self.assertEqual(" a bear", _a_bear)
850 line = self.serv_file.readline()
851 self.assertEqual("\n", line)
852 line = self.serv_file.readline()
853 self.assertEqual("A BALOO IS A BEAR.\n", line)
854 line = self.serv_file.readline()
855 self.assertEqual(MSG, line)
856
857 def _testReadlineAfterRead(self):
858 self.cli_file.write("A baloo is a bear\n")
859 self.cli_file.write("A BALOO IS A BEAR.\n")
860 self.cli_file.write(MSG)
861 self.cli_file.flush()
862
863 def testReadlineAfterReadNoNewline(self):
864 end_of_ = self.serv_file.read(len("End Of "))
865 self.assertEqual("End Of ", end_of_)
866 line = self.serv_file.readline()
867 self.assertEqual("Line", line)
868
869 def _testReadlineAfterReadNoNewline(self):
870 self.cli_file.write("End Of Line")
871
Tim Peters116d83c2004-03-28 02:20:45 +0000872 def testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000873 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000874
875 def _testClosedAttr(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000876 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000877
Gregory P. Smithc4ad0342009-08-13 18:54:50 +0000878
879class FileObjectInterruptedTestCase(unittest.TestCase):
880 """Test that the file object correctly handles EINTR internally."""
881
882 class MockSocket(object):
883 def __init__(self, recv_funcs=()):
884 # A generator that returns callables that we'll call for each
885 # call to recv().
886 self._recv_step = iter(recv_funcs)
887
888 def recv(self, size):
889 return self._recv_step.next()()
890
891 @staticmethod
892 def _raise_eintr():
893 raise socket.error(errno.EINTR)
894
895 def _test_readline(self, size=-1, **kwargs):
896 mock_sock = self.MockSocket(recv_funcs=[
897 lambda : "This is the first line\nAnd the sec",
898 self._raise_eintr,
899 lambda : "ond line is here\n",
900 lambda : "",
901 ])
902 fo = socket._fileobject(mock_sock, **kwargs)
903 self.assertEquals(fo.readline(size), "This is the first line\n")
904 self.assertEquals(fo.readline(size), "And the second line is here\n")
905
906 def _test_read(self, size=-1, **kwargs):
907 mock_sock = self.MockSocket(recv_funcs=[
908 lambda : "This is the first line\nAnd the sec",
909 self._raise_eintr,
910 lambda : "ond line is here\n",
911 lambda : "",
912 ])
913 fo = socket._fileobject(mock_sock, **kwargs)
914 self.assertEquals(fo.read(size), "This is the first line\n"
915 "And the second line is here\n")
916
917 def test_default(self):
918 self._test_readline()
919 self._test_readline(size=100)
920 self._test_read()
921 self._test_read(size=100)
922
923 def test_with_1k_buffer(self):
924 self._test_readline(bufsize=1024)
925 self._test_readline(size=100, bufsize=1024)
926 self._test_read(bufsize=1024)
927 self._test_read(size=100, bufsize=1024)
928
929 def _test_readline_no_buffer(self, size=-1):
930 mock_sock = self.MockSocket(recv_funcs=[
931 lambda : "aa",
932 lambda : "\n",
933 lambda : "BB",
934 self._raise_eintr,
935 lambda : "bb",
936 lambda : "",
937 ])
938 fo = socket._fileobject(mock_sock, bufsize=0)
939 self.assertEquals(fo.readline(size), "aa\n")
940 self.assertEquals(fo.readline(size), "BBbb")
941
942 def test_no_buffer(self):
943 self._test_readline_no_buffer()
944 self._test_readline_no_buffer(size=4)
945 self._test_read(bufsize=0)
946 self._test_read(size=100, bufsize=0)
947
948
Guido van Rossume9f66142002-08-07 15:46:19 +0000949class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
950
951 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000952
Guido van Rossume9f66142002-08-07 15:46:19 +0000953 In this case (and in this case only), it should be possible to
954 create a file object, read a line from it, create another file
955 object, read another line from it, without loss of data in the
956 first file object's buffer. Note that httplib relies on this
957 when reading multiple requests from the same socket."""
958
959 bufsize = 0 # Use unbuffered mode
960
961 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000962 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000963 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000964 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000965 self.serv_file = self.cli_conn.makefile('rb', 0)
966 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000967 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000968
969 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000970 self.cli_file.write("A. " + MSG)
971 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000972 self.cli_file.flush()
973
Guido van Rossum8c943832002-08-08 01:00:28 +0000974class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
975
976 bufsize = 1 # Default-buffered for reading; line-buffered for writing
977
978
979class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
980
981 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000982
Georg Brandldd7b0522007-01-21 10:35:10 +0000983
Facundo Batista07c78be2007-03-23 18:54:07 +0000984class NetworkConnectionTest(object):
985 """Prove network connection."""
986 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000987 # We're inherited below by BasicTCPTest2, which also inherits
988 # BasicTCPTest, which defines self.port referenced below.
989 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000990 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000991
Facundo Batista07c78be2007-03-23 18:54:07 +0000992class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
993 """Tests that NetworkConnection does not break existing TCP functionality.
994 """
995
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000996class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000997 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000998 port = test_support.find_unused_port()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000999 self.assertRaises(
Trent Nelsone41b0062008-04-08 23:47:30 +00001000 socket.error,
1001 lambda: socket.create_connection((HOST, port))
1002 )
Facundo Batista07c78be2007-03-23 18:54:07 +00001003
Victor Stinner6a102812010-04-27 23:55:59 +00001004@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001005class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1006
1007 def __init__(self, methodName='runTest'):
1008 SocketTCPTest.__init__(self, methodName=methodName)
1009 ThreadableTest.__init__(self)
1010
1011 def clientSetUp(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001012 self.source_port = test_support.find_unused_port()
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001013
1014 def clientTearDown(self):
1015 self.cli.close()
1016 self.cli = None
1017 ThreadableTest.clientTearDown(self)
1018
1019 def _justAccept(self):
1020 conn, addr = self.serv.accept()
1021
1022 testFamily = _justAccept
1023 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001024 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001025 self.assertEqual(self.cli.family, 2)
1026
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001027 testSourceAddress = _justAccept
1028 def _testSourceAddress(self):
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001029 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1030 source_address=('', self.source_port))
1031 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smith49d709c2010-01-03 15:05:52 +00001032 # The port number being used is sufficient to show that the bind()
1033 # call happened.
Gregory P. Smith79a3eb12010-01-03 01:29:44 +00001034
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001035 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001036 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001037 # passing no explicit timeout uses socket's global default
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001038 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001039 socket.setdefaulttimeout(42)
1040 try:
1041 self.cli = socket.create_connection((HOST, self.port))
1042 finally:
1043 socket.setdefaulttimeout(None)
1044 self.assertEquals(self.cli.gettimeout(), 42)
1045
1046 testTimeoutNone = _justAccept
1047 def _testTimeoutNone(self):
1048 # None timeout means the same as sock.settimeout(None)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001049 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +00001050 socket.setdefaulttimeout(30)
1051 try:
1052 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1053 finally:
1054 socket.setdefaulttimeout(None)
1055 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001056
1057 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001058 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001059 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001060 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001061
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001062 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001063 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001064 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001065 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001066
Victor Stinner6a102812010-04-27 23:55:59 +00001067@unittest.skipUnless(thread, 'Threading required for this test.')
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001068class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1069
1070 def __init__(self, methodName='runTest'):
1071 SocketTCPTest.__init__(self, methodName=methodName)
1072 ThreadableTest.__init__(self)
1073
1074 def clientSetUp(self):
1075 pass
1076
1077 def clientTearDown(self):
1078 self.cli.close()
1079 self.cli = None
1080 ThreadableTest.clientTearDown(self)
1081
Facundo Batista07c78be2007-03-23 18:54:07 +00001082 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001083 conn, addr = self.serv.accept()
1084 time.sleep(3)
1085 conn.send("done!")
1086 testOutsideTimeout = testInsideTimeout
1087
1088 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001089 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001090 data = sock.recv(5)
1091 self.assertEqual(data, "done!")
1092
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001093 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001094 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001095 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Facundo Batista07c78be2007-03-23 18:54:07 +00001096
1097
Georg Brandldd7b0522007-01-21 10:35:10 +00001098class Urllib2FileobjectTest(unittest.TestCase):
1099
1100 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1101 # it close the socket if the close c'tor argument is true
1102
1103 def testClose(self):
1104 class MockSocket:
1105 closed = False
1106 def flush(self): pass
1107 def close(self): self.closed = True
1108
1109 # must not close unless we request it: the original use of _fileobject
1110 # by module socket requires that the underlying socket not be closed until
1111 # the _socketobject that created the _fileobject is closed
1112 s = MockSocket()
1113 f = socket._fileobject(s)
1114 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001115 self.assertTrue(not s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001116
1117 s = MockSocket()
1118 f = socket._fileobject(s, close=True)
1119 f.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001120 self.assertTrue(s.closed)
Georg Brandldd7b0522007-01-21 10:35:10 +00001121
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001122class TCPTimeoutTest(SocketTCPTest):
1123
1124 def testTCPTimeout(self):
1125 def raise_timeout(*args, **kwargs):
1126 self.serv.settimeout(1.0)
1127 self.serv.accept()
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001128 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001129 "Error generating a timeout exception (TCP)")
1130
1131 def testTimeoutZero(self):
1132 ok = False
1133 try:
1134 self.serv.settimeout(0.0)
1135 foo = self.serv.accept()
1136 except socket.timeout:
1137 self.fail("caught timeout instead of error (TCP)")
1138 except socket.error:
1139 ok = True
1140 except:
1141 self.fail("caught unexpected exception (TCP)")
1142 if not ok:
1143 self.fail("accept() returned success when we did not expect it")
1144
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001145 def testInterruptedTimeout(self):
1146 # XXX I don't know how to do this test on MSWindows or any other
1147 # plaform that doesn't support signal.alarm() or os.kill(), though
1148 # the bug should have existed on all platforms.
1149 if not hasattr(signal, "alarm"):
1150 return # can only test on *nix
1151 self.serv.settimeout(5.0) # must be longer than alarm
1152 class Alarm(Exception):
1153 pass
1154 def alarm_handler(signal, frame):
1155 raise Alarm
1156 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1157 try:
1158 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1159 try:
1160 foo = self.serv.accept()
1161 except socket.timeout:
1162 self.fail("caught timeout instead of Alarm")
1163 except Alarm:
1164 pass
1165 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001166 self.fail("caught other exception instead of Alarm:"
1167 " %s(%s):\n%s" %
1168 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001169 else:
1170 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001171 finally:
1172 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001173 except Alarm:
1174 self.fail("got Alarm in wrong place")
1175 finally:
1176 # no alarm can be pending. Safe to restore old handler.
1177 signal.signal(signal.SIGALRM, old_alarm)
1178
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001179class UDPTimeoutTest(SocketTCPTest):
1180
1181 def testUDPTimeout(self):
1182 def raise_timeout(*args, **kwargs):
1183 self.serv.settimeout(1.0)
1184 self.serv.recv(1024)
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001185 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001186 "Error generating a timeout exception (UDP)")
1187
1188 def testTimeoutZero(self):
1189 ok = False
1190 try:
1191 self.serv.settimeout(0.0)
1192 foo = self.serv.recv(1024)
1193 except socket.timeout:
1194 self.fail("caught timeout instead of error (UDP)")
1195 except socket.error:
1196 ok = True
1197 except:
1198 self.fail("caught unexpected exception (UDP)")
1199 if not ok:
1200 self.fail("recv() returned success when we did not expect it")
1201
1202class TestExceptions(unittest.TestCase):
1203
1204 def testExceptionTree(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001205 self.assertTrue(issubclass(socket.error, Exception))
1206 self.assertTrue(issubclass(socket.herror, socket.error))
1207 self.assertTrue(issubclass(socket.gaierror, socket.error))
1208 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001209
Armin Rigoa9017c32006-04-19 11:50:27 +00001210class TestLinuxAbstractNamespace(unittest.TestCase):
1211
1212 UNIX_PATH_MAX = 108
1213
1214 def testLinuxAbstractNamespace(self):
1215 address = "\x00python-test-hello\x00\xff"
1216 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1217 s1.bind(address)
1218 s1.listen(1)
1219 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1220 s2.connect(s1.getsockname())
1221 s1.accept()
1222 self.assertEqual(s1.getsockname(), address)
1223 self.assertEqual(s2.getpeername(), address)
1224
1225 def testMaxName(self):
1226 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1227 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1228 s.bind(address)
1229 self.assertEqual(s.getsockname(), address)
1230
1231 def testNameOverflow(self):
1232 address = "\x00" + "h" * self.UNIX_PATH_MAX
1233 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1234 self.assertRaises(socket.error, s.bind, address)
1235
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001236
Victor Stinner6a102812010-04-27 23:55:59 +00001237@unittest.skipUnless(thread, 'Threading required for this test.')
Martin Blais2856e5f2006-05-26 12:03:27 +00001238class BufferIOTest(SocketConnectedTest):
1239 """
1240 Test the buffer versions of socket.recv() and socket.send().
1241 """
1242 def __init__(self, methodName='runTest'):
1243 SocketConnectedTest.__init__(self, methodName=methodName)
1244
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001245 def testRecvIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001246 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001247 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001248 self.assertEqual(nbytes, len(MSG))
1249 msg = buf.tostring()[:len(MSG)]
1250 self.assertEqual(msg, MSG)
1251
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001252 def _testRecvIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001253 with test_support.check_py3k_warnings():
1254 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001255 self.serv_conn.send(buf)
1256
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001257 def testRecvIntoBytearray(self):
1258 buf = bytearray(1024)
1259 nbytes = self.cli_conn.recv_into(buf)
1260 self.assertEqual(nbytes, len(MSG))
1261 msg = buf[:len(MSG)]
1262 self.assertEqual(msg, MSG)
1263
1264 _testRecvIntoBytearray = _testRecvIntoArray
1265
1266 def testRecvIntoMemoryview(self):
1267 buf = bytearray(1024)
1268 nbytes = self.cli_conn.recv_into(memoryview(buf))
1269 self.assertEqual(nbytes, len(MSG))
1270 msg = buf[:len(MSG)]
1271 self.assertEqual(msg, MSG)
1272
1273 _testRecvIntoMemoryview = _testRecvIntoArray
1274
1275 def testRecvFromIntoArray(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001276 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001277 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001278 self.assertEqual(nbytes, len(MSG))
1279 msg = buf.tostring()[:len(MSG)]
1280 self.assertEqual(msg, MSG)
1281
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001282 def _testRecvFromIntoArray(self):
Florent Xicluna07627882010-03-21 01:14:24 +00001283 with test_support.check_py3k_warnings():
1284 buf = buffer(MSG)
Martin Blais2856e5f2006-05-26 12:03:27 +00001285 self.serv_conn.send(buf)
1286
Antoine Pitroud7b731d2010-03-17 22:45:39 +00001287 def testRecvFromIntoBytearray(self):
1288 buf = bytearray(1024)
1289 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1290 self.assertEqual(nbytes, len(MSG))
1291 msg = buf[:len(MSG)]
1292 self.assertEqual(msg, MSG)
1293
1294 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1295
1296 def testRecvFromIntoMemoryview(self):
1297 buf = bytearray(1024)
1298 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1299 self.assertEqual(nbytes, len(MSG))
1300 msg = buf[:len(MSG)]
1301 self.assertEqual(msg, MSG)
1302
1303 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1304
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001305
1306TIPC_STYPE = 2000
1307TIPC_LOWER = 200
1308TIPC_UPPER = 210
1309
1310def isTipcAvailable():
1311 """Check if the TIPC module is loaded
1312
1313 The TIPC module is not loaded automatically on Ubuntu and probably
1314 other Linux distros.
1315 """
1316 if not hasattr(socket, "AF_TIPC"):
1317 return False
1318 if not os.path.isfile("/proc/modules"):
1319 return False
1320 with open("/proc/modules") as f:
1321 for line in f:
1322 if line.startswith("tipc "):
1323 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001324 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001325 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1326 return False
1327
1328class TIPCTest (unittest.TestCase):
1329 def testRDM(self):
1330 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1331 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1332
1333 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1334 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1335 TIPC_LOWER, TIPC_UPPER)
1336 srv.bind(srvaddr)
1337
1338 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1339 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1340 cli.sendto(MSG, sendaddr)
1341
1342 msg, recvaddr = srv.recvfrom(1024)
1343
1344 self.assertEqual(cli.getsockname(), recvaddr)
1345 self.assertEqual(msg, MSG)
1346
1347
1348class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1349 def __init__(self, methodName = 'runTest'):
1350 unittest.TestCase.__init__(self, methodName = methodName)
1351 ThreadableTest.__init__(self)
1352
1353 def setUp(self):
1354 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1355 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1356 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1357 TIPC_LOWER, TIPC_UPPER)
1358 self.srv.bind(srvaddr)
1359 self.srv.listen(5)
1360 self.serverExplicitReady()
1361 self.conn, self.connaddr = self.srv.accept()
1362
1363 def clientSetUp(self):
1364 # The is a hittable race between serverExplicitReady() and the
1365 # accept() call; sleep a little while to avoid it, otherwise
1366 # we could get an exception
1367 time.sleep(0.1)
1368 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1369 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1370 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1371 self.cli.connect(addr)
1372 self.cliaddr = self.cli.getsockname()
1373
1374 def testStream(self):
1375 msg = self.conn.recv(1024)
1376 self.assertEqual(msg, MSG)
1377 self.assertEqual(self.cliaddr, self.connaddr)
1378
1379 def _testStream(self):
1380 self.cli.send(MSG)
1381 self.cli.close()
1382
1383
Guido van Rossumb995eb72002-07-31 16:08:40 +00001384def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001385 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren9545a232010-05-05 19:09:31 +00001386 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest,
1387 UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001388
1389 tests.extend([
1390 NonBlockingTCPTests,
1391 FileObjectClassTestCase,
Gregory P. Smithc4ad0342009-08-13 18:54:50 +00001392 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001393 UnbufferedFileObjectClassTestCase,
1394 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001395 SmallBufferedFileObjectClassTestCase,
1396 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001397 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001398 NetworkConnectionAttributesTest,
1399 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001400 ])
Dave Cole331708b2004-08-09 04:51:41 +00001401 if hasattr(socket, "socketpair"):
1402 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001403 if sys.platform == 'linux2':
1404 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001405 if isTipcAvailable():
1406 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001407 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001408
1409 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001410 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001411 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001412
1413if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001414 test_main()