blob: cfb293fe19abf0907ee078af63aae0729485046c [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
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000014
Guido van Rossum24e4af82002-06-12 19:18:08 +000015PORT = 50007
16HOST = 'localhost'
Guido van Rossum7d0a8262007-05-21 23:13:11 +000017MSG = b'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)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024 global PORT
25 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000027
Guido van Rossum24e4af82002-06-12 19:18:08 +000028 def tearDown(self):
29 self.serv.close()
30 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000031
Guido van Rossum24e4af82002-06-12 19:18:08 +000032class SocketUDPTest(unittest.TestCase):
33
34 def setUp(self):
35 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
36 self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000037 global PORT
38 PORT = test_support.bind_port(self.serv, HOST, PORT)
Guido van Rossum24e4af82002-06-12 19:18:08 +000039
40 def tearDown(self):
41 self.serv.close()
42 self.serv = None
43
44class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000045 """Threadable Test class
46
47 The ThreadableTest class makes it easy to create a threaded
48 client/server pair from an existing unit test. To create a
49 new threaded class from an existing unit test, use multiple
50 inheritance:
51
52 class NewClass (OldClass, ThreadableTest):
53 pass
54
55 This class defines two new fixture functions with obvious
56 purposes for overriding:
57
58 clientSetUp ()
59 clientTearDown ()
60
61 Any new test functions within the class must then define
62 tests in pairs, where the test name is preceeded with a
63 '_' to indicate the client portion of the test. Ex:
64
65 def testFoo(self):
66 # Server portion
67
68 def _testFoo(self):
69 # Client portion
70
71 Any exceptions raised by the clients during their tests
72 are caught and transferred to the main thread to alert
73 the testing framework.
74
75 Note, the server setup function cannot call any blocking
76 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000077 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000078 the blocking call (such as in setting up a client/server
79 connection and performing the accept() in setUp().
80 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000081
82 def __init__(self):
83 # Swap the true setup function
84 self.__setUp = self.setUp
85 self.__tearDown = self.tearDown
86 self.setUp = self._setUp
87 self.tearDown = self._tearDown
88
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000089 def serverExplicitReady(self):
90 """This method allows the server to explicitly indicate that
91 it wants the client thread to proceed. This is useful if the
92 server is about to execute a blocking routine that is
93 dependent upon the client thread during its setup routine."""
94 self.server_ready.set()
95
Guido van Rossum24e4af82002-06-12 19:18:08 +000096 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000097 self.server_ready = threading.Event()
98 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +000099 self.done = threading.Event()
100 self.queue = Queue.Queue(1)
101
102 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000103 methodname = self.id()
104 i = methodname.rfind('.')
105 methodname = methodname[i+1:]
106 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000107 self.client_thread = thread.start_new_thread(
108 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000109
110 self.__setUp()
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 if not self.server_ready.isSet():
112 self.server_ready.set()
113 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114
115 def _tearDown(self):
116 self.__tearDown()
117 self.done.wait()
118
119 if not self.queue.empty():
120 msg = self.queue.get()
121 self.fail(msg)
122
123 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000124 self.server_ready.wait()
125 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000126 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000127 if not hasattr(test_func, '__call__'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128 raise TypeError, "test_func must be a callable function"
129 try:
130 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000131 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000132 self.queue.put(strerror)
133 self.clientTearDown()
134
135 def clientSetUp(self):
136 raise NotImplementedError, "clientSetUp must be implemented."
137
138 def clientTearDown(self):
139 self.done.set()
140 thread.exit()
141
142class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
143
144 def __init__(self, methodName='runTest'):
145 SocketTCPTest.__init__(self, methodName=methodName)
146 ThreadableTest.__init__(self)
147
148 def clientSetUp(self):
149 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
150
151 def clientTearDown(self):
152 self.cli.close()
153 self.cli = None
154 ThreadableTest.clientTearDown(self)
155
156class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
157
158 def __init__(self, methodName='runTest'):
159 SocketUDPTest.__init__(self, methodName=methodName)
160 ThreadableTest.__init__(self)
161
162 def clientSetUp(self):
163 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
164
165class SocketConnectedTest(ThreadedTCPSocketTest):
166
167 def __init__(self, methodName='runTest'):
168 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
169
170 def setUp(self):
171 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000172 # Indicate explicitly we're ready for the client thread to
173 # proceed and then perform the blocking call to accept
174 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 conn, addr = self.serv.accept()
176 self.cli_conn = conn
177
178 def tearDown(self):
179 self.cli_conn.close()
180 self.cli_conn = None
181 ThreadedTCPSocketTest.tearDown(self)
182
183 def clientSetUp(self):
184 ThreadedTCPSocketTest.clientSetUp(self)
185 self.cli.connect((HOST, PORT))
186 self.serv_conn = self.cli
187
188 def clientTearDown(self):
189 self.serv_conn.close()
190 self.serv_conn = None
191 ThreadedTCPSocketTest.clientTearDown(self)
192
Dave Cole331708b2004-08-09 04:51:41 +0000193class SocketPairTest(unittest.TestCase, ThreadableTest):
194
195 def __init__(self, methodName='runTest'):
196 unittest.TestCase.__init__(self, methodName=methodName)
197 ThreadableTest.__init__(self)
198
199 def setUp(self):
200 self.serv, self.cli = socket.socketpair()
201
202 def tearDown(self):
203 self.serv.close()
204 self.serv = None
205
206 def clientSetUp(self):
207 pass
208
209 def clientTearDown(self):
210 self.cli.close()
211 self.cli = None
212 ThreadableTest.clientTearDown(self)
213
Tim Peters494aaee2004-08-09 18:54:11 +0000214
Guido van Rossum24e4af82002-06-12 19:18:08 +0000215#######################################################################
216## Begin Tests
217
218class GeneralModuleTests(unittest.TestCase):
219
Raymond Hettinger027bb632004-05-31 03:09:25 +0000220 def test_weakref(self):
221 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
222 p = proxy(s)
223 self.assertEqual(p.fileno(), s.fileno())
224 s.close()
225 s = None
226 try:
227 p.fileno()
228 except ReferenceError:
229 pass
230 else:
231 self.fail('Socket proxy still exists')
232
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000234 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000235 def raise_error(*args, **kwargs):
236 raise socket.error
237 def raise_herror(*args, **kwargs):
238 raise socket.herror
239 def raise_gaierror(*args, **kwargs):
240 raise socket.gaierror
241 self.failUnlessRaises(socket.error, raise_error,
242 "Error raising socket exception.")
243 self.failUnlessRaises(socket.error, raise_herror,
244 "Error raising socket exception.")
245 self.failUnlessRaises(socket.error, raise_gaierror,
246 "Error raising socket exception.")
247
248 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000249 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250 socket.AF_INET
251 socket.SOCK_STREAM
252 socket.SOCK_DGRAM
253 socket.SOCK_RAW
254 socket.SOCK_RDM
255 socket.SOCK_SEQPACKET
256 socket.SOL_SOCKET
257 socket.SO_REUSEADDR
258
Guido van Rossum654c11e2002-06-13 20:24:17 +0000259 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000260 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000261 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000262 try:
263 ip = socket.gethostbyname(hostname)
264 except socket.error:
265 # Probably name lookup wasn't set up right; skip this test
266 return
Guido van Rossum654c11e2002-06-13 20:24:17 +0000267 self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000268 try:
269 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
270 except socket.error:
271 # Probably a similar problem as above; skip this test
272 return
Brett Cannon01668a12005-03-11 00:04:17 +0000273 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000274 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000275 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000276 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000277
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000278 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000279 # Testing reference count for getnameinfo
Guido van Rossum24e4af82002-06-12 19:18:08 +0000280 import sys
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000281 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000282 try:
283 # On some versions, this loses a reference
284 orig = sys.getrefcount(__name__)
285 socket.getnameinfo(__name__,0)
286 except SystemError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000287 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000288 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000289
Guido van Rossum24e4af82002-06-12 19:18:08 +0000290 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000291 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292 try:
293 # On some versions, this crashes the interpreter.
294 socket.getnameinfo(('x', 0, 0, 0), 0)
295 except socket.error:
296 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000297
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000298 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000299 # This just checks that htons etc. are their own inverse,
300 # when looking at the lower 16 or 32 bits.
301 sizes = {socket.htonl: 32, socket.ntohl: 32,
302 socket.htons: 16, socket.ntohs: 16}
303 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000304 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000305 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
306 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000307
Guido van Rossuma2627af2002-09-14 00:58:46 +0000308 swapped = func(mask)
309 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000310 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000311
Guido van Rossum018919a2007-01-15 00:07:32 +0000312 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000313 good_values = [ 1, 2, 3, 1, 2, 3 ]
314 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000315 for k in good_values:
316 socket.ntohl(k)
317 socket.ntohs(k)
318 socket.htonl(k)
319 socket.htons(k)
320 for k in bad_values:
321 self.assertRaises(OverflowError, socket.ntohl, k)
322 self.assertRaises(OverflowError, socket.ntohs, k)
323 self.assertRaises(OverflowError, socket.htonl, k)
324 self.assertRaises(OverflowError, socket.htons, k)
325
Barry Warsaw11b91a02004-06-28 00:50:43 +0000326 def testGetServBy(self):
327 eq = self.assertEqual
328 # Find one service that exists, then check all the related interfaces.
329 # I've ordered this by protocols that have both a tcp and udp
330 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000331 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Hye-Shik Chang4e422812005-07-17 02:36:59 +0000332 'freebsd7', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000333 # avoid the 'echo' service on this platform, as there is an
334 # assumption breaking non-standard port/protocol entry
335 services = ('daytime', 'qotd', 'domain')
336 else:
337 services = ('echo', 'daytime', 'domain')
338 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000339 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000340 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000341 break
342 except socket.error:
343 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000344 else:
345 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000346 # Try same call with optional protocol omitted
347 port2 = socket.getservbyname(service)
348 eq(port, port2)
349 # Try udp, but don't barf it it doesn't exist
350 try:
351 udpport = socket.getservbyname(service, 'udp')
352 except socket.error:
353 udpport = None
354 else:
355 eq(udpport, port)
356 # Now make sure the lookup by port returns the same service name
357 eq(socket.getservbyport(port2), service)
358 eq(socket.getservbyport(port, 'tcp'), service)
359 if udpport is not None:
360 eq(socket.getservbyport(udpport, 'udp'), service)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000361
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000362 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000363 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000364 # The default timeout should initially be None
365 self.assertEqual(socket.getdefaulttimeout(), None)
366 s = socket.socket()
367 self.assertEqual(s.gettimeout(), None)
368 s.close()
369
370 # Set the default timeout to 10, and see if it propagates
371 socket.setdefaulttimeout(10)
372 self.assertEqual(socket.getdefaulttimeout(), 10)
373 s = socket.socket()
374 self.assertEqual(s.gettimeout(), 10)
375 s.close()
376
377 # Reset the default timeout to None, and see if it propagates
378 socket.setdefaulttimeout(None)
379 self.assertEqual(socket.getdefaulttimeout(), None)
380 s = socket.socket()
381 self.assertEqual(s.gettimeout(), None)
382 s.close()
383
384 # Check that setting it to an invalid value raises ValueError
385 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
386
387 # Check that setting it to an invalid type raises TypeError
388 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
389
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000390 def testIPv4toString(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 from socket import inet_aton as f, inet_pton, AF_INET
394 g = lambda a: inet_pton(AF_INET, a)
395
Guido van Rossumb5b22702007-05-18 18:55:53 +0000396 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
397 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
398 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
399 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
400 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000401
Guido van Rossumb5b22702007-05-18 18:55:53 +0000402 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
403 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
404 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
405 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000406
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000407 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000408 if not hasattr(socket, 'inet_pton'):
409 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000410 try:
411 from socket import inet_pton, AF_INET6, has_ipv6
412 if not has_ipv6:
413 return
414 except ImportError:
415 return
416 f = lambda a: inet_pton(AF_INET6, a)
417
418 self.assertEquals('\x00' * 16, f('::'))
419 self.assertEquals('\x00' * 16, f('0::0'))
420 self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
421 self.assertEquals(
422 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
423 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
424 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000425
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000426 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000427 if not hasattr(socket, 'inet_ntop'):
428 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000429 from socket import inet_ntoa as f, inet_ntop, AF_INET
430 g = lambda a: inet_ntop(AF_INET, a)
431
Guido van Rossumb5b22702007-05-18 18:55:53 +0000432 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
433 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
434 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
435 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000436
Guido van Rossumb5b22702007-05-18 18:55:53 +0000437 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
438 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
439 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000440
441 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000442 if not hasattr(socket, 'inet_ntop'):
443 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000444 try:
445 from socket import inet_ntop, AF_INET6, has_ipv6
446 if not has_ipv6:
447 return
448 except ImportError:
449 return
450 f = lambda a: inet_ntop(AF_INET6, a)
451
452 self.assertEquals('::', f('\x00' * 16))
453 self.assertEquals('::1', f('\x00' * 15 + '\x01'))
454 self.assertEquals(
455 'aef:b01:506:1001:ffff:9997:55:170',
456 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
457 )
458
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000459 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000460
Guido van Rossum24e4af82002-06-12 19:18:08 +0000461 def testSockName(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000462 # Testing getsockname()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000463 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum1c938012002-06-12 21:17:20 +0000464 sock.bind(("0.0.0.0", PORT+1))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000465 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
467 # it reasonable to get the host's addr in addition to 0.0.0.0.
468 # At least for eCos. This is required for the S/390 to pass.
469 my_ip_addr = socket.gethostbyname(socket.gethostname())
470 self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
471 self.assertEqual(name[1], PORT+1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000472
473 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000474 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000475 # We know a socket should start without reuse==0
476 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
477 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000478 self.failIf(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000479
480 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000481 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000482 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
483 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
484 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Guido van Rossum733632a2002-06-12 20:46:49 +0000485 self.failIf(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000486
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000487 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000488 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000489 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
490 sock.settimeout(1)
491 sock.close()
492 self.assertRaises(socket.error, sock.send, "spam")
493
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000494 def testNewAttributes(self):
495 # testing .family, .type and .protocol
496 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
497 self.assertEqual(sock.family, socket.AF_INET)
498 self.assertEqual(sock.type, socket.SOCK_STREAM)
499 self.assertEqual(sock.proto, 0)
500 sock.close()
501
Guido van Rossum24e4af82002-06-12 19:18:08 +0000502class BasicTCPTest(SocketConnectedTest):
503
504 def __init__(self, methodName='runTest'):
505 SocketConnectedTest.__init__(self, methodName=methodName)
506
507 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000508 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000509 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000510 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000511
512 def _testRecv(self):
513 self.serv_conn.send(MSG)
514
515 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000516 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517 seg1 = self.cli_conn.recv(len(MSG) - 3)
518 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000519 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000520 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521
522 def _testOverFlowRecv(self):
523 self.serv_conn.send(MSG)
524
525 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000526 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000527 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000528 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000529
530 def _testRecvFrom(self):
531 self.serv_conn.send(MSG)
532
533 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000534 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
536 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000537 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000538 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000539
540 def _testOverFlowRecvFrom(self):
541 self.serv_conn.send(MSG)
542
543 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000545 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000546 while 1:
547 read = self.cli_conn.recv(1024)
548 if not read:
549 break
Guido van Rossume531e292002-08-08 20:28:34 +0000550 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000551 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000552
553 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000554 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000555 self.serv_conn.sendall(big_chunk)
556
557 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000558 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000559 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000560 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000561 fd = self.cli_conn.fileno()
562 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
563 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000564 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000565
566 def _testFromFd(self):
567 self.serv_conn.send(MSG)
568
569 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000570 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000571 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000572 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000573
574 def _testShutdown(self):
575 self.serv_conn.send(MSG)
576 self.serv_conn.shutdown(2)
577
578class BasicUDPTest(ThreadedUDPSocketTest):
579
580 def __init__(self, methodName='runTest'):
581 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
582
583 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000584 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000586 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000587
588 def _testSendtoAndRecv(self):
589 self.cli.sendto(MSG, 0, (HOST, PORT))
590
Guido van Rossum1c938012002-06-12 21:17:20 +0000591 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000592 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000594 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000595
Guido van Rossum1c938012002-06-12 21:17:20 +0000596 def _testRecvFrom(self):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000597 self.cli.sendto(MSG, 0, (HOST, PORT))
598
Guido van Rossumd8faa362007-04-27 19:54:29 +0000599 def testRecvFromNegative(self):
600 # Negative lengths passed to recvfrom should give ValueError.
601 self.assertRaises(ValueError, self.serv.recvfrom, -1)
602
603 def _testRecvFromNegative(self):
604 self.cli.sendto(MSG, 0, (HOST, PORT))
605
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000606class TCPCloserTest(ThreadedTCPSocketTest):
607
608 def testClose(self):
609 conn, addr = self.serv.accept()
610 conn.close()
611
612 sd = self.cli
613 read, write, err = select.select([sd], [], [], 1.0)
614 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000615 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000616
617 def _testClose(self):
618 self.cli.connect((HOST, PORT))
619 time.sleep(1.0)
620
Dave Cole331708b2004-08-09 04:51:41 +0000621class BasicSocketPairTest(SocketPairTest):
622
623 def __init__(self, methodName='runTest'):
624 SocketPairTest.__init__(self, methodName=methodName)
625
626 def testRecv(self):
627 msg = self.serv.recv(1024)
628 self.assertEqual(msg, MSG)
629
630 def _testRecv(self):
631 self.cli.send(MSG)
632
633 def testSend(self):
634 self.serv.send(MSG)
635
636 def _testSend(self):
637 msg = self.cli.recv(1024)
638 self.assertEqual(msg, MSG)
639
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640class NonBlockingTCPTests(ThreadedTCPSocketTest):
641
642 def __init__(self, methodName='runTest'):
643 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
644
645 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000646 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647 self.serv.setblocking(0)
648 start = time.time()
649 try:
650 self.serv.accept()
651 except socket.error:
652 pass
653 end = time.time()
654 self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
655
656 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000657 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000658
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000660 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000662 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663 conn, addr = self.serv.accept()
664 except socket.error:
665 pass
666 else:
667 self.fail("Error trying to do non-blocking accept.")
668 read, write, err = select.select([self.serv], [], [])
669 if self.serv in read:
670 conn, addr = self.serv.accept()
671 else:
672 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673
Guido van Rossum24e4af82002-06-12 19:18:08 +0000674 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000675 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000676 self.cli.connect((HOST, PORT))
677
678 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000679 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000680 conn, addr = self.serv.accept()
681
682 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000683 self.cli.settimeout(10)
684 self.cli.connect((HOST, PORT))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685
686 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000687 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000688 conn, addr = self.serv.accept()
689 conn.setblocking(0)
690 try:
691 msg = conn.recv(len(MSG))
692 except socket.error:
693 pass
694 else:
695 self.fail("Error trying to do non-blocking recv.")
696 read, write, err = select.select([conn], [], [])
697 if conn in read:
698 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000699 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000700 else:
701 self.fail("Error during select call to non-blocking socket.")
702
703 def _testRecv(self):
704 self.cli.connect((HOST, PORT))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000705 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000706 self.cli.send(MSG)
707
708class FileObjectClassTestCase(SocketConnectedTest):
709
Guido van Rossume9f66142002-08-07 15:46:19 +0000710 bufsize = -1 # Use default buffer size
711
Guido van Rossum24e4af82002-06-12 19:18:08 +0000712 def __init__(self, methodName='runTest'):
713 SocketConnectedTest.__init__(self, methodName=methodName)
714
715 def setUp(self):
716 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000717 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718
719 def tearDown(self):
720 self.serv_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000721 self.assert_(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000722 self.serv_file = None
723 SocketConnectedTest.tearDown(self)
724
725 def clientSetUp(self):
726 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000727 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728
729 def clientTearDown(self):
730 self.cli_file.close()
Tim Peters116d83c2004-03-28 02:20:45 +0000731 self.assert_(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 self.cli_file = None
733 SocketConnectedTest.clientTearDown(self)
734
735 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000736 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737 first_seg = self.serv_file.read(len(MSG)-3)
738 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000739 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000740 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741
742 def _testSmallRead(self):
743 self.cli_file.write(MSG)
744 self.cli_file.flush()
745
Guido van Rossum8c943832002-08-08 01:00:28 +0000746 def testFullRead(self):
747 # read until EOF
748 msg = self.serv_file.read()
749 self.assertEqual(msg, MSG)
750
751 def _testFullRead(self):
752 self.cli_file.write(MSG)
753 self.cli_file.close()
754
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000756 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000757 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758 while 1:
759 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000760 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000761 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000762 buf += char
763 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764
765 def _testUnbufferedRead(self):
766 self.cli_file.write(MSG)
767 self.cli_file.flush()
768
769 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000770 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000772 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773
774 def _testReadline(self):
775 self.cli_file.write(MSG)
776 self.cli_file.flush()
777
Tim Peters116d83c2004-03-28 02:20:45 +0000778 def testClosedAttr(self):
779 self.assert_(not self.serv_file.closed)
780
781 def _testClosedAttr(self):
782 self.assert_(not self.cli_file.closed)
783
Guido van Rossume9f66142002-08-07 15:46:19 +0000784class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
785
786 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000787
Guido van Rossume9f66142002-08-07 15:46:19 +0000788 In this case (and in this case only), it should be possible to
789 create a file object, read a line from it, create another file
790 object, read another line from it, without loss of data in the
791 first file object's buffer. Note that httplib relies on this
792 when reading multiple requests from the same socket."""
793
794 bufsize = 0 # Use unbuffered mode
795
796 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000797 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000798 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000799 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000800 self.serv_file = self.cli_conn.makefile('rb', 0)
801 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000802 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000803
804 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000805 self.cli_file.write(b"A. " + MSG)
806 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000807 self.cli_file.flush()
808
Guido van Rossum8c943832002-08-08 01:00:28 +0000809class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
810
811 bufsize = 1 # Default-buffered for reading; line-buffered for writing
812
813
814class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
815
816 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +0000817
Thomas Woutersb2137042007-02-01 18:02:27 +0000818
Guido van Rossumd8faa362007-04-27 19:54:29 +0000819class NetworkConnectionTest(object):
820 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000821
Guido van Rossumd8faa362007-04-27 19:54:29 +0000822 def clientSetUp(self):
823 self.cli = socket.create_connection((HOST, PORT))
824 self.serv_conn = self.cli
825
826class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
827 """Tests that NetworkConnection does not break existing TCP functionality.
828 """
829
830class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000831
Guido van Rossumd8faa362007-04-27 19:54:29 +0000832 def testWithoutServer(self):
833 self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
834
835class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
836
837 def __init__(self, methodName='runTest'):
838 SocketTCPTest.__init__(self, methodName=methodName)
839 ThreadableTest.__init__(self)
840
841 def clientSetUp(self):
842 pass
843
844 def clientTearDown(self):
845 self.cli.close()
846 self.cli = None
847 ThreadableTest.clientTearDown(self)
848
849 def _justAccept(self):
850 conn, addr = self.serv.accept()
851
852 testFamily = _justAccept
853 def _testFamily(self):
854 self.cli = socket.create_connection((HOST, PORT), timeout=30)
855 self.assertEqual(self.cli.family, 2)
856
857 testTimeoutDefault = _justAccept
858 def _testTimeoutDefault(self):
859 self.cli = socket.create_connection((HOST, PORT))
860 self.assertTrue(self.cli.gettimeout() is None)
861
862 testTimeoutValueNamed = _justAccept
863 def _testTimeoutValueNamed(self):
864 self.cli = socket.create_connection((HOST, PORT), timeout=30)
865 self.assertEqual(self.cli.gettimeout(), 30)
866
867 testTimeoutValueNonamed = _justAccept
868 def _testTimeoutValueNonamed(self):
869 self.cli = socket.create_connection((HOST, PORT), 30)
870 self.assertEqual(self.cli.gettimeout(), 30)
871
872 testTimeoutNone = _justAccept
873 def _testTimeoutNone(self):
874 previous = socket.getdefaulttimeout()
875 socket.setdefaulttimeout(30)
876 try:
877 self.cli = socket.create_connection((HOST, PORT), timeout=None)
878 finally:
879 socket.setdefaulttimeout(previous)
880 self.assertEqual(self.cli.gettimeout(), 30)
881
882
883class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
884
885 def __init__(self, methodName='runTest'):
886 SocketTCPTest.__init__(self, methodName=methodName)
887 ThreadableTest.__init__(self)
888
889 def clientSetUp(self):
890 pass
891
892 def clientTearDown(self):
893 self.cli.close()
894 self.cli = None
895 ThreadableTest.clientTearDown(self)
896
897 def testInsideTimeout(self):
898 conn, addr = self.serv.accept()
899 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000900 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000901 testOutsideTimeout = testInsideTimeout
902
903 def _testInsideTimeout(self):
904 self.cli = sock = socket.create_connection((HOST, PORT))
905 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000906 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000907
908 def _testOutsideTimeout(self):
909 self.cli = sock = socket.create_connection((HOST, PORT), timeout=1)
910 self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
911
912
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000913class TCPTimeoutTest(SocketTCPTest):
914
915 def testTCPTimeout(self):
916 def raise_timeout(*args, **kwargs):
917 self.serv.settimeout(1.0)
918 self.serv.accept()
919 self.failUnlessRaises(socket.timeout, raise_timeout,
920 "Error generating a timeout exception (TCP)")
921
922 def testTimeoutZero(self):
923 ok = False
924 try:
925 self.serv.settimeout(0.0)
926 foo = self.serv.accept()
927 except socket.timeout:
928 self.fail("caught timeout instead of error (TCP)")
929 except socket.error:
930 ok = True
931 except:
932 self.fail("caught unexpected exception (TCP)")
933 if not ok:
934 self.fail("accept() returned success when we did not expect it")
935
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000936 def testInterruptedTimeout(self):
937 # XXX I don't know how to do this test on MSWindows or any other
938 # plaform that doesn't support signal.alarm() or os.kill(), though
939 # the bug should have existed on all platforms.
940 if not hasattr(signal, "alarm"):
941 return # can only test on *nix
942 self.serv.settimeout(5.0) # must be longer than alarm
943 class Alarm(Exception):
944 pass
945 def alarm_handler(signal, frame):
946 raise Alarm
947 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
948 try:
949 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
950 try:
951 foo = self.serv.accept()
952 except socket.timeout:
953 self.fail("caught timeout instead of Alarm")
954 except Alarm:
955 pass
956 except:
957 self.fail("caught other exception instead of Alarm")
958 else:
959 self.fail("nothing caught")
960 signal.alarm(0) # shut off alarm
961 except Alarm:
962 self.fail("got Alarm in wrong place")
963 finally:
964 # no alarm can be pending. Safe to restore old handler.
965 signal.signal(signal.SIGALRM, old_alarm)
966
Raymond Hettinger11a35f52003-06-29 04:40:22 +0000967class UDPTimeoutTest(SocketTCPTest):
968
969 def testUDPTimeout(self):
970 def raise_timeout(*args, **kwargs):
971 self.serv.settimeout(1.0)
972 self.serv.recv(1024)
973 self.failUnlessRaises(socket.timeout, raise_timeout,
974 "Error generating a timeout exception (UDP)")
975
976 def testTimeoutZero(self):
977 ok = False
978 try:
979 self.serv.settimeout(0.0)
980 foo = self.serv.recv(1024)
981 except socket.timeout:
982 self.fail("caught timeout instead of error (UDP)")
983 except socket.error:
984 ok = True
985 except:
986 self.fail("caught unexpected exception (UDP)")
987 if not ok:
988 self.fail("recv() returned success when we did not expect it")
989
990class TestExceptions(unittest.TestCase):
991
992 def testExceptionTree(self):
993 self.assert_(issubclass(socket.error, Exception))
994 self.assert_(issubclass(socket.herror, socket.error))
995 self.assert_(issubclass(socket.gaierror, socket.error))
996 self.assert_(issubclass(socket.timeout, socket.error))
997
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000998class TestLinuxAbstractNamespace(unittest.TestCase):
999
1000 UNIX_PATH_MAX = 108
1001
1002 def testLinuxAbstractNamespace(self):
1003 address = "\x00python-test-hello\x00\xff"
1004 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1005 s1.bind(address)
1006 s1.listen(1)
1007 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1008 s2.connect(s1.getsockname())
1009 s1.accept()
1010 self.assertEqual(s1.getsockname(), address)
1011 self.assertEqual(s2.getpeername(), address)
1012
1013 def testMaxName(self):
1014 address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
1015 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1016 s.bind(address)
1017 self.assertEqual(s.getsockname(), address)
1018
1019 def testNameOverflow(self):
1020 address = "\x00" + "h" * self.UNIX_PATH_MAX
1021 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1022 self.assertRaises(socket.error, s.bind, address)
1023
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001024
Thomas Wouters477c8d52006-05-27 19:21:47 +00001025class BufferIOTest(SocketConnectedTest):
1026 """
1027 Test the buffer versions of socket.recv() and socket.send().
1028 """
1029 def __init__(self, methodName='runTest'):
1030 SocketConnectedTest.__init__(self, methodName=methodName)
1031
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001032 def testRecvInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001033 buf = b" "*1024
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001034 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001035 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001036 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001037 self.assertEqual(msg, MSG)
1038
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001039 def _testRecvInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001040 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001041 self.serv_conn.send(buf)
1042
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001043 def testRecvFromInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001044 buf = b" "*1024
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001045 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001046 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001047 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001048 self.assertEqual(msg, MSG)
1049
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001050 def _testRecvFromInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001051 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001052 self.serv_conn.send(buf)
1053
Guido van Rossumb995eb72002-07-31 16:08:40 +00001054def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001055 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001056 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001057 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001058 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001059
1060 tests.extend([
1061 NonBlockingTCPTests,
1062 FileObjectClassTestCase,
1063 UnbufferedFileObjectClassTestCase,
1064 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001065 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001066 NetworkConnectionNoServer,
1067 NetworkConnectionAttributesTest,
1068 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001069 ])
Dave Cole331708b2004-08-09 04:51:41 +00001070 if hasattr(socket, "socketpair"):
1071 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 if sys.platform == 'linux2':
1073 tests.append(TestLinuxAbstractNamespace)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001074
1075 thread_info = test_support.threading_setup()
Walter Dörwald21d3a322003-05-01 17:45:56 +00001076 test_support.run_unittest(*tests)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001077 test_support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001078
1079if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001080 test_main()