Added a 'create_connect()' function to socket.py, which creates a

connection with an optional timeout, and modified httplib.py to
use this function in HTTPConnection. Applies patch 1676823.
This commit is contained in:
Facundo Batista 2007-03-23 18:54:07 +00:00
parent f102e24bd3
commit 07c78be0b4
7 changed files with 181 additions and 25 deletions

View file

@ -75,7 +75,7 @@ class ThreadableTest:
Note, the server setup function cannot call any blocking
functions that rely on the client thread during setup,
unless serverExplicityReady() is called just before
unless serverExplicitReady() is called just before
the blocking call (such as in setting up a client/server
connection and performing the accept() in setUp().
"""
@ -810,6 +810,85 @@ class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
bufsize = 2 # Exercise the buffering code
class NetworkConnectionTest(object):
"""Prove network connection."""
def clientSetUp(self):
self.cli = socket.create_connection((HOST, PORT))
self.serv_conn = self.cli
class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
"""Tests that NetworkConnection does not break existing TCP functionality.
"""
class NetworkConnectionAttributesTest(unittest.TestCase):
def setUp(self):
self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
global PORT
PORT = test_support.bind_port(self.serv, HOST, PORT)
self.serv.listen(1)
def tearDown(self):
if self.serv:
self.serv.close()
self.serv = None
def testWithoutServer(self):
self.tearDown()
self.failUnlessRaises(socket.error, lambda: socket.create_connection((HOST, PORT)))
def testTimeoutAttribute(self):
# default
sock = socket.create_connection((HOST, PORT))
self.assertTrue(sock.gettimeout() is None)
# a value, named
sock = socket.create_connection((HOST, PORT), timeout=10)
self.assertEqual(sock.gettimeout(), 10)
# a value, just the value
sock = socket.create_connection((HOST, PORT), 10)
self.assertEqual(sock.gettimeout(), 10)
# None, having other default
previous = socket.getdefaulttimeout()
socket.setdefaulttimeout(10)
sock = socket.create_connection((HOST, PORT), timeout=None)
socket.setdefaulttimeout(previous)
self.assertEqual(sock.gettimeout(), 10)
def testFamily(self):
sock = socket.create_connection((HOST, PORT), timeout=10)
self.assertEqual(sock.family, 2)
def threadedServer(delay):
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
global PORT
PORT = test_support.bind_port(serv, HOST, PORT)
serv.listen(1)
conn, addr = serv.accept()
time.sleep(delay)
conn.send("done!")
conn.close()
class NetworkConnectionBehaviourTest(unittest.TestCase):
def testInsideTimeout(self):
threading.Thread(target=threadedServer, args=(3,)).start()
time.sleep(.1)
sock = socket.create_connection((HOST, PORT))
data = sock.recv(5)
self.assertEqual(data, "done!")
def testOutsideTimeout(self):
threading.Thread(target=threadedServer, args=(3,)).start()
time.sleep(.1)
sock = socket.create_connection((HOST, PORT), timeout=1)
self.failUnlessRaises(socket.timeout, lambda: sock.recv(5))
class Urllib2FileobjectTest(unittest.TestCase):
# urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
@ -977,7 +1056,7 @@ class BufferIOTest(SocketConnectedTest):
def test_main():
tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
TestExceptions, BufferIOTest]
TestExceptions, BufferIOTest, BasicTCPTest2]
if sys.platform != 'mac':
tests.extend([ BasicUDPTest, UDPTimeoutTest ])
@ -988,6 +1067,8 @@ def test_main():
LineBufferedFileObjectClassTestCase,
SmallBufferedFileObjectClassTestCase,
Urllib2FileobjectTest,
NetworkConnectionAttributesTest,
NetworkConnectionBehaviourTest,
])
if hasattr(socket, "socketpair"):
tests.append(BasicSocketPairTest)