blob: 7380e3ef3d6705b21843198d24b65469a03fa1ef [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()
126 if not callable(test_func):
127 raise TypeError, "test_func must be a callable function"
128 try:
129 test_func()
130 except Exception, strerror:
131 self.queue.put(strerror)
132 self.clientTearDown()
133
134 def clientSetUp(self):
135 raise NotImplementedError, "clientSetUp must be implemented."
136
137 def clientTearDown(self):
138 self.done.set()
139 thread.exit()
140
141class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
142
143 def __init__(self, methodName='runTest'):
144 SocketTCPTest.__init__(self, methodName=methodName)
145 ThreadableTest.__init__(self)
146
147 def clientSetUp(self):
148 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
149
150 def clientTearDown(self):
151 self.cli.close()
152 self.cli = None
153 ThreadableTest.clientTearDown(self)
154
155class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
156
157 def __init__(self, methodName='runTest'):
158 SocketUDPTest.__init__(self, methodName=methodName)
159 ThreadableTest.__init__(self)
160
161 def clientSetUp(self):
162 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
163
164class SocketConnectedTest(ThreadedTCPSocketTest):
165
166 def __init__(self, methodName='runTest'):
167 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
168
169 def setUp(self):
170 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000171 # Indicate explicitly we're ready for the client thread to
172 # proceed and then perform the blocking call to accept
173 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000174 conn, addr = self.serv.accept()
175 self.cli_conn = conn
176
177 def tearDown(self):
178 self.cli_conn.close()
179 self.cli_conn = None
180 ThreadedTCPSocketTest.tearDown(self)
181
182 def clientSetUp(self):
183 ThreadedTCPSocketTest.clientSetUp(self)
Trent Nelsone41b0062008-04-08 23:47:30 +0000184 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000185 self.serv_conn = self.cli
186
187 def clientTearDown(self):
188 self.serv_conn.close()
189 self.serv_conn = None
190 ThreadedTCPSocketTest.clientTearDown(self)
191
Dave Cole331708b2004-08-09 04:51:41 +0000192class SocketPairTest(unittest.TestCase, ThreadableTest):
193
194 def __init__(self, methodName='runTest'):
195 unittest.TestCase.__init__(self, methodName=methodName)
196 ThreadableTest.__init__(self)
197
198 def setUp(self):
199 self.serv, self.cli = socket.socketpair()
200
201 def tearDown(self):
202 self.serv.close()
203 self.serv = None
204
205 def clientSetUp(self):
206 pass
207
208 def clientTearDown(self):
209 self.cli.close()
210 self.cli = None
211 ThreadableTest.clientTearDown(self)
212
Tim Peters494aaee2004-08-09 18:54:11 +0000213
Guido van Rossum24e4af82002-06-12 19:18:08 +0000214#######################################################################
215## Begin Tests
216
217class GeneralModuleTests(unittest.TestCase):
218
Raymond Hettinger027bb632004-05-31 03:09:25 +0000219 def test_weakref(self):
220 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
221 p = proxy(s)
222 self.assertEqual(p.fileno(), s.fileno())
223 s.close()
224 s = None
225 try:
226 p.fileno()
227 except ReferenceError:
228 pass
229 else:
230 self.fail('Socket proxy still exists')
231
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000233 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000234 def raise_error(*args, **kwargs):
235 raise socket.error
236 def raise_herror(*args, **kwargs):
237 raise socket.herror
238 def raise_gaierror(*args, **kwargs):
239 raise socket.gaierror
240 self.failUnlessRaises(socket.error, raise_error,
241 "Error raising socket exception.")
242 self.failUnlessRaises(socket.error, raise_herror,
243 "Error raising socket exception.")
244 self.failUnlessRaises(socket.error, raise_gaierror,
245 "Error raising socket exception.")
246
247 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000248 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000249 socket.AF_INET
250 socket.SOCK_STREAM
251 socket.SOCK_DGRAM
252 socket.SOCK_RAW
253 socket.SOCK_RDM
254 socket.SOCK_SEQPACKET
255 socket.SOL_SOCKET
256 socket.SO_REUSEADDR
257
Guido van Rossum654c11e2002-06-13 20:24:17 +0000258 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000259 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000260 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000261 try:
262 ip = socket.gethostbyname(hostname)
263 except socket.error:
264 # Probably name lookup wasn't set up right; skip this test
265 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000266 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000267 try:
268 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
269 except socket.error:
270 # Probably a similar problem as above; skip this test
271 return
Brett Cannon01668a12005-03-11 00:04:17 +0000272 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000273 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000274 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000275 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000276
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000277 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000278 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000279 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 try:
281 # On some versions, this loses a reference
282 orig = sys.getrefcount(__name__)
283 socket.getnameinfo(__name__,0)
Georg Brandl3ad28472009-09-19 07:46:24 +0000284 except TypeError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 if sys.getrefcount(__name__) <> orig:
286 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000287
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000289 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290 try:
291 # On some versions, this crashes the interpreter.
292 socket.getnameinfo(('x', 0, 0, 0), 0)
293 except socket.error:
294 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000295
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000296 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000297 # This just checks that htons etc. are their own inverse,
298 # when looking at the lower 16 or 32 bits.
299 sizes = {socket.htonl: 32, socket.ntohl: 32,
300 socket.htons: 16, socket.ntohs: 16}
301 for func, size in sizes.items():
302 mask = (1L<<size) - 1
303 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
304 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000305
Guido van Rossuma2627af2002-09-14 00:58:46 +0000306 swapped = func(mask)
307 self.assertEqual(swapped & mask, mask)
308 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000309
Guido van Rossumbb2cc692007-01-14 17:03:32 +0000310 def testNtoHErrors(self):
311 good_values = [ 1, 2, 3, 1L, 2L, 3L ]
312 bad_values = [ -1, -2, -3, -1L, -2L, -3L ]
313 for k in good_values:
314 socket.ntohl(k)
315 socket.ntohs(k)
316 socket.htonl(k)
317 socket.htons(k)
318 for k in bad_values:
319 self.assertRaises(OverflowError, socket.ntohl, k)
320 self.assertRaises(OverflowError, socket.ntohs, k)
321 self.assertRaises(OverflowError, socket.htonl, k)
322 self.assertRaises(OverflowError, socket.htons, k)
323
Barry Warsaw11b91a02004-06-28 00:50:43 +0000324 def testGetServBy(self):
325 eq = self.assertEqual
326 # Find one service that exists, then check all the related interfaces.
327 # I've ordered this by protocols that have both a tcp and udp
328 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000329 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Changea684742007-10-28 12:38:09 +0000330 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000331 # avoid the 'echo' service on this platform, as there is an
332 # assumption breaking non-standard port/protocol entry
333 services = ('daytime', 'qotd', 'domain')
334 else:
335 services = ('echo', 'daytime', 'domain')
336 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000337 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000338 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000339 break
340 except socket.error:
341 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000342 else:
343 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000344 # Try same call with optional protocol omitted
345 port2 = socket.getservbyname(service)
346 eq(port, port2)
347 # Try udp, but don't barf it it doesn't exist
348 try:
349 udpport = socket.getservbyname(service, 'udp')
350 except socket.error:
351 udpport = None
352 else:
353 eq(udpport, port)
354 # Now make sure the lookup by port returns the same service name
355 eq(socket.getservbyport(port2), service)
356 eq(socket.getservbyport(port, 'tcp'), service)
357 if udpport is not None:
358 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000359
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000360 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000361 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000362 # The default timeout should initially be None
363 self.assertEqual(socket.getdefaulttimeout(), None)
364 s = socket.socket()
365 self.assertEqual(s.gettimeout(), None)
366 s.close()
367
368 # Set the default timeout to 10, and see if it propagates
369 socket.setdefaulttimeout(10)
370 self.assertEqual(socket.getdefaulttimeout(), 10)
371 s = socket.socket()
372 self.assertEqual(s.gettimeout(), 10)
373 s.close()
374
375 # Reset the default timeout to None, and see if it propagates
376 socket.setdefaulttimeout(None)
377 self.assertEqual(socket.getdefaulttimeout(), None)
378 s = socket.socket()
379 self.assertEqual(s.gettimeout(), None)
380 s.close()
381
382 # Check that setting it to an invalid value raises ValueError
383 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
384
385 # Check that setting it to an invalid type raises TypeError
386 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
387
Gregory P. Smith63e64ad2009-11-01 20:28:48 +0000388 def testIPv4_inet_aton_fourbytes(self):
389 if not hasattr(socket, 'inet_aton'):
390 return # No inet_aton, nothing to check
391 # Test that issue1008086 and issue767150 are fixed.
392 # It must return 4 bytes.
393 self.assertEquals('\x00'*4, socket.inet_aton('0.0.0.0'))
394 self.assertEquals('\xff'*4, socket.inet_aton('255.255.255.255'))
395
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000396 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000397 if not hasattr(socket, 'inet_pton'):
398 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000399 from socket import inet_aton as f, inet_pton, AF_INET
400 g = lambda a: inet_pton(AF_INET, a)
401
402 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
403 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
404 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
405 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000406 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000407
408 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
409 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
410 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000411 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000412
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000413 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000414 if not hasattr(socket, 'inet_pton'):
415 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000416 try:
417 from socket import inet_pton, AF_INET6, has_ipv6
418 if not has_ipv6:
419 return
420 except ImportError:
421 return
422 f = lambda a: inet_pton(AF_INET6, a)
423
424 self.assertEquals('\x00' * 16, f('::'))
425 self.assertEquals('\x00' * 16, f('0::0'))
426 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
427 self.assertEquals(
428 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
429 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
430 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000431
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000432 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000433 if not hasattr(socket, 'inet_ntop'):
434 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000435 from socket import inet_ntoa as f, inet_ntop, AF_INET
436 g = lambda a: inet_ntop(AF_INET, a)
437
438 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
439 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
440 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
441 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000442
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000443 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
444 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
445 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
446
447 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000448 if not hasattr(socket, 'inet_ntop'):
449 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000450 try:
451 from socket import inet_ntop, AF_INET6, has_ipv6
452 if not has_ipv6:
453 return
454 except ImportError:
455 return
456 f = lambda a: inet_ntop(AF_INET6, a)
457
458 self.assertEquals('::', f('\x00' * 16))
459 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
460 self.assertEquals(
461 'aef:b01:506:1001:ffff:9997:55:170',
462 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
463 )
464
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000465 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000466
Guido van Rossum24e4af82002-06-12 19:18:08 +0000467 def testSockName(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000468 # Testing getsockname(). Use a temporary socket to elicit an unused
469 # ephemeral port that we can use later in the test.
470 tempsock = socket.socket()
471 tempsock.bind(("0.0.0.0", 0))
472 (host, port) = tempsock.getsockname()
473 tempsock.close()
474 del tempsock
475
Guido van Rossum24e4af82002-06-12 19:18:08 +0000476 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000477 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000479 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
480 # it reasonable to get the host's addr in addition to 0.0.0.0.
481 # At least for eCos. This is required for the S/390 to pass.
482 my_ip_addr = socket.gethostbyname(socket.gethostname())
483 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000484 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000485
486 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000487 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 # We know a socket should start without reuse==0
489 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
490 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000491 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000492
493 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000494 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
496 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
497 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000498 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000499
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000500 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000501 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000502 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
503 sock.settimeout(1)
504 sock.close()
505 self.assertRaises(socket.error, sock.send, "spam")
506
Georg Brandlbb03ac02006-03-21 18:17:25 +0000507 def testNewAttributes(self):
508 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000509 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000510 self.assertEqual(sock.family, socket.AF_INET)
511 self.assertEqual(sock.type, socket.SOCK_STREAM)
512 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000513 sock.close()
514
Christian Heimesa47b75b2008-01-04 15:48:06 +0000515 def test_sock_ioctl(self):
516 if os.name != "nt":
517 return
518 self.assert_(hasattr(socket.socket, 'ioctl'))
519 self.assert_(hasattr(socket, 'SIO_RCVALL'))
520 self.assert_(hasattr(socket, 'RCVALL_ON'))
521 self.assert_(hasattr(socket, 'RCVALL_OFF'))
522
523
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524class BasicTCPTest(SocketConnectedTest):
525
526 def __init__(self, methodName='runTest'):
527 SocketConnectedTest.__init__(self, methodName=methodName)
528
529 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000532 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533
534 def _testRecv(self):
535 self.serv_conn.send(MSG)
536
537 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000538 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539 seg1 = self.cli_conn.recv(len(MSG) - 3)
540 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000541 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000542 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543
544 def _testOverFlowRecv(self):
545 self.serv_conn.send(MSG)
546
547 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000548 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000550 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551
552 def _testRecvFrom(self):
553 self.serv_conn.send(MSG)
554
555 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000556 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000557 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
558 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000559 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000560 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561
562 def _testOverFlowRecvFrom(self):
563 self.serv_conn.send(MSG)
564
565 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000566 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000567 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000568 while 1:
569 read = self.cli_conn.recv(1024)
570 if not read:
571 break
Guido van Rossume531e292002-08-08 20:28:34 +0000572 msg += read
573 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574
575 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000576 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577 self.serv_conn.sendall(big_chunk)
578
579 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000580 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000581 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000582 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000583 fd = self.cli_conn.fileno()
584 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
585 msg = sock.recv(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 _testFromFd(self):
589 self.serv_conn.send(MSG)
590
591 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000592 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000594 self.assertEqual(msg, MSG)
Mark Dickinson17d83f32009-01-15 15:25:51 +0000595 # wait for _testShutdown to finish: on OS X, when the server
596 # closes the connection the client also becomes disconnected,
597 # and the client's shutdown call will fail. (Issue #4397.)
598 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000599
600 def _testShutdown(self):
601 self.serv_conn.send(MSG)
602 self.serv_conn.shutdown(2)
603
604class BasicUDPTest(ThreadedUDPSocketTest):
605
606 def __init__(self, methodName='runTest'):
607 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
608
609 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000610 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000612 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
614 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000615 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616
Guido van Rossum1c938012002-06-12 21:17:20 +0000617 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000618 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000620 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621
Guido van Rossum1c938012002-06-12 21:17:20 +0000622 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000623 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000624
Facundo Batista1fe9f962007-03-28 03:45:20 +0000625 def testRecvFromNegative(self):
626 # Negative lengths passed to recvfrom should give ValueError.
627 self.assertRaises(ValueError, self.serv.recvfrom, -1)
628
629 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000630 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000631
Martin v. Löwis7596e832006-07-01 15:33:37 +0000632class TCPCloserTest(ThreadedTCPSocketTest):
633
634 def testClose(self):
635 conn, addr = self.serv.accept()
636 conn.close()
637
638 sd = self.cli
639 read, write, err = select.select([sd], [], [], 1.0)
640 self.assertEqual(read, [sd])
641 self.assertEqual(sd.recv(1), '')
642
643 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000644 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000645 time.sleep(1.0)
646
Dave Cole331708b2004-08-09 04:51:41 +0000647class BasicSocketPairTest(SocketPairTest):
648
649 def __init__(self, methodName='runTest'):
650 SocketPairTest.__init__(self, methodName=methodName)
651
652 def testRecv(self):
653 msg = self.serv.recv(1024)
654 self.assertEqual(msg, MSG)
655
656 def _testRecv(self):
657 self.cli.send(MSG)
658
659 def testSend(self):
660 self.serv.send(MSG)
661
662 def _testSend(self):
663 msg = self.cli.recv(1024)
664 self.assertEqual(msg, MSG)
665
Guido van Rossum24e4af82002-06-12 19:18:08 +0000666class NonBlockingTCPTests(ThreadedTCPSocketTest):
667
668 def __init__(self, methodName='runTest'):
669 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
670
671 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000672 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673 self.serv.setblocking(0)
674 start = time.time()
675 try:
676 self.serv.accept()
677 except socket.error:
678 pass
679 end = time.time()
680 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
681
682 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000683 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000684
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000688 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689 conn, addr = self.serv.accept()
690 except socket.error:
691 pass
692 else:
693 self.fail("Error trying to do non-blocking accept.")
694 read, write, err = select.select([self.serv], [], [])
695 if self.serv in read:
696 conn, addr = self.serv.accept()
697 else:
698 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000699
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000701 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000702 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703
704 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000705 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706 conn, addr = self.serv.accept()
707
708 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000709 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000710 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711
712 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000713 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000714 conn, addr = self.serv.accept()
715 conn.setblocking(0)
716 try:
717 msg = conn.recv(len(MSG))
718 except socket.error:
719 pass
720 else:
721 self.fail("Error trying to do non-blocking recv.")
722 read, write, err = select.select([conn], [], [])
723 if conn in read:
724 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000725 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726 else:
727 self.fail("Error during select call to non-blocking socket.")
728
729 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000730 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000731 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 self.cli.send(MSG)
733
734class FileObjectClassTestCase(SocketConnectedTest):
735
Guido van Rossume9f66142002-08-07 15:46:19 +0000736 bufsize = -1 # Use default buffer size
737
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738 def __init__(self, methodName='runTest'):
739 SocketConnectedTest.__init__(self, methodName=methodName)
740
741 def setUp(self):
742 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000743 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000744
745 def tearDown(self):
746 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000747 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 self.serv_file = None
749 SocketConnectedTest.tearDown(self)
750
751 def clientSetUp(self):
752 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000753 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000754
755 def clientTearDown(self):
756 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000757 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758 self.cli_file = None
759 SocketConnectedTest.clientTearDown(self)
760
761 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000762 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763 first_seg = self.serv_file.read(len(MSG)-3)
764 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000765 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000766 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000767
768 def _testSmallRead(self):
769 self.cli_file.write(MSG)
770 self.cli_file.flush()
771
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 def testFullRead(self):
773 # read until EOF
774 msg = self.serv_file.read()
775 self.assertEqual(msg, MSG)
776
777 def _testFullRead(self):
778 self.cli_file.write(MSG)
779 self.cli_file.close()
780
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000782 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 buf = ''
784 while 1:
785 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000786 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 buf += char
789 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000790
791 def _testUnbufferedRead(self):
792 self.cli_file.write(MSG)
793 self.cli_file.flush()
794
795 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000796 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000798 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799
800 def _testReadline(self):
801 self.cli_file.write(MSG)
802 self.cli_file.flush()
803
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000804 def testReadlineAfterRead(self):
805 a_baloo_is = self.serv_file.read(len("A baloo is"))
806 self.assertEqual("A baloo is", a_baloo_is)
807 _a_bear = self.serv_file.read(len(" a bear"))
808 self.assertEqual(" a bear", _a_bear)
809 line = self.serv_file.readline()
810 self.assertEqual("\n", line)
811 line = self.serv_file.readline()
812 self.assertEqual("A BALOO IS A BEAR.\n", line)
813 line = self.serv_file.readline()
814 self.assertEqual(MSG, line)
815
816 def _testReadlineAfterRead(self):
817 self.cli_file.write("A baloo is a bear\n")
818 self.cli_file.write("A BALOO IS A BEAR.\n")
819 self.cli_file.write(MSG)
820 self.cli_file.flush()
821
822 def testReadlineAfterReadNoNewline(self):
823 end_of_ = self.serv_file.read(len("End Of "))
824 self.assertEqual("End Of ", end_of_)
825 line = self.serv_file.readline()
826 self.assertEqual("Line", line)
827
828 def _testReadlineAfterReadNoNewline(self):
829 self.cli_file.write("End Of Line")
830
Tim Peters116d83c2004-03-28 02:20:45 +0000831 def testClosedAttr(self):
832 self.assert_(not self.serv_file.closed)
833
834 def _testClosedAttr(self):
835 self.assert_(not self.cli_file.closed)
836
Guido van Rossume9f66142002-08-07 15:46:19 +0000837class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
838
839 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000840
Guido van Rossume9f66142002-08-07 15:46:19 +0000841 In this case (and in this case only), it should be possible to
842 create a file object, read a line from it, create another file
843 object, read another line from it, without loss of data in the
844 first file object's buffer. Note that httplib relies on this
845 when reading multiple requests from the same socket."""
846
847 bufsize = 0 # Use unbuffered mode
848
849 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000850 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000851 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000852 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000853 self.serv_file = self.cli_conn.makefile('rb', 0)
854 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000855 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000856
857 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000858 self.cli_file.write("A. " + MSG)
859 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000860 self.cli_file.flush()
861
Guido van Rossum8c943832002-08-08 01:00:28 +0000862class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
863
864 bufsize = 1 # Default-buffered for reading; line-buffered for writing
865
866
867class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
868
869 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000870
Georg Brandldd7b0522007-01-21 10:35:10 +0000871
Facundo Batista07c78be2007-03-23 18:54:07 +0000872class NetworkConnectionTest(object):
873 """Prove network connection."""
874 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000875 # We're inherited below by BasicTCPTest2, which also inherits
876 # BasicTCPTest, which defines self.port referenced below.
877 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000878 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000879
Facundo Batista07c78be2007-03-23 18:54:07 +0000880class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
881 """Tests that NetworkConnection does not break existing TCP functionality.
882 """
883
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000884class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000885 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000886 port = test_support.find_unused_port()
887 self.failUnlessRaises(
888 socket.error,
889 lambda: socket.create_connection((HOST, port))
890 )
Facundo Batista07c78be2007-03-23 18:54:07 +0000891
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000892class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
893
894 def __init__(self, methodName='runTest'):
895 SocketTCPTest.__init__(self, methodName=methodName)
896 ThreadableTest.__init__(self)
897
898 def clientSetUp(self):
899 pass
900
901 def clientTearDown(self):
902 self.cli.close()
903 self.cli = None
904 ThreadableTest.clientTearDown(self)
905
906 def _justAccept(self):
907 conn, addr = self.serv.accept()
908
909 testFamily = _justAccept
910 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000911 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000912 self.assertEqual(self.cli.family, 2)
913
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000914 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000915 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000916 # passing no explicit timeout uses socket's global default
917 self.assert_(socket.getdefaulttimeout() is None)
918 socket.setdefaulttimeout(42)
919 try:
920 self.cli = socket.create_connection((HOST, self.port))
921 finally:
922 socket.setdefaulttimeout(None)
923 self.assertEquals(self.cli.gettimeout(), 42)
924
925 testTimeoutNone = _justAccept
926 def _testTimeoutNone(self):
927 # None timeout means the same as sock.settimeout(None)
928 self.assert_(socket.getdefaulttimeout() is None)
929 socket.setdefaulttimeout(30)
930 try:
931 self.cli = socket.create_connection((HOST, self.port), timeout=None)
932 finally:
933 socket.setdefaulttimeout(None)
934 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000935
936 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000937 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000938 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000939 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000940
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000941 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000942 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000943 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000944 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000945
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000946class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
947
948 def __init__(self, methodName='runTest'):
949 SocketTCPTest.__init__(self, methodName=methodName)
950 ThreadableTest.__init__(self)
951
952 def clientSetUp(self):
953 pass
954
955 def clientTearDown(self):
956 self.cli.close()
957 self.cli = None
958 ThreadableTest.clientTearDown(self)
959
Facundo Batista07c78be2007-03-23 18:54:07 +0000960 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000961 conn, addr = self.serv.accept()
962 time.sleep(3)
963 conn.send("done!")
964 testOutsideTimeout = testInsideTimeout
965
966 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000967 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000968 data = sock.recv(5)
969 self.assertEqual(data, "done!")
970
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000971 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000972 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +0000973 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
974
975
Georg Brandldd7b0522007-01-21 10:35:10 +0000976class Urllib2FileobjectTest(unittest.TestCase):
977
978 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
979 # it close the socket if the close c'tor argument is true
980
981 def testClose(self):
982 class MockSocket:
983 closed = False
984 def flush(self): pass
985 def close(self): self.closed = True
986
987 # must not close unless we request it: the original use of _fileobject
988 # by module socket requires that the underlying socket not be closed until
989 # the _socketobject that created the _fileobject is closed
990 s = MockSocket()
991 f = socket._fileobject(s)
992 f.close()
993 self.assert_(not s.closed)
994
995 s = MockSocket()
996 f = socket._fileobject(s, close=True)
997 f.close()
998 self.assert_(s.closed)
999
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001000class TCPTimeoutTest(SocketTCPTest):
1001
1002 def testTCPTimeout(self):
1003 def raise_timeout(*args, **kwargs):
1004 self.serv.settimeout(1.0)
1005 self.serv.accept()
1006 self.failUnlessRaises(socket.timeout, raise_timeout,
1007 "Error generating a timeout exception (TCP)")
1008
1009 def testTimeoutZero(self):
1010 ok = False
1011 try:
1012 self.serv.settimeout(0.0)
1013 foo = self.serv.accept()
1014 except socket.timeout:
1015 self.fail("caught timeout instead of error (TCP)")
1016 except socket.error:
1017 ok = True
1018 except:
1019 self.fail("caught unexpected exception (TCP)")
1020 if not ok:
1021 self.fail("accept() returned success when we did not expect it")
1022
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001023 def testInterruptedTimeout(self):
1024 # XXX I don't know how to do this test on MSWindows or any other
1025 # plaform that doesn't support signal.alarm() or os.kill(), though
1026 # the bug should have existed on all platforms.
1027 if not hasattr(signal, "alarm"):
1028 return # can only test on *nix
1029 self.serv.settimeout(5.0) # must be longer than alarm
1030 class Alarm(Exception):
1031 pass
1032 def alarm_handler(signal, frame):
1033 raise Alarm
1034 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1035 try:
1036 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1037 try:
1038 foo = self.serv.accept()
1039 except socket.timeout:
1040 self.fail("caught timeout instead of Alarm")
1041 except Alarm:
1042 pass
1043 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001044 self.fail("caught other exception instead of Alarm:"
1045 " %s(%s):\n%s" %
1046 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001047 else:
1048 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001049 finally:
1050 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001051 except Alarm:
1052 self.fail("got Alarm in wrong place")
1053 finally:
1054 # no alarm can be pending. Safe to restore old handler.
1055 signal.signal(signal.SIGALRM, old_alarm)
1056
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001057class UDPTimeoutTest(SocketTCPTest):
1058
1059 def testUDPTimeout(self):
1060 def raise_timeout(*args, **kwargs):
1061 self.serv.settimeout(1.0)
1062 self.serv.recv(1024)
1063 self.failUnlessRaises(socket.timeout, raise_timeout,
1064 "Error generating a timeout exception (UDP)")
1065
1066 def testTimeoutZero(self):
1067 ok = False
1068 try:
1069 self.serv.settimeout(0.0)
1070 foo = self.serv.recv(1024)
1071 except socket.timeout:
1072 self.fail("caught timeout instead of error (UDP)")
1073 except socket.error:
1074 ok = True
1075 except:
1076 self.fail("caught unexpected exception (UDP)")
1077 if not ok:
1078 self.fail("recv() returned success when we did not expect it")
1079
1080class TestExceptions(unittest.TestCase):
1081
1082 def testExceptionTree(self):
1083 self.assert_(issubclass(socket.error, Exception))
1084 self.assert_(issubclass(socket.herror, socket.error))
1085 self.assert_(issubclass(socket.gaierror, socket.error))
1086 self.assert_(issubclass(socket.timeout, socket.error))
1087
Armin Rigoa9017c32006-04-19 11:50:27 +00001088class TestLinuxAbstractNamespace(unittest.TestCase):
1089
1090 UNIX_PATH_MAX = 108
1091
1092 def testLinuxAbstractNamespace(self):
1093 address = "\x00python-test-hello\x00\xff"
1094 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1095 s1.bind(address)
1096 s1.listen(1)
1097 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1098 s2.connect(s1.getsockname())
1099 s1.accept()
1100 self.assertEqual(s1.getsockname(), address)
1101 self.assertEqual(s2.getpeername(), address)
1102
1103 def testMaxName(self):
1104 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1105 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1106 s.bind(address)
1107 self.assertEqual(s.getsockname(), address)
1108
1109 def testNameOverflow(self):
1110 address = "\x00" + "h" * self.UNIX_PATH_MAX
1111 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1112 self.assertRaises(socket.error, s.bind, address)
1113
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001114
Martin Blais2856e5f2006-05-26 12:03:27 +00001115class BufferIOTest(SocketConnectedTest):
1116 """
1117 Test the buffer versions of socket.recv() and socket.send().
1118 """
1119 def __init__(self, methodName='runTest'):
1120 SocketConnectedTest.__init__(self, methodName=methodName)
1121
Martin Blaisaf2ae722006-06-04 13:49:49 +00001122 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001123 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001124 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001125 self.assertEqual(nbytes, len(MSG))
1126 msg = buf.tostring()[:len(MSG)]
1127 self.assertEqual(msg, MSG)
1128
Martin Blaisaf2ae722006-06-04 13:49:49 +00001129 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001130 buf = buffer(MSG)
1131 self.serv_conn.send(buf)
1132
Martin Blaisaf2ae722006-06-04 13:49:49 +00001133 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001134 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001135 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001136 self.assertEqual(nbytes, len(MSG))
1137 msg = buf.tostring()[:len(MSG)]
1138 self.assertEqual(msg, MSG)
1139
Martin Blaisaf2ae722006-06-04 13:49:49 +00001140 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001141 buf = buffer(MSG)
1142 self.serv_conn.send(buf)
1143
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001144
1145TIPC_STYPE = 2000
1146TIPC_LOWER = 200
1147TIPC_UPPER = 210
1148
1149def isTipcAvailable():
1150 """Check if the TIPC module is loaded
1151
1152 The TIPC module is not loaded automatically on Ubuntu and probably
1153 other Linux distros.
1154 """
1155 if not hasattr(socket, "AF_TIPC"):
1156 return False
1157 if not os.path.isfile("/proc/modules"):
1158 return False
1159 with open("/proc/modules") as f:
1160 for line in f:
1161 if line.startswith("tipc "):
1162 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001163 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001164 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1165 return False
1166
1167class TIPCTest (unittest.TestCase):
1168 def testRDM(self):
1169 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1170 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1171
1172 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1173 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1174 TIPC_LOWER, TIPC_UPPER)
1175 srv.bind(srvaddr)
1176
1177 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1178 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1179 cli.sendto(MSG, sendaddr)
1180
1181 msg, recvaddr = srv.recvfrom(1024)
1182
1183 self.assertEqual(cli.getsockname(), recvaddr)
1184 self.assertEqual(msg, MSG)
1185
1186
1187class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1188 def __init__(self, methodName = 'runTest'):
1189 unittest.TestCase.__init__(self, methodName = methodName)
1190 ThreadableTest.__init__(self)
1191
1192 def setUp(self):
1193 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1194 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1195 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1196 TIPC_LOWER, TIPC_UPPER)
1197 self.srv.bind(srvaddr)
1198 self.srv.listen(5)
1199 self.serverExplicitReady()
1200 self.conn, self.connaddr = self.srv.accept()
1201
1202 def clientSetUp(self):
1203 # The is a hittable race between serverExplicitReady() and the
1204 # accept() call; sleep a little while to avoid it, otherwise
1205 # we could get an exception
1206 time.sleep(0.1)
1207 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1208 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1209 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1210 self.cli.connect(addr)
1211 self.cliaddr = self.cli.getsockname()
1212
1213 def testStream(self):
1214 msg = self.conn.recv(1024)
1215 self.assertEqual(msg, MSG)
1216 self.assertEqual(self.cliaddr, self.connaddr)
1217
1218 def _testStream(self):
1219 self.cli.send(MSG)
1220 self.cli.close()
1221
1222
Guido van Rossumb995eb72002-07-31 16:08:40 +00001223def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001224 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001225 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001226 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001227 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001228
1229 tests.extend([
1230 NonBlockingTCPTests,
1231 FileObjectClassTestCase,
1232 UnbufferedFileObjectClassTestCase,
1233 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001234 SmallBufferedFileObjectClassTestCase,
1235 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001236 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001237 NetworkConnectionAttributesTest,
1238 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001239 ])
Dave Cole331708b2004-08-09 04:51:41 +00001240 if hasattr(socket, "socketpair"):
1241 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001242 if sys.platform == 'linux2':
1243 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001244 if isTipcAvailable():
1245 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001246 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001247
1248 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001249 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001250 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001251
1252if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001253 test_main()