blob: 0bb43d3f5180d6de0e98f41cae7eefa4e95ae002 [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
Antoine Pitrou4d7979b2010-09-07 21:22:56 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou08ae02f2010-09-27 18:14:43 +000020import math
Barry Warsawcf3d4b51997-01-03 20:03:32 +000021
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +000022def try_address(host, port=0, family=socket.AF_INET):
23 """Try to bind a socket on the given host:port and return True
24 if that has been possible."""
25 try:
26 sock = socket.socket(family, socket.SOCK_STREAM)
27 sock.bind((host, port))
28 except (socket.error, socket.gaierror):
29 return False
30 else:
31 sock.close()
32 return True
33
Benjamin Petersonee8712c2008-05-20 21:35:26 +000034HOST = support.HOST
Antoine Pitrou674f4002010-10-13 16:25:33 +000035MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf8') ## test unicode string and carriage return
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +000036SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000037
Guido van Rossum24e4af82002-06-12 19:18:08 +000038class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000039
Guido van Rossum24e4af82002-06-12 19:18:08 +000040 def setUp(self):
41 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000042 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000043 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000044
Guido van Rossum24e4af82002-06-12 19:18:08 +000045 def tearDown(self):
46 self.serv.close()
47 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000048
Guido van Rossum24e4af82002-06-12 19:18:08 +000049class SocketUDPTest(unittest.TestCase):
50
51 def setUp(self):
52 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000053 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000054
55 def tearDown(self):
56 self.serv.close()
57 self.serv = None
58
59class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000060 """Threadable Test class
61
62 The ThreadableTest class makes it easy to create a threaded
63 client/server pair from an existing unit test. To create a
64 new threaded class from an existing unit test, use multiple
65 inheritance:
66
67 class NewClass (OldClass, ThreadableTest):
68 pass
69
70 This class defines two new fixture functions with obvious
71 purposes for overriding:
72
73 clientSetUp ()
74 clientTearDown ()
75
76 Any new test functions within the class must then define
77 tests in pairs, where the test name is preceeded with a
78 '_' to indicate the client portion of the test. Ex:
79
80 def testFoo(self):
81 # Server portion
82
83 def _testFoo(self):
84 # Client portion
85
86 Any exceptions raised by the clients during their tests
87 are caught and transferred to the main thread to alert
88 the testing framework.
89
90 Note, the server setup function cannot call any blocking
91 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000092 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000093 the blocking call (such as in setting up a client/server
94 connection and performing the accept() in setUp().
95 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000096
97 def __init__(self):
98 # Swap the true setup function
99 self.__setUp = self.setUp
100 self.__tearDown = self.tearDown
101 self.setUp = self._setUp
102 self.tearDown = self._tearDown
103
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000104 def serverExplicitReady(self):
105 """This method allows the server to explicitly indicate that
106 it wants the client thread to proceed. This is useful if the
107 server is about to execute a blocking routine that is
108 dependent upon the client thread during its setup routine."""
109 self.server_ready.set()
110
Guido van Rossum24e4af82002-06-12 19:18:08 +0000111 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000112 self.server_ready = threading.Event()
113 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000114 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000115 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000116
117 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000118 methodname = self.id()
119 i = methodname.rfind('.')
120 methodname = methodname[i+1:]
121 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000122 self.client_thread = thread.start_new_thread(
123 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000124
125 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000126 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000127 self.server_ready.set()
128 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129
130 def _tearDown(self):
131 self.__tearDown()
132 self.done.wait()
133
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000134 if self.queue.qsize():
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135 msg = self.queue.get()
136 self.fail(msg)
137
138 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000139 self.server_ready.wait()
140 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000141 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000142 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000143 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000144 try:
145 test_func()
Guido van Rossumb940e112007-01-10 16:19:56 +0000146 except Exception as strerror:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147 self.queue.put(strerror)
148 self.clientTearDown()
149
150 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000151 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000152
153 def clientTearDown(self):
154 self.done.set()
155 thread.exit()
156
157class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
158
159 def __init__(self, methodName='runTest'):
160 SocketTCPTest.__init__(self, methodName=methodName)
161 ThreadableTest.__init__(self)
162
163 def clientSetUp(self):
164 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
165
166 def clientTearDown(self):
167 self.cli.close()
168 self.cli = None
169 ThreadableTest.clientTearDown(self)
170
171class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
172
173 def __init__(self, methodName='runTest'):
174 SocketUDPTest.__init__(self, methodName=methodName)
175 ThreadableTest.__init__(self)
176
177 def clientSetUp(self):
178 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
179
Brian Curtin8f8ed942010-11-04 03:49:29 +0000180 def clientTearDown(self):
181 self.cli.close()
182 self.cli = None
183 ThreadableTest.clientTearDown(self)
184
Guido van Rossum24e4af82002-06-12 19:18:08 +0000185class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000186 """Socket tests for client-server connection.
187
188 self.cli_conn is a client socket connected to the server. The
189 setUp() method guarantees that it is connected to the server.
190 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000191
192 def __init__(self, methodName='runTest'):
193 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
194
195 def setUp(self):
196 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000197 # Indicate explicitly we're ready for the client thread to
198 # proceed and then perform the blocking call to accept
199 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000200 conn, addr = self.serv.accept()
201 self.cli_conn = conn
202
203 def tearDown(self):
204 self.cli_conn.close()
205 self.cli_conn = None
206 ThreadedTCPSocketTest.tearDown(self)
207
208 def clientSetUp(self):
209 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000210 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211 self.serv_conn = self.cli
212
213 def clientTearDown(self):
214 self.serv_conn.close()
215 self.serv_conn = None
216 ThreadedTCPSocketTest.clientTearDown(self)
217
Dave Cole331708b2004-08-09 04:51:41 +0000218class SocketPairTest(unittest.TestCase, ThreadableTest):
219
220 def __init__(self, methodName='runTest'):
221 unittest.TestCase.__init__(self, methodName=methodName)
222 ThreadableTest.__init__(self)
223
224 def setUp(self):
225 self.serv, self.cli = socket.socketpair()
226
227 def tearDown(self):
228 self.serv.close()
229 self.serv = None
230
231 def clientSetUp(self):
232 pass
233
234 def clientTearDown(self):
235 self.cli.close()
236 self.cli = None
237 ThreadableTest.clientTearDown(self)
238
Tim Peters494aaee2004-08-09 18:54:11 +0000239
Guido van Rossum24e4af82002-06-12 19:18:08 +0000240#######################################################################
241## Begin Tests
242
243class GeneralModuleTests(unittest.TestCase):
244
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000245 def test_repr(self):
246 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlab91fde2009-08-13 08:51:18 +0000247 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000248
Raymond Hettinger027bb632004-05-31 03:09:25 +0000249 def test_weakref(self):
250 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
251 p = proxy(s)
252 self.assertEqual(p.fileno(), s.fileno())
253 s.close()
254 s = None
255 try:
256 p.fileno()
257 except ReferenceError:
258 pass
259 else:
260 self.fail('Socket proxy still exists')
261
Guido van Rossum24e4af82002-06-12 19:18:08 +0000262 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000263 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def raise_error(*args, **kwargs):
265 raise socket.error
266 def raise_herror(*args, **kwargs):
267 raise socket.herror
268 def raise_gaierror(*args, **kwargs):
269 raise socket.gaierror
Georg Brandlab91fde2009-08-13 08:51:18 +0000270 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 "Error raising socket exception.")
Georg Brandlab91fde2009-08-13 08:51:18 +0000272 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Georg Brandlab91fde2009-08-13 08:51:18 +0000274 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
276
277 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000278 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000279 socket.AF_INET
280 socket.SOCK_STREAM
281 socket.SOCK_DGRAM
282 socket.SOCK_RAW
283 socket.SOCK_RDM
284 socket.SOCK_SEQPACKET
285 socket.SOL_SOCKET
286 socket.SO_REUSEADDR
287
Guido van Rossum654c11e2002-06-13 20:24:17 +0000288 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000289 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000291 try:
292 ip = socket.gethostbyname(hostname)
293 except socket.error:
294 # Probably name lookup wasn't set up right; skip this test
295 return
Georg Brandlab91fde2009-08-13 08:51:18 +0000296 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000297 try:
298 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
299 except socket.error:
300 # Probably a similar problem as above; skip this test
301 return
Brett Cannon01668a12005-03-11 00:04:17 +0000302 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000303 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000304 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000305 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000306
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000307 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000308 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000309 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000310 try:
311 # On some versions, this loses a reference
312 orig = sys.getrefcount(__name__)
313 socket.getnameinfo(__name__,0)
Benjamin Petersonf3d7dbe2009-10-04 14:54:52 +0000314 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000315 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000316 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000317
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000319 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 try:
321 # On some versions, this crashes the interpreter.
322 socket.getnameinfo(('x', 0, 0, 0), 0)
323 except socket.error:
324 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000325
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000326 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000327 # This just checks that htons etc. are their own inverse,
328 # when looking at the lower 16 or 32 bits.
329 sizes = {socket.htonl: 32, socket.ntohl: 32,
330 socket.htons: 16, socket.ntohs: 16}
331 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000332 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000333 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
334 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000335
Guido van Rossuma2627af2002-09-14 00:58:46 +0000336 swapped = func(mask)
337 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000338 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000339
Guido van Rossum018919a2007-01-15 00:07:32 +0000340 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000341 good_values = [ 1, 2, 3, 1, 2, 3 ]
342 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000343 for k in good_values:
344 socket.ntohl(k)
345 socket.ntohs(k)
346 socket.htonl(k)
347 socket.htons(k)
348 for k in bad_values:
349 self.assertRaises(OverflowError, socket.ntohl, k)
350 self.assertRaises(OverflowError, socket.ntohs, k)
351 self.assertRaises(OverflowError, socket.htonl, k)
352 self.assertRaises(OverflowError, socket.htons, k)
353
Barry Warsaw11b91a02004-06-28 00:50:43 +0000354 def testGetServBy(self):
355 eq = self.assertEqual
356 # Find one service that exists, then check all the related interfaces.
357 # I've ordered this by protocols that have both a tcp and udp
358 # protocol, at least for modern Linuxes.
Gregory P. Smith397cd8a2010-10-17 04:23:21 +0000359 if (sys.platform.startswith('linux') or
360 sys.platform.startswith('freebsd') or
361 sys.platform.startswith('netbsd') or
362 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000363 # avoid the 'echo' service on this platform, as there is an
364 # assumption breaking non-standard port/protocol entry
365 services = ('daytime', 'qotd', 'domain')
366 else:
367 services = ('echo', 'daytime', 'domain')
368 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000369 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000370 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000371 break
372 except socket.error:
373 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000374 else:
375 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000376 # Try same call with optional protocol omitted
377 port2 = socket.getservbyname(service)
378 eq(port, port2)
379 # Try udp, but don't barf it it doesn't exist
380 try:
381 udpport = socket.getservbyname(service, 'udp')
382 except socket.error:
383 udpport = None
384 else:
385 eq(udpport, port)
386 # Now make sure the lookup by port returns the same service name
387 eq(socket.getservbyport(port2), service)
388 eq(socket.getservbyport(port, 'tcp'), service)
389 if udpport is not None:
390 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000391 # Make sure getservbyport does not accept out of range ports.
392 self.assertRaises(OverflowError, socket.getservbyport, -1)
393 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000394
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000395 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000396 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000397 # The default timeout should initially be None
398 self.assertEqual(socket.getdefaulttimeout(), None)
399 s = socket.socket()
400 self.assertEqual(s.gettimeout(), None)
401 s.close()
402
403 # Set the default timeout to 10, and see if it propagates
404 socket.setdefaulttimeout(10)
405 self.assertEqual(socket.getdefaulttimeout(), 10)
406 s = socket.socket()
407 self.assertEqual(s.gettimeout(), 10)
408 s.close()
409
410 # Reset the default timeout to None, and see if it propagates
411 socket.setdefaulttimeout(None)
412 self.assertEqual(socket.getdefaulttimeout(), None)
413 s = socket.socket()
414 self.assertEqual(s.gettimeout(), None)
415 s.close()
416
417 # Check that setting it to an invalid value raises ValueError
418 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
419
420 # Check that setting it to an invalid type raises TypeError
421 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
422
Benjamin Petersonf91df042009-02-13 02:50:59 +0000423 def testIPv4_inet_aton_fourbytes(self):
424 if not hasattr(socket, 'inet_aton'):
425 return # No inet_aton, nothing to check
426 # Test that issue1008086 and issue767150 are fixed.
427 # It must return 4 bytes.
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000428 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
429 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000430
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000431 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000432 if not hasattr(socket, 'inet_pton'):
433 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000434 from socket import inet_aton as f, inet_pton, AF_INET
435 g = lambda a: inet_pton(AF_INET, a)
436
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000437 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
438 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
439 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
440 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
441 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000443 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
444 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
445 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
446 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000447
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000448 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000449 if not hasattr(socket, 'inet_pton'):
450 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000451 try:
452 from socket import inet_pton, AF_INET6, has_ipv6
453 if not has_ipv6:
454 return
455 except ImportError:
456 return
457 f = lambda a: inet_pton(AF_INET6, a)
458
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000459 self.assertEqual(b'\x00' * 16, f('::'))
460 self.assertEqual(b'\x00' * 16, f('0::0'))
461 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
462 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000463 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 +0000464 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
465 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000466
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000467 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000468 if not hasattr(socket, 'inet_ntop'):
469 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000470 from socket import inet_ntoa as f, inet_ntop, AF_INET
471 g = lambda a: inet_ntop(AF_INET, a)
472
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000473 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
474 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
475 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
476 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000477
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000478 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
479 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
480 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000481
482 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000483 if not hasattr(socket, 'inet_ntop'):
484 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000485 try:
486 from socket import inet_ntop, AF_INET6, has_ipv6
487 if not has_ipv6:
488 return
489 except ImportError:
490 return
491 f = lambda a: inet_ntop(AF_INET6, a)
492
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000493 self.assertEqual('::', f(b'\x00' * 16))
494 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
495 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000496 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000497 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 +0000498 )
499
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000500 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000501
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000502 def _get_unused_port(self, bind_address='0.0.0.0'):
503 """Use a temporary socket to elicit an unused ephemeral port.
Christian Heimes5e696852008-04-09 08:37:03 +0000504
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000505 Args:
506 bind_address: Hostname or IP address to search for a port on.
507
508 Returns: A most likely to be unused port.
509 """
510 tempsock = socket.socket()
511 tempsock.bind((bind_address, 0))
512 host, port = tempsock.getsockname()
513 tempsock.close()
514 return port
515
516 def testSockName(self):
517 # Testing getsockname()
518 port = self._get_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000519 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Christian Heimes5e696852008-04-09 08:37:03 +0000520 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000521 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000522 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
523 # it reasonable to get the host's addr in addition to 0.0.0.0.
524 # At least for eCos. This is required for the S/390 to pass.
525 my_ip_addr = socket.gethostbyname(socket.gethostname())
Georg Brandlab91fde2009-08-13 08:51:18 +0000526 self.assertTrue(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000527 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000528
529 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000530 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000531 # We know a socket should start without reuse==0
532 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
533 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Georg Brandlab91fde2009-08-13 08:51:18 +0000534 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000535
536 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000537 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000538 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
539 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
540 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Georg Brandlab91fde2009-08-13 08:51:18 +0000541 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000542
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000543 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000544 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000545 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
546 sock.settimeout(1)
547 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000548 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000549
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 def testNewAttributes(self):
551 # testing .family, .type and .protocol
552 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
553 self.assertEqual(sock.family, socket.AF_INET)
554 self.assertEqual(sock.type, socket.SOCK_STREAM)
555 self.assertEqual(sock.proto, 0)
556 sock.close()
557
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000558 def test_getsockaddrarg(self):
559 host = '0.0.0.0'
560 port = self._get_unused_port(bind_address=host)
561 big_port = port + 65536
562 neg_port = port - 65536
563 sock = socket.socket()
564 try:
565 self.assertRaises(OverflowError, sock.bind, (host, big_port))
566 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
567 sock.bind((host, port))
568 finally:
569 sock.close()
570
Christian Heimesfaf2f632008-01-06 16:59:19 +0000571 def test_sock_ioctl(self):
572 if os.name != "nt":
573 return
Georg Brandlab91fde2009-08-13 08:51:18 +0000574 self.assertTrue(hasattr(socket.socket, 'ioctl'))
575 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
576 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
577 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000578
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +0000579 def testGetaddrinfo(self):
580 try:
581 socket.getaddrinfo('localhost', 80)
582 except socket.gaierror as err:
583 if err.errno == socket.EAI_SERVICE:
584 # see http://bugs.python.org/issue1282647
585 self.skipTest("buggy libc version")
586 raise
587 # len of every sequence is supposed to be == 5
588 for info in socket.getaddrinfo(HOST, None):
589 self.assertEqual(len(info), 5)
590 # host can be a domain name, a string representation of an
591 # IPv4/v6 address or None
592 socket.getaddrinfo('localhost', 80)
593 socket.getaddrinfo('127.0.0.1', 80)
594 socket.getaddrinfo(None, 80)
595 if SUPPORTS_IPV6:
596 socket.getaddrinfo('::1', 80)
597 # port can be a string service name such as "http", a numeric
598 # port number or None
599 socket.getaddrinfo(HOST, "http")
600 socket.getaddrinfo(HOST, 80)
601 socket.getaddrinfo(HOST, None)
602 # test family and socktype filters
603 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
604 for family, _, _, _, _ in infos:
605 self.assertEqual(family, socket.AF_INET)
606 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
607 for _, socktype, _, _, _ in infos:
608 self.assertEqual(socktype, socket.SOCK_STREAM)
609 # test proto and flags arguments
Giampaolo Rodolà5b37ce62010-08-16 05:09:31 +0000610 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolàb384e6c2010-08-14 17:00:05 +0000611 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
612 # a server willing to support both IPv4 and IPv6 will
613 # usually do this
614 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
615 socket.AI_PASSIVE)
616
Christian Heimesfaf2f632008-01-06 16:59:19 +0000617
Antoine Pitrou08ae02f2010-09-27 18:14:43 +0000618 def check_sendall_interrupted(self, with_timeout):
619 # socketpair() is not stricly required, but it makes things easier.
620 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
621 self.skipTest("signal.alarm and socket.socketpair required for this test")
622 # Our signal handlers clobber the C errno by calling a math function
623 # with an invalid domain value.
624 def ok_handler(*args):
625 self.assertRaises(ValueError, math.acosh, 0)
626 def raising_handler(*args):
627 self.assertRaises(ValueError, math.acosh, 0)
628 1 // 0
629 c, s = socket.socketpair()
630 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
631 try:
632 if with_timeout:
633 # Just above the one second minimum for signal.alarm
634 c.settimeout(1.5)
635 with self.assertRaises(ZeroDivisionError):
636 signal.alarm(1)
637 c.sendall(b"x" * (1024**2))
638 if with_timeout:
639 signal.signal(signal.SIGALRM, ok_handler)
640 signal.alarm(1)
641 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
642 finally:
643 signal.signal(signal.SIGALRM, old_alarm)
644 c.close()
645 s.close()
646
647 def test_sendall_interrupted(self):
648 self.check_sendall_interrupted(False)
649
650 def test_sendall_interrupted_with_timeout(self):
651 self.check_sendall_interrupted(True)
652
653
Guido van Rossum24e4af82002-06-12 19:18:08 +0000654class BasicTCPTest(SocketConnectedTest):
655
656 def __init__(self, methodName='runTest'):
657 SocketConnectedTest.__init__(self, methodName=methodName)
658
659 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000660 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000661 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000662 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000663
664 def _testRecv(self):
665 self.serv_conn.send(MSG)
666
667 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000668 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000669 seg1 = self.cli_conn.recv(len(MSG) - 3)
670 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000671 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000672 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000673
674 def _testOverFlowRecv(self):
675 self.serv_conn.send(MSG)
676
677 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000678 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000679 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000680 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000681
682 def _testRecvFrom(self):
683 self.serv_conn.send(MSG)
684
685 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000686 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000687 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
688 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000689 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000690 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000691
692 def _testOverFlowRecvFrom(self):
693 self.serv_conn.send(MSG)
694
695 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000696 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000697 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000698 while 1:
699 read = self.cli_conn.recv(1024)
700 if not read:
701 break
Guido van Rossume531e292002-08-08 20:28:34 +0000702 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000703 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000704
705 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000706 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000707 self.serv_conn.sendall(big_chunk)
708
709 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing fromfd()
Guido van Rossum8e95ca82002-06-12 20:55:17 +0000711 if not hasattr(socket, "fromfd"):
Guido van Rossum6fb3d5e2002-06-12 20:48:59 +0000712 return # On Windows, this doesn't exist
Guido van Rossum24e4af82002-06-12 19:18:08 +0000713 fd = self.cli_conn.fileno()
714 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
715 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000716 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000717
718 def _testFromFd(self):
719 self.serv_conn.send(MSG)
720
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000721 def testDup(self):
722 # Testing dup()
723 sock = self.cli_conn.dup()
724 msg = sock.recv(1024)
725 self.assertEqual(msg, MSG)
726
727 def _testDup(self):
728 self.serv_conn.send(MSG)
729
Guido van Rossum24e4af82002-06-12 19:18:08 +0000730 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000731 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000732 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000733 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000734 # wait for _testShutdown to finish: on OS X, when the server
735 # closes the connection the client also becomes disconnected,
736 # and the client's shutdown call will fail. (Issue #4397.)
737 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000738
739 def _testShutdown(self):
740 self.serv_conn.send(MSG)
741 self.serv_conn.shutdown(2)
742
743class BasicUDPTest(ThreadedUDPSocketTest):
744
745 def __init__(self, methodName='runTest'):
746 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
747
748 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000749 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000750 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000751 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000752
753 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000754 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000755
Guido van Rossum1c938012002-06-12 21:17:20 +0000756 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000757 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000759 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000760
Guido van Rossum1c938012002-06-12 21:17:20 +0000761 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000762 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000763
Guido van Rossumd8faa362007-04-27 19:54:29 +0000764 def testRecvFromNegative(self):
765 # Negative lengths passed to recvfrom should give ValueError.
766 self.assertRaises(ValueError, self.serv.recvfrom, -1)
767
768 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000769 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000770
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000771class TCPCloserTest(ThreadedTCPSocketTest):
772
773 def testClose(self):
774 conn, addr = self.serv.accept()
775 conn.close()
776
777 sd = self.cli
778 read, write, err = select.select([sd], [], [], 1.0)
779 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000780 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000781
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000782 # Calling close() many times should be safe.
783 conn.close()
784 conn.close()
785
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000786 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000787 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000788 time.sleep(1.0)
789
Dave Cole331708b2004-08-09 04:51:41 +0000790class BasicSocketPairTest(SocketPairTest):
791
792 def __init__(self, methodName='runTest'):
793 SocketPairTest.__init__(self, methodName=methodName)
794
795 def testRecv(self):
796 msg = self.serv.recv(1024)
797 self.assertEqual(msg, MSG)
798
799 def _testRecv(self):
800 self.cli.send(MSG)
801
802 def testSend(self):
803 self.serv.send(MSG)
804
805 def _testSend(self):
806 msg = self.cli.recv(1024)
807 self.assertEqual(msg, MSG)
808
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809class NonBlockingTCPTests(ThreadedTCPSocketTest):
810
811 def __init__(self, methodName='runTest'):
812 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
813
814 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000815 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000816 self.serv.setblocking(0)
817 start = time.time()
818 try:
819 self.serv.accept()
820 except socket.error:
821 pass
822 end = time.time()
Georg Brandlab91fde2009-08-13 08:51:18 +0000823 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000824
825 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000826 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000827
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000829 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000831 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832 conn, addr = self.serv.accept()
833 except socket.error:
834 pass
835 else:
836 self.fail("Error trying to do non-blocking accept.")
837 read, write, err = select.select([self.serv], [], [])
838 if self.serv in read:
839 conn, addr = self.serv.accept()
840 else:
841 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000842
Guido van Rossum24e4af82002-06-12 19:18:08 +0000843 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000844 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000845 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846
847 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000848 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000849 conn, addr = self.serv.accept()
850
851 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000852 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000853 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000854
855 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000856 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 conn, addr = self.serv.accept()
858 conn.setblocking(0)
859 try:
860 msg = conn.recv(len(MSG))
861 except socket.error:
862 pass
863 else:
864 self.fail("Error trying to do non-blocking recv.")
865 read, write, err = select.select([conn], [], [])
866 if conn in read:
867 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000868 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000869 else:
870 self.fail("Error during select call to non-blocking socket.")
871
872 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000873 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000874 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000875 self.cli.send(MSG)
876
877class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000878 """Unit tests for the object returned by socket.makefile()
879
Antoine Pitrou674f4002010-10-13 16:25:33 +0000880 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000881 the client connection. You can read from this file to
882 get output from the server.
883
Antoine Pitrou674f4002010-10-13 16:25:33 +0000884 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000885 server connection. You can write to this file to send output
886 to the client.
887 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888
Guido van Rossume9f66142002-08-07 15:46:19 +0000889 bufsize = -1 # Use default buffer size
Antoine Pitrou674f4002010-10-13 16:25:33 +0000890 encoding = 'utf8'
891 errors = 'strict'
892 newline = None
893
894 read_mode = 'rb'
895 read_msg = MSG
896 write_mode = 'wb'
897 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +0000898
Guido van Rossum24e4af82002-06-12 19:18:08 +0000899 def __init__(self, methodName='runTest'):
900 SocketConnectedTest.__init__(self, methodName=methodName)
901
902 def setUp(self):
903 SocketConnectedTest.setUp(self)
Antoine Pitrou674f4002010-10-13 16:25:33 +0000904 self.read_file = self.cli_conn.makefile(
905 self.read_mode, self.bufsize,
906 encoding = self.encoding,
907 errors = self.errors,
908 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909
910 def tearDown(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000911 self.read_file.close()
912 self.assertTrue(self.read_file.closed)
913 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914 SocketConnectedTest.tearDown(self)
915
916 def clientSetUp(self):
917 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou674f4002010-10-13 16:25:33 +0000918 self.write_file = self.serv_conn.makefile(
919 self.write_mode, self.bufsize,
920 encoding = self.encoding,
921 errors = self.errors,
922 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923
924 def clientTearDown(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000925 self.write_file.close()
926 self.assertTrue(self.write_file.closed)
927 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928 SocketConnectedTest.clientTearDown(self)
929
930 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000931 # Performing small file read test
Antoine Pitrou674f4002010-10-13 16:25:33 +0000932 first_seg = self.read_file.read(len(self.read_msg)-3)
933 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +0000934 msg = first_seg + second_seg
Antoine Pitrou674f4002010-10-13 16:25:33 +0000935 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936
937 def _testSmallRead(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000938 self.write_file.write(self.write_msg)
939 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940
Guido van Rossum8c943832002-08-08 01:00:28 +0000941 def testFullRead(self):
942 # read until EOF
Antoine Pitrou674f4002010-10-13 16:25:33 +0000943 msg = self.read_file.read()
944 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +0000945
946 def _testFullRead(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000947 self.write_file.write(self.write_msg)
948 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +0000949
Guido van Rossum24e4af82002-06-12 19:18:08 +0000950 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000951 # Performing unbuffered file read test
Antoine Pitrou674f4002010-10-13 16:25:33 +0000952 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000953 while 1:
Antoine Pitrou674f4002010-10-13 16:25:33 +0000954 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +0000955 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956 break
Guido van Rossum8c943832002-08-08 01:00:28 +0000957 buf += char
Antoine Pitrou674f4002010-10-13 16:25:33 +0000958 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000959
960 def _testUnbufferedRead(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000961 self.write_file.write(self.write_msg)
962 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000963
964 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000965 # Performing file readline test
Antoine Pitrou674f4002010-10-13 16:25:33 +0000966 line = self.read_file.readline()
967 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000968
969 def _testReadline(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000970 self.write_file.write(self.write_msg)
971 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000972
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000973 def testCloseAfterMakefile(self):
974 # The file returned by makefile should keep the socket open.
975 self.cli_conn.close()
976 # read until EOF
Antoine Pitrou674f4002010-10-13 16:25:33 +0000977 msg = self.read_file.read()
978 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000979
980 def _testCloseAfterMakefile(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000981 self.write_file.write(self.write_msg)
982 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000983
984 def testMakefileAfterMakefileClose(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000985 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000986 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou674f4002010-10-13 16:25:33 +0000987 if isinstance(self.read_msg, str):
988 msg = msg.decode()
989 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000990
991 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000992 self.write_file.write(self.write_msg)
993 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000994
Tim Peters116d83c2004-03-28 02:20:45 +0000995 def testClosedAttr(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000996 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +0000997
998 def _testClosedAttr(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +0000999 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001000
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001001 def testAttributes(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +00001002 self.assertEqual(self.read_file.mode, self.read_mode)
1003 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001004
1005 def _testAttributes(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +00001006 self.assertEqual(self.write_file.mode, self.write_mode)
1007 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001008
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001009 def testRealClose(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +00001010 self.read_file.close()
1011 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001012 self.cli_conn.close()
1013 self.assertRaises(socket.error, self.cli_conn.getsockname)
1014
1015 def _testRealClose(self):
1016 pass
1017
1018
Guido van Rossume9f66142002-08-07 15:46:19 +00001019class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1020
1021 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001022
Guido van Rossume9f66142002-08-07 15:46:19 +00001023 In this case (and in this case only), it should be possible to
1024 create a file object, read a line from it, create another file
1025 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001026 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001027 when reading multiple requests from the same socket."""
1028
1029 bufsize = 0 # Use unbuffered mode
1030
1031 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001032 # Read a line, create a new file object, read another line with it
Antoine Pitrou674f4002010-10-13 16:25:33 +00001033 line = self.read_file.readline() # first line
1034 self.assertEqual(line, b"A. " + self.write_msg) # first line
1035 self.read_file = self.cli_conn.makefile('rb', 0)
1036 line = self.read_file.readline() # second line
1037 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001038
1039 def _testUnbufferedReadline(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +00001040 self.write_file.write(b"A. " + self.write_msg)
1041 self.write_file.write(b"B. " + self.write_msg)
1042 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001043
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001044 def testMakefileClose(self):
1045 # The file returned by makefile should keep the socket open...
1046 self.cli_conn.close()
1047 msg = self.cli_conn.recv(1024)
Antoine Pitrou674f4002010-10-13 16:25:33 +00001048 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001049 # ...until the file is itself closed
Antoine Pitrou674f4002010-10-13 16:25:33 +00001050 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001051 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1052
1053 def _testMakefileClose(self):
Antoine Pitrou674f4002010-10-13 16:25:33 +00001054 self.write_file.write(self.write_msg)
1055 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001056
1057 def testMakefileCloseSocketDestroy(self):
1058 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou674f4002010-10-13 16:25:33 +00001059 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001060 refcount_after = sys.getrefcount(self.cli_conn)
1061 self.assertEqual(refcount_before - 1, refcount_after)
1062
1063 def _testMakefileCloseSocketDestroy(self):
1064 pass
1065
1066
Guido van Rossum8c943832002-08-08 01:00:28 +00001067class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1068
1069 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1070
1071
1072class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1073
1074 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001075
Thomas Woutersb2137042007-02-01 18:02:27 +00001076
Antoine Pitrou674f4002010-10-13 16:25:33 +00001077class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1078 """Tests for socket.makefile() in text mode (rather than binary)"""
1079
1080 read_mode = 'r'
1081 read_msg = MSG.decode('utf8')
1082 write_mode = 'wb'
1083 write_msg = MSG
1084 newline = ''
1085
1086
1087class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1088 """Tests for socket.makefile() in text mode (rather than binary)"""
1089
1090 read_mode = 'rb'
1091 read_msg = MSG
1092 write_mode = 'w'
1093 write_msg = MSG.decode('utf8')
1094 newline = ''
1095
1096
1097class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1098 """Tests for socket.makefile() in text mode (rather than binary)"""
1099
1100 read_mode = 'r'
1101 read_msg = MSG.decode('utf8')
1102 write_mode = 'w'
1103 write_msg = MSG.decode('utf8')
1104 newline = ''
1105
1106
Guido van Rossumd8faa362007-04-27 19:54:29 +00001107class NetworkConnectionTest(object):
1108 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001109
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001111 # We're inherited below by BasicTCPTest2, which also inherits
1112 # BasicTCPTest, which defines self.port referenced below.
1113 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001114 self.serv_conn = self.cli
1115
1116class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1117 """Tests that NetworkConnection does not break existing TCP functionality.
1118 """
1119
1120class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001121
Antoine Pitrou4d7979b2010-09-07 21:22:56 +00001122 class MockSocket(socket.socket):
1123 def connect(self, *args):
1124 raise socket.timeout('timed out')
1125
1126 @contextlib.contextmanager
1127 def mocked_socket_module(self):
1128 """Return a socket which times out on connect"""
1129 old_socket = socket.socket
1130 socket.socket = self.MockSocket
1131 try:
1132 yield
1133 finally:
1134 socket.socket = old_socket
1135
1136 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001137 port = support.find_unused_port()
Antoine Pitrou4d7979b2010-09-07 21:22:56 +00001138 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1139 try:
1140 cli.connect((HOST, port))
1141 except socket.error as err:
1142 self.assertEqual(err.errno, errno.ECONNREFUSED)
1143 else:
1144 self.fail("socket.error not raised")
1145
1146 def test_create_connection(self):
1147 # Issue #9792: errors raised by create_connection() should have
1148 # a proper errno attribute.
1149 port = support.find_unused_port()
1150 try:
1151 socket.create_connection((HOST, port))
1152 except socket.error as err:
1153 self.assertEqual(err.errno, errno.ECONNREFUSED)
1154 else:
1155 self.fail("socket.error not raised")
1156
1157 def test_create_connection_timeout(self):
1158 # Issue #9792: create_connection() should not recast timeout errors
1159 # as generic socket errors.
1160 with self.mocked_socket_module():
1161 with self.assertRaises(socket.timeout):
1162 socket.create_connection((HOST, 1234))
1163
Guido van Rossumd8faa362007-04-27 19:54:29 +00001164
1165class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1166
1167 def __init__(self, methodName='runTest'):
1168 SocketTCPTest.__init__(self, methodName=methodName)
1169 ThreadableTest.__init__(self)
1170
1171 def clientSetUp(self):
1172 pass
1173
1174 def clientTearDown(self):
1175 self.cli.close()
1176 self.cli = None
1177 ThreadableTest.clientTearDown(self)
1178
1179 def _justAccept(self):
1180 conn, addr = self.serv.accept()
1181
1182 testFamily = _justAccept
1183 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001184 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001185 self.assertEqual(self.cli.family, 2)
1186
1187 testTimeoutDefault = _justAccept
1188 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001189 # passing no explicit timeout uses socket's global default
Georg Brandlab91fde2009-08-13 08:51:18 +00001190 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001191 socket.setdefaulttimeout(42)
1192 try:
1193 self.cli = socket.create_connection((HOST, self.port))
1194 finally:
1195 socket.setdefaulttimeout(None)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +00001196 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001197
1198 testTimeoutNone = _justAccept
1199 def _testTimeoutNone(self):
1200 # None timeout means the same as sock.settimeout(None)
Georg Brandlab91fde2009-08-13 08:51:18 +00001201 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001202 socket.setdefaulttimeout(30)
1203 try:
1204 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1205 finally:
1206 socket.setdefaulttimeout(None)
1207 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001208
1209 testTimeoutValueNamed = _justAccept
1210 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001211 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001212 self.assertEqual(self.cli.gettimeout(), 30)
1213
1214 testTimeoutValueNonamed = _justAccept
1215 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001216 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001217 self.assertEqual(self.cli.gettimeout(), 30)
1218
Guido van Rossumd8faa362007-04-27 19:54:29 +00001219class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1220
1221 def __init__(self, methodName='runTest'):
1222 SocketTCPTest.__init__(self, methodName=methodName)
1223 ThreadableTest.__init__(self)
1224
1225 def clientSetUp(self):
1226 pass
1227
1228 def clientTearDown(self):
1229 self.cli.close()
1230 self.cli = None
1231 ThreadableTest.clientTearDown(self)
1232
1233 def testInsideTimeout(self):
1234 conn, addr = self.serv.accept()
1235 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001236 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001237 testOutsideTimeout = testInsideTimeout
1238
1239 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001240 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001241 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001242 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001243
1244 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001245 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Georg Brandlab91fde2009-08-13 08:51:18 +00001246 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001247
1248
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001249class TCPTimeoutTest(SocketTCPTest):
1250
1251 def testTCPTimeout(self):
1252 def raise_timeout(*args, **kwargs):
1253 self.serv.settimeout(1.0)
1254 self.serv.accept()
Georg Brandlab91fde2009-08-13 08:51:18 +00001255 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001256 "Error generating a timeout exception (TCP)")
1257
1258 def testTimeoutZero(self):
1259 ok = False
1260 try:
1261 self.serv.settimeout(0.0)
1262 foo = self.serv.accept()
1263 except socket.timeout:
1264 self.fail("caught timeout instead of error (TCP)")
1265 except socket.error:
1266 ok = True
1267 except:
1268 self.fail("caught unexpected exception (TCP)")
1269 if not ok:
1270 self.fail("accept() returned success when we did not expect it")
1271
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001272 def testInterruptedTimeout(self):
1273 # XXX I don't know how to do this test on MSWindows or any other
1274 # plaform that doesn't support signal.alarm() or os.kill(), though
1275 # the bug should have existed on all platforms.
1276 if not hasattr(signal, "alarm"):
1277 return # can only test on *nix
1278 self.serv.settimeout(5.0) # must be longer than alarm
1279 class Alarm(Exception):
1280 pass
1281 def alarm_handler(signal, frame):
1282 raise Alarm
1283 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1284 try:
1285 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1286 try:
1287 foo = self.serv.accept()
1288 except socket.timeout:
1289 self.fail("caught timeout instead of Alarm")
1290 except Alarm:
1291 pass
1292 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001293 self.fail("caught other exception instead of Alarm:"
1294 " %s(%s):\n%s" %
1295 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001296 else:
1297 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001298 finally:
1299 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001300 except Alarm:
1301 self.fail("got Alarm in wrong place")
1302 finally:
1303 # no alarm can be pending. Safe to restore old handler.
1304 signal.signal(signal.SIGALRM, old_alarm)
1305
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001306class UDPTimeoutTest(SocketTCPTest):
1307
1308 def testUDPTimeout(self):
1309 def raise_timeout(*args, **kwargs):
1310 self.serv.settimeout(1.0)
1311 self.serv.recv(1024)
Georg Brandlab91fde2009-08-13 08:51:18 +00001312 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001313 "Error generating a timeout exception (UDP)")
1314
1315 def testTimeoutZero(self):
1316 ok = False
1317 try:
1318 self.serv.settimeout(0.0)
1319 foo = self.serv.recv(1024)
1320 except socket.timeout:
1321 self.fail("caught timeout instead of error (UDP)")
1322 except socket.error:
1323 ok = True
1324 except:
1325 self.fail("caught unexpected exception (UDP)")
1326 if not ok:
1327 self.fail("recv() returned success when we did not expect it")
1328
1329class TestExceptions(unittest.TestCase):
1330
1331 def testExceptionTree(self):
Georg Brandlab91fde2009-08-13 08:51:18 +00001332 self.assertTrue(issubclass(socket.error, Exception))
1333 self.assertTrue(issubclass(socket.herror, socket.error))
1334 self.assertTrue(issubclass(socket.gaierror, socket.error))
1335 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001336
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001337class TestLinuxAbstractNamespace(unittest.TestCase):
1338
1339 UNIX_PATH_MAX = 108
1340
1341 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001342 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001343 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1344 s1.bind(address)
1345 s1.listen(1)
1346 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1347 s2.connect(s1.getsockname())
1348 s1.accept()
1349 self.assertEqual(s1.getsockname(), address)
1350 self.assertEqual(s2.getpeername(), address)
1351
1352 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001353 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001354 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1355 s.bind(address)
1356 self.assertEqual(s.getsockname(), address)
1357
1358 def testNameOverflow(self):
1359 address = "\x00" + "h" * self.UNIX_PATH_MAX
1360 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1361 self.assertRaises(socket.error, s.bind, address)
1362
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001363
Thomas Wouters477c8d52006-05-27 19:21:47 +00001364class BufferIOTest(SocketConnectedTest):
1365 """
1366 Test the buffer versions of socket.recv() and socket.send().
1367 """
1368 def __init__(self, methodName='runTest'):
1369 SocketConnectedTest.__init__(self, methodName=methodName)
1370
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001371 def testRecvInto(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001372 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001373 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001374 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001375 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001376 self.assertEqual(msg, MSG)
1377
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001378 def _testRecvInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001379 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380 self.serv_conn.send(buf)
1381
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001382 def testRecvFromInto(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001383 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001384 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001385 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001386 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387 self.assertEqual(msg, MSG)
1388
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001389 def _testRecvFromInto(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001390 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391 self.serv_conn.send(buf)
1392
Christian Heimes043d6f62008-01-07 17:19:16 +00001393
1394TIPC_STYPE = 2000
1395TIPC_LOWER = 200
1396TIPC_UPPER = 210
1397
1398def isTipcAvailable():
1399 """Check if the TIPC module is loaded
1400
1401 The TIPC module is not loaded automatically on Ubuntu and probably
1402 other Linux distros.
1403 """
1404 if not hasattr(socket, "AF_TIPC"):
1405 return False
1406 if not os.path.isfile("/proc/modules"):
1407 return False
1408 with open("/proc/modules") as f:
1409 for line in f:
1410 if line.startswith("tipc "):
1411 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001412 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001413 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1414 return False
1415
1416class TIPCTest (unittest.TestCase):
1417 def testRDM(self):
1418 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1419 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1420
1421 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1422 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1423 TIPC_LOWER, TIPC_UPPER)
1424 srv.bind(srvaddr)
1425
1426 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1427 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1428 cli.sendto(MSG, sendaddr)
1429
1430 msg, recvaddr = srv.recvfrom(1024)
1431
1432 self.assertEqual(cli.getsockname(), recvaddr)
1433 self.assertEqual(msg, MSG)
1434
1435
1436class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1437 def __init__(self, methodName = 'runTest'):
1438 unittest.TestCase.__init__(self, methodName = methodName)
1439 ThreadableTest.__init__(self)
1440
1441 def setUp(self):
1442 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1443 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1444 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1445 TIPC_LOWER, TIPC_UPPER)
1446 self.srv.bind(srvaddr)
1447 self.srv.listen(5)
1448 self.serverExplicitReady()
1449 self.conn, self.connaddr = self.srv.accept()
1450
1451 def clientSetUp(self):
1452 # The is a hittable race between serverExplicitReady() and the
1453 # accept() call; sleep a little while to avoid it, otherwise
1454 # we could get an exception
1455 time.sleep(0.1)
1456 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1457 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1458 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1459 self.cli.connect(addr)
1460 self.cliaddr = self.cli.getsockname()
1461
1462 def testStream(self):
1463 msg = self.conn.recv(1024)
1464 self.assertEqual(msg, MSG)
1465 self.assertEqual(self.cliaddr, self.connaddr)
1466
1467 def _testStream(self):
1468 self.cli.send(MSG)
1469 self.cli.close()
1470
1471
Guido van Rossumb995eb72002-07-31 16:08:40 +00001472def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001473 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001474 TestExceptions, BufferIOTest, BasicTCPTest2]
Jack Jansen522e7692002-09-06 21:57:50 +00001475 if sys.platform != 'mac':
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001476 tests.extend([ BasicUDPTest, UDPTimeoutTest ])
Walter Dörwald21d3a322003-05-01 17:45:56 +00001477
1478 tests.extend([
1479 NonBlockingTCPTests,
1480 FileObjectClassTestCase,
1481 UnbufferedFileObjectClassTestCase,
1482 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001483 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou674f4002010-10-13 16:25:33 +00001484 UnicodeReadFileObjectClassTestCase,
1485 UnicodeWriteFileObjectClassTestCase,
1486 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001487 NetworkConnectionNoServer,
1488 NetworkConnectionAttributesTest,
1489 NetworkConnectionBehaviourTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001490 ])
Dave Cole331708b2004-08-09 04:51:41 +00001491 if hasattr(socket, "socketpair"):
1492 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001493 if sys.platform == 'linux2':
1494 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001495 if isTipcAvailable():
1496 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001497 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001498
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001499 thread_info = support.threading_setup()
1500 support.run_unittest(*tests)
1501 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001502
1503if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001504 test_main()