blob: 6943080a71c00abf9dfb624add3deabcc1e4e5a1 [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
Raymond Hettinger027bb632004-05-31 03:09:25 +000012from weakref import proxy
Barry Warsawcf3d4b51997-01-03 20:03:32 +000013
Guido van Rossum24e4af82002-06-12 19:18:08 +000014PORT = 50007
15HOST = 'localhost'
16MSG = 'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000017
Guido van Rossum24e4af82002-06-12 19:18:08 +000018class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Guido van Rossum24e4af82002-06-12 19:18:08 +000020 def setUp(self):
21 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
22 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
23 self.serv.bind((HOST, PORT))
24 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 def tearDown(self):
27 self.serv.close()
28 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Guido van Rossum24e4af82002-06-12 19:18:08 +000030class SocketUDPTest(unittest.TestCase):
31
32 def setUp(self):
33 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
34 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
35 self.serv.bind((HOST, PORT))
36
37 def tearDown(self):
38 self.serv.close()
39 self.serv = None
40
41class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000042 """Threadable Test class
43
44 The ThreadableTest class makes it easy to create a threaded
45 client/server pair from an existing unit test. To create a
46 new threaded class from an existing unit test, use multiple
47 inheritance:
48
49 class NewClass (OldClass, ThreadableTest):
50 pass
51
52 This class defines two new fixture functions with obvious
53 purposes for overriding:
54
55 clientSetUp ()
56 clientTearDown ()
57
58 Any new test functions within the class must then define
59 tests in pairs, where the test name is preceeded with a
60 '_' to indicate the client portion of the test. Ex:
61
62 def testFoo(self):
63 # Server portion
64
65 def _testFoo(self):
66 # Client portion
67
68 Any exceptions raised by the clients during their tests
69 are caught and transferred to the main thread to alert
70 the testing framework.
71
72 Note, the server setup function cannot call any blocking
73 functions that rely on the client thread during setup,
74 unless serverExplicityReady() is called just before
75 the blocking call (such as in setting up a client/server
76 connection and performing the accept() in setUp().
77 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000078
79 def __init__(self):
80 # Swap the true setup function
81 self.__setUp = self.setUp
82 self.__tearDown = self.tearDown
83 self.setUp = self._setUp
84 self.tearDown = self._tearDown
85
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000086 def serverExplicitReady(self):
87 """This method allows the server to explicitly indicate that
88 it wants the client thread to proceed. This is useful if the
89 server is about to execute a blocking routine that is
90 dependent upon the client thread during its setup routine."""
91 self.server_ready.set()
92
Guido van Rossum24e4af82002-06-12 19:18:08 +000093 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000094 self.server_ready = threading.Event()
95 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 self.done = threading.Event()
97 self.queue = Queue.Queue(1)
98
99 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000100 methodname = self.id()
101 i = methodname.rfind('.')
102 methodname = methodname[i+1:]
103 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000104 self.client_thread = thread.start_new_thread(
105 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000106
107 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000108 if not self.server_ready.isSet():
109 self.server_ready.set()
110 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111
112 def _tearDown(self):
113 self.__tearDown()
114 self.done.wait()
115
116 if not self.queue.empty():
117 msg = self.queue.get()
118 self.fail(msg)
119
120 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000121 self.server_ready.wait()
122 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123 self.clientSetUp()
124 if not callable(test_func):
125 raise TypeError, "test_func must be a callable function"
126 try:
127 test_func()
128 except Exception, strerror:
129 self.queue.put(strerror)
130 self.clientTearDown()
131
132 def clientSetUp(self):
133 raise NotImplementedError, "clientSetUp must be implemented."
134
135 def clientTearDown(self):
136 self.done.set()
137 thread.exit()
138
139class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
140
141 def __init__(self, methodName='runTest'):
142 SocketTCPTest.__init__(self, methodName=methodName)
143 ThreadableTest.__init__(self)
144
145 def clientSetUp(self):
146 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
147
148 def clientTearDown(self):
149 self.cli.close()
150 self.cli = None
151 ThreadableTest.clientTearDown(self)
152
153class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
154
155 def __init__(self, methodName='runTest'):
156 SocketUDPTest.__init__(self, methodName=methodName)
157 ThreadableTest.__init__(self)
158
159 def clientSetUp(self):
160 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
161
162class SocketConnectedTest(ThreadedTCPSocketTest):
163
164 def __init__(self, methodName='runTest'):
165 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
166
167 def setUp(self):
168 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000169 # Indicate explicitly we're ready for the client thread to
170 # proceed and then perform the blocking call to accept
171 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172 conn, addr = self.serv.accept()
173 self.cli_conn = conn
174
175 def tearDown(self):
176 self.cli_conn.close()
177 self.cli_conn = None
178 ThreadedTCPSocketTest.tearDown(self)
179
180 def clientSetUp(self):
181 ThreadedTCPSocketTest.clientSetUp(self)
182 self.cli.connect((HOST, PORT))
183 self.serv_conn = self.cli
184
185 def clientTearDown(self):
186 self.serv_conn.close()
187 self.serv_conn = None
188 ThreadedTCPSocketTest.clientTearDown(self)
189
Dave Cole331708b2004-08-09 04:51:41 +0000190class SocketPairTest(unittest.TestCase, ThreadableTest):
191
192 def __init__(self, methodName='runTest'):
193 unittest.TestCase.__init__(self, methodName=methodName)
194 ThreadableTest.__init__(self)
195
196 def setUp(self):
197 self.serv, self.cli = socket.socketpair()
198
199 def tearDown(self):
200 self.serv.close()
201 self.serv = None
202
203 def clientSetUp(self):
204 pass
205
206 def clientTearDown(self):
207 self.cli.close()
208 self.cli = None
209 ThreadableTest.clientTearDown(self)
210
Tim Peters494aaee2004-08-09 18:54:11 +0000211
Guido van Rossum24e4af82002-06-12 19:18:08 +0000212#######################################################################
213## Begin Tests
214
215class GeneralModuleTests(unittest.TestCase):
216
Raymond Hettinger027bb632004-05-31 03:09:25 +0000217 def test_weakref(self):
218 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
219 p = proxy(s)
220 self.assertEqual(p.fileno(), s.fileno())
221 s.close()
222 s = None
223 try:
224 p.fileno()
225 except ReferenceError:
226 pass
227 else:
228 self.fail('Socket proxy still exists')
229
Guido van Rossum24e4af82002-06-12 19:18:08 +0000230 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000231 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000232 def raise_error(*args, **kwargs):
233 raise socket.error
234 def raise_herror(*args, **kwargs):
235 raise socket.herror
236 def raise_gaierror(*args, **kwargs):
237 raise socket.gaierror
238 self.failUnlessRaises(socket.error, raise_error,
239 "Error raising socket exception.")
240 self.failUnlessRaises(socket.error, raise_herror,
241 "Error raising socket exception.")
242 self.failUnlessRaises(socket.error, raise_gaierror,
243 "Error raising socket exception.")
244
245 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000246 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247 socket.AF_INET
248 socket.SOCK_STREAM
249 socket.SOCK_DGRAM
250 socket.SOCK_RAW
251 socket.SOCK_RDM
252 socket.SOCK_SEQPACKET
253 socket.SOL_SOCKET
254 socket.SO_REUSEADDR
255
Guido van Rossum654c11e2002-06-13 20:24:17 +0000256 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000257 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000258 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000259 try:
260 ip = socket.gethostbyname(hostname)
261 except socket.error:
262 # Probably name lookup wasn't set up right; skip this test
263 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000264 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000265 try:
266 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
267 except socket.error:
268 # Probably a similar problem as above; skip this test
269 return
Brett Cannon01668a12005-03-11 00:04:17 +0000270 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000271 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000272 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000273 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000274
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000275 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000276 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000278 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 try:
280 # On some versions, this loses a reference
281 orig = sys.getrefcount(__name__)
282 socket.getnameinfo(__name__,0)
283 except SystemError:
284 if sys.getrefcount(__name__) <> orig:
285 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000286
Guido van Rossum24e4af82002-06-12 19:18:08 +0000287 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000288 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000289 try:
290 # On some versions, this crashes the interpreter.
291 socket.getnameinfo(('x', 0, 0, 0), 0)
292 except socket.error:
293 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000294
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000295 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000296 # This just checks that htons etc. are their own inverse,
297 # when looking at the lower 16 or 32 bits.
298 sizes = {socket.htonl: 32, socket.ntohl: 32,
299 socket.htons: 16, socket.ntohs: 16}
300 for func, size in sizes.items():
301 mask = (1L<<size) - 1
302 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
303 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000304
Guido van Rossuma2627af2002-09-14 00:58:46 +0000305 swapped = func(mask)
306 self.assertEqual(swapped & mask, mask)
307 self.assertRaises(OverflowError, func, 1L<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000308
Barry Warsaw11b91a02004-06-28 00:50:43 +0000309 def testGetServBy(self):
310 eq = self.assertEqual
311 # Find one service that exists, then check all the related interfaces.
312 # I've ordered this by protocols that have both a tcp and udp
313 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000314 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000315 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000316 # avoid the 'echo' service on this platform, as there is an
317 # assumption breaking non-standard port/protocol entry
318 services = ('daytime', 'qotd', 'domain')
319 else:
320 services = ('echo', 'daytime', 'domain')
321 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000322 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000323 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000324 break
325 except socket.error:
326 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000327 else:
328 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000329 # Try same call with optional protocol omitted
330 port2 = socket.getservbyname(service)
331 eq(port, port2)
332 # Try udp, but don't barf it it doesn't exist
333 try:
334 udpport = socket.getservbyname(service, 'udp')
335 except socket.error:
336 udpport = None
337 else:
338 eq(udpport, port)
339 # Now make sure the lookup by port returns the same service name
340 eq(socket.getservbyport(port2), service)
341 eq(socket.getservbyport(port, 'tcp'), service)
342 if udpport is not None:
343 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000344
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000345 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000346 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000347 # The default timeout should initially be None
348 self.assertEqual(socket.getdefaulttimeout(), None)
349 s = socket.socket()
350 self.assertEqual(s.gettimeout(), None)
351 s.close()
352
353 # Set the default timeout to 10, and see if it propagates
354 socket.setdefaulttimeout(10)
355 self.assertEqual(socket.getdefaulttimeout(), 10)
356 s = socket.socket()
357 self.assertEqual(s.gettimeout(), 10)
358 s.close()
359
360 # Reset the default timeout to None, and see if it propagates
361 socket.setdefaulttimeout(None)
362 self.assertEqual(socket.getdefaulttimeout(), None)
363 s = socket.socket()
364 self.assertEqual(s.gettimeout(), None)
365 s.close()
366
367 # Check that setting it to an invalid value raises ValueError
368 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
369
370 # Check that setting it to an invalid type raises TypeError
371 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
372
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000373 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000374 if not hasattr(socket, 'inet_pton'):
375 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000376 from socket import inet_aton as f, inet_pton, AF_INET
377 g = lambda a: inet_pton(AF_INET, a)
378
379 self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
380 self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
381 self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
382 self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000383 self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000384
385 self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
386 self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
387 self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
Georg Brandld2e3ba72005-08-26 08:34:00 +0000388 self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000389
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000390 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000391 if not hasattr(socket, 'inet_pton'):
392 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000393 try:
394 from socket import inet_pton, AF_INET6, has_ipv6
395 if not has_ipv6:
396 return
397 except ImportError:
398 return
399 f = lambda a: inet_pton(AF_INET6, a)
400
401 self.assertEquals('\x00' * 16, f('::'))
402 self.assertEquals('\x00' * 16, f('0::0'))
403 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
404 self.assertEquals(
405 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
406 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
407 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000408
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000409 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000410 if not hasattr(socket, 'inet_ntop'):
411 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000412 from socket import inet_ntoa as f, inet_ntop, AF_INET
413 g = lambda a: inet_ntop(AF_INET, a)
414
415 self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
416 self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
417 self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
418 self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000419
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000420 self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
421 self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
422 self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
423
424 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000425 if not hasattr(socket, 'inet_ntop'):
426 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000427 try:
428 from socket import inet_ntop, AF_INET6, has_ipv6
429 if not has_ipv6:
430 return
431 except ImportError:
432 return
433 f = lambda a: inet_ntop(AF_INET6, a)
434
435 self.assertEquals('::', f('\x00' * 16))
436 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
437 self.assertEquals(
438 'aef:b01:506:1001:ffff:9997:55:170',
439 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
440 )
441
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000442 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000443
Guido van Rossum24e4af82002-06-12 19:18:08 +0000444 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000445 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000446 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000447 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000448 name = sock.getsockname()
Guido van Rossum1c938012002-06-12 21:17:20 +0000449 self.assertEqual(name, ("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000450
451 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000452 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000453 # We know a socket should start without reuse==0
454 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
455 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000456 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000457
458 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000459 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000460 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
461 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
462 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000463 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000464
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000465 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000466 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000467 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
468 sock.settimeout(1)
469 sock.close()
470 self.assertRaises(socket.error, sock.send, "spam")
471
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000472 def testNewAttributes(self):
473 # testing .family, .type and .protocol
474 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
475 self.assertEqual(sock.family, socket.AF_INET)
476 self.assertEqual(sock.type, socket.SOCK_STREAM)
477 self.assertEqual(sock.proto, 0)
478 sock.close()
479
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480class BasicTCPTest(SocketConnectedTest):
481
482 def __init__(self, methodName='runTest'):
483 SocketConnectedTest.__init__(self, methodName=methodName)
484
485 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000486 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000487 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000488 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000489
490 def _testRecv(self):
491 self.serv_conn.send(MSG)
492
493 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000494 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000495 seg1 = self.cli_conn.recv(len(MSG) - 3)
496 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000497 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000498 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000499
500 def _testOverFlowRecv(self):
501 self.serv_conn.send(MSG)
502
503 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000504 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000505 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000506 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000507
508 def _testRecvFrom(self):
509 self.serv_conn.send(MSG)
510
511 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000512 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000513 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
514 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000515 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000516 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517
518 def _testOverFlowRecvFrom(self):
519 self.serv_conn.send(MSG)
520
521 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000522 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossume531e292002-08-08 20:28:34 +0000523 msg = ''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000524 while 1:
525 read = self.cli_conn.recv(1024)
526 if not read:
527 break
Guido van Rossume531e292002-08-08 20:28:34 +0000528 msg += read
529 self.assertEqual(msg, 'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000530
531 def _testSendAll(self):
Guido van Rossumab659962002-06-12 21:29:43 +0000532 big_chunk = 'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533 self.serv_conn.sendall(big_chunk)
534
535 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000536 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000537 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000538 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539 fd = self.cli_conn.fileno()
540 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
541 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000542 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000543
544 def _testFromFd(self):
545 self.serv_conn.send(MSG)
546
547 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000548 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000549 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000550 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000551
552 def _testShutdown(self):
553 self.serv_conn.send(MSG)
554 self.serv_conn.shutdown(2)
555
556class BasicUDPTest(ThreadedUDPSocketTest):
557
558 def __init__(self, methodName='runTest'):
559 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
560
561 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000562 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000564 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565
566 def _testSendtoAndRecv(self):
567 self.cli.sendto(MSG, 0, (HOST, PORT))
568
Guido van Rossum1c938012002-06-12 21:17:20 +0000569 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000570 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000572 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573
Guido van Rossum1c938012002-06-12 21:17:20 +0000574 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000575 self.cli.sendto(MSG, 0, (HOST, PORT))
576
Dave Cole331708b2004-08-09 04:51:41 +0000577class BasicSocketPairTest(SocketPairTest):
578
579 def __init__(self, methodName='runTest'):
580 SocketPairTest.__init__(self, methodName=methodName)
581
582 def testRecv(self):
583 msg = self.serv.recv(1024)
584 self.assertEqual(msg, MSG)
585
586 def _testRecv(self):
587 self.cli.send(MSG)
588
589 def testSend(self):
590 self.serv.send(MSG)
591
592 def _testSend(self):
593 msg = self.cli.recv(1024)
594 self.assertEqual(msg, MSG)
595
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596class NonBlockingTCPTests(ThreadedTCPSocketTest):
597
598 def __init__(self, methodName='runTest'):
599 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
600
601 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000602 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603 self.serv.setblocking(0)
604 start = time.time()
605 try:
606 self.serv.accept()
607 except socket.error:
608 pass
609 end = time.time()
610 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
611
612 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000613 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000614
Guido van Rossum24e4af82002-06-12 19:18:08 +0000615 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000616 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000618 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619 conn, addr = self.serv.accept()
620 except socket.error:
621 pass
622 else:
623 self.fail("Error trying to do non-blocking accept.")
624 read, write, err = select.select([self.serv], [], [])
625 if self.serv in read:
626 conn, addr = self.serv.accept()
627 else:
628 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000629
Guido van Rossum24e4af82002-06-12 19:18:08 +0000630 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000631 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000632 self.cli.connect((HOST, PORT))
633
634 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000635 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000636 conn, addr = self.serv.accept()
637
638 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000639 self.cli.settimeout(10)
640 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641
642 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000643 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 conn, addr = self.serv.accept()
645 conn.setblocking(0)
646 try:
647 msg = conn.recv(len(MSG))
648 except socket.error:
649 pass
650 else:
651 self.fail("Error trying to do non-blocking recv.")
652 read, write, err = select.select([conn], [], [])
653 if conn in read:
654 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000655 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000656 else:
657 self.fail("Error during select call to non-blocking socket.")
658
659 def _testRecv(self):
660 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000661 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000662 self.cli.send(MSG)
663
664class FileObjectClassTestCase(SocketConnectedTest):
665
Guido van Rossume9f66142002-08-07 15:46:19 +0000666 bufsize = -1 # Use default buffer size
667
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668 def __init__(self, methodName='runTest'):
669 SocketConnectedTest.__init__(self, methodName=methodName)
670
671 def setUp(self):
672 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000673 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674
675 def tearDown(self):
676 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000677 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000678 self.serv_file = None
679 SocketConnectedTest.tearDown(self)
680
681 def clientSetUp(self):
682 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000683 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000684
685 def clientTearDown(self):
686 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000687 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688 self.cli_file = None
689 SocketConnectedTest.clientTearDown(self)
690
691 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000692 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000693 first_seg = self.serv_file.read(len(MSG)-3)
694 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000695 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000696 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000697
698 def _testSmallRead(self):
699 self.cli_file.write(MSG)
700 self.cli_file.flush()
701
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 def testFullRead(self):
703 # read until EOF
704 msg = self.serv_file.read()
705 self.assertEqual(msg, MSG)
706
707 def _testFullRead(self):
708 self.cli_file.write(MSG)
709 self.cli_file.close()
710
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000712 # Performing unbuffered file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 buf = ''
714 while 1:
715 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000716 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000718 buf += char
719 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000720
721 def _testUnbufferedRead(self):
722 self.cli_file.write(MSG)
723 self.cli_file.flush()
724
725 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000726 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000727 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000728 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729
730 def _testReadline(self):
731 self.cli_file.write(MSG)
732 self.cli_file.flush()
733
Tim Peters116d83c2004-03-28 02:20:45 +0000734 def testClosedAttr(self):
735 self.assert_(not self.serv_file.closed)
736
737 def _testClosedAttr(self):
738 self.assert_(not self.cli_file.closed)
739
Guido van Rossume9f66142002-08-07 15:46:19 +0000740class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
741
742 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000743
Guido van Rossume9f66142002-08-07 15:46:19 +0000744 In this case (and in this case only), it should be possible to
745 create a file object, read a line from it, create another file
746 object, read another line from it, without loss of data in the
747 first file object's buffer. Note that httplib relies on this
748 when reading multiple requests from the same socket."""
749
750 bufsize = 0 # Use unbuffered mode
751
752 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000753 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000754 line = self.serv_file.readline() # first line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000755 self.assertEqual(line, "A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000756 self.serv_file = self.cli_conn.makefile('rb', 0)
757 line = self.serv_file.readline() # second line
Guido van Rossum10e3f412002-08-07 19:02:49 +0000758 self.assertEqual(line, "B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000759
760 def _testUnbufferedReadline(self):
Guido van Rossum10e3f412002-08-07 19:02:49 +0000761 self.cli_file.write("A. " + MSG)
762 self.cli_file.write("B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000763 self.cli_file.flush()
764
Guido van Rossum8c943832002-08-08 01:00:28 +0000765class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
766
767 bufsize = 1 # Default-buffered for reading; line-buffered for writing
768
769
770class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
771
772 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000773
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000774class TCPTimeoutTest(SocketTCPTest):
775
776 def testTCPTimeout(self):
777 def raise_timeout(*args, **kwargs):
778 self.serv.settimeout(1.0)
779 self.serv.accept()
780 self.failUnlessRaises(socket.timeout, raise_timeout,
781 "Error generating a timeout exception (TCP)")
782
783 def testTimeoutZero(self):
784 ok = False
785 try:
786 self.serv.settimeout(0.0)
787 foo = self.serv.accept()
788 except socket.timeout:
789 self.fail("caught timeout instead of error (TCP)")
790 except socket.error:
791 ok = True
792 except:
793 self.fail("caught unexpected exception (TCP)")
794 if not ok:
795 self.fail("accept() returned success when we did not expect it")
796
797class UDPTimeoutTest(SocketTCPTest):
798
799 def testUDPTimeout(self):
800 def raise_timeout(*args, **kwargs):
801 self.serv.settimeout(1.0)
802 self.serv.recv(1024)
803 self.failUnlessRaises(socket.timeout, raise_timeout,
804 "Error generating a timeout exception (UDP)")
805
806 def testTimeoutZero(self):
807 ok = False
808 try:
809 self.serv.settimeout(0.0)
810 foo = self.serv.recv(1024)
811 except socket.timeout:
812 self.fail("caught timeout instead of error (UDP)")
813 except socket.error:
814 ok = True
815 except:
816 self.fail("caught unexpected exception (UDP)")
817 if not ok:
818 self.fail("recv() returned success when we did not expect it")
819
820class TestExceptions(unittest.TestCase):
821
822 def testExceptionTree(self):
823 self.assert_(issubclass(socket.error, Exception))
824 self.assert_(issubclass(socket.herror, socket.error))
825 self.assert_(issubclass(socket.gaierror, socket.error))
826 self.assert_(issubclass(socket.timeout, socket.error))
827
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000828class TestLinuxAbstractNamespace(unittest.TestCase):
829
830 UNIX_PATH_MAX = 108
831
832 def testLinuxAbstractNamespace(self):
833 address = "\x00python-test-hello\x00\xff"
834 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
835 s1.bind(address)
836 s1.listen(1)
837 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
838 s2.connect(s1.getsockname())
839 s1.accept()
840 self.assertEqual(s1.getsockname(), address)
841 self.assertEqual(s2.getpeername(), address)
842
843 def testMaxName(self):
844 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
845 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
846 s.bind(address)
847 self.assertEqual(s.getsockname(), address)
848
849 def testNameOverflow(self):
850 address = "\x00" + "h" * self.UNIX_PATH_MAX
851 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
852 self.assertRaises(socket.error, s.bind, address)
853
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000854
Guido van Rossumb995eb72002-07-31 16:08:40 +0000855def test_main():
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000856 tests = [GeneralModuleTests, BasicTCPTest, TCPTimeoutTest, TestExceptions]
Jack Jansen522e7692002-09-06 21:57:50 +0000857 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000858 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +0000859
860 tests.extend([
861 NonBlockingTCPTests,
862 FileObjectClassTestCase,
863 UnbufferedFileObjectClassTestCase,
864 LineBufferedFileObjectClassTestCase,
865 SmallBufferedFileObjectClassTestCase
866 ])
Dave Cole331708b2004-08-09 04:51:41 +0000867 if hasattr(socket, "socketpair"):
868 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000869 if sys.platform == 'linux2':
870 tests.append(TestLinuxAbstractNamespace)
Walter Dörwald21d3a322003-05-01 17:45:56 +0000871 test_support.run_unittest(*tests)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872
873if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +0000874 test_main()