[Python-checkins] r61077 - python/trunk/Lib/test/test_ftplib.py

neal.norwitz python-checkins at python.org
Tue Feb 26 05:50:38 CET 2008


Author: neal.norwitz
Date: Tue Feb 26 05:50:37 2008
New Revision: 61077

Modified:
   python/trunk/Lib/test/test_ftplib.py
Log:
Don't use a hard coded port.  This test could hang/fail if the port is in use.
Speed this test up by avoiding a sleep and using the event.


Modified: python/trunk/Lib/test/test_ftplib.py
==============================================================================
--- python/trunk/Lib/test/test_ftplib.py	(original)
+++ python/trunk/Lib/test/test_ftplib.py	Tue Feb 26 05:50:37 2008
@@ -6,32 +6,47 @@
 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 @@
 
         # 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 @@
         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 @@
         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)
 


More information about the Python-checkins mailing list