blob: 66664b44ed5bd481d38d3c9139370929db093679 [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)
284 except SystemError:
285 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)
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000359 # Make sure getservbyport does not accept out of range ports.
360 self.assertRaises(OverflowError, socket.getservbyport, -1)
361 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000362
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000363 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000364 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000365 # The default timeout should initially be None
366 self.assertEqual(socket.getdefaulttimeout(), None)
367 s = socket.socket()
368 self.assertEqual(s.gettimeout(), None)
369 s.close()
370
371 # Set the default timeout to 10, and see if it propagates
372 socket.setdefaulttimeout(10)
373 self.assertEqual(socket.getdefaulttimeout(), 10)
374 s = socket.socket()
375 self.assertEqual(s.gettimeout(), 10)
376 s.close()
377
378 # Reset the default timeout to None, and see if it propagates
379 socket.setdefaulttimeout(None)
380 self.assertEqual(socket.getdefaulttimeout(), None)
381 s = socket.socket()
382 self.assertEqual(s.gettimeout(), None)
383 s.close()
384
385 # Check that setting it to an invalid value raises ValueError
386 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
387
388 # Check that setting it to an invalid type raises TypeError
389 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
390
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000391 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000392 if not hasattr(socket, 'inet_pton'):
393 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000394 from socket import inet_aton as f, inet_pton, AF_INET
395 g = lambda a: inet_pton(AF_INET, a)
396
397 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
398 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
399 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
400 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000401 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000402
403 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
404 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
405 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000406 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000407
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000408 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000409 if not hasattr(socket, 'inet_pton'):
410 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000411 try:
412 from socket import inet_pton, AF_INET6, has_ipv6
413 if not has_ipv6:
414 return
415 except ImportError:
416 return
417 f = lambda a: inet_pton(AF_INET6, a)
418
419 self.assertEquals('\x00' * 16, f('::'))
420 self.assertEquals('\x00' * 16, f('0::0'))
421 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
422 self.assertEquals(
423 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
424 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
425 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000426
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000427 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000428 if not hasattr(socket, 'inet_ntop'):
429 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 from socket import inet_ntoa as f, inet_ntop, AF_INET
431 g = lambda a: inet_ntop(AF_INET, a)
432
433 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
434 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
435 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
436 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000437
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000438 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
439 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
440 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
441
442 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000443 if not hasattr(socket, 'inet_ntop'):
444 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000445 try:
446 from socket import inet_ntop, AF_INET6, has_ipv6
447 if not has_ipv6:
448 return
449 except ImportError:
450 return
451 f = lambda a: inet_ntop(AF_INET6, a)
452
453 self.assertEquals('::', f('\x00' * 16))
454 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
455 self.assertEquals(
456 'aef:b01:506:1001:ffff:9997:55:170',
457 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
458 )
459
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000460 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000461
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000462 def _get_unused_port(self, bind_address='0.0.0.0'):
463 """Use a temporary socket to elicit an unused ephemeral port.
Trent Nelsone41b0062008-04-08 23:47:30 +0000464
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000465 Args:
466 bind_address: Hostname or IP address to search for a port on.
467
468 Returns: A most likely to be unused port.
469 """
470 tempsock = socket.socket()
471 tempsock.bind((bind_address, 0))
472 host, port = tempsock.getsockname()
473 tempsock.close()
474 return port
475
476 def testSockName(self):
477 # Testing getsockname()
478 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Trent Nelsone41b0062008-04-08 23:47:30 +0000480 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000481 name = sock.getsockname()
Neal Norwitz4a9ff162006-06-11 21:38:38 +0000482 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
483 # it reasonable to get the host's addr in addition to 0.0.0.0.
484 # At least for eCos. This is required for the S/390 to pass.
485 my_ip_addr = socket.gethostbyname(socket.gethostname())
486 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Trent Nelsone41b0062008-04-08 23:47:30 +0000487 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488
489 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000490 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000491 # We know a socket should start without reuse==0
492 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
493 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000494 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495
496 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000497 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000498 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
499 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
500 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000501 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000503 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000504 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000505 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
506 sock.settimeout(1)
507 sock.close()
508 self.assertRaises(socket.error, sock.send, "spam")
509
Georg Brandlbb03ac02006-03-21 18:17:25 +0000510 def testNewAttributes(self):
511 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000512 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000513 self.assertEqual(sock.family, socket.AF_INET)
514 self.assertEqual(sock.type, socket.SOCK_STREAM)
515 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000516 sock.close()
517
Gregory P. Smithde1a8b72009-01-31 22:57:30 +0000518 def test_getsockaddrarg(self):
519 host = '0.0.0.0'
520 port = self._get_unused_port(bind_address=host)
521 big_port = port + 65536
522 neg_port = port - 65536
523 sock = socket.socket()
524 try:
525 self.assertRaises(OverflowError, sock.bind, (host, big_port))
526 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
527 sock.bind((host, port))
528 finally:
529 sock.close()
530
Christian Heimesa47b75b2008-01-04 15:48:06 +0000531 def test_sock_ioctl(self):
532 if os.name != "nt":
533 return
534 self.assert_(hasattr(socket.socket, 'ioctl'))
535 self.assert_(hasattr(socket, 'SIO_RCVALL'))
536 self.assert_(hasattr(socket, 'RCVALL_ON'))
537 self.assert_(hasattr(socket, 'RCVALL_OFF'))
538
539
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540class BasicTCPTest(SocketConnectedTest):
541
542 def __init__(self, methodName='runTest'):
543 SocketConnectedTest.__init__(self, methodName=methodName)
544
545 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000546 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000547 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000548 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549
550 def _testRecv(self):
551 self.serv_conn.send(MSG)
552
553 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000554 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 seg1 = self.cli_conn.recv(len(MSG) - 3)
556 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000557 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000558 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000559
560 def _testOverFlowRecv(self):
561 self.serv_conn.send(MSG)
562
563 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000564 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000566 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000567
568 def _testRecvFrom(self):
569 self.serv_conn.send(MSG)
570
571 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000572 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
574 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000575 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000576 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000577
578 def _testOverFlowRecvFrom(self):
579 self.serv_conn.send(MSG)
580
581 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000582 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000583 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000584 while 1:
585 read = self.cli_conn.recv(1024)
586 if not read:
587 break
Guido van Rossume531e292002-08-08 20:28:34 +0000588 msg += read
589 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590
591 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000592 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 self.serv_conn.sendall(big_chunk)
594
595 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000596 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000597 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000598 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000599 fd = self.cli_conn.fileno()
600 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
601 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000602 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603
604 def _testFromFd(self):
605 self.serv_conn.send(MSG)
606
607 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000608 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000610 self.assertEqual(msg, MSG)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000611 # wait for _testShutdown to finish: on OS X, when the server
612 # closes the connection the client also becomes disconnected,
Mark Dickinson0e151822009-01-15 14:58:28 +0000613 # and the client's shutdown call will fail. (Issue #4397.)
Mark Dickinsone82cdae2009-01-15 14:54:37 +0000614 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000615
616 def _testShutdown(self):
617 self.serv_conn.send(MSG)
618 self.serv_conn.shutdown(2)
619
620class BasicUDPTest(ThreadedUDPSocketTest):
621
622 def __init__(self, methodName='runTest'):
623 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
624
625 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000626 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000627 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000628 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000629
630 def _testSendtoAndRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000631 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000632
Guido van Rossum1c938012002-06-12 21:17:20 +0000633 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000634 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000635 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000636 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000637
Guido van Rossum1c938012002-06-12 21:17:20 +0000638 def _testRecvFrom(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000639 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640
Facundo Batista1fe9f962007-03-28 03:45:20 +0000641 def testRecvFromNegative(self):
642 # Negative lengths passed to recvfrom should give ValueError.
643 self.assertRaises(ValueError, self.serv.recvfrom, -1)
644
645 def _testRecvFromNegative(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000646 self.cli.sendto(MSG, 0, (HOST, self.port))
Facundo Batista1fe9f962007-03-28 03:45:20 +0000647
Martin v. Löwis7596e832006-07-01 15:33:37 +0000648class TCPCloserTest(ThreadedTCPSocketTest):
649
650 def testClose(self):
651 conn, addr = self.serv.accept()
652 conn.close()
653
654 sd = self.cli
655 read, write, err = select.select([sd], [], [], 1.0)
656 self.assertEqual(read, [sd])
657 self.assertEqual(sd.recv(1), '')
658
659 def _testClose(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000660 self.cli.connect((HOST, self.port))
Martin v. Löwis7596e832006-07-01 15:33:37 +0000661 time.sleep(1.0)
662
Dave Cole331708b2004-08-09 04:51:41 +0000663class BasicSocketPairTest(SocketPairTest):
664
665 def __init__(self, methodName='runTest'):
666 SocketPairTest.__init__(self, methodName=methodName)
667
668 def testRecv(self):
669 msg = self.serv.recv(1024)
670 self.assertEqual(msg, MSG)
671
672 def _testRecv(self):
673 self.cli.send(MSG)
674
675 def testSend(self):
676 self.serv.send(MSG)
677
678 def _testSend(self):
679 msg = self.cli.recv(1024)
680 self.assertEqual(msg, MSG)
681
Guido van Rossum24e4af82002-06-12 19:18:08 +0000682class NonBlockingTCPTests(ThreadedTCPSocketTest):
683
684 def __init__(self, methodName='runTest'):
685 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
686
687 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000688 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689 self.serv.setblocking(0)
690 start = time.time()
691 try:
692 self.serv.accept()
693 except socket.error:
694 pass
695 end = time.time()
696 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
697
698 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000699 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000700
Guido van Rossum24e4af82002-06-12 19:18:08 +0000701 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000704 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705 conn, addr = self.serv.accept()
706 except socket.error:
707 pass
708 else:
709 self.fail("Error trying to do non-blocking accept.")
710 read, write, err = select.select([self.serv], [], [])
711 if self.serv in read:
712 conn, addr = self.serv.accept()
713 else:
714 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000715
Guido van Rossum24e4af82002-06-12 19:18:08 +0000716 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000717 time.sleep(0.1)
Trent Nelsone41b0062008-04-08 23:47:30 +0000718 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000719
720 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000721 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722 conn, addr = self.serv.accept()
723
724 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000725 self.cli.settimeout(10)
Trent Nelsone41b0062008-04-08 23:47:30 +0000726 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727
728 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000729 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730 conn, addr = self.serv.accept()
731 conn.setblocking(0)
732 try:
733 msg = conn.recv(len(MSG))
734 except socket.error:
735 pass
736 else:
737 self.fail("Error trying to do non-blocking recv.")
738 read, write, err = select.select([conn], [], [])
739 if conn in read:
740 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000741 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000742 else:
743 self.fail("Error during select call to non-blocking socket.")
744
745 def _testRecv(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000746 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000747 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000748 self.cli.send(MSG)
749
750class FileObjectClassTestCase(SocketConnectedTest):
751
Guido van Rossume9f66142002-08-07 15:46:19 +0000752 bufsize = -1 # Use default buffer size
753
Guido van Rossum24e4af82002-06-12 19:18:08 +0000754 def __init__(self, methodName='runTest'):
755 SocketConnectedTest.__init__(self, methodName=methodName)
756
757 def setUp(self):
758 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000759 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760
761 def tearDown(self):
762 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000763 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764 self.serv_file = None
765 SocketConnectedTest.tearDown(self)
766
767 def clientSetUp(self):
768 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000769 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000770
771 def clientTearDown(self):
772 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000773 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000774 self.cli_file = None
775 SocketConnectedTest.clientTearDown(self)
776
777 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000778 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 first_seg = self.serv_file.read(len(MSG)-3)
780 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000781 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000782 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783
784 def _testSmallRead(self):
785 self.cli_file.write(MSG)
786 self.cli_file.flush()
787
Guido van Rossum8c943832002-08-08 01:00:28 +0000788 def testFullRead(self):
789 # read until EOF
790 msg = self.serv_file.read()
791 self.assertEqual(msg, MSG)
792
793 def _testFullRead(self):
794 self.cli_file.write(MSG)
795 self.cli_file.close()
796
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000798 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000799 buf = ''
800 while 1:
801 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000802 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000803 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000804 buf += char
805 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806
807 def _testUnbufferedRead(self):
808 self.cli_file.write(MSG)
809 self.cli_file.flush()
810
811 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000812 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000814 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000815
816 def _testReadline(self):
817 self.cli_file.write(MSG)
818 self.cli_file.flush()
819
Gregory P. Smith24237ea2008-05-05 21:53:45 +0000820 def testReadlineAfterRead(self):
821 a_baloo_is = self.serv_file.read(len("A baloo is"))
822 self.assertEqual("A baloo is", a_baloo_is)
823 _a_bear = self.serv_file.read(len(" a bear"))
824 self.assertEqual(" a bear", _a_bear)
825 line = self.serv_file.readline()
826 self.assertEqual("\n", line)
827 line = self.serv_file.readline()
828 self.assertEqual("A BALOO IS A BEAR.\n", line)
829 line = self.serv_file.readline()
830 self.assertEqual(MSG, line)
831
832 def _testReadlineAfterRead(self):
833 self.cli_file.write("A baloo is a bear\n")
834 self.cli_file.write("A BALOO IS A BEAR.\n")
835 self.cli_file.write(MSG)
836 self.cli_file.flush()
837
838 def testReadlineAfterReadNoNewline(self):
839 end_of_ = self.serv_file.read(len("End Of "))
840 self.assertEqual("End Of ", end_of_)
841 line = self.serv_file.readline()
842 self.assertEqual("Line", line)
843
844 def _testReadlineAfterReadNoNewline(self):
845 self.cli_file.write("End Of Line")
846
Tim Peters116d83c2004-03-28 02:20:45 +0000847 def testClosedAttr(self):
848 self.assert_(not self.serv_file.closed)
849
850 def _testClosedAttr(self):
851 self.assert_(not self.cli_file.closed)
852
Guido van Rossume9f66142002-08-07 15:46:19 +0000853class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
854
855 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000856
Guido van Rossume9f66142002-08-07 15:46:19 +0000857 In this case (and in this case only), it should be possible to
858 create a file object, read a line from it, create another file
859 object, read another line from it, without loss of data in the
860 first file object's buffer. Note that httplib relies on this
861 when reading multiple requests from the same socket."""
862
863 bufsize = 0 # Use unbuffered mode
864
865 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000866 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000867 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000868 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000869 self.serv_file = self.cli_conn.makefile('rb', 0)
870 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000871 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000872
873 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000874 self.cli_file.write("A. " + MSG)
875 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000876 self.cli_file.flush()
877
Guido van Rossum8c943832002-08-08 01:00:28 +0000878class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
879
880 bufsize = 1 # Default-buffered for reading; line-buffered for writing
881
882
883class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
884
885 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000886
Georg Brandldd7b0522007-01-21 10:35:10 +0000887
Facundo Batista07c78be2007-03-23 18:54:07 +0000888class NetworkConnectionTest(object):
889 """Prove network connection."""
890 def clientSetUp(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000891 # We're inherited below by BasicTCPTest2, which also inherits
892 # BasicTCPTest, which defines self.port referenced below.
893 self.cli = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000894 self.serv_conn = self.cli
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000895
Facundo Batista07c78be2007-03-23 18:54:07 +0000896class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
897 """Tests that NetworkConnection does not break existing TCP functionality.
898 """
899
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000900class NetworkConnectionNoServer(unittest.TestCase):
Facundo Batista07c78be2007-03-23 18:54:07 +0000901 def testWithoutServer(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000902 port = test_support.find_unused_port()
903 self.failUnlessRaises(
904 socket.error,
905 lambda: socket.create_connection((HOST, port))
906 )
Facundo Batista07c78be2007-03-23 18:54:07 +0000907
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000908class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
909
910 def __init__(self, methodName='runTest'):
911 SocketTCPTest.__init__(self, methodName=methodName)
912 ThreadableTest.__init__(self)
913
914 def clientSetUp(self):
915 pass
916
917 def clientTearDown(self):
918 self.cli.close()
919 self.cli = None
920 ThreadableTest.clientTearDown(self)
921
922 def _justAccept(self):
923 conn, addr = self.serv.accept()
924
925 testFamily = _justAccept
926 def _testFamily(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000927 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000928 self.assertEqual(self.cli.family, 2)
929
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000930 testTimeoutDefault = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000931 def _testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000932 # passing no explicit timeout uses socket's global default
933 self.assert_(socket.getdefaulttimeout() is None)
934 socket.setdefaulttimeout(42)
935 try:
936 self.cli = socket.create_connection((HOST, self.port))
937 finally:
938 socket.setdefaulttimeout(None)
939 self.assertEquals(self.cli.gettimeout(), 42)
940
941 testTimeoutNone = _justAccept
942 def _testTimeoutNone(self):
943 # None timeout means the same as sock.settimeout(None)
944 self.assert_(socket.getdefaulttimeout() is None)
945 socket.setdefaulttimeout(30)
946 try:
947 self.cli = socket.create_connection((HOST, self.port), timeout=None)
948 finally:
949 socket.setdefaulttimeout(None)
950 self.assertEqual(self.cli.gettimeout(), None)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000951
952 testTimeoutValueNamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000953 def _testTimeoutValueNamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000954 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000955 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000956
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000957 testTimeoutValueNonamed = _justAccept
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000958 def _testTimeoutValueNonamed(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000959 self.cli = socket.create_connection((HOST, self.port), 30)
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000960 self.assertEqual(self.cli.gettimeout(), 30)
Facundo Batista07c78be2007-03-23 18:54:07 +0000961
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000962class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
963
964 def __init__(self, methodName='runTest'):
965 SocketTCPTest.__init__(self, methodName=methodName)
966 ThreadableTest.__init__(self)
967
968 def clientSetUp(self):
969 pass
970
971 def clientTearDown(self):
972 self.cli.close()
973 self.cli = None
974 ThreadableTest.clientTearDown(self)
975
Facundo Batista07c78be2007-03-23 18:54:07 +0000976 def testInsideTimeout(self):
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000977 conn, addr = self.serv.accept()
978 time.sleep(3)
979 conn.send("done!")
980 testOutsideTimeout = testInsideTimeout
981
982 def _testInsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000983 self.cli = sock = socket.create_connection((HOST, self.port))
Facundo Batista07c78be2007-03-23 18:54:07 +0000984 data = sock.recv(5)
985 self.assertEqual(data, "done!")
986
Facundo Batistab8af7bc2007-03-25 01:53:21 +0000987 def _testOutsideTimeout(self):
Trent Nelsone41b0062008-04-08 23:47:30 +0000988 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Facundo Batista07c78be2007-03-23 18:54:07 +0000989 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
990
991
Georg Brandldd7b0522007-01-21 10:35:10 +0000992class Urllib2FileobjectTest(unittest.TestCase):
993
994 # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
995 # it close the socket if the close c'tor argument is true
996
997 def testClose(self):
998 class MockSocket:
999 closed = False
1000 def flush(self): pass
1001 def close(self): self.closed = True
1002
1003 # must not close unless we request it: the original use of _fileobject
1004 # by module socket requires that the underlying socket not be closed until
1005 # the _socketobject that created the _fileobject is closed
1006 s = MockSocket()
1007 f = socket._fileobject(s)
1008 f.close()
1009 self.assert_(not s.closed)
1010
1011 s = MockSocket()
1012 f = socket._fileobject(s, close=True)
1013 f.close()
1014 self.assert_(s.closed)
1015
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001016class TCPTimeoutTest(SocketTCPTest):
1017
1018 def testTCPTimeout(self):
1019 def raise_timeout(*args, **kwargs):
1020 self.serv.settimeout(1.0)
1021 self.serv.accept()
1022 self.failUnlessRaises(socket.timeout, raise_timeout,
1023 "Error generating a timeout exception (TCP)")
1024
1025 def testTimeoutZero(self):
1026 ok = False
1027 try:
1028 self.serv.settimeout(0.0)
1029 foo = self.serv.accept()
1030 except socket.timeout:
1031 self.fail("caught timeout instead of error (TCP)")
1032 except socket.error:
1033 ok = True
1034 except:
1035 self.fail("caught unexpected exception (TCP)")
1036 if not ok:
1037 self.fail("accept() returned success when we did not expect it")
1038
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001039 def testInterruptedTimeout(self):
1040 # XXX I don't know how to do this test on MSWindows or any other
1041 # plaform that doesn't support signal.alarm() or os.kill(), though
1042 # the bug should have existed on all platforms.
1043 if not hasattr(signal, "alarm"):
1044 return # can only test on *nix
1045 self.serv.settimeout(5.0) # must be longer than alarm
1046 class Alarm(Exception):
1047 pass
1048 def alarm_handler(signal, frame):
1049 raise Alarm
1050 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1051 try:
1052 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1053 try:
1054 foo = self.serv.accept()
1055 except socket.timeout:
1056 self.fail("caught timeout instead of Alarm")
1057 except Alarm:
1058 pass
1059 except:
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001060 self.fail("caught other exception instead of Alarm:"
1061 " %s(%s):\n%s" %
1062 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001063 else:
1064 self.fail("nothing caught")
Jeffrey Yasskin36550bd2008-03-28 04:53:10 +00001065 finally:
1066 signal.alarm(0) # shut off alarm
Neal Norwitz9b0ca792006-08-02 06:46:21 +00001067 except Alarm:
1068 self.fail("got Alarm in wrong place")
1069 finally:
1070 # no alarm can be pending. Safe to restore old handler.
1071 signal.signal(signal.SIGALRM, old_alarm)
1072
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001073class UDPTimeoutTest(SocketTCPTest):
1074
1075 def testUDPTimeout(self):
1076 def raise_timeout(*args, **kwargs):
1077 self.serv.settimeout(1.0)
1078 self.serv.recv(1024)
1079 self.failUnlessRaises(socket.timeout, raise_timeout,
1080 "Error generating a timeout exception (UDP)")
1081
1082 def testTimeoutZero(self):
1083 ok = False
1084 try:
1085 self.serv.settimeout(0.0)
1086 foo = self.serv.recv(1024)
1087 except socket.timeout:
1088 self.fail("caught timeout instead of error (UDP)")
1089 except socket.error:
1090 ok = True
1091 except:
1092 self.fail("caught unexpected exception (UDP)")
1093 if not ok:
1094 self.fail("recv() returned success when we did not expect it")
1095
1096class TestExceptions(unittest.TestCase):
1097
1098 def testExceptionTree(self):
1099 self.assert_(issubclass(socket.error, Exception))
1100 self.assert_(issubclass(socket.herror, socket.error))
1101 self.assert_(issubclass(socket.gaierror, socket.error))
1102 self.assert_(issubclass(socket.timeout, socket.error))
1103
Armin Rigoa9017c32006-04-19 11:50:27 +00001104class TestLinuxAbstractNamespace(unittest.TestCase):
1105
1106 UNIX_PATH_MAX = 108
1107
1108 def testLinuxAbstractNamespace(self):
1109 address = "\x00python-test-hello\x00\xff"
1110 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1111 s1.bind(address)
1112 s1.listen(1)
1113 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1114 s2.connect(s1.getsockname())
1115 s1.accept()
1116 self.assertEqual(s1.getsockname(), address)
1117 self.assertEqual(s2.getpeername(), address)
1118
1119 def testMaxName(self):
1120 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1121 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1122 s.bind(address)
1123 self.assertEqual(s.getsockname(), address)
1124
1125 def testNameOverflow(self):
1126 address = "\x00" + "h" * self.UNIX_PATH_MAX
1127 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1128 self.assertRaises(socket.error, s.bind, address)
1129
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001130
Martin Blais2856e5f2006-05-26 12:03:27 +00001131class BufferIOTest(SocketConnectedTest):
1132 """
1133 Test the buffer versions of socket.recv() and socket.send().
1134 """
1135 def __init__(self, methodName='runTest'):
1136 SocketConnectedTest.__init__(self, methodName=methodName)
1137
Martin Blaisaf2ae722006-06-04 13:49:49 +00001138 def testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001139 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001140 nbytes = self.cli_conn.recv_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001141 self.assertEqual(nbytes, len(MSG))
1142 msg = buf.tostring()[:len(MSG)]
1143 self.assertEqual(msg, MSG)
1144
Martin Blaisaf2ae722006-06-04 13:49:49 +00001145 def _testRecvInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001146 buf = buffer(MSG)
1147 self.serv_conn.send(buf)
1148
Martin Blaisaf2ae722006-06-04 13:49:49 +00001149 def testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001150 buf = array.array('c', ' '*1024)
Martin Blaisaf2ae722006-06-04 13:49:49 +00001151 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Martin Blais2856e5f2006-05-26 12:03:27 +00001152 self.assertEqual(nbytes, len(MSG))
1153 msg = buf.tostring()[:len(MSG)]
1154 self.assertEqual(msg, MSG)
1155
Martin Blaisaf2ae722006-06-04 13:49:49 +00001156 def _testRecvFromInto(self):
Martin Blais2856e5f2006-05-26 12:03:27 +00001157 buf = buffer(MSG)
1158 self.serv_conn.send(buf)
1159
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001160
1161TIPC_STYPE = 2000
1162TIPC_LOWER = 200
1163TIPC_UPPER = 210
1164
1165def isTipcAvailable():
1166 """Check if the TIPC module is loaded
1167
1168 The TIPC module is not loaded automatically on Ubuntu and probably
1169 other Linux distros.
1170 """
1171 if not hasattr(socket, "AF_TIPC"):
1172 return False
1173 if not os.path.isfile("/proc/modules"):
1174 return False
1175 with open("/proc/modules") as f:
1176 for line in f:
1177 if line.startswith("tipc "):
1178 return True
Christian Heimesf66f95d2008-01-08 03:40:04 +00001179 if test_support.verbose:
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001180 print "TIPC module is not loaded, please 'sudo modprobe tipc'"
1181 return False
1182
1183class TIPCTest (unittest.TestCase):
1184 def testRDM(self):
1185 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1186 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1187
1188 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1189 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1190 TIPC_LOWER, TIPC_UPPER)
1191 srv.bind(srvaddr)
1192
1193 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1194 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1195 cli.sendto(MSG, sendaddr)
1196
1197 msg, recvaddr = srv.recvfrom(1024)
1198
1199 self.assertEqual(cli.getsockname(), recvaddr)
1200 self.assertEqual(msg, MSG)
1201
1202
1203class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1204 def __init__(self, methodName = 'runTest'):
1205 unittest.TestCase.__init__(self, methodName = methodName)
1206 ThreadableTest.__init__(self)
1207
1208 def setUp(self):
1209 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1210 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1211 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1212 TIPC_LOWER, TIPC_UPPER)
1213 self.srv.bind(srvaddr)
1214 self.srv.listen(5)
1215 self.serverExplicitReady()
1216 self.conn, self.connaddr = self.srv.accept()
1217
1218 def clientSetUp(self):
1219 # The is a hittable race between serverExplicitReady() and the
1220 # accept() call; sleep a little while to avoid it, otherwise
1221 # we could get an exception
1222 time.sleep(0.1)
1223 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1224 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1225 TIPC_LOWER + (TIPC_UPPER - TIPC_LOWER) / 2, 0)
1226 self.cli.connect(addr)
1227 self.cliaddr = self.cli.getsockname()
1228
1229 def testStream(self):
1230 msg = self.conn.recv(1024)
1231 self.assertEqual(msg, MSG)
1232 self.assertEqual(self.cliaddr, self.connaddr)
1233
1234 def _testStream(self):
1235 self.cli.send(MSG)
1236 self.cli.close()
1237
1238
Guido van Rossumb995eb72002-07-31 16:08:40 +00001239def test_main():
Martin v. Löwis7596e832006-07-01 15:33:37 +00001240 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Facundo Batista07c78be2007-03-23 18:54:07 +00001241 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001242 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001243 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001244
1245 tests.extend([
1246 NonBlockingTCPTests,
1247 FileObjectClassTestCase,
1248 UnbufferedFileObjectClassTestCase,
1249 LineBufferedFileObjectClassTestCase,
Georg Brandldd7b0522007-01-21 10:35:10 +00001250 SmallBufferedFileObjectClassTestCase,
1251 Urllib2FileobjectTest,
Facundo Batistab8af7bc2007-03-25 01:53:21 +00001252 NetworkConnectionNoServer,
Facundo Batista07c78be2007-03-23 18:54:07 +00001253 NetworkConnectionAttributesTest,
1254 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001255 ])
Dave Cole331708b2004-08-09 04:51:41 +00001256 if hasattr(socket, "socketpair"):
1257 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +00001258 if sys.platform == 'linux2':
1259 tests.append(TestLinuxAbstractNamespace)
Christian Heimesfb2d25a2008-01-07 16:12:44 +00001260 if isTipcAvailable():
1261 tests.append(TIPCTest)
Christian Heimes4d7e6702008-01-07 19:58:41 +00001262 tests.append(TIPCThreadableTest)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001263
1264 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001265 test_support.run_unittest(*tests)
Neal Norwitz9602cc22006-06-18 19:35:01 +00001266 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001267
1268if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001269 test_main()