blob: 2246fb6e4ce5c6d4fba7b35515fc0d6e8496b771 [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
Barry Warsawcf3d4b51997-01-03 20:03:32 +00006import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00007import select
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import time
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import thread, threading
10import Queue
Jack Jansen522e7692002-09-06 21:57:50 +000011import sys
Martin Blais2856e5f2006-05-26 12:03:27 +000012import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000013from weakref import proxy
Barry Warsawcf3d4b51997-01-03 20:03:32 +000014
Guido van Rossum24e4af82002-06-12 19:18:08 +000015PORT = 50007
16HOST = 'localhost'
17MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000018
Guido van Rossum24e4af82002-06-12 19:18:08 +000019class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Guido van Rossum24e4af82002-06-12 19:18:08 +000021 def setUp(self):
22 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
23 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
24 self.serv.bind((HOST, PORT))
25 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Guido van Rossum24e4af82002-06-12 19:18:08 +000027 def tearDown(self):
28 self.serv.close()
29 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000030
Guido van Rossum24e4af82002-06-12 19:18:08 +000031class SocketUDPTest(unittest.TestCase):
32
33 def setUp(self):
34 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
35 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
36 self.serv.bind((HOST, PORT))
37
38 def tearDown(self):
39 self.serv.close()
40 self.serv = None
41
42class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000043 """Threadable Test class
44
45 The ThreadableTest class makes it easy to create a threaded
46 client/server pair from an existing unit test. To create a
47 new threaded class from an existing unit test, use multiple
48 inheritance:
49
50 class NewClass (OldClass, ThreadableTest):
51 pass
52
53 This class defines two new fixture functions with obvious
54 purposes for overriding:
55
56 clientSetUp ()
57 clientTearDown ()
58
59 Any new test functions within the class must then define
60 tests in pairs, where the test name is preceeded with a
61 '_' to indicate the client portion of the test. Ex:
62
63 def testFoo(self):
64 # Server portion
65
66 def _testFoo(self):
67 # Client portion
68
69 Any exceptions raised by the clients during their tests
70 are caught and transferred to the main thread to alert
71 the testing framework.
72
73 Note, the server setup function cannot call any blocking
74 functions that rely on the client thread during setup,
75 unless serverExplicityReady() is called just before
76 the blocking call (such as in setting up a client/server
77 connection and performing the accept() in setUp().
78 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000079
80 def __init__(self):
81 # Swap the true setup function
82 self.__setUp = self.setUp
83 self.__tearDown = self.tearDown
84 self.setUp = self._setUp
85 self.tearDown = self._tearDown
86
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000087 def serverExplicitReady(self):
88 """This method allows the server to explicitly indicate that
89 it wants the client thread to proceed. This is useful if the
90 server is about to execute a blocking routine that is
91 dependent upon the client thread during its setup routine."""
92 self.server_ready.set()
93
Guido van Rossum24e4af82002-06-12 19:18:08 +000094 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000095 self.server_ready = threading.Event()
96 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000097 self.done = threading.Event()
98 self.queue = Queue.Queue(1)
99
100 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000101 methodname = self.id()
102 i = methodname.rfind('.')
103 methodname = methodname[i+1:]
104 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000105 self.client_thread = thread.start_new_thread(
106 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000107
108 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000109 if not self.server_ready.isSet():
110 self.server_ready.set()
111 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000112
113 def _tearDown(self):
114 self.__tearDown()
115 self.done.wait()
116
117 if not self.queue.empty():
118 msg = self.queue.get()
119 self.fail(msg)
120
121 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000122 self.server_ready.wait()
123 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124 self.clientSetUp()
125 if not callable(test_func):
126 raise TypeError, "test_func must be a callable function"
127 try:
128 test_func()
129 except Exception, strerror:
130 self.queue.put(strerror)
131 self.clientTearDown()
132
133 def clientSetUp(self):
134 raise NotImplementedError, "clientSetUp must be implemented."
135
136 def clientTearDown(self):
137 self.done.set()
138 thread.exit()
139
140class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
141
142 def __init__(self, methodName='runTest'):
143 SocketTCPTest.__init__(self, methodName=methodName)
144 ThreadableTest.__init__(self)
145
146 def clientSetUp(self):
147 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
148
149 def clientTearDown(self):
150 self.cli.close()
151 self.cli = None
152 ThreadableTest.clientTearDown(self)
153
154class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
155
156 def __init__(self, methodName='runTest'):
157 SocketUDPTest.__init__(self, methodName=methodName)
158 ThreadableTest.__init__(self)
159
160 def clientSetUp(self):
161 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
162
163class SocketConnectedTest(ThreadedTCPSocketTest):
164
165 def __init__(self, methodName='runTest'):
166 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
167
168 def setUp(self):
169 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000170 # Indicate explicitly we're ready for the client thread to
171 # proceed and then perform the blocking call to accept
172 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000173 conn, addr = self.serv.accept()
174 self.cli_conn = conn
175
176 def tearDown(self):
177 self.cli_conn.close()
178 self.cli_conn = None
179 ThreadedTCPSocketTest.tearDown(self)
180
181 def clientSetUp(self):
182 ThreadedTCPSocketTest.clientSetUp(self)
183 self.cli.connect((HOST, PORT))
184 self.serv_conn = self.cli
185
186 def clientTearDown(self):
187 self.serv_conn.close()
188 self.serv_conn = None
189 ThreadedTCPSocketTest.clientTearDown(self)
190
Dave Cole331708b2004-08-09 04:51:41 +0000191class SocketPairTest(unittest.TestCase, ThreadableTest):
192
193 def __init__(self, methodName='runTest'):
194 unittest.TestCase.__init__(self, methodName=methodName)
195 ThreadableTest.__init__(self)
196
197 def setUp(self):
198 self.serv, self.cli = socket.socketpair()
199
200 def tearDown(self):
201 self.serv.close()
202 self.serv = None
203
204 def clientSetUp(self):
205 pass
206
207 def clientTearDown(self):
208 self.cli.close()
209 self.cli = None
210 ThreadableTest.clientTearDown(self)
211
Tim Peters494aaee2004-08-09 18:54:11 +0000212
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213#######################################################################
214## Begin Tests
215
216class GeneralModuleTests(unittest.TestCase):
217
Raymond Hettinger027bb632004-05-31 03:09:25 +0000218 def test_weakref(self):
219 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
220 p = proxy(s)
221 self.assertEqual(p.fileno(), s.fileno())
222 s.close()
223 s = None
224 try:
225 p.fileno()
226 except ReferenceError:
227 pass
228 else:
229 self.fail('Socket proxy still exists')
230
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000232 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def raise_error(*args, **kwargs):
234 raise socket.error
235 def raise_herror(*args, **kwargs):
236 raise socket.herror
237 def raise_gaierror(*args, **kwargs):
238 raise socket.gaierror
239 self.failUnlessRaises(socket.error, raise_error,
240 "Error raising socket exception.")
241 self.failUnlessRaises(socket.error, raise_herror,
242 "Error raising socket exception.")
243 self.failUnlessRaises(socket.error, raise_gaierror,
244 "Error raising socket exception.")
245
246 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000247 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000248 socket.AF_INET
249 socket.SOCK_STREAM
250 socket.SOCK_DGRAM
251 socket.SOCK_RAW
252 socket.SOCK_RDM
253 socket.SOCK_SEQPACKET
254 socket.SOL_SOCKET
255 socket.SO_REUSEADDR
256
Guido van Rossum654c11e2002-06-13 20:24:17 +0000257 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000258 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000259 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000260 try:
261 ip = socket.gethostbyname(hostname)
262 except socket.error:
263 # Probably name lookup wasn't set up right; skip this test
264 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000265 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000266 try:
267 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
268 except socket.error:
269 # Probably a similar problem as above; skip this test
270 return
Brett Cannon01668a12005-03-11 00:04:17 +0000271 all_host_names = [hostname, hname] + aliases
Anthony Baxtercf0a2a82006-04-03 08:10:33 +0000272 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000273 if not fqhn in all_host_names:
Martin v. Löwis04855cc2006-03-26 16:40:47 +0000274 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000275
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000276 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000277 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278 import sys
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
Barry Warsaw11b91a02004-06-28 00:50:43 +0000310 def testGetServBy(self):
311 eq = self.assertEqual
312 # Find one service that exists, then check all the related interfaces.
313 # I've ordered this by protocols that have both a tcp and udp
314 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000315 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000316 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000317 # avoid the 'echo' service on this platform, as there is an
318 # assumption breaking non-standard port/protocol entry
319 services = ('daytime', 'qotd', 'domain')
320 else:
321 services = ('echo', 'daytime', 'domain')
322 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000323 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000324 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000325 break
326 except socket.error:
327 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000328 else:
329 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000330 # Try same call with optional protocol omitted
331 port2 = socket.getservbyname(service)
332 eq(port, port2)
333 # Try udp, but don't barf it it doesn't exist
334 try:
335 udpport = socket.getservbyname(service, 'udp')
336 except socket.error:
337 udpport = None
338 else:
339 eq(udpport, port)
340 # Now make sure the lookup by port returns the same service name
341 eq(socket.getservbyport(port2), service)
342 eq(socket.getservbyport(port, 'tcp'), service)
343 if udpport is not None:
344 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000345
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000346 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000347 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000348 # The default timeout should initially be None
349 self.assertEqual(socket.getdefaulttimeout(), None)
350 s = socket.socket()
351 self.assertEqual(s.gettimeout(), None)
352 s.close()
353
354 # Set the default timeout to 10, and see if it propagates
355 socket.setdefaulttimeout(10)
356 self.assertEqual(socket.getdefaulttimeout(), 10)
357 s = socket.socket()
358 self.assertEqual(s.gettimeout(), 10)
359 s.close()
360
361 # Reset the default timeout to None, and see if it propagates
362 socket.setdefaulttimeout(None)
363 self.assertEqual(socket.getdefaulttimeout(), None)
364 s = socket.socket()
365 self.assertEqual(s.gettimeout(), None)
366 s.close()
367
368 # Check that setting it to an invalid value raises ValueError
369 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
370
371 # Check that setting it to an invalid type raises TypeError
372 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
373
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000374 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000375 if not hasattr(socket, 'inet_pton'):
376 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000377 from socket import inet_aton as f, inet_pton, AF_INET
378 g = lambda a: inet_pton(AF_INET, a)
379
380 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
381 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
382 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
383 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000384 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000385
386 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
387 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
388 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000389 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000390
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000391 def testIPv6toString(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 try:
395 from socket import inet_pton, AF_INET6, has_ipv6
396 if not has_ipv6:
397 return
398 except ImportError:
399 return
400 f = lambda a: inet_pton(AF_INET6, a)
401
402 self.assertEquals('\x00' * 16, f('::'))
403 self.assertEquals('\x00' * 16, f('0::0'))
404 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
405 self.assertEquals(
406 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
407 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
408 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000409
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000410 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000411 if not hasattr(socket, 'inet_ntop'):
412 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000413 from socket import inet_ntoa as f, inet_ntop, AF_INET
414 g = lambda a: inet_ntop(AF_INET, a)
415
416 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
417 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
418 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
419 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000420
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000421 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
422 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
423 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
424
425 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000426 if not hasattr(socket, 'inet_ntop'):
427 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000428 try:
429 from socket import inet_ntop, AF_INET6, has_ipv6
430 if not has_ipv6:
431 return
432 except ImportError:
433 return
434 f = lambda a: inet_ntop(AF_INET6, a)
435
436 self.assertEquals('::', f('\x00' * 16))
437 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
438 self.assertEquals(
439 'aef:b01:506:1001:ffff:9997:55:170',
440 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
441 )
442
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000443 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000444
Guido van Rossum24e4af82002-06-12 19:18:08 +0000445 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000446 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000447 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000448 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000449 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000450 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451
452 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000453 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000454 # We know a socket should start without reuse==0
455 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
456 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000457 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000458
459 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000460 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000461 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
462 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
463 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000464 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000466 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000467 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000468 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
469 sock.settimeout(1)
470 sock.close()
471 self.assertRaises(socket.error, sock.send, "spam")
472
Georg Brandlbb03ac02006-03-21 18:17:25 +0000473 def testNewAttributes(self):
474 # testing .family, .type and .protocol
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000475 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlbb03ac02006-03-21 18:17:25 +0000476 self.assertEqual(sock.family, socket.AF_INET)
477 self.assertEqual(sock.type, socket.SOCK_STREAM)
478 self.assertEqual(sock.proto, 0)
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000479 sock.close()
480
Guido van Rossum24e4af82002-06-12 19:18:08 +0000481class BasicTCPTest(SocketConnectedTest):
482
483 def __init__(self, methodName='runTest'):
484 SocketConnectedTest.__init__(self, methodName=methodName)
485
486 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000487 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000488 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000489 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000490
491 def _testRecv(self):
492 self.serv_conn.send(MSG)
493
494 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000495 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000496 seg1 = self.cli_conn.recv(len(MSG) - 3)
497 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000498 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000499 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500
501 def _testOverFlowRecv(self):
502 self.serv_conn.send(MSG)
503
504 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000505 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000506 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000507 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000508
509 def _testRecvFrom(self):
510 self.serv_conn.send(MSG)
511
512 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000513 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
515 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000516 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000517 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000518
519 def _testOverFlowRecvFrom(self):
520 self.serv_conn.send(MSG)
521
522 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000523 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000524 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000525 while 1:
526 read = self.cli_conn.recv(1024)
527 if not read:
528 break
Guido van Rossume531e292002-08-08 20:28:34 +0000529 msg += read
530 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531
532 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000533 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000534 self.serv_conn.sendall(big_chunk)
535
536 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000538 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000539 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000540 fd = self.cli_conn.fileno()
541 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
542 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000543 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000544
545 def _testFromFd(self):
546 self.serv_conn.send(MSG)
547
548 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000549 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000550 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000551 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def _testShutdown(self):
554 self.serv_conn.send(MSG)
555 self.serv_conn.shutdown(2)
556
557class BasicUDPTest(ThreadedUDPSocketTest):
558
559 def __init__(self, methodName='runTest'):
560 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
561
562 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000563 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000564 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000565 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000566
567 def _testSendtoAndRecv(self):
568 self.cli.sendto(MSG, 0, (HOST, PORT))
569
Guido van Rossum1c938012002-06-12 21:17:20 +0000570 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000571 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000573 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000574
Guido van Rossum1c938012002-06-12 21:17:20 +0000575 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000576 self.cli.sendto(MSG, 0, (HOST, PORT))
577
Dave Cole331708b2004-08-09 04:51:41 +0000578class BasicSocketPairTest(SocketPairTest):
579
580 def __init__(self, methodName='runTest'):
581 SocketPairTest.__init__(self, methodName=methodName)
582
583 def testRecv(self):
584 msg = self.serv.recv(1024)
585 self.assertEqual(msg, MSG)
586
587 def _testRecv(self):
588 self.cli.send(MSG)
589
590 def testSend(self):
591 self.serv.send(MSG)
592
593 def _testSend(self):
594 msg = self.cli.recv(1024)
595 self.assertEqual(msg, MSG)
596
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597class NonBlockingTCPTests(ThreadedTCPSocketTest):
598
599 def __init__(self, methodName='runTest'):
600 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
601
602 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000603 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000604 self.serv.setblocking(0)
605 start = time.time()
606 try:
607 self.serv.accept()
608 except socket.error:
609 pass
610 end = time.time()
611 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
612
613 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000614 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000615
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000617 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000619 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000620 conn, addr = self.serv.accept()
621 except socket.error:
622 pass
623 else:
624 self.fail("Error trying to do non-blocking accept.")
625 read, write, err = select.select([self.serv], [], [])
626 if self.serv in read:
627 conn, addr = self.serv.accept()
628 else:
629 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630
Guido van Rossum24e4af82002-06-12 19:18:08 +0000631 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000632 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000633 self.cli.connect((HOST, PORT))
634
635 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000636 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000637 conn, addr = self.serv.accept()
638
639 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000640 self.cli.settimeout(10)
641 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642
643 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000644 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000645 conn, addr = self.serv.accept()
646 conn.setblocking(0)
647 try:
648 msg = conn.recv(len(MSG))
649 except socket.error:
650 pass
651 else:
652 self.fail("Error trying to do non-blocking recv.")
653 read, write, err = select.select([conn], [], [])
654 if conn in read:
655 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000656 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000657 else:
658 self.fail("Error during select call to non-blocking socket.")
659
660 def _testRecv(self):
661 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000662 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663 self.cli.send(MSG)
664
665class FileObjectClassTestCase(SocketConnectedTest):
666
Guido van Rossume9f66142002-08-07 15:46:19 +0000667 bufsize = -1 # Use default buffer size
668
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 def __init__(self, methodName='runTest'):
670 SocketConnectedTest.__init__(self, methodName=methodName)
671
672 def setUp(self):
673 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000674 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000675
676 def tearDown(self):
677 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000678 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 self.serv_file = None
680 SocketConnectedTest.tearDown(self)
681
682 def clientSetUp(self):
683 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000684 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685
686 def clientTearDown(self):
687 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000688 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000689 self.cli_file = None
690 SocketConnectedTest.clientTearDown(self)
691
692 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000693 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 first_seg = self.serv_file.read(len(MSG)-3)
695 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000696 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000697 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698
699 def _testSmallRead(self):
700 self.cli_file.write(MSG)
701 self.cli_file.flush()
702
Guido van Rossum8c943832002-08-08 01:00:28 +0000703 def testFullRead(self):
704 # read until EOF
705 msg = self.serv_file.read()
706 self.assertEqual(msg, MSG)
707
708 def _testFullRead(self):
709 self.cli_file.write(MSG)
710 self.cli_file.close()
711
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000713 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000714 buf = ''
715 while 1:
716 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000717 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000719 buf += char
720 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721
722 def _testUnbufferedRead(self):
723 self.cli_file.write(MSG)
724 self.cli_file.flush()
725
726 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000727 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000729 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730
731 def _testReadline(self):
732 self.cli_file.write(MSG)
733 self.cli_file.flush()
734
Tim Peters116d83c2004-03-28 02:20:45 +0000735 def testClosedAttr(self):
736 self.assert_(not self.serv_file.closed)
737
738 def _testClosedAttr(self):
739 self.assert_(not self.cli_file.closed)
740
Guido van Rossume9f66142002-08-07 15:46:19 +0000741class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
742
743 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000744
Guido van Rossume9f66142002-08-07 15:46:19 +0000745 In this case (and in this case only), it should be possible to
746 create a file object, read a line from it, create another file
747 object, read another line from it, without loss of data in the
748 first file object's buffer. Note that httplib relies on this
749 when reading multiple requests from the same socket."""
750
751 bufsize = 0 # Use unbuffered mode
752
753 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000754 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000755 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000756 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000757 self.serv_file = self.cli_conn.makefile('rb', 0)
758 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000759 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000760
761 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000762 self.cli_file.write("A. " + MSG)
763 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000764 self.cli_file.flush()
765
Guido van Rossum8c943832002-08-08 01:00:28 +0000766class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
767
768 bufsize = 1 # Default-buffered for reading; line-buffered for writing
769
770
771class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
772
773 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000774
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000775class TCPTimeoutTest(SocketTCPTest):
776
777 def testTCPTimeout(self):
778 def raise_timeout(*args, **kwargs):
779 self.serv.settimeout(1.0)
780 self.serv.accept()
781 self.failUnlessRaises(socket.timeout, raise_timeout,
782 "Error generating a timeout exception (TCP)")
783
784 def testTimeoutZero(self):
785 ok = False
786 try:
787 self.serv.settimeout(0.0)
788 foo = self.serv.accept()
789 except socket.timeout:
790 self.fail("caught timeout instead of error (TCP)")
791 except socket.error:
792 ok = True
793 except:
794 self.fail("caught unexpected exception (TCP)")
795 if not ok:
796 self.fail("accept() returned success when we did not expect it")
797
798class UDPTimeoutTest(SocketTCPTest):
799
800 def testUDPTimeout(self):
801 def raise_timeout(*args, **kwargs):
802 self.serv.settimeout(1.0)
803 self.serv.recv(1024)
804 self.failUnlessRaises(socket.timeout, raise_timeout,
805 "Error generating a timeout exception (UDP)")
806
807 def testTimeoutZero(self):
808 ok = False
809 try:
810 self.serv.settimeout(0.0)
811 foo = self.serv.recv(1024)
812 except socket.timeout:
813 self.fail("caught timeout instead of error (UDP)")
814 except socket.error:
815 ok = True
816 except:
817 self.fail("caught unexpected exception (UDP)")
818 if not ok:
819 self.fail("recv() returned success when we did not expect it")
820
821class TestExceptions(unittest.TestCase):
822
823 def testExceptionTree(self):
824 self.assert_(issubclass(socket.error, Exception))
825 self.assert_(issubclass(socket.herror, socket.error))
826 self.assert_(issubclass(socket.gaierror, socket.error))
827 self.assert_(issubclass(socket.timeout, socket.error))
828
Armin Rigoa9017c32006-04-19 11:50:27 +0000829class TestLinuxAbstractNamespace(unittest.TestCase):
830
831 UNIX_PATH_MAX = 108
832
833 def testLinuxAbstractNamespace(self):
834 address = "\x00python-test-hello\x00\xff"
835 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
836 s1.bind(address)
837 s1.listen(1)
838 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
839 s2.connect(s1.getsockname())
840 s1.accept()
841 self.assertEqual(s1.getsockname(), address)
842 self.assertEqual(s2.getpeername(), address)
843
844 def testMaxName(self):
845 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
846 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
847 s.bind(address)
848 self.assertEqual(s.getsockname(), address)
849
850 def testNameOverflow(self):
851 address = "\x00" + "h" * self.UNIX_PATH_MAX
852 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
853 self.assertRaises(socket.error, s.bind, address)
854
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000855
Martin Blais2856e5f2006-05-26 12:03:27 +0000856class BufferIOTest(SocketConnectedTest):
857 """
858 Test the buffer versions of socket.recv() and socket.send().
859 """
860 def __init__(self, methodName='runTest'):
861 SocketConnectedTest.__init__(self, methodName=methodName)
862
863 def testRecvBuf(self):
864 buf = array.array('c', ' '*1024)
865 nbytes = self.cli_conn.recv_buf(buf)
866 self.assertEqual(nbytes, len(MSG))
867 msg = buf.tostring()[:len(MSG)]
868 self.assertEqual(msg, MSG)
869
870 def _testRecvBuf(self):
871 buf = buffer(MSG)
872 self.serv_conn.send(buf)
873
874 def testRecvFromBuf(self):
875 buf = array.array('c', ' '*1024)
876 nbytes, addr = self.cli_conn.recvfrom_buf(buf)
877 self.assertEqual(nbytes, len(MSG))
878 msg = buf.tostring()[:len(MSG)]
879 self.assertEqual(msg, MSG)
880
881 def _testRecvFromBuf(self):
882 buf = buffer(MSG)
883 self.serv_conn.send(buf)
884
Guido van Rossumb995eb72002-07-31 16:08:40 +0000885def test_main():
Martin Blais2856e5f2006-05-26 12:03:27 +0000886 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions,
887 BufferIOTest]
Jack Jansen522e7692002-09-06 21:57:50 +0000888 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000889 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000890
891 tests.extend([
892 NonBlockingTCPTests,
893 FileObjectClassTestCase,
894 UnbufferedFileObjectClassTestCase,
895 LineBufferedFileObjectClassTestCase,
896 SmallBufferedFileObjectClassTestCase
897 ])
Dave Cole331708b2004-08-09 04:51:41 +0000898 if hasattr(socket, "socketpair"):
899 tests.append(BasicSocketPairTest)
Armin Rigoa9017c32006-04-19 11:50:27 +0000900 if sys.platform == 'linux2':
901 tests.append(TestLinuxAbstractNamespace)
Walter Dörwald21d3a322003-05-01 17:45:56 +0000902 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000903
904if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000905 test_main()