blob: 1e1e4536c1872f9b8ce1b59754dbe9f58b021806 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
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
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Georg Brandl2067bfd2008-05-25 13:05:15 +000010import _thread as thread
11import threading
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Benjamin Petersonee8712c2008-05-20 21:35:26 +000021HOST = support.HOST
Guido van Rossum7d0a8262007-05-21 23:13:11 +000022MSG = b'Michael Gilfix was here\n'
Barry Warsawcf3d4b51997-01-03 20:03:32 +000023
Guido van Rossum24e4af82002-06-12 19:18:08 +000024class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000025
Guido van Rossum24e4af82002-06-12 19:18:08 +000026 def setUp(self):
27 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000028 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000029 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000030
Guido van Rossum24e4af82002-06-12 19:18:08 +000031 def tearDown(self):
32 self.serv.close()
33 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000034
Guido van Rossum24e4af82002-06-12 19:18:08 +000035class SocketUDPTest(unittest.TestCase):
36
37 def setUp(self):
38 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000039 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000040
41 def tearDown(self):
42 self.serv.close()
43 self.serv = None
44
45class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000046 """Threadable Test class
47
48 The ThreadableTest class makes it easy to create a threaded
49 client/server pair from an existing unit test. To create a
50 new threaded class from an existing unit test, use multiple
51 inheritance:
52
53 class NewClass (OldClass, ThreadableTest):
54 pass
55
56 This class defines two new fixture functions with obvious
57 purposes for overriding:
58
59 clientSetUp ()
60 clientTearDown ()
61
62 Any new test functions within the class must then define
63 tests in pairs, where the test name is preceeded with a
64 '_' to indicate the client portion of the test. Ex:
65
66 def testFoo(self):
67 # Server portion
68
69 def _testFoo(self):
70 # Client portion
71
72 Any exceptions raised by the clients during their tests
73 are caught and transferred to the main thread to alert
74 the testing framework.
75
76 Note, the server setup function cannot call any blocking
77 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000078 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000079 the blocking call (such as in setting up a client/server
80 connection and performing the accept() in setUp().
81 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000082
83 def __init__(self):
84 # Swap the true setup function
85 self.__setUp = self.setUp
86 self.__tearDown = self.tearDown
87 self.setUp = self._setUp
88 self.tearDown = self._tearDown
89
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000090 def serverExplicitReady(self):
91 """This method allows the server to explicitly indicate that
92 it wants the client thread to proceed. This is useful if the
93 server is about to execute a blocking routine that is
94 dependent upon the client thread during its setup routine."""
95 self.server_ready.set()
96
Guido van Rossum24e4af82002-06-12 19:18:08 +000097 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000098 self.server_ready = threading.Event()
99 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000100 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000101 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000102
103 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000104 methodname = self.id()
105 i = methodname.rfind('.')
106 methodname = methodname[i+1:]
107 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000108 self.client_thread = thread.start_new_thread(
109 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110
111 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000112 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000113 self.server_ready.set()
114 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 def _tearDown(self):
117 self.__tearDown()
118 self.done.wait()
119
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000120 if self.queue.qsize():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000121 msg = self.queue.get()
122 self.fail(msg)
123
124 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000125 self.server_ready.wait()
126 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000127 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000128 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000129 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130 try:
131 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000132 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000133 self.queue.put(strerror)
134 self.clientTearDown()
135
136 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000137 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000138
139 def clientTearDown(self):
140 self.done.set()
141 thread.exit()
142
143class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
144
145 def __init__(self, methodName='runTest'):
146 SocketTCPTest.__init__(self, methodName=methodName)
147 ThreadableTest.__init__(self)
148
149 def clientSetUp(self):
150 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
151
152 def clientTearDown(self):
153 self.cli.close()
154 self.cli = None
155 ThreadableTest.clientTearDown(self)
156
157class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
158
159 def __init__(self, methodName='runTest'):
160 SocketUDPTest.__init__(self, methodName=methodName)
161 ThreadableTest.__init__(self)
162
163 def clientSetUp(self):
164 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
165
166class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000167 """Socket tests for client-server connection.
168
169 self.cli_conn is a client socket connected to the server. The
170 setUp() method guarantees that it is connected to the server.
171 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172
173 def __init__(self, methodName='runTest'):
174 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
175
176 def setUp(self):
177 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000178 # Indicate explicitly we're ready for the client thread to
179 # proceed and then perform the blocking call to accept
180 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000181 conn, addr = self.serv.accept()
182 self.cli_conn = conn
183
184 def tearDown(self):
185 self.cli_conn.close()
186 self.cli_conn = None
187 ThreadedTCPSocketTest.tearDown(self)
188
189 def clientSetUp(self):
190 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000191 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000192 self.serv_conn = self.cli
193
194 def clientTearDown(self):
195 self.serv_conn.close()
196 self.serv_conn = None
197 ThreadedTCPSocketTest.clientTearDown(self)
198
Dave Cole331708b2004-08-09 04:51:41 +0000199class SocketPairTest(unittest.TestCase, ThreadableTest):
200
201 def __init__(self, methodName='runTest'):
202 unittest.TestCase.__init__(self, methodName=methodName)
203 ThreadableTest.__init__(self)
204
205 def setUp(self):
206 self.serv, self.cli = socket.socketpair()
207
208 def tearDown(self):
209 self.serv.close()
210 self.serv = None
211
212 def clientSetUp(self):
213 pass
214
215 def clientTearDown(self):
216 self.cli.close()
217 self.cli = None
218 ThreadableTest.clientTearDown(self)
219
Tim Peters494aaee2004-08-09 18:54:11 +0000220
Guido van Rossum24e4af82002-06-12 19:18:08 +0000221#######################################################################
222## Begin Tests
223
224class GeneralModuleTests(unittest.TestCase):
225
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000226 def test_repr(self):
227 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000228 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000229
Raymond Hettinger027bb632004-05-31 03:09:25 +0000230 def test_weakref(self):
231 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
232 p = proxy(s)
233 self.assertEqual(p.fileno(), s.fileno())
234 s.close()
235 s = None
236 try:
237 p.fileno()
238 except ReferenceError:
239 pass
240 else:
241 self.fail('Socket proxy still exists')
242
Guido van Rossum24e4af82002-06-12 19:18:08 +0000243 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000244 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000245 def raise_error(*args, **kwargs):
246 raise socket.error
247 def raise_herror(*args, **kwargs):
248 raise socket.herror
249 def raise_gaierror(*args, **kwargs):
250 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000251 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000252 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000253 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000254 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000255 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000256 "Error raising socket exception.")
257
258 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000259 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000260 socket.AF_INET
261 socket.SOCK_STREAM
262 socket.SOCK_DGRAM
263 socket.SOCK_RAW
264 socket.SOCK_RDM
265 socket.SOCK_SEQPACKET
266 socket.SOL_SOCKET
267 socket.SO_REUSEADDR
268
Guido van Rossum654c11e2002-06-13 20:24:17 +0000269 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000270 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000271 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000272 try:
273 ip = socket.gethostbyname(hostname)
274 except socket.error:
275 # Probably name lookup wasn't set up right; skip this test
276 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000277 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000278 try:
279 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
280 except socket.error:
281 # Probably a similar problem as above; skip this test
282 return
Brett Cannon01668a12005-03-11 00:04:17 +0000283 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000284 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000285 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000286 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000287
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000288 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000289 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000290 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000291 try:
292 # On some versions, this loses a reference
293 orig = sys.getrefcount(__name__)
294 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000295 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000296 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000297 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000298
Guido van Rossum24e4af82002-06-12 19:18:08 +0000299 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000300 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000301 try:
302 # On some versions, this crashes the interpreter.
303 socket.getnameinfo(('x', 0, 0, 0), 0)
304 except socket.error:
305 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000306
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000307 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000308 # This just checks that htons etc. are their own inverse,
309 # when looking at the lower 16 or 32 bits.
310 sizes = {socket.htonl: 32, socket.ntohl: 32,
311 socket.htons: 16, socket.ntohs: 16}
312 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000313 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000314 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
315 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000316
Guido van Rossuma2627af2002-09-14 00:58:46 +0000317 swapped = func(mask)
318 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000319 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000320
Guido van Rossum018919a2007-01-15 00:07:32 +0000321 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000322 good_values = [ 1, 2, 3, 1, 2, 3 ]
323 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000324 for k in good_values:
325 socket.ntohl(k)
326 socket.ntohs(k)
327 socket.htonl(k)
328 socket.htons(k)
329 for k in bad_values:
330 self.assertRaises(OverflowError, socket.ntohl, k)
331 self.assertRaises(OverflowError, socket.ntohs, k)
332 self.assertRaises(OverflowError, socket.htonl, k)
333 self.assertRaises(OverflowError, socket.htons, k)
334
Barry Warsaw11b91a02004-06-28 00:50:43 +0000335 def testGetServBy(self):
336 eq = self.assertEqual
337 # Find one service that exists, then check all the related interfaces.
338 # I've ordered this by protocols that have both a tcp and udp
339 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000340 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000341 'freebsd7', 'freebsd8', 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000342 # avoid the 'echo' service on this platform, as there is an
343 # assumption breaking non-standard port/protocol entry
344 services = ('daytime', 'qotd', 'domain')
345 else:
346 services = ('echo', 'daytime', 'domain')
347 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000348 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000349 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000350 break
351 except socket.error:
352 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000353 else:
354 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000355 # Try same call with optional protocol omitted
356 port2 = socket.getservbyname(service)
357 eq(port, port2)
358 # Try udp, but don't barf it it doesn't exist
359 try:
360 udpport = socket.getservbyname(service, 'udp')
361 except socket.error:
362 udpport = None
363 else:
364 eq(udpport, port)
365 # Now make sure the lookup by port returns the same service name
366 eq(socket.getservbyport(port2), service)
367 eq(socket.getservbyport(port, 'tcp'), service)
368 if udpport is not None:
369 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000370 # Make sure getservbyport does not accept out of range ports.
371 self.assertRaises(OverflowError, socket.getservbyport, -1)
372 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000373
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000374 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000375 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000376 # The default timeout should initially be None
377 self.assertEqual(socket.getdefaulttimeout(), None)
378 s = socket.socket()
379 self.assertEqual(s.gettimeout(), None)
380 s.close()
381
382 # Set the default timeout to 10, and see if it propagates
383 socket.setdefaulttimeout(10)
384 self.assertEqual(socket.getdefaulttimeout(), 10)
385 s = socket.socket()
386 self.assertEqual(s.gettimeout(), 10)
387 s.close()
388
389 # Reset the default timeout to None, and see if it propagates
390 socket.setdefaulttimeout(None)
391 self.assertEqual(socket.getdefaulttimeout(), None)
392 s = socket.socket()
393 self.assertEqual(s.gettimeout(), None)
394 s.close()
395
396 # Check that setting it to an invalid value raises ValueError
397 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
398
399 # Check that setting it to an invalid type raises TypeError
400 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
401
Benjamin Petersonf91df042009-02-13 02:50:59 +0000402 def testIPv4_inet_aton_fourbytes(self):
403 if not hasattr(socket, 'inet_aton'):
404 return # No inet_aton, nothing to check
405 # Test that issue1008086 and issue767150 are fixed.
406 # It must return 4 bytes.
407 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
408 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
409
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000410 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000411 if not hasattr(socket, 'inet_pton'):
412 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000413 from socket import inet_aton as f, inet_pton, AF_INET
414 g = lambda a: inet_pton(AF_INET, a)
415
Guido van Rossumb5b22702007-05-18 18:55:53 +0000416 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
417 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
418 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
419 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
420 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000421
Guido van Rossumb5b22702007-05-18 18:55:53 +0000422 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
423 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
424 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
425 self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000426
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000427 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000428 if not hasattr(socket, 'inet_pton'):
429 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000430 try:
431 from socket import inet_pton, AF_INET6, has_ipv6
432 if not has_ipv6:
433 return
434 except ImportError:
435 return
436 f = lambda a: inet_pton(AF_INET6, a)
437
Guido van Rossum540d9872007-08-17 03:51:09 +0000438 self.assertEquals(b'\x00' * 16, f('::'))
439 self.assertEquals(b'\x00' * 16, f('0::0'))
440 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000441 self.assertEquals(
Guido van Rossum67180622007-07-10 07:29:12 +0000442 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 +0000443 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
444 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000445
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000446 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000447 if not hasattr(socket, 'inet_ntop'):
448 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000449 from socket import inet_ntoa as f, inet_ntop, AF_INET
450 g = lambda a: inet_ntop(AF_INET, a)
451
Guido van Rossumb5b22702007-05-18 18:55:53 +0000452 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
453 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
454 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
455 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000456
Guido van Rossumb5b22702007-05-18 18:55:53 +0000457 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
458 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
459 self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000460
461 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000462 if not hasattr(socket, 'inet_ntop'):
463 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000464 try:
465 from socket import inet_ntop, AF_INET6, has_ipv6
466 if not has_ipv6:
467 return
468 except ImportError:
469 return
470 f = lambda a: inet_ntop(AF_INET6, a)
471
Guido van Rossum540d9872007-08-17 03:51:09 +0000472 self.assertEquals('::', f(b'\x00' * 16))
473 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000474 self.assertEquals(
475 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000476 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 +0000477 )
478
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000479 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000480
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000481 def _get_unused_port(self, bind_address='0.0.0.0'):
482 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000483
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000484 Args:
485 bind_address: Hostname or IP address to search for a port on.
486
487 Returns: A most likely to be unused port.
488 """
489 tempsock = socket.socket()
490 tempsock.bind((bind_address, 0))
491 host, port = tempsock.getsockname()
492 tempsock.close()
493 return port
494
495 def testSockName(self):
496 # Testing getsockname()
497 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000498 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000499 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000500 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000501 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
502 # it reasonable to get the host's addr in addition to 0.0.0.0.
503 # At least for eCos. This is required for the S/390 to pass.
504 my_ip_addr = socket.gethostbyname(socket.gethostname())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000505 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000506 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000507
508 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000509 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000510 # We know a socket should start without reuse==0
511 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
512 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000513 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000514
515 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000516 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000517 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
518 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
519 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000520 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000522 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000523 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000524 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
525 sock.settimeout(1)
526 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000527 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000528
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000529 def testNewAttributes(self):
530 # testing .family, .type and .protocol
531 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
532 self.assertEqual(sock.family, socket.AF_INET)
533 self.assertEqual(sock.type, socket.SOCK_STREAM)
534 self.assertEqual(sock.proto, 0)
535 sock.close()
536
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000537 def test_getsockaddrarg(self):
538 host = '0.0.0.0'
539 port = self._get_unused_port(bind_address=host)
540 big_port = port + 65536
541 neg_port = port - 65536
542 sock = socket.socket()
543 try:
544 self.assertRaises(OverflowError, sock.bind, (host, big_port))
545 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
546 sock.bind((host, port))
547 finally:
548 sock.close()
549
Christian Heimesfaf2f632008-01-06 16:59:19 +0000550 def test_sock_ioctl(self):
551 if os.name != "nt":
552 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000553 self.assertTrue(hasattr(socket.socket, 'ioctl'))
554 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
555 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
556 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000557 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
558 s = socket.socket()
559 self.assertRaises(ValueError, s.ioctl, -1, None)
560 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000561
562
Guido van Rossum24e4af82002-06-12 19:18:08 +0000563class BasicTCPTest(SocketConnectedTest):
564
565 def __init__(self, methodName='runTest'):
566 SocketConnectedTest.__init__(self, methodName=methodName)
567
568 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000569 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000570 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000571 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000572
573 def _testRecv(self):
574 self.serv_conn.send(MSG)
575
576 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000577 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000578 seg1 = self.cli_conn.recv(len(MSG) - 3)
579 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000580 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000581 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000582
583 def _testOverFlowRecv(self):
584 self.serv_conn.send(MSG)
585
586 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000587 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000588 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000589 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000590
591 def _testRecvFrom(self):
592 self.serv_conn.send(MSG)
593
594 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000595 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000596 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
597 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000598 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000599 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000600
601 def _testOverFlowRecvFrom(self):
602 self.serv_conn.send(MSG)
603
604 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000605 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000606 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000607 while 1:
608 read = self.cli_conn.recv(1024)
609 if not read:
610 break
Guido van Rossume531e292002-08-08 20:28:34 +0000611 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000612 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
614 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000615 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 self.serv_conn.sendall(big_chunk)
617
618 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000619 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000620 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000621 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000622 fd = self.cli_conn.fileno()
623 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
624 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000625 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000626
627 def _testFromFd(self):
628 self.serv_conn.send(MSG)
629
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000630 def testDup(self):
631 # Testing dup()
632 sock = self.cli_conn.dup()
633 msg = sock.recv(1024)
634 self.assertEqual(msg, MSG)
635
636 def _testDup(self):
637 self.serv_conn.send(MSG)
638
Guido van Rossum24e4af82002-06-12 19:18:08 +0000639 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000640 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000642 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000643 # wait for _testShutdown to finish: on OS X, when the server
644 # closes the connection the client also becomes disconnected,
645 # and the client's shutdown call will fail. (Issue #4397.)
646 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000647
648 def _testShutdown(self):
649 self.serv_conn.send(MSG)
650 self.serv_conn.shutdown(2)
651
652class BasicUDPTest(ThreadedUDPSocketTest):
653
654 def __init__(self, methodName='runTest'):
655 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
656
657 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000658 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000659 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000660 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661
662 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000663 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000664
Guido van Rossum1c938012002-06-12 21:17:20 +0000665 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000666 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000667 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000668 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669
Guido van Rossum1c938012002-06-12 21:17:20 +0000670 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000671 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000672
Guido van Rossumd8faa362007-04-27 19:54:29 +0000673 def testRecvFromNegative(self):
674 # Negative lengths passed to recvfrom should give ValueError.
675 self.assertRaises(ValueError, self.serv.recvfrom, -1)
676
677 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000678 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000679
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000680class TCPCloserTest(ThreadedTCPSocketTest):
681
682 def testClose(self):
683 conn, addr = self.serv.accept()
684 conn.close()
685
686 sd = self.cli
687 read, write, err = select.select([sd], [], [], 1.0)
688 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000689 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000690
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000691 # Calling close() many times should be safe.
692 conn.close()
693 conn.close()
694
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000695 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000696 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000697 time.sleep(1.0)
698
Dave Cole331708b2004-08-09 04:51:41 +0000699class BasicSocketPairTest(SocketPairTest):
700
701 def __init__(self, methodName='runTest'):
702 SocketPairTest.__init__(self, methodName=methodName)
703
704 def testRecv(self):
705 msg = self.serv.recv(1024)
706 self.assertEqual(msg, MSG)
707
708 def _testRecv(self):
709 self.cli.send(MSG)
710
711 def testSend(self):
712 self.serv.send(MSG)
713
714 def _testSend(self):
715 msg = self.cli.recv(1024)
716 self.assertEqual(msg, MSG)
717
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718class NonBlockingTCPTests(ThreadedTCPSocketTest):
719
720 def __init__(self, methodName='runTest'):
721 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
722
723 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000724 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000725 self.serv.setblocking(0)
726 start = time.time()
727 try:
728 self.serv.accept()
729 except socket.error:
730 pass
731 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000732 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733
734 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000735 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000736
Guido van Rossum24e4af82002-06-12 19:18:08 +0000737 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000738 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000739 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000740 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000741 conn, addr = self.serv.accept()
742 except socket.error:
743 pass
744 else:
745 self.fail("Error trying to do non-blocking accept.")
746 read, write, err = select.select([self.serv], [], [])
747 if self.serv in read:
748 conn, addr = self.serv.accept()
749 else:
750 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000751
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000753 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000754 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755
756 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000757 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758 conn, addr = self.serv.accept()
759
760 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000761 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000762 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763
764 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000765 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000766 conn, addr = self.serv.accept()
767 conn.setblocking(0)
768 try:
769 msg = conn.recv(len(MSG))
770 except socket.error:
771 pass
772 else:
773 self.fail("Error trying to do non-blocking recv.")
774 read, write, err = select.select([conn], [], [])
775 if conn in read:
776 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000777 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000778 else:
779 self.fail("Error during select call to non-blocking socket.")
780
781 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000782 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000783 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000784 self.cli.send(MSG)
785
786class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000787 """Unit tests for the object returned by socket.makefile()
788
789 self.serv_file is the io object returned by makefile() on
790 the client connection. You can read from this file to
791 get output from the server.
792
793 self.cli_file is the io object returned by makefile() on the
794 server connection. You can write to this file to send output
795 to the client.
796 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797
Guido van Rossume9f66142002-08-07 15:46:19 +0000798 bufsize = -1 # Use default buffer size
799
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800 def __init__(self, methodName='runTest'):
801 SocketConnectedTest.__init__(self, methodName=methodName)
802
803 def setUp(self):
804 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000805 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000806
807 def tearDown(self):
808 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000809 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000810 self.serv_file = None
811 SocketConnectedTest.tearDown(self)
812
813 def clientSetUp(self):
814 SocketConnectedTest.clientSetUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000815 self.cli_file = self.serv_conn.makefile('wb')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816
817 def clientTearDown(self):
818 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000819 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 self.cli_file = None
821 SocketConnectedTest.clientTearDown(self)
822
823 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000824 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000825 first_seg = self.serv_file.read(len(MSG)-3)
826 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000827 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +0000828 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000829
830 def _testSmallRead(self):
831 self.cli_file.write(MSG)
832 self.cli_file.flush()
833
Guido van Rossum8c943832002-08-08 01:00:28 +0000834 def testFullRead(self):
835 # read until EOF
836 msg = self.serv_file.read()
837 self.assertEqual(msg, MSG)
838
839 def _testFullRead(self):
840 self.cli_file.write(MSG)
841 self.cli_file.close()
842
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000844 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000845 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 while 1:
847 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000850 buf += char
851 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000852
853 def _testUnbufferedRead(self):
854 self.cli_file.write(MSG)
855 self.cli_file.flush()
856
857 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000858 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000859 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +0000860 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
862 def _testReadline(self):
863 self.cli_file.write(MSG)
864 self.cli_file.flush()
865
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000866 def testCloseAfterMakefile(self):
867 # The file returned by makefile should keep the socket open.
868 self.cli_conn.close()
869 # read until EOF
870 msg = self.serv_file.read()
871 self.assertEqual(msg, MSG)
872
873 def _testCloseAfterMakefile(self):
874 self.cli_file.write(MSG)
875 self.cli_file.flush()
876
877 def testMakefileAfterMakefileClose(self):
878 self.serv_file.close()
879 msg = self.cli_conn.recv(len(MSG))
880 self.assertEqual(msg, MSG)
881
882 def _testMakefileAfterMakefileClose(self):
883 self.cli_file.write(MSG)
884 self.cli_file.flush()
885
Tim Peters116d83c2004-03-28 02:20:45 +0000886 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000887 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000888
889 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000890 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000891
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000892 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000893 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000894 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
895
896 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000897 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000898 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
899
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000900 def testRealClose(self):
901 self.serv_file.close()
902 self.assertRaises(ValueError, self.serv_file.fileno)
903 self.cli_conn.close()
904 self.assertRaises(socket.error, self.cli_conn.getsockname)
905
906 def _testRealClose(self):
907 pass
908
909
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000910class FileObjectInterruptedTestCase(unittest.TestCase):
911 """Test that the file object correctly handles EINTR internally."""
912
913 class MockSocket(object):
914 def __init__(self, recv_funcs=()):
915 # A generator that returns callables that we'll call for each
916 # call to recv().
917 self._recv_step = iter(recv_funcs)
918
919 def recv_into(self, buffer):
920 data = next(self._recv_step)()
921 assert len(buffer) >= len(data)
922 buffer[:len(data)] = data
923 return len(data)
924
925 def _decref_socketios(self):
926 pass
927
928 def _textiowrap_for_test(self, buffering=-1):
929 raw = socket.SocketIO(self, "r")
930 if buffering < 0:
931 buffering = io.DEFAULT_BUFFER_SIZE
932 if buffering == 0:
933 return raw
934 buffer = io.BufferedReader(raw, buffering)
935 text = io.TextIOWrapper(buffer, None, None)
936 text.mode = "rb"
937 return text
938
939 @staticmethod
940 def _raise_eintr():
941 raise socket.error(errno.EINTR)
942
943 def _textiowrap_mock_socket(self, mock, buffering=-1):
944 raw = socket.SocketIO(mock, "r")
945 if buffering < 0:
946 buffering = io.DEFAULT_BUFFER_SIZE
947 if buffering == 0:
948 return raw
949 buffer = io.BufferedReader(raw, buffering)
950 text = io.TextIOWrapper(buffer, None, None)
951 text.mode = "rb"
952 return text
953
954 def _test_readline(self, size=-1, buffering=-1):
955 mock_sock = self.MockSocket(recv_funcs=[
956 lambda : b"This is the first line\nAnd the sec",
957 self._raise_eintr,
958 lambda : b"ond line is here\n",
959 lambda : b"",
960 lambda : b"", # XXX(gps): io library does an extra EOF read
961 ])
962 fo = mock_sock._textiowrap_for_test(buffering=buffering)
963 self.assertEquals(fo.readline(size), "This is the first line\n")
964 self.assertEquals(fo.readline(size), "And the second line is here\n")
965
966 def _test_read(self, size=-1, buffering=-1):
967 mock_sock = self.MockSocket(recv_funcs=[
968 lambda : b"This is the first line\nAnd the sec",
969 self._raise_eintr,
970 lambda : b"ond line is here\n",
971 lambda : b"",
972 lambda : b"", # XXX(gps): io library does an extra EOF read
973 ])
974 expecting = (b"This is the first line\n"
975 b"And the second line is here\n")
976 fo = mock_sock._textiowrap_for_test(buffering=buffering)
977 if buffering == 0:
978 data = b''
979 else:
980 data = ''
981 expecting = expecting.decode('utf8')
982 while len(data) != len(expecting):
983 part = fo.read(size)
984 if not part:
985 break
986 data += part
987 self.assertEquals(data, expecting)
988
989 def test_default(self):
990 self._test_readline()
991 self._test_readline(size=100)
992 self._test_read()
993 self._test_read(size=100)
994
995 def test_with_1k_buffer(self):
996 self._test_readline(buffering=1024)
997 self._test_readline(size=100, buffering=1024)
998 self._test_read(buffering=1024)
999 self._test_read(size=100, buffering=1024)
1000
1001 def _test_readline_no_buffer(self, size=-1):
1002 mock_sock = self.MockSocket(recv_funcs=[
1003 lambda : b"a",
1004 lambda : b"\n",
1005 lambda : b"B",
1006 self._raise_eintr,
1007 lambda : b"b",
1008 lambda : b"",
1009 ])
1010 fo = mock_sock._textiowrap_for_test(buffering=0)
1011 self.assertEquals(fo.readline(size), b"a\n")
1012 self.assertEquals(fo.readline(size), b"Bb")
1013
1014 def test_no_buffer(self):
1015 self._test_readline_no_buffer()
1016 self._test_readline_no_buffer(size=4)
1017 self._test_read(buffering=0)
1018 self._test_read(size=100, buffering=0)
1019
1020
Guido van Rossume9f66142002-08-07 15:46:19 +00001021class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1022
1023 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001024
Guido van Rossume9f66142002-08-07 15:46:19 +00001025 In this case (and in this case only), it should be possible to
1026 create a file object, read a line from it, create another file
1027 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001028 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001029 when reading multiple requests from the same socket."""
1030
1031 bufsize = 0 # Use unbuffered mode
1032
1033 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001034 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001035 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001036 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001037 self.serv_file = self.cli_conn.makefile('rb', 0)
1038 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001039 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001040
1041 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001042 self.cli_file.write(b"A. " + MSG)
1043 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001044 self.cli_file.flush()
1045
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001046 def testMakefileClose(self):
1047 # The file returned by makefile should keep the socket open...
1048 self.cli_conn.close()
1049 msg = self.cli_conn.recv(1024)
1050 self.assertEqual(msg, MSG)
1051 # ...until the file is itself closed
1052 self.serv_file.close()
1053 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1054
1055 def _testMakefileClose(self):
1056 self.cli_file.write(MSG)
1057 self.cli_file.flush()
1058
1059 def testMakefileCloseSocketDestroy(self):
1060 refcount_before = sys.getrefcount(self.cli_conn)
1061 self.serv_file.close()
1062 refcount_after = sys.getrefcount(self.cli_conn)
1063 self.assertEqual(refcount_before - 1, refcount_after)
1064
1065 def _testMakefileCloseSocketDestroy(self):
1066 pass
1067
1068
Guido van Rossum8c943832002-08-08 01:00:28 +00001069class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1070
1071 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1072
1073
1074class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1075
1076 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001077
Thomas Woutersb2137042007-02-01 18:02:27 +00001078
Guido van Rossumd8faa362007-04-27 19:54:29 +00001079class NetworkConnectionTest(object):
1080 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001081
Guido van Rossumd8faa362007-04-27 19:54:29 +00001082 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001083 # We're inherited below by BasicTCPTest2, which also inherits
1084 # BasicTCPTest, which defines self.port referenced below.
1085 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001086 self.serv_conn = self.cli
1087
1088class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1089 """Tests that NetworkConnection does not break existing TCP functionality.
1090 """
1091
1092class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001093
Guido van Rossumd8faa362007-04-27 19:54:29 +00001094 def testWithoutServer(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001095 port = support.find_unused_port()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001096 self.assertRaises(
Christian Heimes5e696852008-04-09 08:37:03 +00001097 socket.error,
1098 lambda: socket.create_connection((HOST, port))
1099 )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001100
1101class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1102
1103 def __init__(self, methodName='runTest'):
1104 SocketTCPTest.__init__(self, methodName=methodName)
1105 ThreadableTest.__init__(self)
1106
1107 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001108 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001109
1110 def clientTearDown(self):
1111 self.cli.close()
1112 self.cli = None
1113 ThreadableTest.clientTearDown(self)
1114
1115 def _justAccept(self):
1116 conn, addr = self.serv.accept()
1117
1118 testFamily = _justAccept
1119 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001120 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001121 self.assertEqual(self.cli.family, 2)
1122
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001123 testSourceAddress = _justAccept
1124 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001125 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1126 source_address=('', self.source_port))
1127 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001128 # The port number being used is sufficient to show that the bind()
1129 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001130
Guido van Rossumd8faa362007-04-27 19:54:29 +00001131 testTimeoutDefault = _justAccept
1132 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001133 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001134 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001135 socket.setdefaulttimeout(42)
1136 try:
1137 self.cli = socket.create_connection((HOST, self.port))
1138 finally:
1139 socket.setdefaulttimeout(None)
1140 self.assertEquals(self.cli.gettimeout(), 42)
1141
1142 testTimeoutNone = _justAccept
1143 def _testTimeoutNone(self):
1144 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001145 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001146 socket.setdefaulttimeout(30)
1147 try:
1148 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1149 finally:
1150 socket.setdefaulttimeout(None)
1151 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001152
1153 testTimeoutValueNamed = _justAccept
1154 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001155 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001156 self.assertEqual(self.cli.gettimeout(), 30)
1157
1158 testTimeoutValueNonamed = _justAccept
1159 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001160 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001161 self.assertEqual(self.cli.gettimeout(), 30)
1162
Guido van Rossumd8faa362007-04-27 19:54:29 +00001163class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1164
1165 def __init__(self, methodName='runTest'):
1166 SocketTCPTest.__init__(self, methodName=methodName)
1167 ThreadableTest.__init__(self)
1168
1169 def clientSetUp(self):
1170 pass
1171
1172 def clientTearDown(self):
1173 self.cli.close()
1174 self.cli = None
1175 ThreadableTest.clientTearDown(self)
1176
1177 def testInsideTimeout(self):
1178 conn, addr = self.serv.accept()
1179 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001180 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001181 testOutsideTimeout = testInsideTimeout
1182
1183 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001184 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001185 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001186 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001187
1188 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001189 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001190 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001191
1192
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001193class TCPTimeoutTest(SocketTCPTest):
1194
1195 def testTCPTimeout(self):
1196 def raise_timeout(*args, **kwargs):
1197 self.serv.settimeout(1.0)
1198 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001199 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001200 "Error generating a timeout exception (TCP)")
1201
1202 def testTimeoutZero(self):
1203 ok = False
1204 try:
1205 self.serv.settimeout(0.0)
1206 foo = self.serv.accept()
1207 except socket.timeout:
1208 self.fail("caught timeout instead of error (TCP)")
1209 except socket.error:
1210 ok = True
1211 except:
1212 self.fail("caught unexpected exception (TCP)")
1213 if not ok:
1214 self.fail("accept() returned success when we did not expect it")
1215
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001216 def testInterruptedTimeout(self):
1217 # XXX I don't know how to do this test on MSWindows or any other
1218 # plaform that doesn't support signal.alarm() or os.kill(), though
1219 # the bug should have existed on all platforms.
1220 if not hasattr(signal, "alarm"):
1221 return # can only test on *nix
1222 self.serv.settimeout(5.0) # must be longer than alarm
1223 class Alarm(Exception):
1224 pass
1225 def alarm_handler(signal, frame):
1226 raise Alarm
1227 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1228 try:
1229 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1230 try:
1231 foo = self.serv.accept()
1232 except socket.timeout:
1233 self.fail("caught timeout instead of Alarm")
1234 except Alarm:
1235 pass
1236 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001237 self.fail("caught other exception instead of Alarm:"
1238 " %s(%s):\n%s" %
1239 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001240 else:
1241 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001242 finally:
1243 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001244 except Alarm:
1245 self.fail("got Alarm in wrong place")
1246 finally:
1247 # no alarm can be pending. Safe to restore old handler.
1248 signal.signal(signal.SIGALRM, old_alarm)
1249
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001250class UDPTimeoutTest(SocketTCPTest):
1251
1252 def testUDPTimeout(self):
1253 def raise_timeout(*args, **kwargs):
1254 self.serv.settimeout(1.0)
1255 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001256 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001257 "Error generating a timeout exception (UDP)")
1258
1259 def testTimeoutZero(self):
1260 ok = False
1261 try:
1262 self.serv.settimeout(0.0)
1263 foo = self.serv.recv(1024)
1264 except socket.timeout:
1265 self.fail("caught timeout instead of error (UDP)")
1266 except socket.error:
1267 ok = True
1268 except:
1269 self.fail("caught unexpected exception (UDP)")
1270 if not ok:
1271 self.fail("recv() returned success when we did not expect it")
1272
1273class TestExceptions(unittest.TestCase):
1274
1275 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001276 self.assertTrue(issubclass(socket.error, Exception))
1277 self.assertTrue(issubclass(socket.herror, socket.error))
1278 self.assertTrue(issubclass(socket.gaierror, socket.error))
1279 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001280
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001281class TestLinuxAbstractNamespace(unittest.TestCase):
1282
1283 UNIX_PATH_MAX = 108
1284
1285 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001286 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001287 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1288 s1.bind(address)
1289 s1.listen(1)
1290 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1291 s2.connect(s1.getsockname())
1292 s1.accept()
1293 self.assertEqual(s1.getsockname(), address)
1294 self.assertEqual(s2.getpeername(), address)
1295
1296 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001297 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001298 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1299 s.bind(address)
1300 self.assertEqual(s.getsockname(), address)
1301
1302 def testNameOverflow(self):
1303 address = "\x00" + "h" * self.UNIX_PATH_MAX
1304 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1305 self.assertRaises(socket.error, s.bind, address)
1306
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001307
Thomas Wouters477c8d52006-05-27 19:21:47 +00001308class BufferIOTest(SocketConnectedTest):
1309 """
1310 Test the buffer versions of socket.recv() and socket.send().
1311 """
1312 def __init__(self, methodName='runTest'):
1313 SocketConnectedTest.__init__(self, methodName=methodName)
1314
Antoine Pitrou25480782010-03-17 22:50:28 +00001315 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001316 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001317 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001318 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001319 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001320 self.assertEqual(msg, MSG)
1321
Antoine Pitrou25480782010-03-17 22:50:28 +00001322 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001323 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001324 self.serv_conn.send(buf)
1325
Antoine Pitrou25480782010-03-17 22:50:28 +00001326 def testRecvIntoBytearray(self):
1327 buf = bytearray(1024)
1328 nbytes = self.cli_conn.recv_into(buf)
1329 self.assertEqual(nbytes, len(MSG))
1330 msg = buf[:len(MSG)]
1331 self.assertEqual(msg, MSG)
1332
1333 _testRecvIntoBytearray = _testRecvIntoArray
1334
1335 def testRecvIntoMemoryview(self):
1336 buf = bytearray(1024)
1337 nbytes = self.cli_conn.recv_into(memoryview(buf))
1338 self.assertEqual(nbytes, len(MSG))
1339 msg = buf[:len(MSG)]
1340 self.assertEqual(msg, MSG)
1341
1342 _testRecvIntoMemoryview = _testRecvIntoArray
1343
1344 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001345 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001346 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001347 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001348 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001349 self.assertEqual(msg, MSG)
1350
Antoine Pitrou25480782010-03-17 22:50:28 +00001351 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001352 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353 self.serv_conn.send(buf)
1354
Antoine Pitrou25480782010-03-17 22:50:28 +00001355 def testRecvFromIntoBytearray(self):
1356 buf = bytearray(1024)
1357 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1358 self.assertEqual(nbytes, len(MSG))
1359 msg = buf[:len(MSG)]
1360 self.assertEqual(msg, MSG)
1361
1362 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1363
1364 def testRecvFromIntoMemoryview(self):
1365 buf = bytearray(1024)
1366 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1367 self.assertEqual(nbytes, len(MSG))
1368 msg = buf[:len(MSG)]
1369 self.assertEqual(msg, MSG)
1370
1371 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1372
Christian Heimes043d6f62008-01-07 17:19:16 +00001373
1374TIPC_STYPE = 2000
1375TIPC_LOWER = 200
1376TIPC_UPPER = 210
1377
1378def isTipcAvailable():
1379 """Check if the TIPC module is loaded
1380
1381 The TIPC module is not loaded automatically on Ubuntu and probably
1382 other Linux distros.
1383 """
1384 if not hasattr(socket, "AF_TIPC"):
1385 return False
1386 if not os.path.isfile("/proc/modules"):
1387 return False
1388 with open("/proc/modules") as f:
1389 for line in f:
1390 if line.startswith("tipc "):
1391 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001392 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001393 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1394 return False
1395
1396class TIPCTest (unittest.TestCase):
1397 def testRDM(self):
1398 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1399 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1400
1401 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1402 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1403 TIPC_LOWER, TIPC_UPPER)
1404 srv.bind(srvaddr)
1405
1406 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1407 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1408 cli.sendto(MSG, sendaddr)
1409
1410 msg, recvaddr = srv.recvfrom(1024)
1411
1412 self.assertEqual(cli.getsockname(), recvaddr)
1413 self.assertEqual(msg, MSG)
1414
1415
1416class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1417 def __init__(self, methodName = 'runTest'):
1418 unittest.TestCase.__init__(self, methodName = methodName)
1419 ThreadableTest.__init__(self)
1420
1421 def setUp(self):
1422 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1423 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1424 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1425 TIPC_LOWER, TIPC_UPPER)
1426 self.srv.bind(srvaddr)
1427 self.srv.listen(5)
1428 self.serverExplicitReady()
1429 self.conn, self.connaddr = self.srv.accept()
1430
1431 def clientSetUp(self):
1432 # The is a hittable race between serverExplicitReady() and the
1433 # accept() call; sleep a little while to avoid it, otherwise
1434 # we could get an exception
1435 time.sleep(0.1)
1436 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1437 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1438 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1439 self.cli.connect(addr)
1440 self.cliaddr = self.cli.getsockname()
1441
1442 def testStream(self):
1443 msg = self.conn.recv(1024)
1444 self.assertEqual(msg, MSG)
1445 self.assertEqual(self.cliaddr, self.connaddr)
1446
1447 def _testStream(self):
1448 self.cli.send(MSG)
1449 self.cli.close()
1450
1451
Guido van Rossumb995eb72002-07-31 16:08:40 +00001452def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001453 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001454 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001455 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001456 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001457
1458 tests.extend([
1459 NonBlockingTCPTests,
1460 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001461 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001462 UnbufferedFileObjectClassTestCase,
1463 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001464 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001465 NetworkConnectionNoServer,
1466 NetworkConnectionAttributesTest,
1467 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001468 ])
Dave Cole331708b2004-08-09 04:51:41 +00001469 if hasattr(socket, "socketpair"):
1470 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001471 if sys.platform == 'linux2':
1472 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001473 if isTipcAvailable():
1474 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001475 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001476
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001477 thread_info = support.threading_setup()
1478 support.run_unittest(*tests)
1479 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001480
1481if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001482 test_main()