blob: 5949e51a1fac4ecea21734880b9ec1982066991a [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
Barry Warsaw04f357c2002-07-23 19:04:11 +00004from test import test_support
Guido van Rossum67f7a382002-06-06 21:08:16 +00005
6import time
7import socket
8
Guido van Rossumaa6a6642002-06-12 19:57:18 +00009
Guido van Rossum24e4af82002-06-12 19:18:08 +000010class CreationTestCase(unittest.TestCase):
Guido van Rossum28774da2002-06-12 20:22:49 +000011 """Test case for socket.gettimeout() and socket.settimeout()"""
Guido van Rossumaa6a6642002-06-12 19:57:18 +000012
Guido van Rossum67f7a382002-06-06 21:08:16 +000013 def setUp(self):
Guido van Rossum28774da2002-06-12 20:22:49 +000014 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Guido van Rossum67f7a382002-06-06 21:08:16 +000015
16 def tearDown(self):
Guido van Rossum28774da2002-06-12 20:22:49 +000017 self.sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +000018
19 def testObjectCreation(self):
Guido van Rossumae469312002-08-22 20:22:16 +000020 # Test Socket creation
Guido van Rossum28774da2002-06-12 20:22:49 +000021 self.assertEqual(self.sock.gettimeout(), None,
22 "timeout not disabled by default")
Guido van Rossum67f7a382002-06-06 21:08:16 +000023
24 def testFloatReturnValue(self):
Guido van Rossumae469312002-08-22 20:22:16 +000025 # Test return value of gettimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000026 self.sock.settimeout(7.345)
27 self.assertEqual(self.sock.gettimeout(), 7.345)
Guido van Rossum67f7a382002-06-06 21:08:16 +000028
Guido van Rossum28774da2002-06-12 20:22:49 +000029 self.sock.settimeout(3)
30 self.assertEqual(self.sock.gettimeout(), 3)
31
32 self.sock.settimeout(None)
33 self.assertEqual(self.sock.gettimeout(), None)
Guido van Rossum67f7a382002-06-06 21:08:16 +000034
35 def testReturnType(self):
Guido van Rossumae469312002-08-22 20:22:16 +000036 # Test return type of gettimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000037 self.sock.settimeout(1)
38 self.assertEqual(type(self.sock.gettimeout()), type(1.0))
Guido van Rossum67f7a382002-06-06 21:08:16 +000039
Guido van Rossum28774da2002-06-12 20:22:49 +000040 self.sock.settimeout(3.9)
41 self.assertEqual(type(self.sock.gettimeout()), type(1.0))
Guido van Rossumaa6a6642002-06-12 19:57:18 +000042
43 def testTypeCheck(self):
Guido van Rossumae469312002-08-22 20:22:16 +000044 # Test type checking by settimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000045 self.sock.settimeout(0)
46 self.sock.settimeout(0L)
47 self.sock.settimeout(0.0)
48 self.sock.settimeout(None)
49 self.assertRaises(TypeError, self.sock.settimeout, "")
50 self.assertRaises(TypeError, self.sock.settimeout, u"")
51 self.assertRaises(TypeError, self.sock.settimeout, ())
52 self.assertRaises(TypeError, self.sock.settimeout, [])
53 self.assertRaises(TypeError, self.sock.settimeout, {})
54 self.assertRaises(TypeError, self.sock.settimeout, 0j)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000055
56 def testRangeCheck(self):
Guido van Rossumae469312002-08-22 20:22:16 +000057 # Test range checking by settimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000058 self.assertRaises(ValueError, self.sock.settimeout, -1)
59 self.assertRaises(ValueError, self.sock.settimeout, -1L)
60 self.assertRaises(ValueError, self.sock.settimeout, -1.0)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000061
Guido van Rossum11ba0942002-06-13 15:07:44 +000062 def testTimeoutThenBlocking(self):
Guido van Rossumae469312002-08-22 20:22:16 +000063 # Test settimeout() followed by setblocking()
Guido van Rossum28774da2002-06-12 20:22:49 +000064 self.sock.settimeout(10)
65 self.sock.setblocking(1)
66 self.assertEqual(self.sock.gettimeout(), None)
67 self.sock.setblocking(0)
Guido van Rossum11ba0942002-06-13 15:07:44 +000068 self.assertEqual(self.sock.gettimeout(), 0.0)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000069
Guido van Rossum28774da2002-06-12 20:22:49 +000070 self.sock.settimeout(10)
71 self.sock.setblocking(0)
Guido van Rossum11ba0942002-06-13 15:07:44 +000072 self.assertEqual(self.sock.gettimeout(), 0.0)
Guido van Rossum28774da2002-06-12 20:22:49 +000073 self.sock.setblocking(1)
74 self.assertEqual(self.sock.gettimeout(), None)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000075
76 def testBlockingThenTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +000077 # Test setblocking() followed by settimeout()
Guido van Rossum28774da2002-06-12 20:22:49 +000078 self.sock.setblocking(0)
79 self.sock.settimeout(1)
80 self.assertEqual(self.sock.gettimeout(), 1)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000081
Guido van Rossum28774da2002-06-12 20:22:49 +000082 self.sock.setblocking(1)
83 self.sock.settimeout(1)
84 self.assertEqual(self.sock.gettimeout(), 1)
Guido van Rossumaa6a6642002-06-12 19:57:18 +000085
Guido van Rossum67f7a382002-06-06 21:08:16 +000086
Guido van Rossum24e4af82002-06-12 19:18:08 +000087class TimeoutTestCase(unittest.TestCase):
Guido van Rossum28774da2002-06-12 20:22:49 +000088 """Test case for socket.socket() timeout functions"""
89
Tim Peters14821c52003-02-21 16:45:41 +000090 # There are a number of tests here trying to make sure that an operation
91 # doesn't take too much longer than expected. But competing machine
92 # activity makes it inevitable that such tests will fail at times.
93 # When fuzz was at 1.0, I (tim) routinely saw bogus failures on Win2K
94 # and Win98SE. Boosting it to 2.0 helped a lot, but isn't a real
95 # solution.
96 fuzz = 2.0
Guido van Rossumaa6a6642002-06-12 19:57:18 +000097
Guido van Rossum67f7a382002-06-06 21:08:16 +000098 def setUp(self):
Guido van Rossum28774da2002-06-12 20:22:49 +000099 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
100 self.addr_remote = ('www.google.com', 80)
101 self.addr_local = ('127.0.0.1', 25339)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000102
103 def tearDown(self):
Guido van Rossum28774da2002-06-12 20:22:49 +0000104 self.sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000105
106 def testConnectTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000107 # Test connect() timeout
Guido van Rossum6e813182002-09-03 19:17:47 +0000108 _timeout = 0.001
Guido van Rossum28774da2002-06-12 20:22:49 +0000109 self.sock.settimeout(_timeout)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000110
111 _t1 = time.time()
Guido van Rossum28774da2002-06-12 20:22:49 +0000112 self.failUnlessRaises(socket.error, self.sock.connect,
113 self.addr_remote)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000114 _t2 = time.time()
115
116 _delta = abs(_t1 - _t2)
Guido van Rossum28774da2002-06-12 20:22:49 +0000117 self.assert_(_delta < _timeout + self.fuzz,
118 "timeout (%g) is %g seconds more than expected (%g)"
119 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000120
121 def testRecvTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000122 # Test recv() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000123 _timeout = 0.02
Guido van Rossum28774da2002-06-12 20:22:49 +0000124 self.sock.connect(self.addr_remote)
125 self.sock.settimeout(_timeout)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000126
127 _t1 = time.time()
Guido van Rossum28774da2002-06-12 20:22:49 +0000128 self.failUnlessRaises(socket.error, self.sock.recv, 1024)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000129 _t2 = time.time()
130
131 _delta = abs(_t1 - _t2)
Guido van Rossum28774da2002-06-12 20:22:49 +0000132 self.assert_(_delta < _timeout + self.fuzz,
133 "timeout (%g) is %g seconds more than expected (%g)"
134 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000135
136 def testAcceptTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000137 # Test accept() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000138 _timeout = 2
Guido van Rossum28774da2002-06-12 20:22:49 +0000139 self.sock.settimeout(_timeout)
140 self.sock.bind(self.addr_local)
141 self.sock.listen(5)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000142
143 _t1 = time.time()
Guido van Rossum28774da2002-06-12 20:22:49 +0000144 self.failUnlessRaises(socket.error, self.sock.accept)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000145 _t2 = time.time()
146
147 _delta = abs(_t1 - _t2)
Guido van Rossum28774da2002-06-12 20:22:49 +0000148 self.assert_(_delta < _timeout + self.fuzz,
149 "timeout (%g) is %g seconds more than expected (%g)"
150 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000151
152 def testRecvfromTimeout(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000153 # Test recvfrom() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000154 _timeout = 2
Guido van Rossum28774da2002-06-12 20:22:49 +0000155 self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
156 self.sock.settimeout(_timeout)
157 self.sock.bind(self.addr_local)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000158
159 _t1 = time.time()
Guido van Rossum28774da2002-06-12 20:22:49 +0000160 self.failUnlessRaises(socket.error, self.sock.recvfrom, 8192)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000161 _t2 = time.time()
162
163 _delta = abs(_t1 - _t2)
Guido van Rossum28774da2002-06-12 20:22:49 +0000164 self.assert_(_delta < _timeout + self.fuzz,
165 "timeout (%g) is %g seconds more than expected (%g)"
166 %(_delta, self.fuzz, _timeout))
Guido van Rossum67f7a382002-06-06 21:08:16 +0000167
168 def testSend(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000169 # Test send() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000170 # couldn't figure out how to test it
171 pass
172
173 def testSendto(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000174 # Test sendto() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000175 # couldn't figure out how to test it
176 pass
177
178 def testSendall(self):
Guido van Rossumae469312002-08-22 20:22:16 +0000179 # Test sendall() timeout
Guido van Rossum67f7a382002-06-06 21:08:16 +0000180 # couldn't figure out how to test it
181 pass
182
183
Neal Norwitz996acf12003-02-17 14:51:41 +0000184def test_main():
Guido van Rossum67f7a382002-06-06 21:08:16 +0000185 suite = unittest.TestSuite()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000186 suite.addTest(unittest.makeSuite(CreationTestCase))
187 suite.addTest(unittest.makeSuite(TimeoutTestCase))
188 test_support.run_suite(suite)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000189
190if __name__ == "__main__":
Neal Norwitz996acf12003-02-17 14:51:41 +0000191 test_main()