blob: 5e340bf67f2dd999980333c79ea9dac1c1ff657b [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Georg Brandl2067bfd2008-05-25 13:05:15 +00009import _thread as thread
10import threading
Christian Heimesbbe741d2008-03-28 10:53:29 +000011import time
12import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000013import queue
Jack Jansen522e7692002-09-06 21:57:50 +000014import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000015import os
16import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000019
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +000020def try_address(host, port=0, family=socket.AF_INET):
21 """Try to bind a socket on the given host:port and return True
22 if that has been possible."""
23 try:
24 sock = socket.socket(family, socket.SOCK_STREAM)
25 sock.bind((host, port))
26 except (socket.error, socket.gaierror):
27 return False
28 else:
29 sock.close()
30 return True
31
Benjamin Petersonee8712c2008-05-20 21:35:26 +000032HOST = support.HOST
Guido van Rossum7d0a8262007-05-21 23:13:11 +000033MSG = b'Michael Gilfix was here\n'
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +000034SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
Guido van Rossum24e4af82002-06-12 19:18:08 +000036class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Guido van Rossum24e4af82002-06-12 19:18:08 +000038 def setUp(self):
39 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000040 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000041 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000042
Guido van Rossum24e4af82002-06-12 19:18:08 +000043 def tearDown(self):
44 self.serv.close()
45 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000046
Guido van Rossum24e4af82002-06-12 19:18:08 +000047class SocketUDPTest(unittest.TestCase):
48
49 def setUp(self):
50 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000051 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000052
53 def tearDown(self):
54 self.serv.close()
55 self.serv = None
56
57class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000058 """Threadable Test class
59
60 The ThreadableTest class makes it easy to create a threaded
61 client/server pair from an existing unit test. To create a
62 new threaded class from an existing unit test, use multiple
63 inheritance:
64
65 class NewClass (OldClass, ThreadableTest):
66 pass
67
68 This class defines two new fixture functions with obvious
69 purposes for overriding:
70
71 clientSetUp ()
72 clientTearDown ()
73
74 Any new test functions within the class must then define
75 tests in pairs, where the test name is preceeded with a
76 '_' to indicate the client portion of the test. Ex:
77
78 def testFoo(self):
79 # Server portion
80
81 def _testFoo(self):
82 # Client portion
83
84 Any exceptions raised by the clients during their tests
85 are caught and transferred to the main thread to alert
86 the testing framework.
87
88 Note, the server setup function cannot call any blocking
89 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000090 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000091 the blocking call (such as in setting up a client/server
92 connection and performing the accept() in setUp().
93 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000094
95 def __init__(self):
96 # Swap the true setup function
97 self.__setUp = self.setUp
98 self.__tearDown = self.tearDown
99 self.setUp = self._setUp
100 self.tearDown = self._tearDown
101
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000102 def serverExplicitReady(self):
103 """This method allows the server to explicitly indicate that
104 it wants the client thread to proceed. This is useful if the
105 server is about to execute a blocking routine that is
106 dependent upon the client thread during its setup routine."""
107 self.server_ready.set()
108
Guido van Rossum24e4af82002-06-12 19:18:08 +0000109 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000110 self.server_ready = threading.Event()
111 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000112 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000113 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114
115 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000116 methodname = self.id()
117 i = methodname.rfind('.')
118 methodname = methodname[i+1:]
119 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000120 self.client_thread = thread.start_new_thread(
121 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122
123 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000124 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000125 self.server_ready.set()
126 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000127
128 def _tearDown(self):
129 self.__tearDown()
130 self.done.wait()
131
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000132 if self.queue.qsize():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 msg = self.queue.get()
134 self.fail(msg)
135
136 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000137 self.server_ready.wait()
138 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000139 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000140 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000141 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000142 try:
143 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000144 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000145 self.queue.put(strerror)
146 self.clientTearDown()
147
148 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000149 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000150
151 def clientTearDown(self):
152 self.done.set()
153 thread.exit()
154
155class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
156
157 def __init__(self, methodName='runTest'):
158 SocketTCPTest.__init__(self, methodName=methodName)
159 ThreadableTest.__init__(self)
160
161 def clientSetUp(self):
162 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
163
164 def clientTearDown(self):
165 self.cli.close()
166 self.cli = None
167 ThreadableTest.clientTearDown(self)
168
169class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
170
171 def __init__(self, methodName='runTest'):
172 SocketUDPTest.__init__(self, methodName=methodName)
173 ThreadableTest.__init__(self)
174
175 def clientSetUp(self):
176 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
177
178class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000179 """Socket tests for client-server connection.
180
181 self.cli_conn is a client socket connected to the server. The
182 setUp() method guarantees that it is connected to the server.
183 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000184
185 def __init__(self, methodName='runTest'):
186 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
187
188 def setUp(self):
189 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000190 # Indicate explicitly we're ready for the client thread to
191 # proceed and then perform the blocking call to accept
192 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193 conn, addr = self.serv.accept()
194 self.cli_conn = conn
195
196 def tearDown(self):
197 self.cli_conn.close()
198 self.cli_conn = None
199 ThreadedTCPSocketTest.tearDown(self)
200
201 def clientSetUp(self):
202 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000203 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000204 self.serv_conn = self.cli
205
206 def clientTearDown(self):
207 self.serv_conn.close()
208 self.serv_conn = None
209 ThreadedTCPSocketTest.clientTearDown(self)
210
Dave Cole331708b2004-08-09 04:51:41 +0000211class SocketPairTest(unittest.TestCase, ThreadableTest):
212
213 def __init__(self, methodName='runTest'):
214 unittest.TestCase.__init__(self, methodName=methodName)
215 ThreadableTest.__init__(self)
216
217 def setUp(self):
218 self.serv, self.cli = socket.socketpair()
219
220 def tearDown(self):
221 self.serv.close()
222 self.serv = None
223
224 def clientSetUp(self):
225 pass
226
227 def clientTearDown(self):
228 self.cli.close()
229 self.cli = None
230 ThreadableTest.clientTearDown(self)
231
Tim Peters494aaee2004-08-09 18:54:11 +0000232
Guido van Rossum24e4af82002-06-12 19:18:08 +0000233#######################################################################
234## Begin Tests
235
236class GeneralModuleTests(unittest.TestCase):
237
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000238 def test_repr(self):
239 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlab91fde2009-08-13 08:51:18 +0000240 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000241
Raymond Hettinger027bb632004-05-31 03:09:25 +0000242 def test_weakref(self):
243 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
244 p = proxy(s)
245 self.assertEqual(p.fileno(), s.fileno())
246 s.close()
247 s = None
248 try:
249 p.fileno()
250 except ReferenceError:
251 pass
252 else:
253 self.fail('Socket proxy still exists')
254
Guido van Rossum24e4af82002-06-12 19:18:08 +0000255 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000256 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000257 def raise_error(*args, **kwargs):
258 raise socket.error
259 def raise_herror(*args, **kwargs):
260 raise socket.herror
261 def raise_gaierror(*args, **kwargs):
262 raise socket.gaierror
Georg Brandlab91fde2009-08-13 08:51:18 +0000263 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 "Error raising socket exception.")
Georg Brandlab91fde2009-08-13 08:51:18 +0000265 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266 "Error raising socket exception.")
Georg Brandlab91fde2009-08-13 08:51:18 +0000267 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000268 "Error raising socket exception.")
269
270 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000271 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272 socket.AF_INET
273 socket.SOCK_STREAM
274 socket.SOCK_DGRAM
275 socket.SOCK_RAW
276 socket.SOCK_RDM
277 socket.SOCK_SEQPACKET
278 socket.SOL_SOCKET
279 socket.SO_REUSEADDR
280
Guido van Rossum654c11e2002-06-13 20:24:17 +0000281 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000282 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000283 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000284 try:
285 ip = socket.gethostbyname(hostname)
286 except socket.error:
287 # Probably name lookup wasn't set up right; skip this test
288 return
Georg Brandlab91fde2009-08-13 08:51:18 +0000289 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000290 try:
291 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
292 except socket.error:
293 # Probably a similar problem as above; skip this test
294 return
Brett Cannon01668a12005-03-11 00:04:17 +0000295 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000296 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000297 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000298 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000299
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000300 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000301 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000302 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000303 try:
304 # On some versions, this loses a reference
305 orig = sys.getrefcount(__name__)
306 socket.getnameinfo(__name__,0)
Benjamin Petersonf3d7dbe2009-10-04 14:54:52 +0000307 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000308 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000310
Guido van Rossum24e4af82002-06-12 19:18:08 +0000311 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000312 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000313 try:
314 # On some versions, this crashes the interpreter.
315 socket.getnameinfo(('x', 0, 0, 0), 0)
316 except socket.error:
317 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000318
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000319 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000320 # This just checks that htons etc. are their own inverse,
321 # when looking at the lower 16 or 32 bits.
322 sizes = {socket.htonl: 32, socket.ntohl: 32,
323 socket.htons: 16, socket.ntohs: 16}
324 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000325 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000326 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
327 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000328
Guido van Rossuma2627af2002-09-14 00:58:46 +0000329 swapped = func(mask)
330 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000331 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000332
Guido van Rossum018919a2007-01-15 00:07:32 +0000333 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000334 good_values = [ 1, 2, 3, 1, 2, 3 ]
335 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000336 for k in good_values:
337 socket.ntohl(k)
338 socket.ntohs(k)
339 socket.htonl(k)
340 socket.htons(k)
341 for k in bad_values:
342 self.assertRaises(OverflowError, socket.ntohl, k)
343 self.assertRaises(OverflowError, socket.ntohs, k)
344 self.assertRaises(OverflowError, socket.htonl, k)
345 self.assertRaises(OverflowError, socket.htons, k)
346
Barry Warsaw11b91a02004-06-28 00:50:43 +0000347 def testGetServBy(self):
348 eq = self.assertEqual
349 # Find one service that exists, then check all the related interfaces.
350 # I've ordered this by protocols that have both a tcp and udp
351 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000352 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000353 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000354 # avoid the 'echo' service on this platform, as there is an
355 # assumption breaking non-standard port/protocol entry
356 services = ('daytime', 'qotd', 'domain')
357 else:
358 services = ('echo', 'daytime', 'domain')
359 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000360 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000361 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000362 break
363 except socket.error:
364 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000365 else:
366 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000367 # Try same call with optional protocol omitted
368 port2 = socket.getservbyname(service)
369 eq(port, port2)
370 # Try udp, but don't barf it it doesn't exist
371 try:
372 udpport = socket.getservbyname(service, 'udp')
373 except socket.error:
374 udpport = None
375 else:
376 eq(udpport, port)
377 # Now make sure the lookup by port returns the same service name
378 eq(socket.getservbyport(port2), service)
379 eq(socket.getservbyport(port, 'tcp'), service)
380 if udpport is not None:
381 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000382 # Make sure getservbyport does not accept out of range ports.
383 self.assertRaises(OverflowError, socket.getservbyport, -1)
384 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000385
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000386 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000387 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000388 # The default timeout should initially be None
389 self.assertEqual(socket.getdefaulttimeout(), None)
390 s = socket.socket()
391 self.assertEqual(s.gettimeout(), None)
392 s.close()
393
394 # Set the default timeout to 10, and see if it propagates
395 socket.setdefaulttimeout(10)
396 self.assertEqual(socket.getdefaulttimeout(), 10)
397 s = socket.socket()
398 self.assertEqual(s.gettimeout(), 10)
399 s.close()
400
401 # Reset the default timeout to None, and see if it propagates
402 socket.setdefaulttimeout(None)
403 self.assertEqual(socket.getdefaulttimeout(), None)
404 s = socket.socket()
405 self.assertEqual(s.gettimeout(), None)
406 s.close()
407
408 # Check that setting it to an invalid value raises ValueError
409 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
410
411 # Check that setting it to an invalid type raises TypeError
412 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
413
Benjamin Petersonf91df042009-02-13 02:50:59 +0000414 def testIPv4_inet_aton_fourbytes(self):
415 if not hasattr(socket, 'inet_aton'):
416 return # No inet_aton, nothing to check
417 # Test that issue1008086 and issue767150 are fixed.
418 # It must return 4 bytes.
419 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
420 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
421
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000422 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000423 if not hasattr(socket, 'inet_pton'):
424 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000425 from socket import inet_aton as f, inet_pton, AF_INET
426 g = lambda a: inet_pton(AF_INET, a)
427
Guido van Rossumb5b22702007-05-18 18:55:53 +0000428 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
429 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
430 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
431 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
432 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000433
Guido van Rossumb5b22702007-05-18 18:55:53 +0000434 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
435 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
436 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
437 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000438
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000439 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000440 if not hasattr(socket, 'inet_pton'):
441 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442 try:
443 from socket import inet_pton, AF_INET6, has_ipv6
444 if not has_ipv6:
445 return
446 except ImportError:
447 return
448 f = lambda a: inet_pton(AF_INET6, a)
449
Guido van Rossum540d9872007-08-17 03:51:09 +0000450 self.assertEquals(b'\x00' * 16, f('::'))
451 self.assertEquals(b'\x00' * 16, f('0::0'))
452 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000453 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000454 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000455 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
456 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000457
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000458 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000459 if not hasattr(socket, 'inet_ntop'):
460 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000461 from socket import inet_ntoa as f, inet_ntop, AF_INET
462 g = lambda a: inet_ntop(AF_INET, a)
463
Guido van Rossumb5b22702007-05-18 18:55:53 +0000464 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
465 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
466 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
467 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000468
Guido van Rossumb5b22702007-05-18 18:55:53 +0000469 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
470 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
471 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000472
473 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000474 if not hasattr(socket, 'inet_ntop'):
475 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000476 try:
477 from socket import inet_ntop, AF_INET6, has_ipv6
478 if not has_ipv6:
479 return
480 except ImportError:
481 return
482 f = lambda a: inet_ntop(AF_INET6, a)
483
Guido van Rossum540d9872007-08-17 03:51:09 +0000484 self.assertEquals('::', f(b'\x00' * 16))
485 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000486 self.assertEquals(
487 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000488 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000489 )
490
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000491 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000492
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000493 def _get_unused_port(self, bind_address='0.0.0.0'):
494 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000495
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000496 Args:
497 bind_address: Hostname or IP address to search for a port on.
498
499 Returns: A most likely to be unused port.
500 """
501 tempsock = socket.socket()
502 tempsock.bind((bind_address, 0))
503 host, port = tempsock.getsockname()
504 tempsock.close()
505 return port
506
507 def testSockName(self):
508 # Testing getsockname()
509 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000511 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000512 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000513 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
514 # it reasonable to get the host's addr in addition to 0.0.0.0.
515 # At least for eCos. This is required for the S/390 to pass.
516 my_ip_addr = socket.gethostbyname(socket.gethostname())
Georg Brandlab91fde2009-08-13 08:51:18 +0000517 self.assertTrue(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000518 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519
520 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000521 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000522 # We know a socket should start without reuse==0
523 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
524 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Georg Brandlab91fde2009-08-13 08:51:18 +0000525 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000526
527 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000528 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000529 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
530 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
531 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Georg Brandlab91fde2009-08-13 08:51:18 +0000532 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000533
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000534 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000535 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000536 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
537 sock.settimeout(1)
538 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000539 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000540
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000541 def testNewAttributes(self):
542 # testing .family, .type and .protocol
543 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
544 self.assertEqual(sock.family, socket.AF_INET)
545 self.assertEqual(sock.type, socket.SOCK_STREAM)
546 self.assertEqual(sock.proto, 0)
547 sock.close()
548
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000549 def test_getsockaddrarg(self):
550 host = '0.0.0.0'
551 port = self._get_unused_port(bind_address=host)
552 big_port = port + 65536
553 neg_port = port - 65536
554 sock = socket.socket()
555 try:
556 self.assertRaises(OverflowError, sock.bind, (host, big_port))
557 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
558 sock.bind((host, port))
559 finally:
560 sock.close()
561
Christian Heimesfaf2f632008-01-06 16:59:19 +0000562 def test_sock_ioctl(self):
563 if os.name != "nt":
564 return
Georg Brandlab91fde2009-08-13 08:51:18 +0000565 self.assertTrue(hasattr(socket.socket, 'ioctl'))
566 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
567 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
568 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000569
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +0000570 def testGetaddrinfo(self):
571 try:
572 socket.getaddrinfo('localhost', 80)
573 except socket.gaierror as err:
574 if err.errno == socket.EAI_SERVICE:
575 # see http://bugs.python.org/issue1282647
576 self.skipTest("buggy libc version")
577 raise
578 # len of every sequence is supposed to be == 5
579 for info in socket.getaddrinfo(HOST, None):
580 self.assertEqual(len(info), 5)
581 # host can be a domain name, a string representation of an
582 # IPv4/v6 address or None
583 socket.getaddrinfo('localhost', 80)
584 socket.getaddrinfo('127.0.0.1', 80)
585 socket.getaddrinfo(None, 80)
586 if SUPPORTS_IPV6:
587 socket.getaddrinfo('::1', 80)
588 # port can be a string service name such as "http", a numeric
589 # port number or None
590 socket.getaddrinfo(HOST, "http")
591 socket.getaddrinfo(HOST, 80)
592 socket.getaddrinfo(HOST, None)
593 # test family and socktype filters
594 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
595 for family, _, _, _, _ in infos:
596 self.assertEqual(family, socket.AF_INET)
597 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
598 for _, socktype, _, _, _ in infos:
599 self.assertEqual(socktype, socket.SOCK_STREAM)
600 # test proto and flags arguments
Giampaolo Rodolà5b37ce62010-08-16 05:09:31 +0000601 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +0000602 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
603 # a server willing to support both IPv4 and IPv6 will
604 # usually do this
605 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
606 socket.AI_PASSIVE)
607
Christian Heimesfaf2f632008-01-06 16:59:19 +0000608
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609class BasicTCPTest(SocketConnectedTest):
610
611 def __init__(self, methodName='runTest'):
612 SocketConnectedTest.__init__(self, methodName=methodName)
613
614 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000617 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618
619 def _testRecv(self):
620 self.serv_conn.send(MSG)
621
622 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000623 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000624 seg1 = self.cli_conn.recv(len(MSG) - 3)
625 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000626 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000627 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000628
629 def _testOverFlowRecv(self):
630 self.serv_conn.send(MSG)
631
632 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000633 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000634 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000635 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000636
637 def _testRecvFrom(self):
638 self.serv_conn.send(MSG)
639
640 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000641 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000642 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
643 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000644 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000645 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646
647 def _testOverFlowRecvFrom(self):
648 self.serv_conn.send(MSG)
649
650 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000651 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000652 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000653 while 1:
654 read = self.cli_conn.recv(1024)
655 if not read:
656 break
Guido van Rossume531e292002-08-08 20:28:34 +0000657 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000658 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659
660 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000661 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000662 self.serv_conn.sendall(big_chunk)
663
664 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000665 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000666 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000667 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000668 fd = self.cli_conn.fileno()
669 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
670 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000671 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672
673 def _testFromFd(self):
674 self.serv_conn.send(MSG)
675
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000676 def testDup(self):
677 # Testing dup()
678 sock = self.cli_conn.dup()
679 msg = sock.recv(1024)
680 self.assertEqual(msg, MSG)
681
682 def _testDup(self):
683 self.serv_conn.send(MSG)
684
Guido van Rossum24e4af82002-06-12 19:18:08 +0000685 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000688 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000689 # wait for _testShutdown to finish: on OS X, when the server
690 # closes the connection the client also becomes disconnected,
691 # and the client's shutdown call will fail. (Issue #4397.)
692 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000693
694 def _testShutdown(self):
695 self.serv_conn.send(MSG)
696 self.serv_conn.shutdown(2)
697
698class BasicUDPTest(ThreadedUDPSocketTest):
699
700 def __init__(self, methodName='runTest'):
701 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
702
703 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000704 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000706 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707
708 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000709 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000710
Guido van Rossum1c938012002-06-12 21:17:20 +0000711 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000712 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715
Guido van Rossum1c938012002-06-12 21:17:20 +0000716 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000717 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718
Guido van Rossumd8faa362007-04-27 19:54:29 +0000719 def testRecvFromNegative(self):
720 # Negative lengths passed to recvfrom should give ValueError.
721 self.assertRaises(ValueError, self.serv.recvfrom, -1)
722
723 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000724 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000725
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000726class TCPCloserTest(ThreadedTCPSocketTest):
727
728 def testClose(self):
729 conn, addr = self.serv.accept()
730 conn.close()
731
732 sd = self.cli
733 read, write, err = select.select([sd], [], [], 1.0)
734 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000735 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000736
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000737 # Calling close() many times should be safe.
738 conn.close()
739 conn.close()
740
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000741 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000742 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000743 time.sleep(1.0)
744
Dave Cole331708b2004-08-09 04:51:41 +0000745class BasicSocketPairTest(SocketPairTest):
746
747 def __init__(self, methodName='runTest'):
748 SocketPairTest.__init__(self, methodName=methodName)
749
750 def testRecv(self):
751 msg = self.serv.recv(1024)
752 self.assertEqual(msg, MSG)
753
754 def _testRecv(self):
755 self.cli.send(MSG)
756
757 def testSend(self):
758 self.serv.send(MSG)
759
760 def _testSend(self):
761 msg = self.cli.recv(1024)
762 self.assertEqual(msg, MSG)
763
Guido van Rossum24e4af82002-06-12 19:18:08 +0000764class NonBlockingTCPTests(ThreadedTCPSocketTest):
765
766 def __init__(self, methodName='runTest'):
767 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
768
769 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000770 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 self.serv.setblocking(0)
772 start = time.time()
773 try:
774 self.serv.accept()
775 except socket.error:
776 pass
777 end = time.time()
Georg Brandlab91fde2009-08-13 08:51:18 +0000778 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779
780 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000781 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000782
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000784 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000785 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000786 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000787 conn, addr = self.serv.accept()
788 except socket.error:
789 pass
790 else:
791 self.fail("Error trying to do non-blocking accept.")
792 read, write, err = select.select([self.serv], [], [])
793 if self.serv in read:
794 conn, addr = self.serv.accept()
795 else:
796 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000797
Guido van Rossum24e4af82002-06-12 19:18:08 +0000798 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000799 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000800 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000801
802 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000803 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000804 conn, addr = self.serv.accept()
805
806 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000807 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000808 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809
810 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000811 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000812 conn, addr = self.serv.accept()
813 conn.setblocking(0)
814 try:
815 msg = conn.recv(len(MSG))
816 except socket.error:
817 pass
818 else:
819 self.fail("Error trying to do non-blocking recv.")
820 read, write, err = select.select([conn], [], [])
821 if conn in read:
822 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000823 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824 else:
825 self.fail("Error during select call to non-blocking socket.")
826
827 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000828 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000829 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830 self.cli.send(MSG)
831
832class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000833 """Unit tests for the object returned by socket.makefile()
834
835 self.serv_file is the io object returned by makefile() on
836 the client connection. You can read from this file to
837 get output from the server.
838
839 self.cli_file is the io object returned by makefile() on the
840 server connection. You can write to this file to send output
841 to the client.
842 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843
Guido van Rossume9f66142002-08-07 15:46:19 +0000844 bufsize = -1 # Use default buffer size
845
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 def __init__(self, methodName='runTest'):
847 SocketConnectedTest.__init__(self, methodName=methodName)
848
849 def setUp(self):
850 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000851 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852
853 def tearDown(self):
854 self.serv_file.close()
Georg Brandlab91fde2009-08-13 08:51:18 +0000855 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000856 self.serv_file = None
857 SocketConnectedTest.tearDown(self)
858
859 def clientSetUp(self):
860 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000861 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000862
863 def clientTearDown(self):
864 self.cli_file.close()
Georg Brandlab91fde2009-08-13 08:51:18 +0000865 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 self.cli_file = None
867 SocketConnectedTest.clientTearDown(self)
868
869 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000870 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000871 first_seg = self.serv_file.read(len(MSG)-3)
872 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000873 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000874 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000875
876 def _testSmallRead(self):
877 self.cli_file.write(MSG)
878 self.cli_file.flush()
879
Guido van Rossum8c943832002-08-08 01:00:28 +0000880 def testFullRead(self):
881 # read until EOF
882 msg = self.serv_file.read()
883 self.assertEqual(msg, MSG)
884
885 def _testFullRead(self):
886 self.cli_file.write(MSG)
887 self.cli_file.close()
888
Guido van Rossum24e4af82002-06-12 19:18:08 +0000889 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000890 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000891 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892 while 1:
893 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000894 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000895 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000896 buf += char
897 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898
899 def _testUnbufferedRead(self):
900 self.cli_file.write(MSG)
901 self.cli_file.flush()
902
903 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000904 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000906 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907
908 def _testReadline(self):
909 self.cli_file.write(MSG)
910 self.cli_file.flush()
911
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000912 def testCloseAfterMakefile(self):
913 # The file returned by makefile should keep the socket open.
914 self.cli_conn.close()
915 # read until EOF
916 msg = self.serv_file.read()
917 self.assertEqual(msg, MSG)
918
919 def _testCloseAfterMakefile(self):
920 self.cli_file.write(MSG)
921 self.cli_file.flush()
922
923 def testMakefileAfterMakefileClose(self):
924 self.serv_file.close()
925 msg = self.cli_conn.recv(len(MSG))
926 self.assertEqual(msg, MSG)
927
928 def _testMakefileAfterMakefileClose(self):
929 self.cli_file.write(MSG)
930 self.cli_file.flush()
931
Tim Peters116d83c2004-03-28 02:20:45 +0000932 def testClosedAttr(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000933 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000934
935 def _testClosedAttr(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000936 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000937
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000938 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000939 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000940 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
941
942 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000943 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000944 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
945
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000946 def testRealClose(self):
947 self.serv_file.close()
948 self.assertRaises(ValueError, self.serv_file.fileno)
949 self.cli_conn.close()
950 self.assertRaises(socket.error, self.cli_conn.getsockname)
951
952 def _testRealClose(self):
953 pass
954
955
Guido van Rossume9f66142002-08-07 15:46:19 +0000956class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
957
958 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +0000959
Guido van Rossume9f66142002-08-07 15:46:19 +0000960 In this case (and in this case only), it should be possible to
961 create a file object, read a line from it, create another file
962 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +0000963 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +0000964 when reading multiple requests from the same socket."""
965
966 bufsize = 0 # Use unbuffered mode
967
968 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000969 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +0000970 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000971 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +0000972 self.serv_file = self.cli_conn.makefile('rb', 0)
973 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000974 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +0000975
976 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000977 self.cli_file.write(b"A. " + MSG)
978 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +0000979 self.cli_file.flush()
980
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000981 def testMakefileClose(self):
982 # The file returned by makefile should keep the socket open...
983 self.cli_conn.close()
984 msg = self.cli_conn.recv(1024)
985 self.assertEqual(msg, MSG)
986 # ...until the file is itself closed
987 self.serv_file.close()
988 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
989
990 def _testMakefileClose(self):
991 self.cli_file.write(MSG)
992 self.cli_file.flush()
993
994 def testMakefileCloseSocketDestroy(self):
995 refcount_before = sys.getrefcount(self.cli_conn)
996 self.serv_file.close()
997 refcount_after = sys.getrefcount(self.cli_conn)
998 self.assertEqual(refcount_before - 1, refcount_after)
999
1000 def _testMakefileCloseSocketDestroy(self):
1001 pass
1002
1003
Guido van Rossum8c943832002-08-08 01:00:28 +00001004class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1005
1006 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1007
1008
1009class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1010
1011 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001012
Thomas Woutersb2137042007-02-01 18:02:27 +00001013
Guido van Rossumd8faa362007-04-27 19:54:29 +00001014class NetworkConnectionTest(object):
1015 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001016
Guido van Rossumd8faa362007-04-27 19:54:29 +00001017 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001018 # We're inherited below by BasicTCPTest2, which also inherits
1019 # BasicTCPTest, which defines self.port referenced below.
1020 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001021 self.serv_conn = self.cli
1022
1023class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1024 """Tests that NetworkConnection does not break existing TCP functionality.
1025 """
1026
1027class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001028
Guido van Rossumd8faa362007-04-27 19:54:29 +00001029 def testWithoutServer(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001030 port = support.find_unused_port()
Georg Brandlab91fde2009-08-13 08:51:18 +00001031 self.assertRaises(
Christian Heimes5e696852008-04-09 08:37:03 +00001032 socket.error,
1033 lambda: socket.create_connection((HOST, port))
1034 )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035
1036class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1037
1038 def __init__(self, methodName='runTest'):
1039 SocketTCPTest.__init__(self, methodName=methodName)
1040 ThreadableTest.__init__(self)
1041
1042 def clientSetUp(self):
1043 pass
1044
1045 def clientTearDown(self):
1046 self.cli.close()
1047 self.cli = None
1048 ThreadableTest.clientTearDown(self)
1049
1050 def _justAccept(self):
1051 conn, addr = self.serv.accept()
1052
1053 testFamily = _justAccept
1054 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001055 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001056 self.assertEqual(self.cli.family, 2)
1057
1058 testTimeoutDefault = _justAccept
1059 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001060 # passing no explicit timeout uses socket's global default
Georg Brandlab91fde2009-08-13 08:51:18 +00001061 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001062 socket.setdefaulttimeout(42)
1063 try:
1064 self.cli = socket.create_connection((HOST, self.port))
1065 finally:
1066 socket.setdefaulttimeout(None)
1067 self.assertEquals(self.cli.gettimeout(), 42)
1068
1069 testTimeoutNone = _justAccept
1070 def _testTimeoutNone(self):
1071 # None timeout means the same as sock.settimeout(None)
Georg Brandlab91fde2009-08-13 08:51:18 +00001072 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001073 socket.setdefaulttimeout(30)
1074 try:
1075 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1076 finally:
1077 socket.setdefaulttimeout(None)
1078 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001079
1080 testTimeoutValueNamed = _justAccept
1081 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001082 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001083 self.assertEqual(self.cli.gettimeout(), 30)
1084
1085 testTimeoutValueNonamed = _justAccept
1086 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001087 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001088 self.assertEqual(self.cli.gettimeout(), 30)
1089
Guido van Rossumd8faa362007-04-27 19:54:29 +00001090class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1091
1092 def __init__(self, methodName='runTest'):
1093 SocketTCPTest.__init__(self, methodName=methodName)
1094 ThreadableTest.__init__(self)
1095
1096 def clientSetUp(self):
1097 pass
1098
1099 def clientTearDown(self):
1100 self.cli.close()
1101 self.cli = None
1102 ThreadableTest.clientTearDown(self)
1103
1104 def testInsideTimeout(self):
1105 conn, addr = self.serv.accept()
1106 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001107 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 testOutsideTimeout = testInsideTimeout
1109
1110 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001111 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001112 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001113 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001114
1115 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001116 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001117 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001118
1119
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001120class TCPTimeoutTest(SocketTCPTest):
1121
1122 def testTCPTimeout(self):
1123 def raise_timeout(*args, **kwargs):
1124 self.serv.settimeout(1.0)
1125 self.serv.accept()
Georg Brandlab91fde2009-08-13 08:51:18 +00001126 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001127 "Error generating a timeout exception (TCP)")
1128
1129 def testTimeoutZero(self):
1130 ok = False
1131 try:
1132 self.serv.settimeout(0.0)
1133 foo = self.serv.accept()
1134 except socket.timeout:
1135 self.fail("caught timeout instead of error (TCP)")
1136 except socket.error:
1137 ok = True
1138 except:
1139 self.fail("caught unexpected exception (TCP)")
1140 if not ok:
1141 self.fail("accept() returned success when we did not expect it")
1142
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001143 def testInterruptedTimeout(self):
1144 # XXX I don't know how to do this test on MSWindows or any other
1145 # plaform that doesn't support signal.alarm() or os.kill(), though
1146 # the bug should have existed on all platforms.
1147 if not hasattr(signal, "alarm"):
1148 return # can only test on *nix
1149 self.serv.settimeout(5.0) # must be longer than alarm
1150 class Alarm(Exception):
1151 pass
1152 def alarm_handler(signal, frame):
1153 raise Alarm
1154 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1155 try:
1156 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1157 try:
1158 foo = self.serv.accept()
1159 except socket.timeout:
1160 self.fail("caught timeout instead of Alarm")
1161 except Alarm:
1162 pass
1163 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001164 self.fail("caught other exception instead of Alarm:"
1165 " %s(%s):\n%s" %
1166 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001167 else:
1168 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001169 finally:
1170 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001171 except Alarm:
1172 self.fail("got Alarm in wrong place")
1173 finally:
1174 # no alarm can be pending. Safe to restore old handler.
1175 signal.signal(signal.SIGALRM, old_alarm)
1176
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001177class UDPTimeoutTest(SocketTCPTest):
1178
1179 def testUDPTimeout(self):
1180 def raise_timeout(*args, **kwargs):
1181 self.serv.settimeout(1.0)
1182 self.serv.recv(1024)
Georg Brandlab91fde2009-08-13 08:51:18 +00001183 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001184 "Error generating a timeout exception (UDP)")
1185
1186 def testTimeoutZero(self):
1187 ok = False
1188 try:
1189 self.serv.settimeout(0.0)
1190 foo = self.serv.recv(1024)
1191 except socket.timeout:
1192 self.fail("caught timeout instead of error (UDP)")
1193 except socket.error:
1194 ok = True
1195 except:
1196 self.fail("caught unexpected exception (UDP)")
1197 if not ok:
1198 self.fail("recv() returned success when we did not expect it")
1199
1200class TestExceptions(unittest.TestCase):
1201
1202 def testExceptionTree(self):
Georg Brandlab91fde2009-08-13 08:51:18 +00001203 self.assertTrue(issubclass(socket.error, Exception))
1204 self.assertTrue(issubclass(socket.herror, socket.error))
1205 self.assertTrue(issubclass(socket.gaierror, socket.error))
1206 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001207
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001208class TestLinuxAbstractNamespace(unittest.TestCase):
1209
1210 UNIX_PATH_MAX = 108
1211
1212 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001213 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001214 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1215 s1.bind(address)
1216 s1.listen(1)
1217 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1218 s2.connect(s1.getsockname())
1219 s1.accept()
1220 self.assertEqual(s1.getsockname(), address)
1221 self.assertEqual(s2.getpeername(), address)
1222
1223 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001224 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001225 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1226 s.bind(address)
1227 self.assertEqual(s.getsockname(), address)
1228
1229 def testNameOverflow(self):
1230 address = "\x00" + "h" * self.UNIX_PATH_MAX
1231 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1232 self.assertRaises(socket.error, s.bind, address)
1233
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001234
Thomas Wouters477c8d52006-05-27 19:21:47 +00001235class BufferIOTest(SocketConnectedTest):
1236 """
1237 Test the buffer versions of socket.recv() and socket.send().
1238 """
1239 def __init__(self, methodName='runTest'):
1240 SocketConnectedTest.__init__(self, methodName=methodName)
1241
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001242 def testRecvInto(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001243 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001244 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001245 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001246 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001247 self.assertEqual(msg, MSG)
1248
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001249 def _testRecvInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001250 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001251 self.serv_conn.send(buf)
1252
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001253 def testRecvFromInto(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001254 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001255 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001256 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001257 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001258 self.assertEqual(msg, MSG)
1259
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001260 def _testRecvFromInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001261 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001262 self.serv_conn.send(buf)
1263
Christian Heimes043d6f62008-01-07 17:19:16 +00001264
1265TIPC_STYPE = 2000
1266TIPC_LOWER = 200
1267TIPC_UPPER = 210
1268
1269def isTipcAvailable():
1270 """Check if the TIPC module is loaded
1271
1272 The TIPC module is not loaded automatically on Ubuntu and probably
1273 other Linux distros.
1274 """
1275 if not hasattr(socket, "AF_TIPC"):
1276 return False
1277 if not os.path.isfile("/proc/modules"):
1278 return False
1279 with open("/proc/modules") as f:
1280 for line in f:
1281 if line.startswith("tipc "):
1282 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001283 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001284 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1285 return False
1286
1287class TIPCTest (unittest.TestCase):
1288 def testRDM(self):
1289 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1290 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1291
1292 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1293 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1294 TIPC_LOWER, TIPC_UPPER)
1295 srv.bind(srvaddr)
1296
1297 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1298 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1299 cli.sendto(MSG, sendaddr)
1300
1301 msg, recvaddr = srv.recvfrom(1024)
1302
1303 self.assertEqual(cli.getsockname(), recvaddr)
1304 self.assertEqual(msg, MSG)
1305
1306
1307class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1308 def __init__(self, methodName = 'runTest'):
1309 unittest.TestCase.__init__(self, methodName = methodName)
1310 ThreadableTest.__init__(self)
1311
1312 def setUp(self):
1313 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1314 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1315 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1316 TIPC_LOWER, TIPC_UPPER)
1317 self.srv.bind(srvaddr)
1318 self.srv.listen(5)
1319 self.serverExplicitReady()
1320 self.conn, self.connaddr = self.srv.accept()
1321
1322 def clientSetUp(self):
1323 # The is a hittable race between serverExplicitReady() and the
1324 # accept() call; sleep a little while to avoid it, otherwise
1325 # we could get an exception
1326 time.sleep(0.1)
1327 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1328 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1329 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1330 self.cli.connect(addr)
1331 self.cliaddr = self.cli.getsockname()
1332
1333 def testStream(self):
1334 msg = self.conn.recv(1024)
1335 self.assertEqual(msg, MSG)
1336 self.assertEqual(self.cliaddr, self.connaddr)
1337
1338 def _testStream(self):
1339 self.cli.send(MSG)
1340 self.cli.close()
1341
1342
Guido van Rossumb995eb72002-07-31 16:08:40 +00001343def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001344 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001345 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001346 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001347 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001348
1349 tests.extend([
1350 NonBlockingTCPTests,
1351 FileObjectClassTestCase,
1352 UnbufferedFileObjectClassTestCase,
1353 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001354 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001355 NetworkConnectionNoServer,
1356 NetworkConnectionAttributesTest,
1357 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001358 ])
Dave Cole331708b2004-08-09 04:51:41 +00001359 if hasattr(socket, "socketpair"):
1360 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001361 if sys.platform == 'linux2':
1362 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001363 if isTipcAvailable():
1364 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001365 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001366
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001367 thread_info = support.threading_setup()
1368 support.run_unittest(*tests)
1369 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001370
1371if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001372 test_main()