diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 9298bf45d66..7c1f622ce05 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -6,32 +6,47 @@ import time from unittest import TestCase from test import test_support +server_port = None + +# This function sets the evt 3 times: +# 1) when the connection is ready to be accepted. +# 2) when it is safe for the caller to close the connection +# 3) when we have closed the socket def server(evt): + global server_port serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv.settimeout(3) serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - serv.bind(("", 9091)) + server_port = test_support.bind_port(serv, "", 9091) serv.listen(5) + # (1) Signal the caller that we are ready to accept the connection. + evt.set() try: conn, addr = serv.accept() except socket.timeout: pass else: conn.send("1 Hola mundo\n") + # (2) Signal the caller that it is safe to close the socket. + evt.set() conn.close() finally: serv.close() + # (3) Signal the caller that we are done. evt.set() class GeneralTests(TestCase): def setUp(self): - ftplib.FTP.port = 9091 self.evt = threading.Event() threading.Thread(target=server, args=(self.evt,)).start() - time.sleep(.1) + # Wait for the server to be ready. + self.evt.wait() + self.evt.clear() + ftplib.FTP.port = server_port def tearDown(self): + # Wait on the closing of the socket (this shouldn't be necessary). self.evt.wait() def testBasic(self): @@ -40,30 +55,35 @@ class GeneralTests(TestCase): # connects ftp = ftplib.FTP("localhost") + self.evt.wait() ftp.sock.close() def testTimeoutDefault(self): # default ftp = ftplib.FTP("localhost") self.assertTrue(ftp.sock.gettimeout() is None) + self.evt.wait() ftp.sock.close() def testTimeoutValue(self): # a value ftp = ftplib.FTP("localhost", timeout=30) self.assertEqual(ftp.sock.gettimeout(), 30) + self.evt.wait() ftp.sock.close() def testTimeoutConnect(self): ftp = ftplib.FTP() ftp.connect("localhost", timeout=30) self.assertEqual(ftp.sock.gettimeout(), 30) + self.evt.wait() ftp.sock.close() def testTimeoutDifferentOrder(self): ftp = ftplib.FTP(timeout=30) ftp.connect("localhost") self.assertEqual(ftp.sock.gettimeout(), 30) + self.evt.wait() ftp.sock.close() def testTimeoutDirectAccess(self): @@ -71,6 +91,7 @@ class GeneralTests(TestCase): ftp.timeout = 30 ftp.connect("localhost") self.assertEqual(ftp.sock.gettimeout(), 30) + self.evt.wait() ftp.sock.close() def testTimeoutNone(self): @@ -82,10 +103,10 @@ class GeneralTests(TestCase): finally: socket.setdefaulttimeout(previous) self.assertEqual(ftp.sock.gettimeout(), 30) + self.evt.wait() ftp.close() - def test_main(verbose=None): test_support.run_unittest(GeneralTests)