blob: 4a0b60053c9948f95f2c22e51b035524fda1f0fa [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
Jean-Paul Calderonec28d5542010-05-23 15:22:08 +0000837
838class FileObjectInterruptedTestCase(unittest.TestCase):
839 """Test that the file object correctly handles EINTR internally."""
840
841 class MockSocket(object):
842 def __init__(self, recv_funcs=()):
843 # A generator that returns callables that we'll call for each
844 # call to recv().
845 self._recv_step = iter(recv_funcs)
846
847 def recv(self, size):
848 return self._recv_step.next()()
849
850 @staticmethod
851 def _raise_eintr():
852 raise socket.error(errno.EINTR)
853
854 def _test_readline(self, size=-1, **kwargs):
855 mock_sock = self.MockSocket(recv_funcs=[
856 lambda : "This is the first line\nAnd the sec",
857 self._raise_eintr,
858 lambda : "ond line is here\n",
859 lambda : "",
860 ])
861 fo = socket._fileobject(mock_sock, **kwargs)
862 self.assertEquals(fo.readline(size), "This is the first line\n")
863 self.assertEquals(fo.readline(size), "And the second line is here\n")
864
865 def _test_read(self, size=-1, **kwargs):
866 mock_sock = self.MockSocket(recv_funcs=[
867 lambda : "This is the first line\nAnd the sec",
868 self._raise_eintr,
869 lambda : "ond line is here\n",
870 lambda : "",
871 ])
872 fo = socket._fileobject(mock_sock, **kwargs)
873 self.assertEquals(fo.read(size), "This is the first line\n"
874 "And the second line is here\n")
875
876 def test_default(self):
877 self._test_readline()
878 self._test_readline(size=100)
879 self._test_read()
880 self._test_read(size=100)
881
882 def test_with_1k_buffer(self):
883 self._test_readline(bufsize=1024)
884 self._test_readline(size=100, bufsize=1024)
885 self._test_read(bufsize=1024)
886 self._test_read(size=100, bufsize=1024)
887
888 def _test_readline_no_buffer(self, size=-1):
889 mock_sock = self.MockSocket(recv_funcs=[
890 lambda : "aa",
891 lambda : "\n",
892 lambda : "BB",
893 self._raise_eintr,
894 lambda : "bb",
895 lambda : "",
896 ])
897 fo = socket._fileobject(mock_sock, bufsize=0)
898 self.assertEquals(fo.readline(size), "aa\n")
899 self.assertEquals(fo.readline(size), "BBbb")
900
901 def test_no_buffer(self):
902 self._test_readline_no_buffer()
903 self._test_readline_no_buffer(size=4)
904 self._test_read(bufsize=0)
905 self._test_read(size=100, bufsize=0)
906
907
Guido van Rossume9f66142002-08-07 15:46:19 +0000908class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
909
910 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000911
Guido van Rossume9f66142002-08-07 15:46:19 +0000912 In this case (and in this case only), it should be possible to
913 create a file object, read a line from it, create another file
914 object, read another line from it, without loss of data in the
915 first file object's buffer. Note that httplib relies on this
916 when reading multiple requests from the same socket."""
917
918 bufsize = 0 # Use unbuffered mode
919
920 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000921 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000922 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000923 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000924 self.serv_file = self.cli_conn.makefile('rb', 0)
925 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000926 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000927
928 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000929 self.cli_file.write("A. " + MSG)
930 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000931 self.cli_file.flush()
932
Guido van Rossum8c943832002-08-08 01:00:28 +0000933class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
934
935 bufsize = 1 # Default-buffered for reading; line-buffered for writing
936
937
938class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
939
940 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000941
Georg Brandldd7b0522007-01-21 10:35:10 +0000942
Facundo Batista07c78be2007-03-23 18:54:07 +0000943class NetworkConnectionTest(object):
944 """Prove network connection."""
945 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000946 # We're inherited below by BasicTCPTest2, which also inherits
947 # BasicTCPTest, which defines self.port referenced below.
948 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000949 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000950
Facundo Batista07c78be2007-03-23 18:54:07 +0000951class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
952 """Tests that NetworkConnection does not break existing TCP functionality.
953 """
954
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000955class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000956 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000957 port = test_support.find_unused_port()
958 self.failUnlessRaises(
959 socket.error,
960 lambda: socket.create_connection((HOST, port))
961 )
Facundo Batista07c78be2007-03-23 18:54:07 +0000962
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000963class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
964
965 def __init__(self, methodName='runTest'):
966 SocketTCPTest.__init__(self, methodName=methodName)
967 ThreadableTest.__init__(self)
968
969 def clientSetUp(self):
970 pass
971
972 def clientTearDown(self):
973 self.cli.close()
974 self.cli = None
975 ThreadableTest.clientTearDown(self)
976
977 def _justAccept(self):
978 conn, addr = self.serv.accept()
979
980 testFamily = _justAccept
981 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000982 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000983 self.assertEqual(self.cli.family, 2)
984
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000985 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000986 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000987 # passing no explicit timeout uses socket's global default
988 self.assert_(socket.getdefaulttimeout() is None)
989 socket.setdefaulttimeout(42)
990 try:
991 self.cli = socket.create_connection((HOST, self.port))
992 finally:
993 socket.setdefaulttimeout(None)
994 self.assertEquals(self.cli.gettimeout(), 42)
995
996 testTimeoutNone = _justAccept
997 def _testTimeoutNone(self):
998 # None timeout means the same as sock.settimeout(None)
999 self.assert_(socket.getdefaulttimeout() is None)
1000 socket.setdefaulttimeout(30)
1001 try:
1002 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1003 finally:
1004 socket.setdefaulttimeout(None)
1005 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001006
1007 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001008 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001009 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001010 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001011
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001012 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001013 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001014 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001015 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +00001016
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001017class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1018
1019 def __init__(self, methodName='runTest'):
1020 SocketTCPTest.__init__(self, methodName=methodName)
1021 ThreadableTest.__init__(self)
1022
1023 def clientSetUp(self):
1024 pass
1025
1026 def clientTearDown(self):
1027 self.cli.close()
1028 self.cli = None
1029 ThreadableTest.clientTearDown(self)
1030
Facundo Batista07c78be2007-03-23 18:54:07 +00001031 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001032 conn, addr = self.serv.accept()
1033 time.sleep(3)
1034 conn.send("done!")
1035 testOutsideTimeout = testInsideTimeout
1036
1037 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001038 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +00001039 data = sock.recv(5)
1040 self.assertEqual(data, "done!")
1041
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001042 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +00001043 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +00001044 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
1045
1046
Georg Brandldd7b0522007-01-21 10:35:10 +00001047class Urllib2FileobjectTest(unittest.TestCase):
1048
1049 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
1050 # it close the socket if the close c'tor argument is true
1051
1052 def testClose(self):
1053 class MockSocket:
1054 closed = False
1055 def flush(self): pass
1056 def close(self): self.closed = True
1057
1058 # must not close unless we request it: the original use of _fileobject
1059 # by module socket requires that the underlying socket not be closed until
1060 # the _socketobject that created the _fileobject is closed
1061 s = MockSocket()
1062 f = socket._fileobject(s)
1063 f.close()
1064 self.assert_(not s.closed)
1065
1066 s = MockSocket()
1067 f = socket._fileobject(s, close=True)
1068 f.close()
1069 self.assert_(s.closed)
1070
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001071class TCPTimeoutTest(SocketTCPTest):
1072
1073 def testTCPTimeout(self):
1074 def raise_timeout(*args, **kwargs):
1075 self.serv.settimeout(1.0)
1076 self.serv.accept()
1077 self.failUnlessRaises(socket.timeout, raise_timeout,
1078 "Error generating a timeout exception (TCP)")
1079
1080 def testTimeoutZero(self):
1081 ok = False
1082 try:
1083 self.serv.settimeout(0.0)
1084 foo = self.serv.accept()
1085 except socket.timeout:
1086 self.fail("caught timeout instead of error (TCP)")
1087 except socket.error:
1088 ok = True
1089 except:
1090 self.fail("caught unexpected exception (TCP)")
1091 if not ok:
1092 self.fail("accept() returned success when we did not expect it")
1093
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001094 def testInterruptedTimeout(self):
1095 # XXX I don't know how to do this test on MSWindows or any other
1096 # plaform that doesn't support signal.alarm() or os.kill(), though
1097 # the bug should have existed on all platforms.
1098 if not hasattr(signal, "alarm"):
1099 return # can only test on *nix
1100 self.serv.settimeout(5.0) # must be longer than alarm
1101 class Alarm(Exception):
1102 pass
1103 def alarm_handler(signal, frame):
1104 raise Alarm
1105 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1106 try:
1107 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1108 try:
1109 foo = self.serv.accept()
1110 except socket.timeout:
1111 self.fail("caught timeout instead of Alarm")
1112 except Alarm:
1113 pass
1114 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001115 self.fail("caught other exception instead of Alarm:"
1116 " %s(%s):\n%s" %
1117 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001118 else:
1119 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001120 finally:
1121 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001122 except Alarm:
1123 self.fail("got Alarm in wrong place")
1124 finally:
1125 # no alarm can be pending. Safe to restore old handler.
1126 signal.signal(signal.SIGALRM, old_alarm)
1127
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001128class UDPTimeoutTest(SocketTCPTest):
1129
1130 def testUDPTimeout(self):
1131 def raise_timeout(*args, **kwargs):
1132 self.serv.settimeout(1.0)
1133 self.serv.recv(1024)
1134 self.failUnlessRaises(socket.timeout, raise_timeout,
1135 "Error generating a timeout exception (UDP)")
1136
1137 def testTimeoutZero(self):
1138 ok = False
1139 try:
1140 self.serv.settimeout(0.0)
1141 foo = self.serv.recv(1024)
1142 except socket.timeout:
1143 self.fail("caught timeout instead of error (UDP)")
1144 except socket.error:
1145 ok = True
1146 except:
1147 self.fail("caught unexpected exception (UDP)")
1148 if not ok:
1149 self.fail("recv() returned success when we did not expect it")
1150
1151class TestExceptions(unittest.TestCase):
1152
1153 def testExceptionTree(self):
1154 self.assert_(issubclass(socket.error, Exception))
1155 self.assert_(issubclass(socket.herror, socket.error))
1156 self.assert_(issubclass(socket.gaierror, socket.error))
1157 self.assert_(issubclass(socket.timeout, socket.error))
1158
Armin Rigoa9017c32006-04-19 11:50:27 +00001159class TestLinuxAbstractNamespace(unittest.TestCase):
1160
1161 UNIX_PATH_MAX = 108
1162
1163 def testLinuxAbstractNamespace(self):
1164 address = "\x00python-test-hello\x00\xff"
1165 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1166 s1.bind(address)
1167 s1.listen(1)
1168 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1169 s2.connect(s1.getsockname())
1170 s1.accept()
1171 self.assertEqual(s1.getsockname(), address)
1172 self.assertEqual(s2.getpeername(), address)
1173
1174 def testMaxName(self):
1175 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1176 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1177 s.bind(address)
1178 self.assertEqual(s.getsockname(), address)
1179
1180 def testNameOverflow(self):
1181 address = "\x00" + "h" * self.UNIX_PATH_MAX
1182 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1183 self.assertRaises(socket.error, s.bind, address)
1184
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001185
Martin Blais2856e5f2006-05-26 12:03:27 +00001186class BufferIOTest(SocketConnectedTest):
1187 """
1188 Test the buffer versions of socket.recv() and socket.send().
1189 """
1190 def __init__(self, methodName='runTest'):
1191 SocketConnectedTest.__init__(self, methodName=methodName)
1192
Martin Blaisaf2ae722006-06-04 13:49:49 +00001193 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001194 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001195 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001196 self.assertEqual(nbytes, len(MSG))
1197 msg = buf.tostring()[:len(MSG)]
1198 self.assertEqual(msg, MSG)
1199
Martin Blaisaf2ae722006-06-04 13:49:49 +00001200 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001201 buf = buffer(MSG)
1202 self.serv_conn.send(buf)
1203
Martin Blaisaf2ae722006-06-04 13:49:49 +00001204 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001205 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001206 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001207 self.assertEqual(nbytes, len(MSG))
1208 msg = buf.tostring()[:len(MSG)]
1209 self.assertEqual(msg, MSG)
1210
Martin Blaisaf2ae722006-06-04 13:49:49 +00001211 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001212 buf = buffer(MSG)
1213 self.serv_conn.send(buf)
1214
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001215
1216TIPC_STYPE = 2000
1217TIPC_LOWER = 200
1218TIPC_UPPER = 210
1219
1220def isTipcAvailable():
1221 """Check if the TIPC module is loaded
1222
1223 The TIPC module is not loaded automatically on Ubuntu and probably
1224 other Linux distros.
1225 """
1226 if not hasattr(socket, "AF_TIPC"):
1227 return False
1228 if not os.path.isfile("/proc/modules"):
1229 return False
1230 with open("/proc/modules") as f:
1231 for line in f:
1232 if line.startswith("tipc "):
1233 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001234 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001235 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1236 return False
1237
1238class TIPCTest (unittest.TestCase):
1239 def testRDM(self):
1240 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1241 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1242
1243 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1244 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1245 TIPC_LOWER, TIPC_UPPER)
1246 srv.bind(srvaddr)
1247
1248 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1249 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1250 cli.sendto(MSG, sendaddr)
1251
1252 msg, recvaddr = srv.recvfrom(1024)
1253
1254 self.assertEqual(cli.getsockname(), recvaddr)
1255 self.assertEqual(msg, MSG)
1256
1257
1258class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1259 def __init__(self, methodName = 'runTest'):
1260 unittest.TestCase.__init__(self, methodName = methodName)
1261 ThreadableTest.__init__(self)
1262
1263 def setUp(self):
1264 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1265 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1266 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1267 TIPC_LOWER, TIPC_UPPER)
1268 self.srv.bind(srvaddr)
1269 self.srv.listen(5)
1270 self.serverExplicitReady()
1271 self.conn, self.connaddr = self.srv.accept()
1272
1273 def clientSetUp(self):
1274 # The is a hittable race between serverExplicitReady() and the
1275 # accept() call; sleep a little while to avoid it, otherwise
1276 # we could get an exception
1277 time.sleep(0.1)
1278 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1279 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1280 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1281 self.cli.connect(addr)
1282 self.cliaddr = self.cli.getsockname()
1283
1284 def testStream(self):
1285 msg = self.conn.recv(1024)
1286 self.assertEqual(msg, MSG)
1287 self.assertEqual(self.cliaddr, self.connaddr)
1288
1289 def _testStream(self):
1290 self.cli.send(MSG)
1291 self.cli.close()
1292
1293
Guido van Rossumb995eb72002-07-31 16:08:40 +00001294def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001295 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001296 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001297 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001298 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001299
1300 tests.extend([
1301 NonBlockingTCPTests,
1302 FileObjectClassTestCase,
Jean-Paul Calderonec28d5542010-05-23 15:22:08 +00001303 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001304 UnbufferedFileObjectClassTestCase,
1305 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001306 SmallBufferedFileObjectClassTestCase,
1307 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001308 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001309 NetworkConnectionAttributesTest,
1310 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001311 ])
Dave Cole331708b2004-08-09 04:51:41 +00001312 if hasattr(socket, "socketpair"):
1313 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001314 if sys.platform == 'linux2':
1315 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001316 if isTipcAvailable():
1317 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001318 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001319
1320 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001321 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001322 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001323
1324if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001325 test_main()