blob: a00a99f8aae865ca374975126f66a2cffdc5fc9d [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.
Gregory P. Smithb603d032010-10-17 00:17:24 +0000445 if (sys.platform.startswith('linux') or
446 sys.platform.startswith('freebsd') or
447 sys.platform.startswith('netbsd') or
448 sys.platform == 'darwin'):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000449 # avoid the 'echo' service on this platform, as there is an
450 # assumption breaking non-standard port/protocol entry
451 services = ('daytime', 'qotd', 'domain')
452 else:
453 services = ('echo', 'daytime', 'domain')
454 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000455 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000456 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000457 break
458 except socket.error:
459 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000460 else:
461 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000462 # Try same call with optional protocol omitted
463 port2 = socket.getservbyname(service)
464 eq(port, port2)
465 # Try udp, but don't barf it it doesn't exist
466 try:
467 udpport = socket.getservbyname(service, 'udp')
468 except socket.error:
469 udpport = None
470 else:
471 eq(udpport, port)
472 # Now make sure the lookup by port returns the same service name
473 eq(socket.getservbyport(port2), service)
474 eq(socket.getservbyport(port, 'tcp'), service)
475 if udpport is not None:
476 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000477 # Make sure getservbyport does not accept out of range ports.
478 self.assertRaises(OverflowError, socket.getservbyport, -1)
479 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000480
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000481 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000482 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000483 # The default timeout should initially be None
484 self.assertEqual(socket.getdefaulttimeout(), None)
485 s = socket.socket()
486 self.assertEqual(s.gettimeout(), None)
487 s.close()
488
489 # Set the default timeout to 10, and see if it propagates
490 socket.setdefaulttimeout(10)
491 self.assertEqual(socket.getdefaulttimeout(), 10)
492 s = socket.socket()
493 self.assertEqual(s.gettimeout(), 10)
494 s.close()
495
496 # Reset the default timeout to None, and see if it propagates
497 socket.setdefaulttimeout(None)
498 self.assertEqual(socket.getdefaulttimeout(), None)
499 s = socket.socket()
500 self.assertEqual(s.gettimeout(), None)
501 s.close()
502
503 # Check that setting it to an invalid value raises ValueError
504 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
505
506 # Check that setting it to an invalid type raises TypeError
507 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
508
Benjamin Petersonf91df042009-02-13 02:50:59 +0000509 def testIPv4_inet_aton_fourbytes(self):
510 if not hasattr(socket, 'inet_aton'):
511 return # No inet_aton, nothing to check
512 # Test that issue1008086 and issue767150 are fixed.
513 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000514 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
515 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000516
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000517 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000518 if not hasattr(socket, 'inet_pton'):
519 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000520 from socket import inet_aton as f, inet_pton, AF_INET
521 g = lambda a: inet_pton(AF_INET, a)
522
Ezio Melottib3aedd42010-11-20 19:04:17 +0000523 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
524 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
525 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
526 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
527 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000528
Ezio Melottib3aedd42010-11-20 19:04:17 +0000529 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
530 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
531 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
532 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000533
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000534 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000535 if not hasattr(socket, 'inet_pton'):
536 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000537 try:
538 from socket import inet_pton, AF_INET6, has_ipv6
539 if not has_ipv6:
540 return
541 except ImportError:
542 return
543 f = lambda a: inet_pton(AF_INET6, a)
544
Ezio Melottib3aedd42010-11-20 19:04:17 +0000545 self.assertEqual(b'\x00' * 16, f('::'))
546 self.assertEqual(b'\x00' * 16, f('0::0'))
547 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
548 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000549 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 +0000550 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
551 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000552
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000553 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000554 if not hasattr(socket, 'inet_ntop'):
555 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000556 from socket import inet_ntoa as f, inet_ntop, AF_INET
557 g = lambda a: inet_ntop(AF_INET, a)
558
Ezio Melottib3aedd42010-11-20 19:04:17 +0000559 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
560 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
561 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
562 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000563
Ezio Melottib3aedd42010-11-20 19:04:17 +0000564 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
565 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
566 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000567
568 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000569 if not hasattr(socket, 'inet_ntop'):
570 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000571 try:
572 from socket import inet_ntop, AF_INET6, has_ipv6
573 if not has_ipv6:
574 return
575 except ImportError:
576 return
577 f = lambda a: inet_ntop(AF_INET6, a)
578
Ezio Melottib3aedd42010-11-20 19:04:17 +0000579 self.assertEqual('::', f(b'\x00' * 16))
580 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
581 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000582 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000583 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 +0000584 )
585
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000586 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000587
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000588 def testSockName(self):
589 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200590 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000591 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000592 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000593 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000595 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
596 # it reasonable to get the host's addr in addition to 0.0.0.0.
597 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000598 try:
599 my_ip_addr = socket.gethostbyname(socket.gethostname())
600 except socket.error:
601 # Probably name lookup wasn't set up right; skip this test
602 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000603 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000604 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000605
606 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000607 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000608 # We know a socket should start without reuse==0
609 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000610 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000611 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000612 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000613
614 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000615 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000616 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000617 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000618 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
619 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000620 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000621
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000622 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000623 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000624 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
625 sock.settimeout(1)
626 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000627 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000628
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000629 def testNewAttributes(self):
630 # testing .family, .type and .protocol
631 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
632 self.assertEqual(sock.family, socket.AF_INET)
633 self.assertEqual(sock.type, socket.SOCK_STREAM)
634 self.assertEqual(sock.proto, 0)
635 sock.close()
636
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000637 def test_getsockaddrarg(self):
638 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200639 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000640 big_port = port + 65536
641 neg_port = port - 65536
642 sock = socket.socket()
643 try:
644 self.assertRaises(OverflowError, sock.bind, (host, big_port))
645 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
646 sock.bind((host, port))
647 finally:
648 sock.close()
649
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000650 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000651 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000652 self.assertTrue(hasattr(socket.socket, 'ioctl'))
653 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
654 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
655 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000656 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
657 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000658 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000659 self.assertRaises(ValueError, s.ioctl, -1, None)
660 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000661
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000662 def testGetaddrinfo(self):
663 try:
664 socket.getaddrinfo('localhost', 80)
665 except socket.gaierror as err:
666 if err.errno == socket.EAI_SERVICE:
667 # see http://bugs.python.org/issue1282647
668 self.skipTest("buggy libc version")
669 raise
670 # len of every sequence is supposed to be == 5
671 for info in socket.getaddrinfo(HOST, None):
672 self.assertEqual(len(info), 5)
673 # host can be a domain name, a string representation of an
674 # IPv4/v6 address or None
675 socket.getaddrinfo('localhost', 80)
676 socket.getaddrinfo('127.0.0.1', 80)
677 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200678 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000679 socket.getaddrinfo('::1', 80)
680 # port can be a string service name such as "http", a numeric
681 # port number or None
682 socket.getaddrinfo(HOST, "http")
683 socket.getaddrinfo(HOST, 80)
684 socket.getaddrinfo(HOST, None)
685 # test family and socktype filters
686 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
687 for family, _, _, _, _ in infos:
688 self.assertEqual(family, socket.AF_INET)
689 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
690 for _, socktype, _, _, _ in infos:
691 self.assertEqual(socktype, socket.SOCK_STREAM)
692 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +0000693 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000694 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
695 # a server willing to support both IPv4 and IPv6 will
696 # usually do this
697 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
698 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +0000699 # test keyword arguments
700 a = socket.getaddrinfo(HOST, None)
701 b = socket.getaddrinfo(host=HOST, port=None)
702 self.assertEqual(a, b)
703 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
704 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
705 self.assertEqual(a, b)
706 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
707 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
708 self.assertEqual(a, b)
709 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
710 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
711 self.assertEqual(a, b)
712 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
713 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
714 self.assertEqual(a, b)
715 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
716 socket.AI_PASSIVE)
717 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
718 type=socket.SOCK_STREAM, proto=0,
719 flags=socket.AI_PASSIVE)
720 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +0000721 # Issue #6697.
722 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000723
Martin v. Löwis112c0f32010-08-25 07:38:15 +0000724 def test_getnameinfo(self):
725 # only IP addresses are allowed
726 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
727
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +0000728 @unittest.skipUnless(support.is_resource_enabled('network'),
729 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000730 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +0000731 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +0000732 # these should all be successful
733 socket.gethostbyname('испытание.python.org')
734 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +0000735 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
736 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
737 # have a reverse entry yet
738 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +0000739
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000740 def check_sendall_interrupted(self, with_timeout):
741 # socketpair() is not stricly required, but it makes things easier.
742 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
743 self.skipTest("signal.alarm and socket.socketpair required for this test")
744 # Our signal handlers clobber the C errno by calling a math function
745 # with an invalid domain value.
746 def ok_handler(*args):
747 self.assertRaises(ValueError, math.acosh, 0)
748 def raising_handler(*args):
749 self.assertRaises(ValueError, math.acosh, 0)
750 1 // 0
751 c, s = socket.socketpair()
752 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
753 try:
754 if with_timeout:
755 # Just above the one second minimum for signal.alarm
756 c.settimeout(1.5)
757 with self.assertRaises(ZeroDivisionError):
758 signal.alarm(1)
759 c.sendall(b"x" * (1024**2))
760 if with_timeout:
761 signal.signal(signal.SIGALRM, ok_handler)
762 signal.alarm(1)
763 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
764 finally:
765 signal.signal(signal.SIGALRM, old_alarm)
766 c.close()
767 s.close()
768
769 def test_sendall_interrupted(self):
770 self.check_sendall_interrupted(False)
771
772 def test_sendall_interrupted_with_timeout(self):
773 self.check_sendall_interrupted(True)
774
Antoine Pitroue033e062010-10-29 10:38:18 +0000775 def test_dealloc_warn(self):
776 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
777 r = repr(sock)
778 with self.assertWarns(ResourceWarning) as cm:
779 sock = None
780 support.gc_collect()
781 self.assertIn(r, str(cm.warning.args[0]))
782 # An open socket file object gets dereferenced after the socket
783 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
784 f = sock.makefile('rb')
785 r = repr(sock)
786 sock = None
787 support.gc_collect()
788 with self.assertWarns(ResourceWarning):
789 f = None
790 support.gc_collect()
791
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000792 def test_name_closed_socketio(self):
793 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
794 fp = sock.makefile("rb")
795 fp.close()
796 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
797
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100798 def test_pickle(self):
799 sock = socket.socket()
800 with sock:
801 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
802 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
803
Antoine Pitrou3cade992011-05-10 19:19:13 +0200804 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +0200805 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
806 srv.bind((HOST, 0))
807 # backlog = 0
808 srv.listen(0)
809 srv.close()
810
Antoine Pitrou6d7df632010-09-27 17:52:25 +0000811
Victor Stinner45df8202010-04-28 22:31:17 +0000812@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000813class BasicTCPTest(SocketConnectedTest):
814
815 def __init__(self, methodName='runTest'):
816 SocketConnectedTest.__init__(self, methodName=methodName)
817
818 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000819 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000820 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000821 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000822
823 def _testRecv(self):
824 self.serv_conn.send(MSG)
825
826 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000827 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000828 seg1 = self.cli_conn.recv(len(MSG) - 3)
829 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000830 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000831 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000832
833 def _testOverFlowRecv(self):
834 self.serv_conn.send(MSG)
835
836 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000837 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000838 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000839 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000840
841 def _testRecvFrom(self):
842 self.serv_conn.send(MSG)
843
844 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000845 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000846 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
847 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +0000848 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +0000849 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000850
851 def _testOverFlowRecvFrom(self):
852 self.serv_conn.send(MSG)
853
854 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000855 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000856 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +0000857 while 1:
858 read = self.cli_conn.recv(1024)
859 if not read:
860 break
Guido van Rossume531e292002-08-08 20:28:34 +0000861 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000862 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000863
864 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000865 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +0000866 self.serv_conn.sendall(big_chunk)
867
868 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000869 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000870 fd = self.cli_conn.fileno()
871 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000872 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000873 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000874 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000875 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000876
877 def _testFromFd(self):
878 self.serv_conn.send(MSG)
879
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000880 def testDup(self):
881 # Testing dup()
882 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +0000883 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000884 msg = sock.recv(1024)
885 self.assertEqual(msg, MSG)
886
887 def _testDup(self):
888 self.serv_conn.send(MSG)
889
Guido van Rossum24e4af82002-06-12 19:18:08 +0000890 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000891 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000892 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +0000893 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +0000894 # wait for _testShutdown to finish: on OS X, when the server
895 # closes the connection the client also becomes disconnected,
896 # and the client's shutdown call will fail. (Issue #4397.)
897 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000898
899 def _testShutdown(self):
900 self.serv_conn.send(MSG)
901 self.serv_conn.shutdown(2)
902
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000903 def testDetach(self):
904 # Testing detach()
905 fileno = self.cli_conn.fileno()
906 f = self.cli_conn.detach()
907 self.assertEqual(f, fileno)
908 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000909 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
910 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000911 # ...but we can create another socket using the (still open)
912 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000913 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000914 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000915 msg = sock.recv(1024)
916 self.assertEqual(msg, MSG)
917
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000918 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000919 self.serv_conn.send(MSG)
920
Victor Stinner45df8202010-04-28 22:31:17 +0000921@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +0000922class BasicUDPTest(ThreadedUDPSocketTest):
923
924 def __init__(self, methodName='runTest'):
925 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
926
927 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000928 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000929 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000930 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931
932 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000933 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000934
Guido van Rossum1c938012002-06-12 21:17:20 +0000935 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000936 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +0000937 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +0000938 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000939
Guido van Rossum1c938012002-06-12 21:17:20 +0000940 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000941 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000942
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943 def testRecvFromNegative(self):
944 # Negative lengths passed to recvfrom should give ValueError.
945 self.assertRaises(ValueError, self.serv.recvfrom, -1)
946
947 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000948 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000949
Victor Stinner45df8202010-04-28 22:31:17 +0000950@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000951class TCPCloserTest(ThreadedTCPSocketTest):
952
953 def testClose(self):
954 conn, addr = self.serv.accept()
955 conn.close()
956
957 sd = self.cli
958 read, write, err = select.select([sd], [], [], 1.0)
959 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000960 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000961
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000962 # Calling close() many times should be safe.
963 conn.close()
964 conn.close()
965
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000966 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +0000967 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000968 time.sleep(1.0)
969
Victor Stinner45df8202010-04-28 22:31:17 +0000970@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +0000971class BasicSocketPairTest(SocketPairTest):
972
973 def __init__(self, methodName='runTest'):
974 SocketPairTest.__init__(self, methodName=methodName)
975
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000976 def _check_defaults(self, sock):
977 self.assertIsInstance(sock, socket.socket)
978 if hasattr(socket, 'AF_UNIX'):
979 self.assertEqual(sock.family, socket.AF_UNIX)
980 else:
981 self.assertEqual(sock.family, socket.AF_INET)
982 self.assertEqual(sock.type, socket.SOCK_STREAM)
983 self.assertEqual(sock.proto, 0)
984
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000985 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000986 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000987
988 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +0000989 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000990
Dave Cole331708b2004-08-09 04:51:41 +0000991 def testRecv(self):
992 msg = self.serv.recv(1024)
993 self.assertEqual(msg, MSG)
994
995 def _testRecv(self):
996 self.cli.send(MSG)
997
998 def testSend(self):
999 self.serv.send(MSG)
1000
1001 def _testSend(self):
1002 msg = self.cli.recv(1024)
1003 self.assertEqual(msg, MSG)
1004
Victor Stinner45df8202010-04-28 22:31:17 +00001005@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001006class NonBlockingTCPTests(ThreadedTCPSocketTest):
1007
1008 def __init__(self, methodName='runTest'):
1009 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
1010
1011 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001012 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00001013 self.serv.setblocking(0)
1014 start = time.time()
1015 try:
1016 self.serv.accept()
1017 except socket.error:
1018 pass
1019 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001020 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001021
1022 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00001023 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00001024
Antoine Pitroub1c54962010-10-14 15:05:38 +00001025 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02001026 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001027 def testInitNonBlocking(self):
1028 # reinit server socket
1029 self.serv.close()
1030 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00001031 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00001032 self.port = support.bind_port(self.serv)
1033 self.serv.listen(1)
1034 # actual testing
1035 start = time.time()
1036 try:
1037 self.serv.accept()
1038 except socket.error:
1039 pass
1040 end = time.time()
1041 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
1042
1043 def _testInitNonBlocking(self):
1044 pass
1045
Antoine Pitrou600232b2011-01-05 21:03:42 +00001046 def testInheritFlags(self):
1047 # Issue #7995: when calling accept() on a listening socket with a
1048 # timeout, the resulting socket should not be non-blocking.
1049 self.serv.settimeout(10)
1050 try:
1051 conn, addr = self.serv.accept()
1052 message = conn.recv(len(MSG))
1053 finally:
1054 conn.close()
1055 self.serv.settimeout(None)
1056
1057 def _testInheritFlags(self):
1058 time.sleep(0.1)
1059 self.cli.connect((HOST, self.port))
1060 time.sleep(0.5)
1061 self.cli.send(MSG)
1062
Guido van Rossum24e4af82002-06-12 19:18:08 +00001063 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001064 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00001065 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00001066 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001067 conn, addr = self.serv.accept()
1068 except socket.error:
1069 pass
1070 else:
1071 self.fail("Error trying to do non-blocking accept.")
1072 read, write, err = select.select([self.serv], [], [])
1073 if self.serv in read:
1074 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001075 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001076 else:
1077 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00001078
Guido van Rossum24e4af82002-06-12 19:18:08 +00001079 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001080 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00001081 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001082
1083 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001084 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00001085 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001086 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001087
1088 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001089 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00001090 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001091
1092 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001093 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00001094 conn, addr = self.serv.accept()
1095 conn.setblocking(0)
1096 try:
1097 msg = conn.recv(len(MSG))
1098 except socket.error:
1099 pass
1100 else:
1101 self.fail("Error trying to do non-blocking recv.")
1102 read, write, err = select.select([conn], [], [])
1103 if conn in read:
1104 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001105 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00001106 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001107 else:
1108 self.fail("Error during select call to non-blocking socket.")
1109
1110 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001111 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001112 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001113 self.cli.send(MSG)
1114
Victor Stinner45df8202010-04-28 22:31:17 +00001115@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001116class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001117 """Unit tests for the object returned by socket.makefile()
1118
Antoine Pitrou834bd812010-10-13 16:17:14 +00001119 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001120 the client connection. You can read from this file to
1121 get output from the server.
1122
Antoine Pitrou834bd812010-10-13 16:17:14 +00001123 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001124 server connection. You can write to this file to send output
1125 to the client.
1126 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00001127
Guido van Rossume9f66142002-08-07 15:46:19 +00001128 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001129 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00001130 errors = 'strict'
1131 newline = None
1132
1133 read_mode = 'rb'
1134 read_msg = MSG
1135 write_mode = 'wb'
1136 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00001137
Guido van Rossum24e4af82002-06-12 19:18:08 +00001138 def __init__(self, methodName='runTest'):
1139 SocketConnectedTest.__init__(self, methodName=methodName)
1140
1141 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001142 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
1143 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001144 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001145 self.read_file = self.cli_conn.makefile(
1146 self.read_mode, self.bufsize,
1147 encoding = self.encoding,
1148 errors = self.errors,
1149 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001150
1151 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001152 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001153 self.read_file.close()
1154 self.assertTrue(self.read_file.closed)
1155 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001156 SocketConnectedTest.tearDown(self)
1157
1158 def clientSetUp(self):
1159 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001160 self.write_file = self.serv_conn.makefile(
1161 self.write_mode, self.bufsize,
1162 encoding = self.encoding,
1163 errors = self.errors,
1164 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001165
1166 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00001167 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00001168 self.write_file.close()
1169 self.assertTrue(self.write_file.closed)
1170 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00001171 SocketConnectedTest.clientTearDown(self)
1172
Antoine Pitrou68e5c042011-02-25 23:07:44 +00001173 def testReadAfterTimeout(self):
1174 # Issue #7322: A file object must disallow further reads
1175 # after a timeout has occurred.
1176 self.cli_conn.settimeout(1)
1177 self.read_file.read(3)
1178 # First read raises a timeout
1179 self.assertRaises(socket.timeout, self.read_file.read, 1)
1180 # Second read is disallowed
1181 with self.assertRaises(IOError) as ctx:
1182 self.read_file.read(1)
1183 self.assertIn("cannot read from timed out object", str(ctx.exception))
1184
1185 def _testReadAfterTimeout(self):
1186 self.write_file.write(self.write_msg[0:3])
1187 self.write_file.flush()
1188 self.serv_finished.wait()
1189
Guido van Rossum24e4af82002-06-12 19:18:08 +00001190 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001191 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001192 first_seg = self.read_file.read(len(self.read_msg)-3)
1193 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00001194 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00001195 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001196
1197 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001198 self.write_file.write(self.write_msg)
1199 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001200
Guido van Rossum8c943832002-08-08 01:00:28 +00001201 def testFullRead(self):
1202 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001203 msg = self.read_file.read()
1204 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00001205
1206 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001207 self.write_file.write(self.write_msg)
1208 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00001209
Guido van Rossum24e4af82002-06-12 19:18:08 +00001210 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001211 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001212 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001213 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00001214 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00001215 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00001216 break
Guido van Rossum8c943832002-08-08 01:00:28 +00001217 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00001218 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001219
1220 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001221 self.write_file.write(self.write_msg)
1222 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001223
1224 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001225 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00001226 line = self.read_file.readline()
1227 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001228
1229 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001230 self.write_file.write(self.write_msg)
1231 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001232
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001233 def testCloseAfterMakefile(self):
1234 # The file returned by makefile should keep the socket open.
1235 self.cli_conn.close()
1236 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00001237 msg = self.read_file.read()
1238 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001239
1240 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001241 self.write_file.write(self.write_msg)
1242 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001243
1244 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001245 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001246 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00001247 if isinstance(self.read_msg, str):
1248 msg = msg.decode()
1249 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001250
1251 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001252 self.write_file.write(self.write_msg)
1253 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00001254
Tim Peters116d83c2004-03-28 02:20:45 +00001255 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001256 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001257
1258 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001259 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00001260
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001261 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001262 self.assertEqual(self.read_file.mode, self.read_mode)
1263 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001264
1265 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001266 self.assertEqual(self.write_file.mode, self.write_mode)
1267 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00001268
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001269 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001270 self.read_file.close()
1271 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001272 self.cli_conn.close()
1273 self.assertRaises(socket.error, self.cli_conn.getsockname)
1274
1275 def _testRealClose(self):
1276 pass
1277
1278
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001279class FileObjectInterruptedTestCase(unittest.TestCase):
1280 """Test that the file object correctly handles EINTR internally."""
1281
1282 class MockSocket(object):
1283 def __init__(self, recv_funcs=()):
1284 # A generator that returns callables that we'll call for each
1285 # call to recv().
1286 self._recv_step = iter(recv_funcs)
1287
1288 def recv_into(self, buffer):
1289 data = next(self._recv_step)()
1290 assert len(buffer) >= len(data)
1291 buffer[:len(data)] = data
1292 return len(data)
1293
1294 def _decref_socketios(self):
1295 pass
1296
1297 def _textiowrap_for_test(self, buffering=-1):
1298 raw = socket.SocketIO(self, "r")
1299 if buffering < 0:
1300 buffering = io.DEFAULT_BUFFER_SIZE
1301 if buffering == 0:
1302 return raw
1303 buffer = io.BufferedReader(raw, buffering)
1304 text = io.TextIOWrapper(buffer, None, None)
1305 text.mode = "rb"
1306 return text
1307
1308 @staticmethod
1309 def _raise_eintr():
1310 raise socket.error(errno.EINTR)
1311
1312 def _textiowrap_mock_socket(self, mock, buffering=-1):
1313 raw = socket.SocketIO(mock, "r")
1314 if buffering < 0:
1315 buffering = io.DEFAULT_BUFFER_SIZE
1316 if buffering == 0:
1317 return raw
1318 buffer = io.BufferedReader(raw, buffering)
1319 text = io.TextIOWrapper(buffer, None, None)
1320 text.mode = "rb"
1321 return text
1322
1323 def _test_readline(self, size=-1, buffering=-1):
1324 mock_sock = self.MockSocket(recv_funcs=[
1325 lambda : b"This is the first line\nAnd the sec",
1326 self._raise_eintr,
1327 lambda : b"ond line is here\n",
1328 lambda : b"",
1329 lambda : b"", # XXX(gps): io library does an extra EOF read
1330 ])
1331 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001332 self.assertEqual(fo.readline(size), "This is the first line\n")
1333 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001334
1335 def _test_read(self, size=-1, buffering=-1):
1336 mock_sock = self.MockSocket(recv_funcs=[
1337 lambda : b"This is the first line\nAnd the sec",
1338 self._raise_eintr,
1339 lambda : b"ond line is here\n",
1340 lambda : b"",
1341 lambda : b"", # XXX(gps): io library does an extra EOF read
1342 ])
1343 expecting = (b"This is the first line\n"
1344 b"And the second line is here\n")
1345 fo = mock_sock._textiowrap_for_test(buffering=buffering)
1346 if buffering == 0:
1347 data = b''
1348 else:
1349 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001350 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001351 while len(data) != len(expecting):
1352 part = fo.read(size)
1353 if not part:
1354 break
1355 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00001356 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001357
1358 def test_default(self):
1359 self._test_readline()
1360 self._test_readline(size=100)
1361 self._test_read()
1362 self._test_read(size=100)
1363
1364 def test_with_1k_buffer(self):
1365 self._test_readline(buffering=1024)
1366 self._test_readline(size=100, buffering=1024)
1367 self._test_read(buffering=1024)
1368 self._test_read(size=100, buffering=1024)
1369
1370 def _test_readline_no_buffer(self, size=-1):
1371 mock_sock = self.MockSocket(recv_funcs=[
1372 lambda : b"a",
1373 lambda : b"\n",
1374 lambda : b"B",
1375 self._raise_eintr,
1376 lambda : b"b",
1377 lambda : b"",
1378 ])
1379 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001380 self.assertEqual(fo.readline(size), b"a\n")
1381 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00001382
1383 def test_no_buffer(self):
1384 self._test_readline_no_buffer()
1385 self._test_readline_no_buffer(size=4)
1386 self._test_read(buffering=0)
1387 self._test_read(size=100, buffering=0)
1388
1389
Guido van Rossume9f66142002-08-07 15:46:19 +00001390class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
1391
1392 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00001393
Guido van Rossume9f66142002-08-07 15:46:19 +00001394 In this case (and in this case only), it should be possible to
1395 create a file object, read a line from it, create another file
1396 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00001397 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00001398 when reading multiple requests from the same socket."""
1399
1400 bufsize = 0 # Use unbuffered mode
1401
1402 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001403 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00001404 line = self.read_file.readline() # first line
1405 self.assertEqual(line, b"A. " + self.write_msg) # first line
1406 self.read_file = self.cli_conn.makefile('rb', 0)
1407 line = self.read_file.readline() # second line
1408 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00001409
1410 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001411 self.write_file.write(b"A. " + self.write_msg)
1412 self.write_file.write(b"B. " + self.write_msg)
1413 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00001414
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001415 def testMakefileClose(self):
1416 # The file returned by makefile should keep the socket open...
1417 self.cli_conn.close()
1418 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001419 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001420 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00001421 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001422 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1423
1424 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001425 self.write_file.write(self.write_msg)
1426 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001427
1428 def testMakefileCloseSocketDestroy(self):
1429 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001430 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001431 refcount_after = sys.getrefcount(self.cli_conn)
1432 self.assertEqual(refcount_before - 1, refcount_after)
1433
1434 def _testMakefileCloseSocketDestroy(self):
1435 pass
1436
Antoine Pitrou98b46702010-09-18 22:59:00 +00001437 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00001438 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00001439 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
1440
1441 def testSmallReadNonBlocking(self):
1442 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001443 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
1444 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001445 self.evt1.set()
1446 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001447 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02001448 if first_seg is None:
1449 # Data not arrived (can happen under Windows), wait a bit
1450 time.sleep(0.5)
1451 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001452 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001453 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001454 self.assertEqual(n, 3)
1455 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00001456 self.assertEqual(msg, self.read_msg)
1457 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
1458 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001459
1460 def _testSmallReadNonBlocking(self):
1461 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00001462 self.write_file.write(self.write_msg)
1463 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00001464 self.evt2.set()
1465 # Avoid cloding the socket before the server test has finished,
1466 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
1467 self.serv_finished.wait(5.0)
1468
1469 def testWriteNonBlocking(self):
1470 self.cli_finished.wait(5.0)
1471 # The client thread can't skip directly - the SkipTest exception
1472 # would appear as a failure.
1473 if self.serv_skipped:
1474 self.skipTest(self.serv_skipped)
1475
1476 def _testWriteNonBlocking(self):
1477 self.serv_skipped = None
1478 self.serv_conn.setblocking(False)
1479 # Try to saturate the socket buffer pipe with repeated large writes.
1480 BIG = b"x" * (1024 ** 2)
1481 LIMIT = 10
1482 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00001483 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001484 self.assertGreater(n, 0)
1485 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00001486 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00001487 if n is None:
1488 # Succeeded
1489 break
1490 self.assertGreater(n, 0)
1491 else:
1492 # Let us know that this test didn't manage to establish
1493 # the expected conditions. This is not a failure in itself but,
1494 # if it happens repeatedly, the test should be fixed.
1495 self.serv_skipped = "failed to saturate the socket buffer"
1496
Gregory P. Smithde3369f2009-01-12 04:50:11 +00001497
Guido van Rossum8c943832002-08-08 01:00:28 +00001498class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1499
1500 bufsize = 1 # Default-buffered for reading; line-buffered for writing
1501
1502
1503class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
1504
1505 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00001506
Thomas Woutersb2137042007-02-01 18:02:27 +00001507
Antoine Pitrou834bd812010-10-13 16:17:14 +00001508class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
1509 """Tests for socket.makefile() in text mode (rather than binary)"""
1510
1511 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001512 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001513 write_mode = 'wb'
1514 write_msg = MSG
1515 newline = ''
1516
1517
1518class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
1519 """Tests for socket.makefile() in text mode (rather than binary)"""
1520
1521 read_mode = 'rb'
1522 read_msg = MSG
1523 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001524 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001525 newline = ''
1526
1527
1528class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
1529 """Tests for socket.makefile() in text mode (rather than binary)"""
1530
1531 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001532 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001533 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001534 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00001535 newline = ''
1536
1537
Guido van Rossumd8faa362007-04-27 19:54:29 +00001538class NetworkConnectionTest(object):
1539 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001540
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001542 # We're inherited below by BasicTCPTest2, which also inherits
1543 # BasicTCPTest, which defines self.port referenced below.
1544 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545 self.serv_conn = self.cli
1546
1547class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
1548 """Tests that NetworkConnection does not break existing TCP functionality.
1549 """
1550
1551class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001552
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001553 class MockSocket(socket.socket):
1554 def connect(self, *args):
1555 raise socket.timeout('timed out')
1556
1557 @contextlib.contextmanager
1558 def mocked_socket_module(self):
1559 """Return a socket which times out on connect"""
1560 old_socket = socket.socket
1561 socket.socket = self.MockSocket
1562 try:
1563 yield
1564 finally:
1565 socket.socket = old_socket
1566
1567 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001568 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001569 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001570 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00001571 with self.assertRaises(socket.error) as cm:
1572 cli.connect((HOST, port))
1573 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1574
1575 def test_create_connection(self):
1576 # Issue #9792: errors raised by create_connection() should have
1577 # a proper errno attribute.
1578 port = support.find_unused_port()
1579 with self.assertRaises(socket.error) as cm:
1580 socket.create_connection((HOST, port))
1581 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
1582
1583 def test_create_connection_timeout(self):
1584 # Issue #9792: create_connection() should not recast timeout errors
1585 # as generic socket errors.
1586 with self.mocked_socket_module():
1587 with self.assertRaises(socket.timeout):
1588 socket.create_connection((HOST, 1234))
1589
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590
Victor Stinner45df8202010-04-28 22:31:17 +00001591@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001592class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
1593
1594 def __init__(self, methodName='runTest'):
1595 SocketTCPTest.__init__(self, methodName=methodName)
1596 ThreadableTest.__init__(self)
1597
1598 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001599 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001600
1601 def clientTearDown(self):
1602 self.cli.close()
1603 self.cli = None
1604 ThreadableTest.clientTearDown(self)
1605
1606 def _justAccept(self):
1607 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001608 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001609
1610 testFamily = _justAccept
1611 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001612 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001613 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001614 self.assertEqual(self.cli.family, 2)
1615
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001616 testSourceAddress = _justAccept
1617 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00001618 self.cli = socket.create_connection((HOST, self.port), timeout=30,
1619 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001620 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00001621 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00001622 # The port number being used is sufficient to show that the bind()
1623 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00001624
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 testTimeoutDefault = _justAccept
1626 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00001627 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001628 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001629 socket.setdefaulttimeout(42)
1630 try:
1631 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00001632 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001633 finally:
1634 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001635 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001636
1637 testTimeoutNone = _justAccept
1638 def _testTimeoutNone(self):
1639 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001640 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001641 socket.setdefaulttimeout(30)
1642 try:
1643 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001644 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00001645 finally:
1646 socket.setdefaulttimeout(None)
1647 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001648
1649 testTimeoutValueNamed = _justAccept
1650 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001651 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001652 self.assertEqual(self.cli.gettimeout(), 30)
1653
1654 testTimeoutValueNonamed = _justAccept
1655 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001656 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001657 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001658 self.assertEqual(self.cli.gettimeout(), 30)
1659
Victor Stinner45df8202010-04-28 22:31:17 +00001660@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001661class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
1662
1663 def __init__(self, methodName='runTest'):
1664 SocketTCPTest.__init__(self, methodName=methodName)
1665 ThreadableTest.__init__(self)
1666
1667 def clientSetUp(self):
1668 pass
1669
1670 def clientTearDown(self):
1671 self.cli.close()
1672 self.cli = None
1673 ThreadableTest.clientTearDown(self)
1674
1675 def testInsideTimeout(self):
1676 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001677 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001678 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001679 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001680 testOutsideTimeout = testInsideTimeout
1681
1682 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001683 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001684 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001685 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001686
1687 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001688 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001689 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001690
1691
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001692class TCPTimeoutTest(SocketTCPTest):
1693
1694 def testTCPTimeout(self):
1695 def raise_timeout(*args, **kwargs):
1696 self.serv.settimeout(1.0)
1697 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001698 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001699 "Error generating a timeout exception (TCP)")
1700
1701 def testTimeoutZero(self):
1702 ok = False
1703 try:
1704 self.serv.settimeout(0.0)
1705 foo = self.serv.accept()
1706 except socket.timeout:
1707 self.fail("caught timeout instead of error (TCP)")
1708 except socket.error:
1709 ok = True
1710 except:
1711 self.fail("caught unexpected exception (TCP)")
1712 if not ok:
1713 self.fail("accept() returned success when we did not expect it")
1714
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001715 def testInterruptedTimeout(self):
1716 # XXX I don't know how to do this test on MSWindows or any other
1717 # plaform that doesn't support signal.alarm() or os.kill(), though
1718 # the bug should have existed on all platforms.
1719 if not hasattr(signal, "alarm"):
1720 return # can only test on *nix
1721 self.serv.settimeout(5.0) # must be longer than alarm
1722 class Alarm(Exception):
1723 pass
1724 def alarm_handler(signal, frame):
1725 raise Alarm
1726 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
1727 try:
1728 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
1729 try:
1730 foo = self.serv.accept()
1731 except socket.timeout:
1732 self.fail("caught timeout instead of Alarm")
1733 except Alarm:
1734 pass
1735 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00001736 self.fail("caught other exception instead of Alarm:"
1737 " %s(%s):\n%s" %
1738 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001739 else:
1740 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00001741 finally:
1742 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001743 except Alarm:
1744 self.fail("got Alarm in wrong place")
1745 finally:
1746 # no alarm can be pending. Safe to restore old handler.
1747 signal.signal(signal.SIGALRM, old_alarm)
1748
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001749class UDPTimeoutTest(SocketTCPTest):
1750
1751 def testUDPTimeout(self):
1752 def raise_timeout(*args, **kwargs):
1753 self.serv.settimeout(1.0)
1754 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001755 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001756 "Error generating a timeout exception (UDP)")
1757
1758 def testTimeoutZero(self):
1759 ok = False
1760 try:
1761 self.serv.settimeout(0.0)
1762 foo = self.serv.recv(1024)
1763 except socket.timeout:
1764 self.fail("caught timeout instead of error (UDP)")
1765 except socket.error:
1766 ok = True
1767 except:
1768 self.fail("caught unexpected exception (UDP)")
1769 if not ok:
1770 self.fail("recv() returned success when we did not expect it")
1771
1772class TestExceptions(unittest.TestCase):
1773
1774 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001775 self.assertTrue(issubclass(socket.error, Exception))
1776 self.assertTrue(issubclass(socket.herror, socket.error))
1777 self.assertTrue(issubclass(socket.gaierror, socket.error))
1778 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001779
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001780class TestLinuxAbstractNamespace(unittest.TestCase):
1781
1782 UNIX_PATH_MAX = 108
1783
1784 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001785 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00001786 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
1787 s1.bind(address)
1788 s1.listen(1)
1789 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
1790 s2.connect(s1.getsockname())
1791 with s1.accept()[0] as s3:
1792 self.assertEqual(s1.getsockname(), address)
1793 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001794
1795 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001796 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00001797 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1798 s.bind(address)
1799 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001800
1801 def testNameOverflow(self):
1802 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00001803 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
1804 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805
Raymond Hettinger11a35f52003-06-29 04:40:22 +00001806
Victor Stinner45df8202010-04-28 22:31:17 +00001807@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808class BufferIOTest(SocketConnectedTest):
1809 """
1810 Test the buffer versions of socket.recv() and socket.send().
1811 """
1812 def __init__(self, methodName='runTest'):
1813 SocketConnectedTest.__init__(self, methodName=methodName)
1814
Antoine Pitrou25480782010-03-17 22:50:28 +00001815 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001816 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001817 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001818 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001819 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001820 self.assertEqual(msg, MSG)
1821
Antoine Pitrou25480782010-03-17 22:50:28 +00001822 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001823 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824 self.serv_conn.send(buf)
1825
Antoine Pitrou25480782010-03-17 22:50:28 +00001826 def testRecvIntoBytearray(self):
1827 buf = bytearray(1024)
1828 nbytes = self.cli_conn.recv_into(buf)
1829 self.assertEqual(nbytes, len(MSG))
1830 msg = buf[:len(MSG)]
1831 self.assertEqual(msg, MSG)
1832
1833 _testRecvIntoBytearray = _testRecvIntoArray
1834
1835 def testRecvIntoMemoryview(self):
1836 buf = bytearray(1024)
1837 nbytes = self.cli_conn.recv_into(memoryview(buf))
1838 self.assertEqual(nbytes, len(MSG))
1839 msg = buf[:len(MSG)]
1840 self.assertEqual(msg, MSG)
1841
1842 _testRecvIntoMemoryview = _testRecvIntoArray
1843
1844 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001845 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001846 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001848 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849 self.assertEqual(msg, MSG)
1850
Antoine Pitrou25480782010-03-17 22:50:28 +00001851 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00001852 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001853 self.serv_conn.send(buf)
1854
Antoine Pitrou25480782010-03-17 22:50:28 +00001855 def testRecvFromIntoBytearray(self):
1856 buf = bytearray(1024)
1857 nbytes, addr = self.cli_conn.recvfrom_into(buf)
1858 self.assertEqual(nbytes, len(MSG))
1859 msg = buf[:len(MSG)]
1860 self.assertEqual(msg, MSG)
1861
1862 _testRecvFromIntoBytearray = _testRecvFromIntoArray
1863
1864 def testRecvFromIntoMemoryview(self):
1865 buf = bytearray(1024)
1866 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
1867 self.assertEqual(nbytes, len(MSG))
1868 msg = buf[:len(MSG)]
1869 self.assertEqual(msg, MSG)
1870
1871 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
1872
Christian Heimes043d6f62008-01-07 17:19:16 +00001873
1874TIPC_STYPE = 2000
1875TIPC_LOWER = 200
1876TIPC_UPPER = 210
1877
1878def isTipcAvailable():
1879 """Check if the TIPC module is loaded
1880
1881 The TIPC module is not loaded automatically on Ubuntu and probably
1882 other Linux distros.
1883 """
1884 if not hasattr(socket, "AF_TIPC"):
1885 return False
1886 if not os.path.isfile("/proc/modules"):
1887 return False
1888 with open("/proc/modules") as f:
1889 for line in f:
1890 if line.startswith("tipc "):
1891 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001892 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00001893 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
1894 return False
1895
1896class TIPCTest (unittest.TestCase):
1897 def testRDM(self):
1898 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1899 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
1900
1901 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1902 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1903 TIPC_LOWER, TIPC_UPPER)
1904 srv.bind(srvaddr)
1905
1906 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1907 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1908 cli.sendto(MSG, sendaddr)
1909
1910 msg, recvaddr = srv.recvfrom(1024)
1911
1912 self.assertEqual(cli.getsockname(), recvaddr)
1913 self.assertEqual(msg, MSG)
1914
1915
1916class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
1917 def __init__(self, methodName = 'runTest'):
1918 unittest.TestCase.__init__(self, methodName = methodName)
1919 ThreadableTest.__init__(self)
1920
1921 def setUp(self):
1922 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1923 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1924 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
1925 TIPC_LOWER, TIPC_UPPER)
1926 self.srv.bind(srvaddr)
1927 self.srv.listen(5)
1928 self.serverExplicitReady()
1929 self.conn, self.connaddr = self.srv.accept()
1930
1931 def clientSetUp(self):
1932 # The is a hittable race between serverExplicitReady() and the
1933 # accept() call; sleep a little while to avoid it, otherwise
1934 # we could get an exception
1935 time.sleep(0.1)
1936 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
1937 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
1938 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
1939 self.cli.connect(addr)
1940 self.cliaddr = self.cli.getsockname()
1941
1942 def testStream(self):
1943 msg = self.conn.recv(1024)
1944 self.assertEqual(msg, MSG)
1945 self.assertEqual(self.cliaddr, self.connaddr)
1946
1947 def _testStream(self):
1948 self.cli.send(MSG)
1949 self.cli.close()
1950
1951
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001952@unittest.skipUnless(thread, 'Threading required for this test.')
1953class ContextManagersTest(ThreadedTCPSocketTest):
1954
1955 def _testSocketClass(self):
1956 # base test
1957 with socket.socket() as sock:
1958 self.assertFalse(sock._closed)
1959 self.assertTrue(sock._closed)
1960 # close inside with block
1961 with socket.socket() as sock:
1962 sock.close()
1963 self.assertTrue(sock._closed)
1964 # exception inside with block
1965 with socket.socket() as sock:
1966 self.assertRaises(socket.error, sock.sendall, b'foo')
1967 self.assertTrue(sock._closed)
1968
1969 def testCreateConnectionBase(self):
1970 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001971 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001972 data = conn.recv(1024)
1973 conn.sendall(data)
1974
1975 def _testCreateConnectionBase(self):
1976 address = self.serv.getsockname()
1977 with socket.create_connection(address) as sock:
1978 self.assertFalse(sock._closed)
1979 sock.sendall(b'foo')
1980 self.assertEqual(sock.recv(1024), b'foo')
1981 self.assertTrue(sock._closed)
1982
1983 def testCreateConnectionClose(self):
1984 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001985 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00001986 data = conn.recv(1024)
1987 conn.sendall(data)
1988
1989 def _testCreateConnectionClose(self):
1990 address = self.serv.getsockname()
1991 with socket.create_connection(address) as sock:
1992 sock.close()
1993 self.assertTrue(sock._closed)
1994 self.assertRaises(socket.error, sock.sendall, b'foo')
1995
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00001996
Antoine Pitroub1c54962010-10-14 15:05:38 +00001997@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
1998 "SOCK_CLOEXEC not defined")
1999@unittest.skipUnless(fcntl, "module fcntl not available")
2000class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02002001 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002002 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00002003 with socket.socket(socket.AF_INET,
2004 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
2005 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
2006 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002007
2008
2009@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
2010 "SOCK_NONBLOCK not defined")
2011class NonblockConstantTest(unittest.TestCase):
2012 def checkNonblock(self, s, nonblock=True, timeout=0.0):
2013 if nonblock:
2014 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
2015 self.assertEqual(s.gettimeout(), timeout)
2016 else:
2017 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
2018 self.assertEqual(s.gettimeout(), None)
2019
Charles-François Natali239bb962011-06-03 12:55:15 +02002020 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002021 def test_SOCK_NONBLOCK(self):
2022 # a lot of it seems silly and redundant, but I wanted to test that
2023 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00002024 with socket.socket(socket.AF_INET,
2025 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
2026 self.checkNonblock(s)
2027 s.setblocking(1)
2028 self.checkNonblock(s, False)
2029 s.setblocking(0)
2030 self.checkNonblock(s)
2031 s.settimeout(None)
2032 self.checkNonblock(s, False)
2033 s.settimeout(2.0)
2034 self.checkNonblock(s, timeout=2.0)
2035 s.setblocking(1)
2036 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002037 # defaulttimeout
2038 t = socket.getdefaulttimeout()
2039 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002040 with socket.socket() as s:
2041 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002042 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002043 with socket.socket() as s:
2044 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002045 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002046 with socket.socket() as s:
2047 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002048 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00002049 with socket.socket() as s:
2050 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00002051 socket.setdefaulttimeout(t)
2052
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002053
Guido van Rossumb995eb72002-07-31 16:08:40 +00002054def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002055 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00002056 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00002057
2058 tests.extend([
2059 NonBlockingTCPTests,
2060 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00002061 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00002062 UnbufferedFileObjectClassTestCase,
2063 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00002064 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00002065 UnicodeReadFileObjectClassTestCase,
2066 UnicodeWriteFileObjectClassTestCase,
2067 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002068 NetworkConnectionNoServer,
2069 NetworkConnectionAttributesTest,
2070 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00002071 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00002072 CloexecConstantTest,
2073 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00002074 ])
Dave Cole331708b2004-08-09 04:51:41 +00002075 if hasattr(socket, "socketpair"):
2076 tests.append(BasicSocketPairTest)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002077 if sys.platform == 'linux2':
2078 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00002079 if isTipcAvailable():
2080 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00002081 tests.append(TIPCThreadableTest)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002082
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002083 thread_info = support.threading_setup()
2084 support.run_unittest(*tests)
2085 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002086
2087if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00002088 test_main()