blob: 4e5085ebdc57e0726477b6fbfd6d6d31524b13c5 [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 Pitrouacd0fda2010-10-23 17:01:44 +000016import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000017import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000018from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000020import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010021import pickle
Antoine Pitroub1c54962010-10-14 15:05:38 +000022try:
23 import fcntl
24except ImportError:
25 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000026
Benjamin Petersonee8712c2008-05-20 21:35:26 +000027HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000028MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Victor Stinner45df8202010-04-28 22:31:17 +000030try:
31 import _thread as thread
32 import threading
33except ImportError:
34 thread = None
35 threading = None
36
Guido van Rossum24e4af82002-06-12 19:18:08 +000037class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000038
Guido van Rossum24e4af82002-06-12 19:18:08 +000039 def setUp(self):
40 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000041 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000042 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000043
Guido van Rossum24e4af82002-06-12 19:18:08 +000044 def tearDown(self):
45 self.serv.close()
46 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000047
Guido van Rossum24e4af82002-06-12 19:18:08 +000048class SocketUDPTest(unittest.TestCase):
49
50 def setUp(self):
51 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000052 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000053
54 def tearDown(self):
55 self.serv.close()
56 self.serv = None
57
58class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000059 """Threadable Test class
60
61 The ThreadableTest class makes it easy to create a threaded
62 client/server pair from an existing unit test. To create a
63 new threaded class from an existing unit test, use multiple
64 inheritance:
65
66 class NewClass (OldClass, ThreadableTest):
67 pass
68
69 This class defines two new fixture functions with obvious
70 purposes for overriding:
71
72 clientSetUp ()
73 clientTearDown ()
74
75 Any new test functions within the class must then define
76 tests in pairs, where the test name is preceeded with a
77 '_' to indicate the client portion of the test. Ex:
78
79 def testFoo(self):
80 # Server portion
81
82 def _testFoo(self):
83 # Client portion
84
85 Any exceptions raised by the clients during their tests
86 are caught and transferred to the main thread to alert
87 the testing framework.
88
89 Note, the server setup function cannot call any blocking
90 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +000091 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +000092 the blocking call (such as in setting up a client/server
93 connection and performing the accept() in setUp().
94 """
Guido van Rossum24e4af82002-06-12 19:18:08 +000095
96 def __init__(self):
97 # Swap the true setup function
98 self.__setUp = self.setUp
99 self.__tearDown = self.tearDown
100 self.setUp = self._setUp
101 self.tearDown = self._tearDown
102
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000103 def serverExplicitReady(self):
104 """This method allows the server to explicitly indicate that
105 it wants the client thread to proceed. This is useful if the
106 server is about to execute a blocking routine that is
107 dependent upon the client thread during its setup routine."""
108 self.server_ready.set()
109
Guido van Rossum24e4af82002-06-12 19:18:08 +0000110 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000111 self.server_ready = threading.Event()
112 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000113 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000114 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000115
116 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000117 methodname = self.id()
118 i = methodname.rfind('.')
119 methodname = methodname[i+1:]
120 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000121 self.client_thread = thread.start_new_thread(
122 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000123
124 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000125 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000126 self.server_ready.set()
127 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000128
129 def _tearDown(self):
130 self.__tearDown()
131 self.done.wait()
132
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000133 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000134 exc = self.queue.get()
135 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000136
137 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000138 self.server_ready.wait()
139 self.client_ready.set()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000140 self.clientSetUp()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000141 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000142 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000143 try:
144 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000145 except BaseException as e:
146 self.queue.put(e)
147 finally:
148 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000149
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 Curtin3beb38f2010-11-04 03:41:43 +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)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000247 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000248 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000249
Raymond Hettinger027bb632004-05-31 03:09:25 +0000250 def test_weakref(self):
251 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
252 p = proxy(s)
253 self.assertEqual(p.fileno(), s.fileno())
254 s.close()
255 s = None
256 try:
257 p.fileno()
258 except ReferenceError:
259 pass
260 else:
261 self.fail('Socket proxy still exists')
262
Guido van Rossum24e4af82002-06-12 19:18:08 +0000263 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000264 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300265 msg = "Error raising socket exception (%s)."
266 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000267 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300268 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000269 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300270 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000271 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000272
Ezio Melotti63e42302011-05-07 19:47:48 +0300273 def testSendtoErrors(self):
274 # Testing that sendto doens't masks failures. See #10169.
275 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
276 self.addCleanup(s.close)
277 s.bind(('', 0))
278 sockname = s.getsockname()
279 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300280 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300281 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300282 self.assertEqual(str(cm.exception),
283 "'str' does not support the buffer interface")
284 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300285 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300286 self.assertEqual(str(cm.exception),
287 "'complex' does not support the buffer interface")
288 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300289 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300290 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300291 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300292 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300293 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300294 self.assertEqual(str(cm.exception),
295 "'str' does not support the buffer interface")
296 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300297 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300298 self.assertEqual(str(cm.exception),
299 "'complex' does not support the buffer interface")
300 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300301 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300302 self.assertIn('not NoneType', str(cm.exception))
303 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300304 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300305 self.assertIn('an integer is required', str(cm.exception))
306 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300307 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300308 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300309 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300310 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300311 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300312 self.assertIn('(1 given)', str(cm.exception))
313 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300314 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300315 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300316
Guido van Rossum24e4af82002-06-12 19:18:08 +0000317 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000318 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000319 socket.AF_INET
320 socket.SOCK_STREAM
321 socket.SOCK_DGRAM
322 socket.SOCK_RAW
323 socket.SOCK_RDM
324 socket.SOCK_SEQPACKET
325 socket.SOL_SOCKET
326 socket.SO_REUSEADDR
327
Guido van Rossum654c11e2002-06-13 20:24:17 +0000328 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000329 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000330 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000331 try:
332 ip = socket.gethostbyname(hostname)
333 except socket.error:
334 # Probably name lookup wasn't set up right; skip this test
335 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000336 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000337 try:
338 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
339 except socket.error:
340 # Probably a similar problem as above; skip this test
341 return
Brett Cannon01668a12005-03-11 00:04:17 +0000342 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000343 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000344 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000345 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000346
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000347 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
348 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
349 def test_sethostname(self):
350 oldhn = socket.gethostname()
351 try:
352 socket.sethostname('new')
353 except socket.error as e:
354 if e.errno == errno.EPERM:
355 self.skipTest("test should be run as root")
356 else:
357 raise
358 try:
359 # running test as root!
360 self.assertEqual(socket.gethostname(), 'new')
361 # Should work with bytes objects too
362 socket.sethostname(b'bar')
363 self.assertEqual(socket.gethostname(), 'bar')
364 finally:
365 socket.sethostname(oldhn)
366
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700367 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
368 'socket.if_nameindex() not available.')
369 def testInterfaceNameIndex(self):
370 interfaces = socket.if_nameindex()
371 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200372 self.assertIsInstance(index, int)
373 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700374 # interface indices are non-zero integers
375 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200376 _index = socket.if_nametoindex(name)
377 self.assertIsInstance(_index, int)
378 self.assertEqual(index, _index)
379 _name = socket.if_indextoname(index)
380 self.assertIsInstance(_name, str)
381 self.assertEqual(name, _name)
382
383 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
384 'socket.if_nameindex() not available.')
385 def testInvalidInterfaceNameIndex(self):
386 # test nonexistent interface index/name
387 self.assertRaises(socket.error, socket.if_indextoname, 0)
388 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
389 # test with invalid values
390 self.assertRaises(TypeError, socket.if_nametoindex, 0)
391 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700392
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000393 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000394 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000395 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000396 try:
397 # On some versions, this loses a reference
398 orig = sys.getrefcount(__name__)
399 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000400 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000401 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000402 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000403
Guido van Rossum24e4af82002-06-12 19:18:08 +0000404 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000405 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000406 try:
407 # On some versions, this crashes the interpreter.
408 socket.getnameinfo(('x', 0, 0, 0), 0)
409 except socket.error:
410 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000411
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000412 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000413 # This just checks that htons etc. are their own inverse,
414 # when looking at the lower 16 or 32 bits.
415 sizes = {socket.htonl: 32, socket.ntohl: 32,
416 socket.htons: 16, socket.ntohs: 16}
417 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000418 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000419 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
420 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000421
Guido van Rossuma2627af2002-09-14 00:58:46 +0000422 swapped = func(mask)
423 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000424 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000425
Guido van Rossum018919a2007-01-15 00:07:32 +0000426 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000427 good_values = [ 1, 2, 3, 1, 2, 3 ]
428 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000429 for k in good_values:
430 socket.ntohl(k)
431 socket.ntohs(k)
432 socket.htonl(k)
433 socket.htons(k)
434 for k in bad_values:
435 self.assertRaises(OverflowError, socket.ntohl, k)
436 self.assertRaises(OverflowError, socket.ntohs, k)
437 self.assertRaises(OverflowError, socket.htonl, k)
438 self.assertRaises(OverflowError, socket.htons, k)
439
Barry Warsaw11b91a02004-06-28 00:50:43 +0000440 def testGetServBy(self):
441 eq = self.assertEqual
442 # Find one service that exists, then check all the related interfaces.
443 # I've ordered this by protocols that have both a tcp and udp
444 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200445 if (sys.platform.startswith(('freebsd', 'netbsd'))
446 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000447 # avoid the 'echo' service on this platform, as there is an
448 # assumption breaking non-standard port/protocol entry
449 services = ('daytime', 'qotd', 'domain')
450 else:
451 services = ('echo', 'daytime', 'domain')
452 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000453 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000454 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000455 break
456 except socket.error:
457 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000458 else:
459 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000460 # Try same call with optional protocol omitted
461 port2 = socket.getservbyname(service)
462 eq(port, port2)
463 # Try udp, but don't barf it it doesn't exist
464 try:
465 udpport = socket.getservbyname(service, 'udp')
466 except socket.error:
467 udpport = None
468 else:
469 eq(udpport, port)
470 # Now make sure the lookup by port returns the same service name
471 eq(socket.getservbyport(port2), service)
472 eq(socket.getservbyport(port, 'tcp'), service)
473 if udpport is not None:
474 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000475 # Make sure getservbyport does not accept out of range ports.
476 self.assertRaises(OverflowError, socket.getservbyport, -1)
477 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000478
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000479 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000480 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000481 # The default timeout should initially be None
482 self.assertEqual(socket.getdefaulttimeout(), None)
483 s = socket.socket()
484 self.assertEqual(s.gettimeout(), None)
485 s.close()
486
487 # Set the default timeout to 10, and see if it propagates
488 socket.setdefaulttimeout(10)
489 self.assertEqual(socket.getdefaulttimeout(), 10)
490 s = socket.socket()
491 self.assertEqual(s.gettimeout(), 10)
492 s.close()
493
494 # Reset the default timeout to None, and see if it propagates
495 socket.setdefaulttimeout(None)
496 self.assertEqual(socket.getdefaulttimeout(), None)
497 s = socket.socket()
498 self.assertEqual(s.gettimeout(), None)
499 s.close()
500
501 # Check that setting it to an invalid value raises ValueError
502 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
503
504 # Check that setting it to an invalid type raises TypeError
505 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
506
Benjamin Petersonf91df042009-02-13 02:50:59 +0000507 def testIPv4_inet_aton_fourbytes(self):
508 if not hasattr(socket, 'inet_aton'):
509 return # No inet_aton, nothing to check
510 # Test that issue1008086 and issue767150 are fixed.
511 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000512 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
513 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000514
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000515 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000516 if not hasattr(socket, 'inet_pton'):
517 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000518 from socket import inet_aton as f, inet_pton, AF_INET
519 g = lambda a: inet_pton(AF_INET, a)
520
Ezio Melottib3aedd42010-11-20 19:04:17 +0000521 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
522 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
523 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
524 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
525 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000526
Ezio Melottib3aedd42010-11-20 19:04:17 +0000527 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
528 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
529 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
530 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000531
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000532 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000533 if not hasattr(socket, 'inet_pton'):
534 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000535 try:
536 from socket import inet_pton, AF_INET6, has_ipv6
537 if not has_ipv6:
538 return
539 except ImportError:
540 return
541 f = lambda a: inet_pton(AF_INET6, a)
542
Ezio Melottib3aedd42010-11-20 19:04:17 +0000543 self.assertEqual(b'\x00' * 16, f('::'))
544 self.assertEqual(b'\x00' * 16, f('0::0'))
545 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
546 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000547 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 +0000548 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
549 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000550
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000551 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000552 if not hasattr(socket, 'inet_ntop'):
553 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000554 from socket import inet_ntoa as f, inet_ntop, AF_INET
555 g = lambda a: inet_ntop(AF_INET, a)
556
Ezio Melottib3aedd42010-11-20 19:04:17 +0000557 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
558 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
559 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
560 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000561
Ezio Melottib3aedd42010-11-20 19:04:17 +0000562 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
563 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
564 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000565
566 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000567 if not hasattr(socket, 'inet_ntop'):
568 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000569 try:
570 from socket import inet_ntop, AF_INET6, has_ipv6
571 if not has_ipv6:
572 return
573 except ImportError:
574 return
575 f = lambda a: inet_ntop(AF_INET6, a)
576
Ezio Melottib3aedd42010-11-20 19:04:17 +0000577 self.assertEqual('::', f(b'\x00' * 16))
578 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
579 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000580 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000581 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 +0000582 )
583
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000584 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000585
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000586 def testSockName(self):
587 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200588 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000590 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000591 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000592 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000593 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
594 # it reasonable to get the host's addr in addition to 0.0.0.0.
595 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000596 try:
597 my_ip_addr = socket.gethostbyname(socket.gethostname())
598 except socket.error:
599 # Probably name lookup wasn't set up right; skip this test
600 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000601 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000602 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000603
604 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000605 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000606 # We know a socket should start without reuse==0
607 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000608 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000609 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000610 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611
612 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000613 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000614 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000615 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
617 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000618 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000619
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000620 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000621 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000622 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
623 sock.settimeout(1)
624 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000625 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000626
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000627 def testNewAttributes(self):
628 # testing .family, .type and .protocol
629 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
630 self.assertEqual(sock.family, socket.AF_INET)
631 self.assertEqual(sock.type, socket.SOCK_STREAM)
632 self.assertEqual(sock.proto, 0)
633 sock.close()
634
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000635 def test_getsockaddrarg(self):
636 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200637 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000638 big_port = port + 65536
639 neg_port = port - 65536
640 sock = socket.socket()
641 try:
642 self.assertRaises(OverflowError, sock.bind, (host, big_port))
643 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
644 sock.bind((host, port))
645 finally:
646 sock.close()
647
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000648 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000649 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000650 self.assertTrue(hasattr(socket.socket, 'ioctl'))
651 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
652 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
653 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000654 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
655 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000656 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000657 self.assertRaises(ValueError, s.ioctl, -1, None)
658 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000659
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000660 def testGetaddrinfo(self):
661 try:
662 socket.getaddrinfo('localhost', 80)
663 except socket.gaierror as err:
664 if err.errno == socket.EAI_SERVICE:
665 # see http://bugs.python.org/issue1282647
666 self.skipTest("buggy libc version")
667 raise
668 # len of every sequence is supposed to be == 5
669 for info in socket.getaddrinfo(HOST, None):
670 self.assertEqual(len(info), 5)
671 # host can be a domain name, a string representation of an
672 # IPv4/v6 address or None
673 socket.getaddrinfo('localhost', 80)
674 socket.getaddrinfo('127.0.0.1', 80)
675 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200676 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000677 socket.getaddrinfo('::1', 80)
678 # port can be a string service name such as "http", a numeric
679 # port number or None
680 socket.getaddrinfo(HOST, "http")
681 socket.getaddrinfo(HOST, 80)
682 socket.getaddrinfo(HOST, None)
683 # test family and socktype filters
684 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
685 for family, _, _, _, _ in infos:
686 self.assertEqual(family, socket.AF_INET)
687 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
688 for _, socktype, _, _, _ in infos:
689 self.assertEqual(socktype, socket.SOCK_STREAM)
690 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000691 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000692 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
693 # a server willing to support both IPv4 and IPv6 will
694 # usually do this
695 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
696 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000697 # test keyword arguments
698 a = socket.getaddrinfo(HOST, None)
699 b = socket.getaddrinfo(host=HOST, port=None)
700 self.assertEqual(a, b)
701 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
702 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
703 self.assertEqual(a, b)
704 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
705 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
706 self.assertEqual(a, b)
707 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
708 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
709 self.assertEqual(a, b)
710 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
711 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
712 self.assertEqual(a, b)
713 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
714 socket.AI_PASSIVE)
715 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
716 type=socket.SOCK_STREAM, proto=0,
717 flags=socket.AI_PASSIVE)
718 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000719 # Issue #6697.
720 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000721
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000722 def test_getnameinfo(self):
723 # only IP addresses are allowed
724 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
725
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000726 @unittest.skipUnless(support.is_resource_enabled('network'),
727 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000728 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000729 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000730 # these should all be successful
731 socket.gethostbyname('испытание.python.org')
732 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000733 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
734 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
735 # have a reverse entry yet
736 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000737
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000738 def check_sendall_interrupted(self, with_timeout):
739 # socketpair() is not stricly required, but it makes things easier.
740 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
741 self.skipTest("signal.alarm and socket.socketpair required for this test")
742 # Our signal handlers clobber the C errno by calling a math function
743 # with an invalid domain value.
744 def ok_handler(*args):
745 self.assertRaises(ValueError, math.acosh, 0)
746 def raising_handler(*args):
747 self.assertRaises(ValueError, math.acosh, 0)
748 1 // 0
749 c, s = socket.socketpair()
750 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
751 try:
752 if with_timeout:
753 # Just above the one second minimum for signal.alarm
754 c.settimeout(1.5)
755 with self.assertRaises(ZeroDivisionError):
756 signal.alarm(1)
757 c.sendall(b"x" * (1024**2))
758 if with_timeout:
759 signal.signal(signal.SIGALRM, ok_handler)
760 signal.alarm(1)
761 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
762 finally:
763 signal.signal(signal.SIGALRM, old_alarm)
764 c.close()
765 s.close()
766
767 def test_sendall_interrupted(self):
768 self.check_sendall_interrupted(False)
769
770 def test_sendall_interrupted_with_timeout(self):
771 self.check_sendall_interrupted(True)
772
Antoine Pitroue033e062010-10-29 10:38:18 +0000773 def test_dealloc_warn(self):
774 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
775 r = repr(sock)
776 with self.assertWarns(ResourceWarning) as cm:
777 sock = None
778 support.gc_collect()
779 self.assertIn(r, str(cm.warning.args[0]))
780 # An open socket file object gets dereferenced after the socket
781 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
782 f = sock.makefile('rb')
783 r = repr(sock)
784 sock = None
785 support.gc_collect()
786 with self.assertWarns(ResourceWarning):
787 f = None
788 support.gc_collect()
789
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000790 def test_name_closed_socketio(self):
791 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
792 fp = sock.makefile("rb")
793 fp.close()
794 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
795
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100796 def test_pickle(self):
797 sock = socket.socket()
798 with sock:
799 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
800 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
801
Antoine Pitrou3cade992011-05-10 19:19:13 +0200802 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200803 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
804 srv.bind((HOST, 0))
805 # backlog = 0
806 srv.listen(0)
807 srv.close()
808
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000809
Victor Stinner45df8202010-04-28 22:31:17 +0000810@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000811class BasicTCPTest(SocketConnectedTest):
812
813 def __init__(self, methodName='runTest'):
814 SocketConnectedTest.__init__(self, methodName=methodName)
815
816 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000817 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000818 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000819 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820
821 def _testRecv(self):
822 self.serv_conn.send(MSG)
823
824 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000825 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000826 seg1 = self.cli_conn.recv(len(MSG) - 3)
827 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000828 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000829 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000830
831 def _testOverFlowRecv(self):
832 self.serv_conn.send(MSG)
833
834 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000835 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000836 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000837 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838
839 def _testRecvFrom(self):
840 self.serv_conn.send(MSG)
841
842 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000843 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
845 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000846 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000847 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000848
849 def _testOverFlowRecvFrom(self):
850 self.serv_conn.send(MSG)
851
852 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000853 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000854 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855 while 1:
856 read = self.cli_conn.recv(1024)
857 if not read:
858 break
Guido van Rossume531e292002-08-08 20:28:34 +0000859 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000860 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000861
862 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000863 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000864 self.serv_conn.sendall(big_chunk)
865
866 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000867 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000868 fd = self.cli_conn.fileno()
869 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000870 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000871 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000872 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000873 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874
875 def _testFromFd(self):
876 self.serv_conn.send(MSG)
877
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000878 def testDup(self):
879 # Testing dup()
880 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000881 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000882 msg = sock.recv(1024)
883 self.assertEqual(msg, MSG)
884
885 def _testDup(self):
886 self.serv_conn.send(MSG)
887
Guido van Rossum24e4af82002-06-12 19:18:08 +0000888 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000889 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000891 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000892 # wait for _testShutdown to finish: on OS X, when the server
893 # closes the connection the client also becomes disconnected,
894 # and the client's shutdown call will fail. (Issue #4397.)
895 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000896
897 def _testShutdown(self):
898 self.serv_conn.send(MSG)
899 self.serv_conn.shutdown(2)
900
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000901 def testDetach(self):
902 # Testing detach()
903 fileno = self.cli_conn.fileno()
904 f = self.cli_conn.detach()
905 self.assertEqual(f, fileno)
906 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000907 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
908 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000909 # ...but we can create another socket using the (still open)
910 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000911 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000912 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000913 msg = sock.recv(1024)
914 self.assertEqual(msg, MSG)
915
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000916 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000917 self.serv_conn.send(MSG)
918
Victor Stinner45df8202010-04-28 22:31:17 +0000919@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000920class BasicUDPTest(ThreadedUDPSocketTest):
921
922 def __init__(self, methodName='runTest'):
923 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
924
925 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000926 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000927 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000928 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929
930 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000931 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000932
Guido van Rossum1c938012002-06-12 21:17:20 +0000933 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000934 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000935 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000936 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937
Guido van Rossum1c938012002-06-12 21:17:20 +0000938 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000939 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000940
Guido van Rossumd8faa362007-04-27 19:54:29 +0000941 def testRecvFromNegative(self):
942 # Negative lengths passed to recvfrom should give ValueError.
943 self.assertRaises(ValueError, self.serv.recvfrom, -1)
944
945 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000946 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000947
Victor Stinner45df8202010-04-28 22:31:17 +0000948@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000949class TCPCloserTest(ThreadedTCPSocketTest):
950
951 def testClose(self):
952 conn, addr = self.serv.accept()
953 conn.close()
954
955 sd = self.cli
956 read, write, err = select.select([sd], [], [], 1.0)
957 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000958 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000959
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000960 # Calling close() many times should be safe.
961 conn.close()
962 conn.close()
963
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000964 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000965 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000966 time.sleep(1.0)
967
Victor Stinner45df8202010-04-28 22:31:17 +0000968@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000969class BasicSocketPairTest(SocketPairTest):
970
971 def __init__(self, methodName='runTest'):
972 SocketPairTest.__init__(self, methodName=methodName)
973
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000974 def _check_defaults(self, sock):
975 self.assertIsInstance(sock, socket.socket)
976 if hasattr(socket, 'AF_UNIX'):
977 self.assertEqual(sock.family, socket.AF_UNIX)
978 else:
979 self.assertEqual(sock.family, socket.AF_INET)
980 self.assertEqual(sock.type, socket.SOCK_STREAM)
981 self.assertEqual(sock.proto, 0)
982
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000983 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000984 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000985
986 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000987 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000988
Dave Cole331708b2004-08-09 04:51:41 +0000989 def testRecv(self):
990 msg = self.serv.recv(1024)
991 self.assertEqual(msg, MSG)
992
993 def _testRecv(self):
994 self.cli.send(MSG)
995
996 def testSend(self):
997 self.serv.send(MSG)
998
999 def _testSend(self):
1000 msg = self.cli.recv(1024)
1001 self.assertEqual(msg, MSG)
1002
Victor Stinner45df8202010-04-28 22:31:17 +00001003@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001004class NonBlockingTCPTests(ThreadedTCPSocketTest):
1005
1006 def __init__(self, methodName='runTest'):
1007 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1008
1009 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001010 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001011 self.serv.setblocking(0)
1012 start = time.time()
1013 try:
1014 self.serv.accept()
1015 except socket.error:
1016 pass
1017 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001018 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001019
1020 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001021 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001022
Antoine Pitroub1c54962010-10-14 15:05:38 +00001023 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02001024 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001025 def testInitNonBlocking(self):
1026 # reinit server socket
1027 self.serv.close()
1028 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001029 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001030 self.port = support.bind_port(self.serv)
1031 self.serv.listen(1)
1032 # actual testing
1033 start = time.time()
1034 try:
1035 self.serv.accept()
1036 except socket.error:
1037 pass
1038 end = time.time()
1039 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1040
1041 def _testInitNonBlocking(self):
1042 pass
1043
Antoine Pitrou600232b2011-01-05 21:03:42 +00001044 def testInheritFlags(self):
1045 # Issue #7995: when calling accept() on a listening socket with a
1046 # timeout, the resulting socket should not be non-blocking.
1047 self.serv.settimeout(10)
1048 try:
1049 conn, addr = self.serv.accept()
1050 message = conn.recv(len(MSG))
1051 finally:
1052 conn.close()
1053 self.serv.settimeout(None)
1054
1055 def _testInheritFlags(self):
1056 time.sleep(0.1)
1057 self.cli.connect((HOST, self.port))
1058 time.sleep(0.5)
1059 self.cli.send(MSG)
1060
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001062 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001064 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065 conn, addr = self.serv.accept()
1066 except socket.error:
1067 pass
1068 else:
1069 self.fail("Error trying to do non-blocking accept.")
1070 read, write, err = select.select([self.serv], [], [])
1071 if self.serv in read:
1072 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001073 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001074 else:
1075 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001076
Guido van Rossum24e4af82002-06-12 19:18:08 +00001077 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001078 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001079 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001080
1081 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001082 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001083 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001084 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085
1086 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001087 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001088 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001089
1090 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001091 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001092 conn, addr = self.serv.accept()
1093 conn.setblocking(0)
1094 try:
1095 msg = conn.recv(len(MSG))
1096 except socket.error:
1097 pass
1098 else:
1099 self.fail("Error trying to do non-blocking recv.")
1100 read, write, err = select.select([conn], [], [])
1101 if conn in read:
1102 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001103 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001104 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001105 else:
1106 self.fail("Error during select call to non-blocking socket.")
1107
1108 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001109 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001110 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001111 self.cli.send(MSG)
1112
Victor Stinner45df8202010-04-28 22:31:17 +00001113@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001114class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001115 """Unit tests for the object returned by socket.makefile()
1116
Antoine Pitrou834bd812010-10-13 16:17:14 +00001117 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001118 the client connection. You can read from this file to
1119 get output from the server.
1120
Antoine Pitrou834bd812010-10-13 16:17:14 +00001121 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001122 server connection. You can write to this file to send output
1123 to the client.
1124 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001125
Guido van Rossume9f66142002-08-07 15:46:19 +00001126 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001127 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001128 errors = 'strict'
1129 newline = None
1130
1131 read_mode = 'rb'
1132 read_msg = MSG
1133 write_mode = 'wb'
1134 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001135
Guido van Rossum24e4af82002-06-12 19:18:08 +00001136 def __init__(self, methodName='runTest'):
1137 SocketConnectedTest.__init__(self, methodName=methodName)
1138
1139 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001140 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1141 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001142 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001143 self.read_file = self.cli_conn.makefile(
1144 self.read_mode, self.bufsize,
1145 encoding = self.encoding,
1146 errors = self.errors,
1147 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001148
1149 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001150 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001151 self.read_file.close()
1152 self.assertTrue(self.read_file.closed)
1153 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001154 SocketConnectedTest.tearDown(self)
1155
1156 def clientSetUp(self):
1157 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001158 self.write_file = self.serv_conn.makefile(
1159 self.write_mode, self.bufsize,
1160 encoding = self.encoding,
1161 errors = self.errors,
1162 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001163
1164 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001165 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001166 self.write_file.close()
1167 self.assertTrue(self.write_file.closed)
1168 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001169 SocketConnectedTest.clientTearDown(self)
1170
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001171 def testReadAfterTimeout(self):
1172 # Issue #7322: A file object must disallow further reads
1173 # after a timeout has occurred.
1174 self.cli_conn.settimeout(1)
1175 self.read_file.read(3)
1176 # First read raises a timeout
1177 self.assertRaises(socket.timeout, self.read_file.read, 1)
1178 # Second read is disallowed
1179 with self.assertRaises(IOError) as ctx:
1180 self.read_file.read(1)
1181 self.assertIn("cannot read from timed out object", str(ctx.exception))
1182
1183 def _testReadAfterTimeout(self):
1184 self.write_file.write(self.write_msg[0:3])
1185 self.write_file.flush()
1186 self.serv_finished.wait()
1187
Guido van Rossum24e4af82002-06-12 19:18:08 +00001188 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001189 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001190 first_seg = self.read_file.read(len(self.read_msg)-3)
1191 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001192 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001193 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001194
1195 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001196 self.write_file.write(self.write_msg)
1197 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001198
Guido van Rossum8c943832002-08-08 01:00:28 +00001199 def testFullRead(self):
1200 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001201 msg = self.read_file.read()
1202 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001203
1204 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001205 self.write_file.write(self.write_msg)
1206 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001207
Guido van Rossum24e4af82002-06-12 19:18:08 +00001208 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001209 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001210 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001211 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001212 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001213 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001214 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001215 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001216 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001217
1218 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001219 self.write_file.write(self.write_msg)
1220 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001221
1222 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001223 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001224 line = self.read_file.readline()
1225 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001226
1227 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001228 self.write_file.write(self.write_msg)
1229 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001230
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001231 def testCloseAfterMakefile(self):
1232 # The file returned by makefile should keep the socket open.
1233 self.cli_conn.close()
1234 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001235 msg = self.read_file.read()
1236 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001237
1238 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001239 self.write_file.write(self.write_msg)
1240 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001241
1242 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001243 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001244 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001245 if isinstance(self.read_msg, str):
1246 msg = msg.decode()
1247 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001248
1249 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001250 self.write_file.write(self.write_msg)
1251 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001252
Tim Peters116d83c2004-03-28 02:20:45 +00001253 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001254 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001255
1256 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001257 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001258
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001259 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001260 self.assertEqual(self.read_file.mode, self.read_mode)
1261 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001262
1263 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001264 self.assertEqual(self.write_file.mode, self.write_mode)
1265 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001266
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001267 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001268 self.read_file.close()
1269 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001270 self.cli_conn.close()
1271 self.assertRaises(socket.error, self.cli_conn.getsockname)
1272
1273 def _testRealClose(self):
1274 pass
1275
1276
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001277class FileObjectInterruptedTestCase(unittest.TestCase):
1278 """Test that the file object correctly handles EINTR internally."""
1279
1280 class MockSocket(object):
1281 def __init__(self, recv_funcs=()):
1282 # A generator that returns callables that we'll call for each
1283 # call to recv().
1284 self._recv_step = iter(recv_funcs)
1285
1286 def recv_into(self, buffer):
1287 data = next(self._recv_step)()
1288 assert len(buffer) >= len(data)
1289 buffer[:len(data)] = data
1290 return len(data)
1291
1292 def _decref_socketios(self):
1293 pass
1294
1295 def _textiowrap_for_test(self, buffering=-1):
1296 raw = socket.SocketIO(self, "r")
1297 if buffering < 0:
1298 buffering = io.DEFAULT_BUFFER_SIZE
1299 if buffering == 0:
1300 return raw
1301 buffer = io.BufferedReader(raw, buffering)
1302 text = io.TextIOWrapper(buffer, None, None)
1303 text.mode = "rb"
1304 return text
1305
1306 @staticmethod
1307 def _raise_eintr():
1308 raise socket.error(errno.EINTR)
1309
1310 def _textiowrap_mock_socket(self, mock, buffering=-1):
1311 raw = socket.SocketIO(mock, "r")
1312 if buffering < 0:
1313 buffering = io.DEFAULT_BUFFER_SIZE
1314 if buffering == 0:
1315 return raw
1316 buffer = io.BufferedReader(raw, buffering)
1317 text = io.TextIOWrapper(buffer, None, None)
1318 text.mode = "rb"
1319 return text
1320
1321 def _test_readline(self, size=-1, buffering=-1):
1322 mock_sock = self.MockSocket(recv_funcs=[
1323 lambda : b"This is the first line\nAnd the sec",
1324 self._raise_eintr,
1325 lambda : b"ond line is here\n",
1326 lambda : b"",
1327 lambda : b"", # XXX(gps): io library does an extra EOF read
1328 ])
1329 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001330 self.assertEqual(fo.readline(size), "This is the first line\n")
1331 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001332
1333 def _test_read(self, size=-1, buffering=-1):
1334 mock_sock = self.MockSocket(recv_funcs=[
1335 lambda : b"This is the first line\nAnd the sec",
1336 self._raise_eintr,
1337 lambda : b"ond line is here\n",
1338 lambda : b"",
1339 lambda : b"", # XXX(gps): io library does an extra EOF read
1340 ])
1341 expecting = (b"This is the first line\n"
1342 b"And the second line is here\n")
1343 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1344 if buffering == 0:
1345 data = b''
1346 else:
1347 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001348 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001349 while len(data) != len(expecting):
1350 part = fo.read(size)
1351 if not part:
1352 break
1353 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001354 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001355
1356 def test_default(self):
1357 self._test_readline()
1358 self._test_readline(size=100)
1359 self._test_read()
1360 self._test_read(size=100)
1361
1362 def test_with_1k_buffer(self):
1363 self._test_readline(buffering=1024)
1364 self._test_readline(size=100, buffering=1024)
1365 self._test_read(buffering=1024)
1366 self._test_read(size=100, buffering=1024)
1367
1368 def _test_readline_no_buffer(self, size=-1):
1369 mock_sock = self.MockSocket(recv_funcs=[
1370 lambda : b"a",
1371 lambda : b"\n",
1372 lambda : b"B",
1373 self._raise_eintr,
1374 lambda : b"b",
1375 lambda : b"",
1376 ])
1377 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001378 self.assertEqual(fo.readline(size), b"a\n")
1379 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001380
1381 def test_no_buffer(self):
1382 self._test_readline_no_buffer()
1383 self._test_readline_no_buffer(size=4)
1384 self._test_read(buffering=0)
1385 self._test_read(size=100, buffering=0)
1386
1387
Guido van Rossume9f66142002-08-07 15:46:19 +00001388class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1389
1390 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001391
Guido van Rossume9f66142002-08-07 15:46:19 +00001392 In this case (and in this case only), it should be possible to
1393 create a file object, read a line from it, create another file
1394 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001395 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001396 when reading multiple requests from the same socket."""
1397
1398 bufsize = 0 # Use unbuffered mode
1399
1400 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001401 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001402 line = self.read_file.readline() # first line
1403 self.assertEqual(line, b"A. " + self.write_msg) # first line
1404 self.read_file = self.cli_conn.makefile('rb', 0)
1405 line = self.read_file.readline() # second line
1406 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001407
1408 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001409 self.write_file.write(b"A. " + self.write_msg)
1410 self.write_file.write(b"B. " + self.write_msg)
1411 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001412
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001413 def testMakefileClose(self):
1414 # The file returned by makefile should keep the socket open...
1415 self.cli_conn.close()
1416 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001417 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001418 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001419 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001420 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1421
1422 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001423 self.write_file.write(self.write_msg)
1424 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001425
1426 def testMakefileCloseSocketDestroy(self):
1427 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001428 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001429 refcount_after = sys.getrefcount(self.cli_conn)
1430 self.assertEqual(refcount_before - 1, refcount_after)
1431
1432 def _testMakefileCloseSocketDestroy(self):
1433 pass
1434
Antoine Pitrou98b46702010-09-18 22:59:00 +00001435 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001436 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001437 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1438
1439 def testSmallReadNonBlocking(self):
1440 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001441 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1442 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001443 self.evt1.set()
1444 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001445 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001446 if first_seg is None:
1447 # Data not arrived (can happen under Windows), wait a bit
1448 time.sleep(0.5)
1449 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001450 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001451 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001452 self.assertEqual(n, 3)
1453 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001454 self.assertEqual(msg, self.read_msg)
1455 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1456 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001457
1458 def _testSmallReadNonBlocking(self):
1459 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001460 self.write_file.write(self.write_msg)
1461 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001462 self.evt2.set()
1463 # Avoid cloding the socket before the server test has finished,
1464 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1465 self.serv_finished.wait(5.0)
1466
1467 def testWriteNonBlocking(self):
1468 self.cli_finished.wait(5.0)
1469 # The client thread can't skip directly - the SkipTest exception
1470 # would appear as a failure.
1471 if self.serv_skipped:
1472 self.skipTest(self.serv_skipped)
1473
1474 def _testWriteNonBlocking(self):
1475 self.serv_skipped = None
1476 self.serv_conn.setblocking(False)
1477 # Try to saturate the socket buffer pipe with repeated large writes.
1478 BIG = b"x" * (1024 ** 2)
1479 LIMIT = 10
1480 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001481 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001482 self.assertGreater(n, 0)
1483 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001484 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001485 if n is None:
1486 # Succeeded
1487 break
1488 self.assertGreater(n, 0)
1489 else:
1490 # Let us know that this test didn't manage to establish
1491 # the expected conditions. This is not a failure in itself but,
1492 # if it happens repeatedly, the test should be fixed.
1493 self.serv_skipped = "failed to saturate the socket buffer"
1494
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001495
Guido van Rossum8c943832002-08-08 01:00:28 +00001496class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1497
1498 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1499
1500
1501class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1502
1503 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001504
Thomas Woutersb2137042007-02-01 18:02:27 +00001505
Antoine Pitrou834bd812010-10-13 16:17:14 +00001506class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1507 """Tests for socket.makefile() in text mode (rather than binary)"""
1508
1509 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001510 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001511 write_mode = 'wb'
1512 write_msg = MSG
1513 newline = ''
1514
1515
1516class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1517 """Tests for socket.makefile() in text mode (rather than binary)"""
1518
1519 read_mode = 'rb'
1520 read_msg = MSG
1521 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001522 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001523 newline = ''
1524
1525
1526class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1527 """Tests for socket.makefile() in text mode (rather than binary)"""
1528
1529 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001530 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001531 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001532 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001533 newline = ''
1534
1535
Guido van Rossumd8faa362007-04-27 19:54:29 +00001536class NetworkConnectionTest(object):
1537 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001538
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001540 # We're inherited below by BasicTCPTest2, which also inherits
1541 # BasicTCPTest, which defines self.port referenced below.
1542 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001543 self.serv_conn = self.cli
1544
1545class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1546 """Tests that NetworkConnection does not break existing TCP functionality.
1547 """
1548
1549class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001550
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001551 class MockSocket(socket.socket):
1552 def connect(self, *args):
1553 raise socket.timeout('timed out')
1554
1555 @contextlib.contextmanager
1556 def mocked_socket_module(self):
1557 """Return a socket which times out on connect"""
1558 old_socket = socket.socket
1559 socket.socket = self.MockSocket
1560 try:
1561 yield
1562 finally:
1563 socket.socket = old_socket
1564
1565 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001566 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001567 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001568 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001569 with self.assertRaises(socket.error) as cm:
1570 cli.connect((HOST, port))
1571 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1572
1573 def test_create_connection(self):
1574 # Issue #9792: errors raised by create_connection() should have
1575 # a proper errno attribute.
1576 port = support.find_unused_port()
1577 with self.assertRaises(socket.error) as cm:
1578 socket.create_connection((HOST, port))
1579 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1580
1581 def test_create_connection_timeout(self):
1582 # Issue #9792: create_connection() should not recast timeout errors
1583 # as generic socket errors.
1584 with self.mocked_socket_module():
1585 with self.assertRaises(socket.timeout):
1586 socket.create_connection((HOST, 1234))
1587
Guido van Rossumd8faa362007-04-27 19:54:29 +00001588
Victor Stinner45df8202010-04-28 22:31:17 +00001589@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1591
1592 def __init__(self, methodName='runTest'):
1593 SocketTCPTest.__init__(self, methodName=methodName)
1594 ThreadableTest.__init__(self)
1595
1596 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001597 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001598
1599 def clientTearDown(self):
1600 self.cli.close()
1601 self.cli = None
1602 ThreadableTest.clientTearDown(self)
1603
1604 def _justAccept(self):
1605 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001606 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607
1608 testFamily = _justAccept
1609 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001610 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001611 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001612 self.assertEqual(self.cli.family, 2)
1613
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001614 testSourceAddress = _justAccept
1615 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001616 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1617 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001618 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001619 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001620 # The port number being used is sufficient to show that the bind()
1621 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001622
Guido van Rossumd8faa362007-04-27 19:54:29 +00001623 testTimeoutDefault = _justAccept
1624 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001625 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001626 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001627 socket.setdefaulttimeout(42)
1628 try:
1629 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001630 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001631 finally:
1632 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001633 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001634
1635 testTimeoutNone = _justAccept
1636 def _testTimeoutNone(self):
1637 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001638 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001639 socket.setdefaulttimeout(30)
1640 try:
1641 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001642 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001643 finally:
1644 socket.setdefaulttimeout(None)
1645 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001646
1647 testTimeoutValueNamed = _justAccept
1648 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001649 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001650 self.assertEqual(self.cli.gettimeout(), 30)
1651
1652 testTimeoutValueNonamed = _justAccept
1653 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001654 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001655 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001656 self.assertEqual(self.cli.gettimeout(), 30)
1657
Victor Stinner45df8202010-04-28 22:31:17 +00001658@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001659class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1660
1661 def __init__(self, methodName='runTest'):
1662 SocketTCPTest.__init__(self, methodName=methodName)
1663 ThreadableTest.__init__(self)
1664
1665 def clientSetUp(self):
1666 pass
1667
1668 def clientTearDown(self):
1669 self.cli.close()
1670 self.cli = None
1671 ThreadableTest.clientTearDown(self)
1672
1673 def testInsideTimeout(self):
1674 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001675 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001676 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001677 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001678 testOutsideTimeout = testInsideTimeout
1679
1680 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001681 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001682 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001683 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001684
1685 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001686 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001687 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001688
1689
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001690class TCPTimeoutTest(SocketTCPTest):
1691
1692 def testTCPTimeout(self):
1693 def raise_timeout(*args, **kwargs):
1694 self.serv.settimeout(1.0)
1695 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001696 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001697 "Error generating a timeout exception (TCP)")
1698
1699 def testTimeoutZero(self):
1700 ok = False
1701 try:
1702 self.serv.settimeout(0.0)
1703 foo = self.serv.accept()
1704 except socket.timeout:
1705 self.fail("caught timeout instead of error (TCP)")
1706 except socket.error:
1707 ok = True
1708 except:
1709 self.fail("caught unexpected exception (TCP)")
1710 if not ok:
1711 self.fail("accept() returned success when we did not expect it")
1712
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001713 def testInterruptedTimeout(self):
1714 # XXX I don't know how to do this test on MSWindows or any other
1715 # plaform that doesn't support signal.alarm() or os.kill(), though
1716 # the bug should have existed on all platforms.
1717 if not hasattr(signal, "alarm"):
1718 return # can only test on *nix
1719 self.serv.settimeout(5.0) # must be longer than alarm
1720 class Alarm(Exception):
1721 pass
1722 def alarm_handler(signal, frame):
1723 raise Alarm
1724 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1725 try:
1726 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1727 try:
1728 foo = self.serv.accept()
1729 except socket.timeout:
1730 self.fail("caught timeout instead of Alarm")
1731 except Alarm:
1732 pass
1733 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001734 self.fail("caught other exception instead of Alarm:"
1735 " %s(%s):\n%s" %
1736 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001737 else:
1738 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001739 finally:
1740 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001741 except Alarm:
1742 self.fail("got Alarm in wrong place")
1743 finally:
1744 # no alarm can be pending. Safe to restore old handler.
1745 signal.signal(signal.SIGALRM, old_alarm)
1746
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001747class UDPTimeoutTest(SocketTCPTest):
1748
1749 def testUDPTimeout(self):
1750 def raise_timeout(*args, **kwargs):
1751 self.serv.settimeout(1.0)
1752 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001753 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001754 "Error generating a timeout exception (UDP)")
1755
1756 def testTimeoutZero(self):
1757 ok = False
1758 try:
1759 self.serv.settimeout(0.0)
1760 foo = self.serv.recv(1024)
1761 except socket.timeout:
1762 self.fail("caught timeout instead of error (UDP)")
1763 except socket.error:
1764 ok = True
1765 except:
1766 self.fail("caught unexpected exception (UDP)")
1767 if not ok:
1768 self.fail("recv() returned success when we did not expect it")
1769
1770class TestExceptions(unittest.TestCase):
1771
1772 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001773 self.assertTrue(issubclass(socket.error, Exception))
1774 self.assertTrue(issubclass(socket.herror, socket.error))
1775 self.assertTrue(issubclass(socket.gaierror, socket.error))
1776 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001777
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001778class TestLinuxAbstractNamespace(unittest.TestCase):
1779
1780 UNIX_PATH_MAX = 108
1781
1782 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001783 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001784 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1785 s1.bind(address)
1786 s1.listen(1)
1787 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1788 s2.connect(s1.getsockname())
1789 with s1.accept()[0] as s3:
1790 self.assertEqual(s1.getsockname(), address)
1791 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001792
1793 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001794 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001795 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1796 s.bind(address)
1797 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001798
1799 def testNameOverflow(self):
1800 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001801 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1802 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001804
Victor Stinner45df8202010-04-28 22:31:17 +00001805@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001806class BufferIOTest(SocketConnectedTest):
1807 """
1808 Test the buffer versions of socket.recv() and socket.send().
1809 """
1810 def __init__(self, methodName='runTest'):
1811 SocketConnectedTest.__init__(self, methodName=methodName)
1812
Antoine Pitrou25480782010-03-17 22:50:28 +00001813 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001814 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001815 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001817 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001818 self.assertEqual(msg, MSG)
1819
Antoine Pitrou25480782010-03-17 22:50:28 +00001820 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001821 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001822 self.serv_conn.send(buf)
1823
Antoine Pitrou25480782010-03-17 22:50:28 +00001824 def testRecvIntoBytearray(self):
1825 buf = bytearray(1024)
1826 nbytes = self.cli_conn.recv_into(buf)
1827 self.assertEqual(nbytes, len(MSG))
1828 msg = buf[:len(MSG)]
1829 self.assertEqual(msg, MSG)
1830
1831 _testRecvIntoBytearray = _testRecvIntoArray
1832
1833 def testRecvIntoMemoryview(self):
1834 buf = bytearray(1024)
1835 nbytes = self.cli_conn.recv_into(memoryview(buf))
1836 self.assertEqual(nbytes, len(MSG))
1837 msg = buf[:len(MSG)]
1838 self.assertEqual(msg, MSG)
1839
1840 _testRecvIntoMemoryview = _testRecvIntoArray
1841
1842 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001843 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001844 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001846 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847 self.assertEqual(msg, MSG)
1848
Antoine Pitrou25480782010-03-17 22:50:28 +00001849 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001850 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851 self.serv_conn.send(buf)
1852
Antoine Pitrou25480782010-03-17 22:50:28 +00001853 def testRecvFromIntoBytearray(self):
1854 buf = bytearray(1024)
1855 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1856 self.assertEqual(nbytes, len(MSG))
1857 msg = buf[:len(MSG)]
1858 self.assertEqual(msg, MSG)
1859
1860 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1861
1862 def testRecvFromIntoMemoryview(self):
1863 buf = bytearray(1024)
1864 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1865 self.assertEqual(nbytes, len(MSG))
1866 msg = buf[:len(MSG)]
1867 self.assertEqual(msg, MSG)
1868
1869 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1870
Christian Heimes043d6f62008-01-07 17:19:16 +00001871
1872TIPC_STYPE = 2000
1873TIPC_LOWER = 200
1874TIPC_UPPER = 210
1875
1876def isTipcAvailable():
1877 """Check if the TIPC module is loaded
1878
1879 The TIPC module is not loaded automatically on Ubuntu and probably
1880 other Linux distros.
1881 """
1882 if not hasattr(socket, "AF_TIPC"):
1883 return False
1884 if not os.path.isfile("/proc/modules"):
1885 return False
1886 with open("/proc/modules") as f:
1887 for line in f:
1888 if line.startswith("tipc "):
1889 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001890 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001891 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1892 return False
1893
1894class TIPCTest (unittest.TestCase):
1895 def testRDM(self):
1896 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1897 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1898
1899 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1900 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1901 TIPC_LOWER, TIPC_UPPER)
1902 srv.bind(srvaddr)
1903
1904 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1905 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1906 cli.sendto(MSG, sendaddr)
1907
1908 msg, recvaddr = srv.recvfrom(1024)
1909
1910 self.assertEqual(cli.getsockname(), recvaddr)
1911 self.assertEqual(msg, MSG)
1912
1913
1914class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1915 def __init__(self, methodName = 'runTest'):
1916 unittest.TestCase.__init__(self, methodName = methodName)
1917 ThreadableTest.__init__(self)
1918
1919 def setUp(self):
1920 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1921 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1922 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1923 TIPC_LOWER, TIPC_UPPER)
1924 self.srv.bind(srvaddr)
1925 self.srv.listen(5)
1926 self.serverExplicitReady()
1927 self.conn, self.connaddr = self.srv.accept()
1928
1929 def clientSetUp(self):
1930 # The is a hittable race between serverExplicitReady() and the
1931 # accept() call; sleep a little while to avoid it, otherwise
1932 # we could get an exception
1933 time.sleep(0.1)
1934 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1935 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1936 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1937 self.cli.connect(addr)
1938 self.cliaddr = self.cli.getsockname()
1939
1940 def testStream(self):
1941 msg = self.conn.recv(1024)
1942 self.assertEqual(msg, MSG)
1943 self.assertEqual(self.cliaddr, self.connaddr)
1944
1945 def _testStream(self):
1946 self.cli.send(MSG)
1947 self.cli.close()
1948
1949
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001950@unittest.skipUnless(thread, 'Threading required for this test.')
1951class ContextManagersTest(ThreadedTCPSocketTest):
1952
1953 def _testSocketClass(self):
1954 # base test
1955 with socket.socket() as sock:
1956 self.assertFalse(sock._closed)
1957 self.assertTrue(sock._closed)
1958 # close inside with block
1959 with socket.socket() as sock:
1960 sock.close()
1961 self.assertTrue(sock._closed)
1962 # exception inside with block
1963 with socket.socket() as sock:
1964 self.assertRaises(socket.error, sock.sendall, b'foo')
1965 self.assertTrue(sock._closed)
1966
1967 def testCreateConnectionBase(self):
1968 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001969 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001970 data = conn.recv(1024)
1971 conn.sendall(data)
1972
1973 def _testCreateConnectionBase(self):
1974 address = self.serv.getsockname()
1975 with socket.create_connection(address) as sock:
1976 self.assertFalse(sock._closed)
1977 sock.sendall(b'foo')
1978 self.assertEqual(sock.recv(1024), b'foo')
1979 self.assertTrue(sock._closed)
1980
1981 def testCreateConnectionClose(self):
1982 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001983 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001984 data = conn.recv(1024)
1985 conn.sendall(data)
1986
1987 def _testCreateConnectionClose(self):
1988 address = self.serv.getsockname()
1989 with socket.create_connection(address) as sock:
1990 sock.close()
1991 self.assertTrue(sock._closed)
1992 self.assertRaises(socket.error, sock.sendall, b'foo')
1993
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001994
Antoine Pitroub1c54962010-10-14 15:05:38 +00001995@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1996 "SOCK_CLOEXEC not defined")
1997@unittest.skipUnless(fcntl, "module fcntl not available")
1998class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02001999 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002000 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00002001 with socket.socket(socket.AF_INET,
2002 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2003 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2004 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002005
2006
2007@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2008 "SOCK_NONBLOCK not defined")
2009class NonblockConstantTest(unittest.TestCase):
2010 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2011 if nonblock:
2012 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2013 self.assertEqual(s.gettimeout(), timeout)
2014 else:
2015 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2016 self.assertEqual(s.gettimeout(), None)
2017
Charles-François Natali239bb962011-06-03 12:55:15 +02002018 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002019 def test_SOCK_NONBLOCK(self):
2020 # a lot of it seems silly and redundant, but I wanted to test that
2021 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002022 with socket.socket(socket.AF_INET,
2023 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2024 self.checkNonblock(s)
2025 s.setblocking(1)
2026 self.checkNonblock(s, False)
2027 s.setblocking(0)
2028 self.checkNonblock(s)
2029 s.settimeout(None)
2030 self.checkNonblock(s, False)
2031 s.settimeout(2.0)
2032 self.checkNonblock(s, timeout=2.0)
2033 s.setblocking(1)
2034 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002035 # defaulttimeout
2036 t = socket.getdefaulttimeout()
2037 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002038 with socket.socket() as s:
2039 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002040 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002041 with socket.socket() as s:
2042 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002043 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002044 with socket.socket() as s:
2045 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002046 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002047 with socket.socket() as s:
2048 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002049 socket.setdefaulttimeout(t)
2050
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002051
Guido van Rossumb995eb72002-07-31 16:08:40 +00002052def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002053 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002054 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002055
2056 tests.extend([
2057 NonBlockingTCPTests,
2058 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002059 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002060 UnbufferedFileObjectClassTestCase,
2061 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002062 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002063 UnicodeReadFileObjectClassTestCase,
2064 UnicodeWriteFileObjectClassTestCase,
2065 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002066 NetworkConnectionNoServer,
2067 NetworkConnectionAttributesTest,
2068 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002069 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002070 CloexecConstantTest,
2071 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002072 ])
Dave Cole331708b2004-08-09 04:51:41 +00002073 if hasattr(socket, "socketpair"):
2074 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02002075 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002076 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002077 if isTipcAvailable():
2078 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002079 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002080
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002081 thread_info = support.threading_setup()
2082 support.run_unittest(*tests)
2083 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002084
2085if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002086 test_main()