blob: ccb9cd018b0e9c8f232a758d311ac0fc7d39e412 [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
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Barry Warsawcf3d4b51997-01-03 20:03:32 +000020
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000021def try_address(host, port=0, family=socket.AF_INET):
22 """Try to bind a socket on the given host:port and return True
23 if that has been possible."""
24 try:
25 sock = socket.socket(family, socket.SOCK_STREAM)
26 sock.bind((host, port))
27 except (socket.error, socket.gaierror):
28 return False
29 else:
30 sock.close()
31 return True
32
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Guido van Rossum7d0a8262007-05-21 23:13:11 +000034MSG = b'Michael Gilfix was here\n'
Giampaolo Rodolà419f7042010-08-14 16:45:41 +000035SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000036
Victor Stinner45df8202010-04-28 22:31:17 +000037try:
38 import _thread as thread
39 import threading
40except ImportError:
41 thread = None
42 threading = None
43
Guido van Rossum24e4af82002-06-12 19:18:08 +000044class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000045
Guido van Rossum24e4af82002-06-12 19:18:08 +000046 def setUp(self):
47 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000048 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000049 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000050
Guido van Rossum24e4af82002-06-12 19:18:08 +000051 def tearDown(self):
52 self.serv.close()
53 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000054
Guido van Rossum24e4af82002-06-12 19:18:08 +000055class SocketUDPTest(unittest.TestCase):
56
57 def setUp(self):
58 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000059 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000060
61 def tearDown(self):
62 self.serv.close()
63 self.serv = None
64
65class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000066 """Threadable Test class
67
68 The ThreadableTest class makes it easy to create a threaded
69 client/server pair from an existing unit test. To create a
70 new threaded class from an existing unit test, use multiple
71 inheritance:
72
73 class NewClass (OldClass, ThreadableTest):
74 pass
75
76 This class defines two new fixture functions with obvious
77 purposes for overriding:
78
79 clientSetUp ()
80 clientTearDown ()
81
82 Any new test functions within the class must then define
83 tests in pairs, where the test name is preceeded with a
84 '_' to indicate the client portion of the test. Ex:
85
86 def testFoo(self):
87 # Server portion
88
89 def _testFoo(self):
90 # Client portion
91
92 Any exceptions raised by the clients during their tests
93 are caught and transferred to the main thread to alert
94 the testing framework.
95
96 Note, the server setup function cannot call any blocking
97 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000098 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000099 the blocking call (such as in setting up a client/server
100 connection and performing the accept() in setUp().
101 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000102
103 def __init__(self):
104 # Swap the true setup function
105 self.__setUp = self.setUp
106 self.__tearDown = self.tearDown
107 self.setUp = self._setUp
108 self.tearDown = self._tearDown
109
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000110 def serverExplicitReady(self):
111 """This method allows the server to explicitly indicate that
112 it wants the client thread to proceed. This is useful if the
113 server is about to execute a blocking routine that is
114 dependent upon the client thread during its setup routine."""
115 self.server_ready.set()
116
Guido van Rossum24e4af82002-06-12 19:18:08 +0000117 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000118 self.server_ready = threading.Event()
119 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000121 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000122
123 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000124 methodname = self.id()
125 i = methodname.rfind('.')
126 methodname = methodname[i+1:]
127 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000128 self.client_thread = thread.start_new_thread(
129 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000130
131 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000132 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000133 self.server_ready.set()
134 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000135
136 def _tearDown(self):
137 self.__tearDown()
138 self.done.wait()
139
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000140 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000141 exc = self.queue.get()
142 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143
144 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000145 self.server_ready.wait()
146 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000147 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000148 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000149 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000150 try:
151 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000152 except BaseException as e:
153 self.queue.put(e)
154 finally:
155 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000156
157 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000158 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000159
160 def clientTearDown(self):
161 self.done.set()
162 thread.exit()
163
164class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
165
166 def __init__(self, methodName='runTest'):
167 SocketTCPTest.__init__(self, methodName=methodName)
168 ThreadableTest.__init__(self)
169
170 def clientSetUp(self):
171 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
172
173 def clientTearDown(self):
174 self.cli.close()
175 self.cli = None
176 ThreadableTest.clientTearDown(self)
177
178class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
179
180 def __init__(self, methodName='runTest'):
181 SocketUDPTest.__init__(self, methodName=methodName)
182 ThreadableTest.__init__(self)
183
184 def clientSetUp(self):
185 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
186
187class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000188 """Socket tests for client-server connection.
189
190 self.cli_conn is a client socket connected to the server. The
191 setUp() method guarantees that it is connected to the server.
192 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000193
194 def __init__(self, methodName='runTest'):
195 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
196
197 def setUp(self):
198 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000199 # Indicate explicitly we're ready for the client thread to
200 # proceed and then perform the blocking call to accept
201 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000202 conn, addr = self.serv.accept()
203 self.cli_conn = conn
204
205 def tearDown(self):
206 self.cli_conn.close()
207 self.cli_conn = None
208 ThreadedTCPSocketTest.tearDown(self)
209
210 def clientSetUp(self):
211 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000212 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000213 self.serv_conn = self.cli
214
215 def clientTearDown(self):
216 self.serv_conn.close()
217 self.serv_conn = None
218 ThreadedTCPSocketTest.clientTearDown(self)
219
Dave Cole331708b2004-08-09 04:51:41 +0000220class SocketPairTest(unittest.TestCase, ThreadableTest):
221
222 def __init__(self, methodName='runTest'):
223 unittest.TestCase.__init__(self, methodName=methodName)
224 ThreadableTest.__init__(self)
225
226 def setUp(self):
227 self.serv, self.cli = socket.socketpair()
228
229 def tearDown(self):
230 self.serv.close()
231 self.serv = None
232
233 def clientSetUp(self):
234 pass
235
236 def clientTearDown(self):
237 self.cli.close()
238 self.cli = None
239 ThreadableTest.clientTearDown(self)
240
Tim Peters494aaee2004-08-09 18:54:11 +0000241
Guido van Rossum24e4af82002-06-12 19:18:08 +0000242#######################################################################
243## Begin Tests
244
245class GeneralModuleTests(unittest.TestCase):
246
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000247 def test_repr(self):
248 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000249 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000250
Raymond Hettinger027bb632004-05-31 03:09:25 +0000251 def test_weakref(self):
252 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
253 p = proxy(s)
254 self.assertEqual(p.fileno(), s.fileno())
255 s.close()
256 s = None
257 try:
258 p.fileno()
259 except ReferenceError:
260 pass
261 else:
262 self.fail('Socket proxy still exists')
263
Guido van Rossum24e4af82002-06-12 19:18:08 +0000264 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000265 # Testing socket module exceptions
Guido van Rossum24e4af82002-06-12 19:18:08 +0000266 def raise_error(*args, **kwargs):
267 raise socket.error
268 def raise_herror(*args, **kwargs):
269 raise socket.herror
270 def raise_gaierror(*args, **kwargs):
271 raise socket.gaierror
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000272 self.assertRaises(socket.error, raise_error,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000273 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertRaises(socket.error, raise_herror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000275 "Error raising socket exception.")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertRaises(socket.error, raise_gaierror,
Guido van Rossum24e4af82002-06-12 19:18:08 +0000277 "Error raising socket exception.")
278
279 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000280 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 socket.AF_INET
282 socket.SOCK_STREAM
283 socket.SOCK_DGRAM
284 socket.SOCK_RAW
285 socket.SOCK_RDM
286 socket.SOCK_SEQPACKET
287 socket.SOL_SOCKET
288 socket.SO_REUSEADDR
289
Guido van Rossum654c11e2002-06-13 20:24:17 +0000290 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000291 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000292 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000293 try:
294 ip = socket.gethostbyname(hostname)
295 except socket.error:
296 # Probably name lookup wasn't set up right; skip this test
297 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000298 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000299 try:
300 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
301 except socket.error:
302 # Probably a similar problem as above; skip this test
303 return
Brett Cannon01668a12005-03-11 00:04:17 +0000304 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000305 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000306 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000307 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000308
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000309 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000310 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000311 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000312 try:
313 # On some versions, this loses a reference
314 orig = sys.getrefcount(__name__)
315 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000316 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000317 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000318 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000319
Guido van Rossum24e4af82002-06-12 19:18:08 +0000320 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000321 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000322 try:
323 # On some versions, this crashes the interpreter.
324 socket.getnameinfo(('x', 0, 0, 0), 0)
325 except socket.error:
326 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000327
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000328 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000329 # This just checks that htons etc. are their own inverse,
330 # when looking at the lower 16 or 32 bits.
331 sizes = {socket.htonl: 32, socket.ntohl: 32,
332 socket.htons: 16, socket.ntohs: 16}
333 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000334 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000335 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
336 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000337
Guido van Rossuma2627af2002-09-14 00:58:46 +0000338 swapped = func(mask)
339 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000340 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000341
Guido van Rossum018919a2007-01-15 00:07:32 +0000342 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000343 good_values = [ 1, 2, 3, 1, 2, 3 ]
344 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000345 for k in good_values:
346 socket.ntohl(k)
347 socket.ntohs(k)
348 socket.htonl(k)
349 socket.htons(k)
350 for k in bad_values:
351 self.assertRaises(OverflowError, socket.ntohl, k)
352 self.assertRaises(OverflowError, socket.ntohs, k)
353 self.assertRaises(OverflowError, socket.htonl, k)
354 self.assertRaises(OverflowError, socket.htons, k)
355
Barry Warsaw11b91a02004-06-28 00:50:43 +0000356 def testGetServBy(self):
357 eq = self.assertEqual
358 # Find one service that exists, then check all the related interfaces.
359 # I've ordered this by protocols that have both a tcp and udp
360 # protocol, at least for modern Linuxes.
Brett Cannon08febeb2004-11-20 21:10:07 +0000361 if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000362 'freebsd7', 'freebsd8', '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.
428 self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
429 self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
430
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
Guido van Rossumb5b22702007-05-18 18:55:53 +0000437 self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
438 self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
439 self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
440 self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
441 self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000442
Guido van Rossumb5b22702007-05-18 18:55:53 +0000443 self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
444 self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
445 self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
446 self.assertEquals(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
Guido van Rossum540d9872007-08-17 03:51:09 +0000459 self.assertEquals(b'\x00' * 16, f('::'))
460 self.assertEquals(b'\x00' * 16, f('0::0'))
461 self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000462 self.assertEquals(
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
Guido van Rossumb5b22702007-05-18 18:55:53 +0000473 self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
474 self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
475 self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
476 self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000477
Guido van Rossumb5b22702007-05-18 18:55:53 +0000478 self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
479 self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
480 self.assertEquals('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
Guido van Rossum540d9872007-08-17 03:51:09 +0000493 self.assertEquals('::', f(b'\x00' * 16))
494 self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000495 self.assertEquals(
496 '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())
Benjamin Peterson577473f2010-01-19 00:09:57 +0000526 self.assertIn(name[0], ("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)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000578 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
579 s = socket.socket()
580 self.assertRaises(ValueError, s.ioctl, -1, None)
581 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000582
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000583 def testGetaddrinfo(self):
584 try:
585 socket.getaddrinfo('localhost', 80)
586 except socket.gaierror as err:
587 if err.errno == socket.EAI_SERVICE:
588 # see http://bugs.python.org/issue1282647
589 self.skipTest("buggy libc version")
590 raise
591 # len of every sequence is supposed to be == 5
592 for info in socket.getaddrinfo(HOST, None):
593 self.assertEqual(len(info), 5)
594 # host can be a domain name, a string representation of an
595 # IPv4/v6 address or None
596 socket.getaddrinfo('localhost', 80)
597 socket.getaddrinfo('127.0.0.1', 80)
598 socket.getaddrinfo(None, 80)
599 if SUPPORTS_IPV6:
600 socket.getaddrinfo('::1', 80)
601 # port can be a string service name such as "http", a numeric
602 # port number or None
603 socket.getaddrinfo(HOST, "http")
604 socket.getaddrinfo(HOST, 80)
605 socket.getaddrinfo(HOST, None)
606 # test family and socktype filters
607 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
608 for family, _, _, _, _ in infos:
609 self.assertEqual(family, socket.AF_INET)
610 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
611 for _, socktype, _, _, _ in infos:
612 self.assertEqual(socktype, socket.SOCK_STREAM)
613 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000614 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000615 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
616 # a server willing to support both IPv4 and IPv6 will
617 # usually do this
618 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
619 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000620 # test keyword arguments
621 a = socket.getaddrinfo(HOST, None)
622 b = socket.getaddrinfo(host=HOST, port=None)
623 self.assertEqual(a, b)
624 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
625 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
626 self.assertEqual(a, b)
627 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
628 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
629 self.assertEqual(a, b)
630 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
631 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
632 self.assertEqual(a, b)
633 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
634 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
635 self.assertEqual(a, b)
636 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
637 socket.AI_PASSIVE)
638 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
639 type=socket.SOCK_STREAM, proto=0,
640 flags=socket.AI_PASSIVE)
641 self.assertEqual(a, b)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000642
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000643 def test_getnameinfo(self):
644 # only IP addresses are allowed
645 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
646
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000647 @unittest.skipUnless(support.is_resource_enabled('network'),
648 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000649 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000650 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000651 # these should all be successful
652 socket.gethostbyname('испытание.python.org')
653 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000654 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
655 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
656 # have a reverse entry yet
657 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000658
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000659 def check_sendall_interrupted(self, with_timeout):
660 # socketpair() is not stricly required, but it makes things easier.
661 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
662 self.skipTest("signal.alarm and socket.socketpair required for this test")
663 # Our signal handlers clobber the C errno by calling a math function
664 # with an invalid domain value.
665 def ok_handler(*args):
666 self.assertRaises(ValueError, math.acosh, 0)
667 def raising_handler(*args):
668 self.assertRaises(ValueError, math.acosh, 0)
669 1 // 0
670 c, s = socket.socketpair()
671 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
672 try:
673 if with_timeout:
674 # Just above the one second minimum for signal.alarm
675 c.settimeout(1.5)
676 with self.assertRaises(ZeroDivisionError):
677 signal.alarm(1)
678 c.sendall(b"x" * (1024**2))
679 if with_timeout:
680 signal.signal(signal.SIGALRM, ok_handler)
681 signal.alarm(1)
682 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
683 finally:
684 signal.signal(signal.SIGALRM, old_alarm)
685 c.close()
686 s.close()
687
688 def test_sendall_interrupted(self):
689 self.check_sendall_interrupted(False)
690
691 def test_sendall_interrupted_with_timeout(self):
692 self.check_sendall_interrupted(True)
693
694
Victor Stinner45df8202010-04-28 22:31:17 +0000695@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696class BasicTCPTest(SocketConnectedTest):
697
698 def __init__(self, methodName='runTest'):
699 SocketConnectedTest.__init__(self, methodName=methodName)
700
701 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000702 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000703 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000704 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000705
706 def _testRecv(self):
707 self.serv_conn.send(MSG)
708
709 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000710 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000711 seg1 = self.cli_conn.recv(len(MSG) - 3)
712 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000713 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000714 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000715
716 def _testOverFlowRecv(self):
717 self.serv_conn.send(MSG)
718
719 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000720 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000721 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000722 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000723
724 def _testRecvFrom(self):
725 self.serv_conn.send(MSG)
726
727 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000728 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000729 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
730 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000731 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000732 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000733
734 def _testOverFlowRecvFrom(self):
735 self.serv_conn.send(MSG)
736
737 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000738 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000739 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000740 while 1:
741 read = self.cli_conn.recv(1024)
742 if not read:
743 break
Guido van Rossume531e292002-08-08 20:28:34 +0000744 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000745 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000746
747 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000748 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000749 self.serv_conn.sendall(big_chunk)
750
751 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000752 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000753 fd = self.cli_conn.fileno()
754 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000755 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000756 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000757 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000758
759 def _testFromFd(self):
760 self.serv_conn.send(MSG)
761
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000762 def testDup(self):
763 # Testing dup()
764 sock = self.cli_conn.dup()
765 msg = sock.recv(1024)
766 self.assertEqual(msg, MSG)
767
768 def _testDup(self):
769 self.serv_conn.send(MSG)
770
Guido van Rossum24e4af82002-06-12 19:18:08 +0000771 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000772 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000774 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000775 # wait for _testShutdown to finish: on OS X, when the server
776 # closes the connection the client also becomes disconnected,
777 # and the client's shutdown call will fail. (Issue #4397.)
778 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779
780 def _testShutdown(self):
781 self.serv_conn.send(MSG)
782 self.serv_conn.shutdown(2)
783
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000784 def testDetach(self):
785 # Testing detach()
786 fileno = self.cli_conn.fileno()
787 f = self.cli_conn.detach()
788 self.assertEqual(f, fileno)
789 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000790 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
791 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000792 # ...but we can create another socket using the (still open)
793 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000794 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
795 msg = sock.recv(1024)
796 self.assertEqual(msg, MSG)
797
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000798 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000799 self.serv_conn.send(MSG)
800
Victor Stinner45df8202010-04-28 22:31:17 +0000801@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000802class BasicUDPTest(ThreadedUDPSocketTest):
803
804 def __init__(self, methodName='runTest'):
805 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
806
807 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000808 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000809 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000810 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811
812 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000813 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000814
Guido van Rossum1c938012002-06-12 21:17:20 +0000815 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000816 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000817 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000818 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000819
Guido van Rossum1c938012002-06-12 21:17:20 +0000820 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000821 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
Guido van Rossumd8faa362007-04-27 19:54:29 +0000823 def testRecvFromNegative(self):
824 # Negative lengths passed to recvfrom should give ValueError.
825 self.assertRaises(ValueError, self.serv.recvfrom, -1)
826
827 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000828 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000829
Victor Stinner45df8202010-04-28 22:31:17 +0000830@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000831class TCPCloserTest(ThreadedTCPSocketTest):
832
833 def testClose(self):
834 conn, addr = self.serv.accept()
835 conn.close()
836
837 sd = self.cli
838 read, write, err = select.select([sd], [], [], 1.0)
839 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000840 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000841
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000842 # Calling close() many times should be safe.
843 conn.close()
844 conn.close()
845
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000846 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000847 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000848 time.sleep(1.0)
849
Victor Stinner45df8202010-04-28 22:31:17 +0000850@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000851class BasicSocketPairTest(SocketPairTest):
852
853 def __init__(self, methodName='runTest'):
854 SocketPairTest.__init__(self, methodName=methodName)
855
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000856 def _check_defaults(self, sock):
857 self.assertIsInstance(sock, socket.socket)
858 if hasattr(socket, 'AF_UNIX'):
859 self.assertEqual(sock.family, socket.AF_UNIX)
860 else:
861 self.assertEqual(sock.family, socket.AF_INET)
862 self.assertEqual(sock.type, socket.SOCK_STREAM)
863 self.assertEqual(sock.proto, 0)
864
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000865 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000866 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000867
868 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000869 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000870
Dave Cole331708b2004-08-09 04:51:41 +0000871 def testRecv(self):
872 msg = self.serv.recv(1024)
873 self.assertEqual(msg, MSG)
874
875 def _testRecv(self):
876 self.cli.send(MSG)
877
878 def testSend(self):
879 self.serv.send(MSG)
880
881 def _testSend(self):
882 msg = self.cli.recv(1024)
883 self.assertEqual(msg, MSG)
884
Victor Stinner45df8202010-04-28 22:31:17 +0000885@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000886class NonBlockingTCPTests(ThreadedTCPSocketTest):
887
888 def __init__(self, methodName='runTest'):
889 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
890
891 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000892 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +0000893 self.serv.setblocking(0)
894 start = time.time()
895 try:
896 self.serv.accept()
897 except socket.error:
898 pass
899 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000900 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000901
902 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +0000903 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000904
Guido van Rossum24e4af82002-06-12 19:18:08 +0000905 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000906 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +0000907 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +0000908 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000909 conn, addr = self.serv.accept()
910 except socket.error:
911 pass
912 else:
913 self.fail("Error trying to do non-blocking accept.")
914 read, write, err = select.select([self.serv], [], [])
915 if self.serv in read:
916 conn, addr = self.serv.accept()
917 else:
918 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +0000919
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000921 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +0000922 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000923
924 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000925 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +0000926 conn, addr = self.serv.accept()
927
928 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +0000929 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +0000930 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
932 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000933 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934 conn, addr = self.serv.accept()
935 conn.setblocking(0)
936 try:
937 msg = conn.recv(len(MSG))
938 except socket.error:
939 pass
940 else:
941 self.fail("Error trying to do non-blocking recv.")
942 read, write, err = select.select([conn], [], [])
943 if conn in read:
944 msg = conn.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000945 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000946 else:
947 self.fail("Error during select call to non-blocking socket.")
948
949 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000950 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000951 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000952 self.cli.send(MSG)
953
Victor Stinner45df8202010-04-28 22:31:17 +0000954@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000955class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000956 """Unit tests for the object returned by socket.makefile()
957
958 self.serv_file is the io object returned by makefile() on
959 the client connection. You can read from this file to
960 get output from the server.
961
962 self.cli_file is the io object returned by makefile() on the
963 server connection. You can write to this file to send output
964 to the client.
965 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000966
Guido van Rossume9f66142002-08-07 15:46:19 +0000967 bufsize = -1 # Use default buffer size
968
Guido van Rossum24e4af82002-06-12 19:18:08 +0000969 def __init__(self, methodName='runTest'):
970 SocketConnectedTest.__init__(self, methodName=methodName)
971
972 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000973 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
974 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +0000975 SocketConnectedTest.setUp(self)
Guido van Rossume9f66142002-08-07 15:46:19 +0000976 self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000977
978 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000979 self.serv_finished.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000980 self.serv_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000981 self.assertTrue(self.serv_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000982 self.serv_file = None
983 SocketConnectedTest.tearDown(self)
984
985 def clientSetUp(self):
986 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou98b46702010-09-18 22:59:00 +0000987 self.cli_file = self.serv_conn.makefile('wb', self.bufsize)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000988
989 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +0000990 self.cli_finished.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000991 self.cli_file.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000992 self.assertTrue(self.cli_file.closed)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000993 self.cli_file = None
994 SocketConnectedTest.clientTearDown(self)
995
996 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000997 # Performing small file read test
Guido van Rossum24e4af82002-06-12 19:18:08 +0000998 first_seg = self.serv_file.read(len(MSG)-3)
999 second_seg = self.serv_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001000 msg = first_seg + second_seg
Guido van Rossum76489682002-06-12 20:38:30 +00001001 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001002
1003 def _testSmallRead(self):
1004 self.cli_file.write(MSG)
1005 self.cli_file.flush()
1006
Guido van Rossum8c943832002-08-08 01:00:28 +00001007 def testFullRead(self):
1008 # read until EOF
1009 msg = self.serv_file.read()
1010 self.assertEqual(msg, MSG)
1011
1012 def _testFullRead(self):
1013 self.cli_file.write(MSG)
1014 self.cli_file.close()
1015
Guido van Rossum24e4af82002-06-12 19:18:08 +00001016 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001017 # Performing unbuffered file read test
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001018 buf = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001019 while 1:
1020 char = self.serv_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001021 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001022 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001023 buf += char
1024 self.assertEqual(buf, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001025
1026 def _testUnbufferedRead(self):
1027 self.cli_file.write(MSG)
1028 self.cli_file.flush()
1029
1030 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001031 # Performing file readline test
Guido van Rossum24e4af82002-06-12 19:18:08 +00001032 line = self.serv_file.readline()
Guido van Rossum76489682002-06-12 20:38:30 +00001033 self.assertEqual(line, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034
1035 def _testReadline(self):
1036 self.cli_file.write(MSG)
1037 self.cli_file.flush()
1038
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001039 def testCloseAfterMakefile(self):
1040 # The file returned by makefile should keep the socket open.
1041 self.cli_conn.close()
1042 # read until EOF
1043 msg = self.serv_file.read()
1044 self.assertEqual(msg, MSG)
1045
1046 def _testCloseAfterMakefile(self):
1047 self.cli_file.write(MSG)
1048 self.cli_file.flush()
1049
1050 def testMakefileAfterMakefileClose(self):
1051 self.serv_file.close()
1052 msg = self.cli_conn.recv(len(MSG))
1053 self.assertEqual(msg, MSG)
1054
1055 def _testMakefileAfterMakefileClose(self):
1056 self.cli_file.write(MSG)
1057 self.cli_file.flush()
1058
Tim Peters116d83c2004-03-28 02:20:45 +00001059 def testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001060 self.assertTrue(not self.serv_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001061
1062 def _testClosedAttr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001063 self.assertTrue(not self.cli_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001064
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001065 def testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001066 self.assertEqual(self.serv_file.mode, 'rb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001067 self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
1068
1069 def _testAttributes(self):
Benjamin Peterson44309e62008-11-22 00:41:45 +00001070 self.assertEqual(self.cli_file.mode, 'wb')
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001071 self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
1072
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001073 def testRealClose(self):
1074 self.serv_file.close()
1075 self.assertRaises(ValueError, self.serv_file.fileno)
1076 self.cli_conn.close()
1077 self.assertRaises(socket.error, self.cli_conn.getsockname)
1078
1079 def _testRealClose(self):
1080 pass
1081
1082
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001083class FileObjectInterruptedTestCase(unittest.TestCase):
1084 """Test that the file object correctly handles EINTR internally."""
1085
1086 class MockSocket(object):
1087 def __init__(self, recv_funcs=()):
1088 # A generator that returns callables that we'll call for each
1089 # call to recv().
1090 self._recv_step = iter(recv_funcs)
1091
1092 def recv_into(self, buffer):
1093 data = next(self._recv_step)()
1094 assert len(buffer) >= len(data)
1095 buffer[:len(data)] = data
1096 return len(data)
1097
1098 def _decref_socketios(self):
1099 pass
1100
1101 def _textiowrap_for_test(self, buffering=-1):
1102 raw = socket.SocketIO(self, "r")
1103 if buffering < 0:
1104 buffering = io.DEFAULT_BUFFER_SIZE
1105 if buffering == 0:
1106 return raw
1107 buffer = io.BufferedReader(raw, buffering)
1108 text = io.TextIOWrapper(buffer, None, None)
1109 text.mode = "rb"
1110 return text
1111
1112 @staticmethod
1113 def _raise_eintr():
1114 raise socket.error(errno.EINTR)
1115
1116 def _textiowrap_mock_socket(self, mock, buffering=-1):
1117 raw = socket.SocketIO(mock, "r")
1118 if buffering < 0:
1119 buffering = io.DEFAULT_BUFFER_SIZE
1120 if buffering == 0:
1121 return raw
1122 buffer = io.BufferedReader(raw, buffering)
1123 text = io.TextIOWrapper(buffer, None, None)
1124 text.mode = "rb"
1125 return text
1126
1127 def _test_readline(self, size=-1, buffering=-1):
1128 mock_sock = self.MockSocket(recv_funcs=[
1129 lambda : b"This is the first line\nAnd the sec",
1130 self._raise_eintr,
1131 lambda : b"ond line is here\n",
1132 lambda : b"",
1133 lambda : b"", # XXX(gps): io library does an extra EOF read
1134 ])
1135 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1136 self.assertEquals(fo.readline(size), "This is the first line\n")
1137 self.assertEquals(fo.readline(size), "And the second line is here\n")
1138
1139 def _test_read(self, size=-1, buffering=-1):
1140 mock_sock = self.MockSocket(recv_funcs=[
1141 lambda : b"This is the first line\nAnd the sec",
1142 self._raise_eintr,
1143 lambda : b"ond line is here\n",
1144 lambda : b"",
1145 lambda : b"", # XXX(gps): io library does an extra EOF read
1146 ])
1147 expecting = (b"This is the first line\n"
1148 b"And the second line is here\n")
1149 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1150 if buffering == 0:
1151 data = b''
1152 else:
1153 data = ''
1154 expecting = expecting.decode('utf8')
1155 while len(data) != len(expecting):
1156 part = fo.read(size)
1157 if not part:
1158 break
1159 data += part
1160 self.assertEquals(data, expecting)
1161
1162 def test_default(self):
1163 self._test_readline()
1164 self._test_readline(size=100)
1165 self._test_read()
1166 self._test_read(size=100)
1167
1168 def test_with_1k_buffer(self):
1169 self._test_readline(buffering=1024)
1170 self._test_readline(size=100, buffering=1024)
1171 self._test_read(buffering=1024)
1172 self._test_read(size=100, buffering=1024)
1173
1174 def _test_readline_no_buffer(self, size=-1):
1175 mock_sock = self.MockSocket(recv_funcs=[
1176 lambda : b"a",
1177 lambda : b"\n",
1178 lambda : b"B",
1179 self._raise_eintr,
1180 lambda : b"b",
1181 lambda : b"",
1182 ])
1183 fo = mock_sock._textiowrap_for_test(buffering=0)
1184 self.assertEquals(fo.readline(size), b"a\n")
1185 self.assertEquals(fo.readline(size), b"Bb")
1186
1187 def test_no_buffer(self):
1188 self._test_readline_no_buffer()
1189 self._test_readline_no_buffer(size=4)
1190 self._test_read(buffering=0)
1191 self._test_read(size=100, buffering=0)
1192
1193
Guido van Rossume9f66142002-08-07 15:46:19 +00001194class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1195
1196 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001197
Guido van Rossume9f66142002-08-07 15:46:19 +00001198 In this case (and in this case only), it should be possible to
1199 create a file object, read a line from it, create another file
1200 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001201 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001202 when reading multiple requests from the same socket."""
1203
1204 bufsize = 0 # Use unbuffered mode
1205
1206 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001207 # Read a line, create a new file object, read another line with it
Guido van Rossume9f66142002-08-07 15:46:19 +00001208 line = self.serv_file.readline() # first line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001209 self.assertEqual(line, b"A. " + MSG) # first line
Guido van Rossume9f66142002-08-07 15:46:19 +00001210 self.serv_file = self.cli_conn.makefile('rb', 0)
1211 line = self.serv_file.readline() # second line
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001212 self.assertEqual(line, b"B. " + MSG) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001213
1214 def _testUnbufferedReadline(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001215 self.cli_file.write(b"A. " + MSG)
1216 self.cli_file.write(b"B. " + MSG)
Guido van Rossume9f66142002-08-07 15:46:19 +00001217 self.cli_file.flush()
1218
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001219 def testMakefileClose(self):
1220 # The file returned by makefile should keep the socket open...
1221 self.cli_conn.close()
1222 msg = self.cli_conn.recv(1024)
1223 self.assertEqual(msg, MSG)
1224 # ...until the file is itself closed
1225 self.serv_file.close()
1226 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1227
1228 def _testMakefileClose(self):
1229 self.cli_file.write(MSG)
1230 self.cli_file.flush()
1231
1232 def testMakefileCloseSocketDestroy(self):
1233 refcount_before = sys.getrefcount(self.cli_conn)
1234 self.serv_file.close()
1235 refcount_after = sys.getrefcount(self.cli_conn)
1236 self.assertEqual(refcount_before - 1, refcount_after)
1237
1238 def _testMakefileCloseSocketDestroy(self):
1239 pass
1240
Antoine Pitrou98b46702010-09-18 22:59:00 +00001241 # Non-blocking ops
1242 # NOTE: to set `serv_file` as non-blocking, we must call
1243 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1244
1245 def testSmallReadNonBlocking(self):
1246 self.cli_conn.setblocking(False)
1247 self.assertEqual(self.serv_file.readinto(bytearray(10)), None)
1248 self.assertEqual(self.serv_file.read(len(MSG) - 3), None)
1249 self.evt1.set()
1250 self.evt2.wait(1.0)
1251 first_seg = self.serv_file.read(len(MSG) - 3)
1252 buf = bytearray(10)
1253 n = self.serv_file.readinto(buf)
1254 self.assertEqual(n, 3)
1255 msg = first_seg + buf[:n]
1256 self.assertEqual(msg, MSG)
1257 self.assertEqual(self.serv_file.readinto(bytearray(16)), None)
1258 self.assertEqual(self.serv_file.read(1), None)
1259
1260 def _testSmallReadNonBlocking(self):
1261 self.evt1.wait(1.0)
1262 self.cli_file.write(MSG)
1263 self.cli_file.flush()
1264 self.evt2.set()
1265 # Avoid cloding the socket before the server test has finished,
1266 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1267 self.serv_finished.wait(5.0)
1268
1269 def testWriteNonBlocking(self):
1270 self.cli_finished.wait(5.0)
1271 # The client thread can't skip directly - the SkipTest exception
1272 # would appear as a failure.
1273 if self.serv_skipped:
1274 self.skipTest(self.serv_skipped)
1275
1276 def _testWriteNonBlocking(self):
1277 self.serv_skipped = None
1278 self.serv_conn.setblocking(False)
1279 # Try to saturate the socket buffer pipe with repeated large writes.
1280 BIG = b"x" * (1024 ** 2)
1281 LIMIT = 10
1282 # The first write() succeeds since a chunk of data can be buffered
1283 n = self.cli_file.write(BIG)
1284 self.assertGreater(n, 0)
1285 for i in range(LIMIT):
1286 n = self.cli_file.write(BIG)
1287 if n is None:
1288 # Succeeded
1289 break
1290 self.assertGreater(n, 0)
1291 else:
1292 # Let us know that this test didn't manage to establish
1293 # the expected conditions. This is not a failure in itself but,
1294 # if it happens repeatedly, the test should be fixed.
1295 self.serv_skipped = "failed to saturate the socket buffer"
1296
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001297
Guido van Rossum8c943832002-08-08 01:00:28 +00001298class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1299
1300 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1301
1302
1303class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1304
1305 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001306
Thomas Woutersb2137042007-02-01 18:02:27 +00001307
Guido van Rossumd8faa362007-04-27 19:54:29 +00001308class NetworkConnectionTest(object):
1309 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001310
Guido van Rossumd8faa362007-04-27 19:54:29 +00001311 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001312 # We're inherited below by BasicTCPTest2, which also inherits
1313 # BasicTCPTest, which defines self.port referenced below.
1314 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001315 self.serv_conn = self.cli
1316
1317class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1318 """Tests that NetworkConnection does not break existing TCP functionality.
1319 """
1320
1321class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001322
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001323 class MockSocket(socket.socket):
1324 def connect(self, *args):
1325 raise socket.timeout('timed out')
1326
1327 @contextlib.contextmanager
1328 def mocked_socket_module(self):
1329 """Return a socket which times out on connect"""
1330 old_socket = socket.socket
1331 socket.socket = self.MockSocket
1332 try:
1333 yield
1334 finally:
1335 socket.socket = old_socket
1336
1337 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001338 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001339 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1340 with self.assertRaises(socket.error) as cm:
1341 cli.connect((HOST, port))
1342 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1343
1344 def test_create_connection(self):
1345 # Issue #9792: errors raised by create_connection() should have
1346 # a proper errno attribute.
1347 port = support.find_unused_port()
1348 with self.assertRaises(socket.error) as cm:
1349 socket.create_connection((HOST, port))
1350 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1351
1352 def test_create_connection_timeout(self):
1353 # Issue #9792: create_connection() should not recast timeout errors
1354 # as generic socket errors.
1355 with self.mocked_socket_module():
1356 with self.assertRaises(socket.timeout):
1357 socket.create_connection((HOST, 1234))
1358
Guido van Rossumd8faa362007-04-27 19:54:29 +00001359
Victor Stinner45df8202010-04-28 22:31:17 +00001360@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001361class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1362
1363 def __init__(self, methodName='runTest'):
1364 SocketTCPTest.__init__(self, methodName=methodName)
1365 ThreadableTest.__init__(self)
1366
1367 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001368 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001369
1370 def clientTearDown(self):
1371 self.cli.close()
1372 self.cli = None
1373 ThreadableTest.clientTearDown(self)
1374
1375 def _justAccept(self):
1376 conn, addr = self.serv.accept()
1377
1378 testFamily = _justAccept
1379 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001380 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001381 self.assertEqual(self.cli.family, 2)
1382
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001383 testSourceAddress = _justAccept
1384 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001385 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1386 source_address=('', self.source_port))
1387 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001388 # The port number being used is sufficient to show that the bind()
1389 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001390
Guido van Rossumd8faa362007-04-27 19:54:29 +00001391 testTimeoutDefault = _justAccept
1392 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001393 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001394 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001395 socket.setdefaulttimeout(42)
1396 try:
1397 self.cli = socket.create_connection((HOST, self.port))
1398 finally:
1399 socket.setdefaulttimeout(None)
1400 self.assertEquals(self.cli.gettimeout(), 42)
1401
1402 testTimeoutNone = _justAccept
1403 def _testTimeoutNone(self):
1404 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001405 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001406 socket.setdefaulttimeout(30)
1407 try:
1408 self.cli = socket.create_connection((HOST, self.port), timeout=None)
1409 finally:
1410 socket.setdefaulttimeout(None)
1411 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001412
1413 testTimeoutValueNamed = _justAccept
1414 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001415 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001416 self.assertEqual(self.cli.gettimeout(), 30)
1417
1418 testTimeoutValueNonamed = _justAccept
1419 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001420 self.cli = socket.create_connection((HOST, self.port), 30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001421 self.assertEqual(self.cli.gettimeout(), 30)
1422
Victor Stinner45df8202010-04-28 22:31:17 +00001423@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001424class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1425
1426 def __init__(self, methodName='runTest'):
1427 SocketTCPTest.__init__(self, methodName=methodName)
1428 ThreadableTest.__init__(self)
1429
1430 def clientSetUp(self):
1431 pass
1432
1433 def clientTearDown(self):
1434 self.cli.close()
1435 self.cli = None
1436 ThreadableTest.clientTearDown(self)
1437
1438 def testInsideTimeout(self):
1439 conn, addr = self.serv.accept()
1440 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001441 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001442 testOutsideTimeout = testInsideTimeout
1443
1444 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001445 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001446 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001447 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001448
1449 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001450 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001451 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001452
1453
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001454class TCPTimeoutTest(SocketTCPTest):
1455
1456 def testTCPTimeout(self):
1457 def raise_timeout(*args, **kwargs):
1458 self.serv.settimeout(1.0)
1459 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001460 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001461 "Error generating a timeout exception (TCP)")
1462
1463 def testTimeoutZero(self):
1464 ok = False
1465 try:
1466 self.serv.settimeout(0.0)
1467 foo = self.serv.accept()
1468 except socket.timeout:
1469 self.fail("caught timeout instead of error (TCP)")
1470 except socket.error:
1471 ok = True
1472 except:
1473 self.fail("caught unexpected exception (TCP)")
1474 if not ok:
1475 self.fail("accept() returned success when we did not expect it")
1476
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001477 def testInterruptedTimeout(self):
1478 # XXX I don't know how to do this test on MSWindows or any other
1479 # plaform that doesn't support signal.alarm() or os.kill(), though
1480 # the bug should have existed on all platforms.
1481 if not hasattr(signal, "alarm"):
1482 return # can only test on *nix
1483 self.serv.settimeout(5.0) # must be longer than alarm
1484 class Alarm(Exception):
1485 pass
1486 def alarm_handler(signal, frame):
1487 raise Alarm
1488 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1489 try:
1490 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1491 try:
1492 foo = self.serv.accept()
1493 except socket.timeout:
1494 self.fail("caught timeout instead of Alarm")
1495 except Alarm:
1496 pass
1497 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001498 self.fail("caught other exception instead of Alarm:"
1499 " %s(%s):\n%s" %
1500 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001501 else:
1502 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001503 finally:
1504 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001505 except Alarm:
1506 self.fail("got Alarm in wrong place")
1507 finally:
1508 # no alarm can be pending. Safe to restore old handler.
1509 signal.signal(signal.SIGALRM, old_alarm)
1510
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001511class UDPTimeoutTest(SocketTCPTest):
1512
1513 def testUDPTimeout(self):
1514 def raise_timeout(*args, **kwargs):
1515 self.serv.settimeout(1.0)
1516 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001517 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001518 "Error generating a timeout exception (UDP)")
1519
1520 def testTimeoutZero(self):
1521 ok = False
1522 try:
1523 self.serv.settimeout(0.0)
1524 foo = self.serv.recv(1024)
1525 except socket.timeout:
1526 self.fail("caught timeout instead of error (UDP)")
1527 except socket.error:
1528 ok = True
1529 except:
1530 self.fail("caught unexpected exception (UDP)")
1531 if not ok:
1532 self.fail("recv() returned success when we did not expect it")
1533
1534class TestExceptions(unittest.TestCase):
1535
1536 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001537 self.assertTrue(issubclass(socket.error, Exception))
1538 self.assertTrue(issubclass(socket.herror, socket.error))
1539 self.assertTrue(issubclass(socket.gaierror, socket.error))
1540 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001541
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542class TestLinuxAbstractNamespace(unittest.TestCase):
1543
1544 UNIX_PATH_MAX = 108
1545
1546 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001547 address = b"\x00python-test-hello\x00\xff"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001548 s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1549 s1.bind(address)
1550 s1.listen(1)
1551 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1552 s2.connect(s1.getsockname())
1553 s1.accept()
1554 self.assertEqual(s1.getsockname(), address)
1555 self.assertEqual(s2.getpeername(), address)
1556
1557 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001558 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001559 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1560 s.bind(address)
1561 self.assertEqual(s.getsockname(), address)
1562
1563 def testNameOverflow(self):
1564 address = "\x00" + "h" * self.UNIX_PATH_MAX
1565 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1566 self.assertRaises(socket.error, s.bind, address)
1567
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001568
Victor Stinner45df8202010-04-28 22:31:17 +00001569@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001570class BufferIOTest(SocketConnectedTest):
1571 """
1572 Test the buffer versions of socket.recv() and socket.send().
1573 """
1574 def __init__(self, methodName='runTest'):
1575 SocketConnectedTest.__init__(self, methodName=methodName)
1576
Antoine Pitrou25480782010-03-17 22:50:28 +00001577 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001578 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001579 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001580 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001581 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001582 self.assertEqual(msg, MSG)
1583
Antoine Pitrou25480782010-03-17 22:50:28 +00001584 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001585 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001586 self.serv_conn.send(buf)
1587
Antoine Pitrou25480782010-03-17 22:50:28 +00001588 def testRecvIntoBytearray(self):
1589 buf = bytearray(1024)
1590 nbytes = self.cli_conn.recv_into(buf)
1591 self.assertEqual(nbytes, len(MSG))
1592 msg = buf[:len(MSG)]
1593 self.assertEqual(msg, MSG)
1594
1595 _testRecvIntoBytearray = _testRecvIntoArray
1596
1597 def testRecvIntoMemoryview(self):
1598 buf = bytearray(1024)
1599 nbytes = self.cli_conn.recv_into(memoryview(buf))
1600 self.assertEqual(nbytes, len(MSG))
1601 msg = buf[:len(MSG)]
1602 self.assertEqual(msg, MSG)
1603
1604 _testRecvIntoMemoryview = _testRecvIntoArray
1605
1606 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001607 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001608 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001609 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001610 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611 self.assertEqual(msg, MSG)
1612
Antoine Pitrou25480782010-03-17 22:50:28 +00001613 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001614 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001615 self.serv_conn.send(buf)
1616
Antoine Pitrou25480782010-03-17 22:50:28 +00001617 def testRecvFromIntoBytearray(self):
1618 buf = bytearray(1024)
1619 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1620 self.assertEqual(nbytes, len(MSG))
1621 msg = buf[:len(MSG)]
1622 self.assertEqual(msg, MSG)
1623
1624 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1625
1626 def testRecvFromIntoMemoryview(self):
1627 buf = bytearray(1024)
1628 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1629 self.assertEqual(nbytes, len(MSG))
1630 msg = buf[:len(MSG)]
1631 self.assertEqual(msg, MSG)
1632
1633 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1634
Christian Heimes043d6f62008-01-07 17:19:16 +00001635
1636TIPC_STYPE = 2000
1637TIPC_LOWER = 200
1638TIPC_UPPER = 210
1639
1640def isTipcAvailable():
1641 """Check if the TIPC module is loaded
1642
1643 The TIPC module is not loaded automatically on Ubuntu and probably
1644 other Linux distros.
1645 """
1646 if not hasattr(socket, "AF_TIPC"):
1647 return False
1648 if not os.path.isfile("/proc/modules"):
1649 return False
1650 with open("/proc/modules") as f:
1651 for line in f:
1652 if line.startswith("tipc "):
1653 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001654 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001655 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1656 return False
1657
1658class TIPCTest (unittest.TestCase):
1659 def testRDM(self):
1660 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1661 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1662
1663 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1664 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1665 TIPC_LOWER, TIPC_UPPER)
1666 srv.bind(srvaddr)
1667
1668 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1669 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1670 cli.sendto(MSG, sendaddr)
1671
1672 msg, recvaddr = srv.recvfrom(1024)
1673
1674 self.assertEqual(cli.getsockname(), recvaddr)
1675 self.assertEqual(msg, MSG)
1676
1677
1678class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1679 def __init__(self, methodName = 'runTest'):
1680 unittest.TestCase.__init__(self, methodName = methodName)
1681 ThreadableTest.__init__(self)
1682
1683 def setUp(self):
1684 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1685 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1686 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1687 TIPC_LOWER, TIPC_UPPER)
1688 self.srv.bind(srvaddr)
1689 self.srv.listen(5)
1690 self.serverExplicitReady()
1691 self.conn, self.connaddr = self.srv.accept()
1692
1693 def clientSetUp(self):
1694 # The is a hittable race between serverExplicitReady() and the
1695 # accept() call; sleep a little while to avoid it, otherwise
1696 # we could get an exception
1697 time.sleep(0.1)
1698 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1699 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1700 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1701 self.cli.connect(addr)
1702 self.cliaddr = self.cli.getsockname()
1703
1704 def testStream(self):
1705 msg = self.conn.recv(1024)
1706 self.assertEqual(msg, MSG)
1707 self.assertEqual(self.cliaddr, self.connaddr)
1708
1709 def _testStream(self):
1710 self.cli.send(MSG)
1711 self.cli.close()
1712
1713
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001714@unittest.skipUnless(thread, 'Threading required for this test.')
1715class ContextManagersTest(ThreadedTCPSocketTest):
1716
1717 def _testSocketClass(self):
1718 # base test
1719 with socket.socket() as sock:
1720 self.assertFalse(sock._closed)
1721 self.assertTrue(sock._closed)
1722 # close inside with block
1723 with socket.socket() as sock:
1724 sock.close()
1725 self.assertTrue(sock._closed)
1726 # exception inside with block
1727 with socket.socket() as sock:
1728 self.assertRaises(socket.error, sock.sendall, b'foo')
1729 self.assertTrue(sock._closed)
1730
1731 def testCreateConnectionBase(self):
1732 conn, addr = self.serv.accept()
1733 data = conn.recv(1024)
1734 conn.sendall(data)
1735
1736 def _testCreateConnectionBase(self):
1737 address = self.serv.getsockname()
1738 with socket.create_connection(address) as sock:
1739 self.assertFalse(sock._closed)
1740 sock.sendall(b'foo')
1741 self.assertEqual(sock.recv(1024), b'foo')
1742 self.assertTrue(sock._closed)
1743
1744 def testCreateConnectionClose(self):
1745 conn, addr = self.serv.accept()
1746 data = conn.recv(1024)
1747 conn.sendall(data)
1748
1749 def _testCreateConnectionClose(self):
1750 address = self.serv.getsockname()
1751 with socket.create_connection(address) as sock:
1752 sock.close()
1753 self.assertTrue(sock._closed)
1754 self.assertRaises(socket.error, sock.sendall, b'foo')
1755
1756
Guido van Rossumb995eb72002-07-31 16:08:40 +00001757def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001758 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00001759 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00001760
1761 tests.extend([
1762 NonBlockingTCPTests,
1763 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001764 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001765 UnbufferedFileObjectClassTestCase,
1766 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00001767 SmallBufferedFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001768 NetworkConnectionNoServer,
1769 NetworkConnectionAttributesTest,
1770 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001771 ContextManagersTest,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001772 ])
Dave Cole331708b2004-08-09 04:51:41 +00001773 if hasattr(socket, "socketpair"):
1774 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001775 if sys.platform == 'linux2':
1776 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00001777 if isTipcAvailable():
1778 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00001779 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001780
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001781 thread_info = support.threading_setup()
1782 support.run_unittest(*tests)
1783 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001784
1785if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00001786 test_main()