mirror of
https://github.com/python/cpython.git
synced 2025-11-25 21:11:09 +00:00
SF patch 555085 (timeout socket implementation) by Michael Gilfix.
I've made considerable changes to Michael's code, specifically to use the select() system call directly and to store the timeout as a C double instead of a Python object; internally, -1.0 (or anything negative) represents the None from the API. I'm not 100% sure that all corner cases are covered correctly, so please keep an eye on this. Next I'm going to try it Windows before Tim complains. No way is this a bugfix candidate. :-)
This commit is contained in:
parent
c9a55776c8
commit
67f7a38849
5 changed files with 689 additions and 122 deletions
136
Lib/test/test_timeout.py
Normal file
136
Lib/test/test_timeout.py
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
#!/home/bernie/src/python23/dist/src/python
|
||||
|
||||
import unittest
|
||||
|
||||
import time
|
||||
import socket
|
||||
|
||||
class creationTestCase(unittest.TestCase):
|
||||
"""Test Case for socket.gettimeout() and socket.settimeout()"""
|
||||
def setUp(self):
|
||||
self.__s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
|
||||
def tearDown(self):
|
||||
self.__s.close()
|
||||
|
||||
def testObjectCreation(self):
|
||||
"Test Socket creation"
|
||||
self.assertEqual(self.__s.gettimeout(), None,
|
||||
"Timeout socket not default to disable (None)")
|
||||
|
||||
def testFloatReturnValue(self):
|
||||
"Test return value of getter/setter"
|
||||
self.__s.settimeout(7.345)
|
||||
self.assertEqual(self.__s.gettimeout(), 7.345,
|
||||
"settimeout() and gettimeout() return different result")
|
||||
|
||||
self.__s.settimeout(3)
|
||||
self.assertEqual(self.__s.gettimeout(), 3,
|
||||
"settimeout() and gettimeout() return different result")
|
||||
|
||||
def testReturnType(self):
|
||||
"Test return type of getter/setter"
|
||||
self.__s.settimeout(1)
|
||||
self.assertEqual(type(self.__s.gettimeout()), type(1.0),
|
||||
"return type of gettimeout() is not FloatType")
|
||||
|
||||
self.__s.settimeout(3.9)
|
||||
self.assertEqual(type(self.__s.gettimeout()), type(1.0),
|
||||
"return type of gettimeout() is not FloatType")
|
||||
|
||||
|
||||
class timeoutTestCase(unittest.TestCase):
|
||||
"""Test Case for socket.socket() timeout functions"""
|
||||
def setUp(self):
|
||||
self.__s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.__addr_remote = ('www.google.com', 80)
|
||||
self.__addr_local = ('127.0.0.1', 25339)
|
||||
|
||||
def tearDown(self):
|
||||
self.__s.close()
|
||||
|
||||
def testConnectTimeout(self):
|
||||
"Test connect() timeout"
|
||||
_timeout = 0.02
|
||||
self.__s.settimeout(_timeout)
|
||||
|
||||
_t1 = time.time()
|
||||
self.failUnlessRaises(socket.error, self.__s.connect,
|
||||
self.__addr_remote)
|
||||
_t2 = time.time()
|
||||
|
||||
_delta = abs(_t1 - _t2)
|
||||
self.assert_(_delta < _timeout + 0.5,
|
||||
"timeout (%f) is 0.5 seconds more than required (%f)"
|
||||
%(_delta, _timeout))
|
||||
|
||||
def testRecvTimeout(self):
|
||||
"Test recv() timeout"
|
||||
_timeout = 0.02
|
||||
self.__s.connect(self.__addr_remote)
|
||||
self.__s.settimeout(_timeout)
|
||||
|
||||
_t1 = time.time()
|
||||
self.failUnlessRaises(socket.error, self.__s.recv, 1024)
|
||||
_t2 = time.time()
|
||||
|
||||
_delta = abs(_t1 - _t2)
|
||||
self.assert_(_delta < _timeout + 0.5,
|
||||
"timeout (%f) is 0.5 seconds more than required (%f)"
|
||||
%(_delta, _timeout))
|
||||
|
||||
def testAcceptTimeout(self):
|
||||
"Test accept() timeout()"
|
||||
_timeout = 2
|
||||
self.__s.settimeout(_timeout)
|
||||
self.__s.bind(self.__addr_local)
|
||||
self.__s.listen(5)
|
||||
|
||||
_t1 = time.time()
|
||||
self.failUnlessRaises(socket.error, self.__s.accept)
|
||||
_t2 = time.time()
|
||||
|
||||
_delta = abs(_t1 - _t2)
|
||||
self.assert_(_delta < _timeout + 0.5,
|
||||
"timeout (%f) is 0.5 seconds more than required (%f)"
|
||||
%(_delta, _timeout))
|
||||
|
||||
def testRecvfromTimeout(self):
|
||||
"Test recvfrom() timeout()"
|
||||
_timeout = 2
|
||||
self.__s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
self.__s.settimeout(_timeout)
|
||||
self.__s.bind(self.__addr_local)
|
||||
|
||||
_t1 = time.time()
|
||||
self.failUnlessRaises(socket.error, self.__s.recvfrom, 8192)
|
||||
_t2 = time.time()
|
||||
|
||||
_delta = abs(_t1 - _t2)
|
||||
self.assert_(_delta < _timeout + 0.5,
|
||||
"timeout (%f) is 0.5 seconds more than required (%f)"
|
||||
%(_delta, _timeout))
|
||||
|
||||
def testSend(self):
|
||||
"Test send() timeout"
|
||||
# couldn't figure out how to test it
|
||||
pass
|
||||
|
||||
def testSendto(self):
|
||||
"Test sendto() timeout"
|
||||
# couldn't figure out how to test it
|
||||
pass
|
||||
|
||||
def testSendall(self):
|
||||
"Test sendall() timeout"
|
||||
# couldn't figure out how to test it
|
||||
pass
|
||||
|
||||
|
||||
def suite():
|
||||
suite = unittest.TestSuite()
|
||||
|
||||
return suite
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue