blob: bbcdc25672ac56cb7da8f28994649a5f7fb3992b [file] [log] [blame]
Guido van Rossumaa6a6642002-06-12 19:57:18 +00001"""Unit tests for socket timeout feature."""
Guido van Rossum67f7a382002-06-06 21:08:16 +00002
3import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Guido van Rossum67f7a382002-06-06 21:08:16 +00005
Neal Norwitz55b61d22003-02-28 19:57:03 +00006# This requires the 'network' resource as given on the regrtest command line.
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007skip_expected = not support.is_resource_enabled('network')
Neal Norwitz55b61d22003-02-28 19:57:03 +00008
Guido van Rossum67f7a382002-06-06 21:08:16 +00009import time
10import socket
11
Guido van Rossumaa6a6642002-06-12 19:57:18 +000012
Guido van Rossum24e4af82002-06-12 19:18:08 +000013class CreationTestCase(unittest.TestCase):
Guido van Rossum28774da2002-06-12 20:22:49 +000014 """Test case for socket.gettimeout() and socket.settimeout()"""
Guido van Rossumaa6a6642002-06-12 19:57:18 +000015
Guido van Rossum67f7a382002-06-06 21:08:16 +000016 def setUp(self):
Guido van Rossum28774da2002-06-12 20:22:49 +000017 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum67f7a382002-06-06 21:08:16 +000018
19 def tearDown(self):
Guido van Rossum28774da2002-06-12 20:22:49 +000020 self.sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +000021
22 def testObjectCreation(self):
Guido van Rossumae469312002-08-22 20:22:16 +000023 # Test Socket creation
Guido van Rossum28774da2002-06-12 20:22:49 +000024 self.assertEqual(self.sock.gettimeout(), None,
25 "timeout not disabled by default")
Guido van Rossum67f7a382002-06-06 21:08:16 +000026
27 def testFloatReturnValue(self):
Guido van Rossumae469312002-08-22 20:22:16 +000028 # Test return value of gettimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000029 self.sock.settimeout(7.345)
30 self.assertEqual(self.sock.gettimeout(), 7.345)
Guido van Rossum67f7a382002-06-06 21:08:16 +000031
Guido van Rossum28774da2002-06-12 20:22:49 +000032 self.sock.settimeout(3)
33 self.assertEqual(self.sock.gettimeout(), 3)
34
35 self.sock.settimeout(None)
36 self.assertEqual(self.sock.gettimeout(), None)
Guido van Rossum67f7a382002-06-06 21:08:16 +000037
38 def testReturnType(self):
Guido van Rossumae469312002-08-22 20:22:16 +000039 # Test return type of gettimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000040 self.sock.settimeout(1)
41 self.assertEqual(type(self.sock.gettimeout()), type(1.0))
Guido van Rossum67f7a382002-06-06 21:08:16 +000042
Guido van Rossum28774da2002-06-12 20:22:49 +000043 self.sock.settimeout(3.9)
44 self.assertEqual(type(self.sock.gettimeout()), type(1.0))
Guido van Rossumaa6a6642002-06-12 19:57:18 +000045
46 def testTypeCheck(self):
Guido van Rossumae469312002-08-22 20:22:16 +000047 # Test type checking by settimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000048 self.sock.settimeout(0)
Guido van Rossume2a383d2007-01-15 16:59:06 +000049 self.sock.settimeout(0)
Guido van Rossum28774da2002-06-12 20:22:49 +000050 self.sock.settimeout(0.0)
51 self.sock.settimeout(None)
52 self.assertRaises(TypeError, self.sock.settimeout, "")
Guido van Rossumef87d6e2007-05-02 19:09:54 +000053 self.assertRaises(TypeError, self.sock.settimeout, "")
Guido van Rossum28774da2002-06-12 20:22:49 +000054 self.assertRaises(TypeError, self.sock.settimeout, ())
55 self.assertRaises(TypeError, self.sock.settimeout, [])
56 self.assertRaises(TypeError, self.sock.settimeout, {})
57 self.assertRaises(TypeError, self.sock.settimeout, 0j)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000058
59 def testRangeCheck(self):
Guido van Rossumae469312002-08-22 20:22:16 +000060 # Test range checking by settimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000061 self.assertRaises(ValueError, self.sock.settimeout, -1)
Guido van Rossume2a383d2007-01-15 16:59:06 +000062 self.assertRaises(ValueError, self.sock.settimeout, -1)
Guido van Rossum28774da2002-06-12 20:22:49 +000063 self.assertRaises(ValueError, self.sock.settimeout, -1.0)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000064
Guido van Rossum11ba0942002-06-13 15:07:44 +000065 def testTimeoutThenBlocking(self):
Guido van Rossumae469312002-08-22 20:22:16 +000066 # Test settimeout() followed by setblocking()
Guido van Rossum28774da2002-06-12 20:22:49 +000067 self.sock.settimeout(10)
68 self.sock.setblocking(1)
69 self.assertEqual(self.sock.gettimeout(), None)
70 self.sock.setblocking(0)
Guido van Rossum11ba0942002-06-13 15:07:44 +000071 self.assertEqual(self.sock.gettimeout(), 0.0)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000072
Guido van Rossum28774da2002-06-12 20:22:49 +000073 self.sock.settimeout(10)
74 self.sock.setblocking(0)
Guido van Rossum11ba0942002-06-13 15:07:44 +000075 self.assertEqual(self.sock.gettimeout(), 0.0)
Guido van Rossum28774da2002-06-12 20:22:49 +000076 self.sock.setblocking(1)
77 self.assertEqual(self.sock.gettimeout(), None)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000078
79 def testBlockingThenTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +000080 # Test setblocking() followed by settimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000081 self.sock.setblocking(0)
82 self.sock.settimeout(1)
83 self.assertEqual(self.sock.gettimeout(), 1)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000084
Guido van Rossum28774da2002-06-12 20:22:49 +000085 self.sock.setblocking(1)
86 self.sock.settimeout(1)
87 self.assertEqual(self.sock.gettimeout(), 1)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000088
Guido van Rossum67f7a382002-06-06 21:08:16 +000089
Guido van Rossum24e4af82002-06-12 19:18:08 +000090class TimeoutTestCase(unittest.TestCase):
Guido van Rossum28774da2002-06-12 20:22:49 +000091 """Test case for socket.socket() timeout functions"""
92
Tim Peters14821c52003-02-21 16:45:41 +000093 # There are a number of tests here trying to make sure that an operation
94 # doesn't take too much longer than expected. But competing machine
95 # activity makes it inevitable that such tests will fail at times.
96 # When fuzz was at 1.0, I (tim) routinely saw bogus failures on Win2K
97 # and Win98SE. Boosting it to 2.0 helped a lot, but isn't a real
98 # solution.
99 fuzz = 2.0
Guido van Rossumaa6a6642002-06-12 19:57:18 +0000100
Guido van Rossum67f7a382002-06-06 21:08:16 +0000101 def setUp(self):
Guido van Rossum28774da2002-06-12 20:22:49 +0000102 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000103 self.addr_remote = ('www.python.org.', 80)
R. David Murraye9e95932010-02-06 05:00:15 +0000104 self.localhost = '127.0.0.1'
Guido van Rossum67f7a382002-06-06 21:08:16 +0000105
106 def tearDown(self):
Guido van Rossum28774da2002-06-12 20:22:49 +0000107 self.sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000108
109 def testConnectTimeout(self):
Christian Heimesf6cd9672008-03-26 13:45:42 +0000110 # Choose a private address that is unlikely to exist to prevent
111 # failures due to the connect succeeding before the timeout.
112 # Use a dotted IP address to avoid including the DNS lookup time
Christian Heimesfe337bf2008-03-23 21:54:12 +0000113 # with the connect time. This avoids failing the assertion that
114 # the timeout occurred fast enough.
Christian Heimesf6cd9672008-03-26 13:45:42 +0000115 addr = ('10.0.0.0', 12345)
Christian Heimesfe337bf2008-03-23 21:54:12 +0000116
117 # Test connect() timeout
118 _timeout = 0.001
119 self.sock.settimeout(_timeout)
120
Guido van Rossum67f7a382002-06-06 21:08:16 +0000121 _t1 = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000122 self.assertRaises(socket.error, self.sock.connect, addr)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000123 _t2 = time.time()
124
125 _delta = abs(_t1 - _t2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000126 self.assertTrue(_delta < _timeout + self.fuzz,
Anthony Baxter01e80b42004-06-11 15:57:49 +0000127 "timeout (%g) is more than %g seconds more than expected (%g)"
Guido van Rossum28774da2002-06-12 20:22:49 +0000128 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000129
130 def testRecvTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000131 # Test recv() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000132 _timeout = 0.02
Guido van Rossum67f7a382002-06-06 21:08:16 +0000133
Antoine Pitrou83432ba2010-10-29 18:15:33 +0000134 with support.transient_internet(self.addr_remote[0]):
135 self.sock.connect(self.addr_remote)
136 self.sock.settimeout(_timeout)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000137
Antoine Pitrou83432ba2010-10-29 18:15:33 +0000138 _t1 = time.time()
139 self.assertRaises(socket.timeout, self.sock.recv, 1024)
140 _t2 = time.time()
141
142 _delta = abs(_t1 - _t2)
143 self.assertTrue(_delta < _timeout + self.fuzz,
144 "timeout (%g) is %g seconds more than expected (%g)"
145 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000146
147 def testAcceptTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000148 # Test accept() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000149 _timeout = 2
Guido van Rossum28774da2002-06-12 20:22:49 +0000150 self.sock.settimeout(_timeout)
R. David Murraye9e95932010-02-06 05:00:15 +0000151 # Prevent "Address already in use" socket exceptions
152 support.bind_port(self.sock, self.localhost)
Guido van Rossum28774da2002-06-12 20:22:49 +0000153 self.sock.listen(5)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000154
155 _t1 = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000156 self.assertRaises(socket.error, self.sock.accept)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000157 _t2 = time.time()
158
159 _delta = abs(_t1 - _t2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000160 self.assertTrue(_delta < _timeout + self.fuzz,
Guido van Rossum28774da2002-06-12 20:22:49 +0000161 "timeout (%g) is %g seconds more than expected (%g)"
162 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000163
164 def testRecvfromTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000165 # Test recvfrom() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000166 _timeout = 2
Guido van Rossum28774da2002-06-12 20:22:49 +0000167 self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
168 self.sock.settimeout(_timeout)
R. David Murraye9e95932010-02-06 05:00:15 +0000169 # Prevent "Address already in use" socket exceptions
170 support.bind_port(self.sock, self.localhost)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000171
172 _t1 = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000173 self.assertRaises(socket.error, self.sock.recvfrom, 8192)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000174 _t2 = time.time()
175
176 _delta = abs(_t1 - _t2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000177 self.assertTrue(_delta < _timeout + self.fuzz,
Guido van Rossum28774da2002-06-12 20:22:49 +0000178 "timeout (%g) is %g seconds more than expected (%g)"
179 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000180
181 def testSend(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000182 # Test send() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000183 # couldn't figure out how to test it
184 pass
185
186 def testSendto(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000187 # Test sendto() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000188 # couldn't figure out how to test it
189 pass
190
191 def testSendall(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000192 # Test sendall() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000193 # couldn't figure out how to test it
194 pass
195
196
Neal Norwitz996acf12003-02-17 14:51:41 +0000197def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000198 support.requires('network')
199 support.run_unittest(CreationTestCase, TimeoutTestCase)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000200
201if __name__ == "__main__":
Neal Norwitz996acf12003-02-17 14:51:41 +0000202 test_main()