blob: 35e4746a8c56b73a76689f5512baaeacb5fea0e9 [file] [log] [blame]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001import socket
2import threading
3import ftplib
4import time
5
6from unittest import TestCase
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Guido van Rossumd8faa362007-04-27 19:54:29 +00008
Benjamin Petersonee8712c2008-05-20 21:35:26 +00009HOST = support.HOST
Christian Heimes836baa52008-02-26 08:18:30 +000010
11# This function sets the evt 3 times:
12# 1) when the connection is ready to be accepted.
13# 2) when it is safe for the caller to close the connection
14# 3) when we have closed the socket
Christian Heimes5e696852008-04-09 08:37:03 +000015def server(evt, serv):
Guido van Rossumd8faa362007-04-27 19:54:29 +000016 serv.listen(5)
Christian Heimes836baa52008-02-26 08:18:30 +000017
18 # (1) Signal the caller that we are ready to accept the connection.
19 evt.set()
Guido van Rossumd8faa362007-04-27 19:54:29 +000020 try:
21 conn, addr = serv.accept()
22 except socket.timeout:
23 pass
24 else:
Guido van Rossum8a392d72007-11-21 22:09:45 +000025 conn.send(b"1 Hola mundo\n")
Christian Heimes836baa52008-02-26 08:18:30 +000026 # (2) Signal the caller that it is safe to close the socket.
27 evt.set()
Guido van Rossumd8faa362007-04-27 19:54:29 +000028 conn.close()
29 finally:
30 serv.close()
Christian Heimes836baa52008-02-26 08:18:30 +000031 # (3) Signal the caller that we are done.
Guido van Rossumd8faa362007-04-27 19:54:29 +000032 evt.set()
33
34class GeneralTests(TestCase):
35
36 def setUp(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000037 self.evt = threading.Event()
Christian Heimes5e696852008-04-09 08:37:03 +000038 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
39 self.sock.settimeout(3)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000040 self.port = support.bind_port(self.sock)
Christian Heimes5e696852008-04-09 08:37:03 +000041 threading.Thread(target=server, args=(self.evt,self.sock)).start()
Christian Heimes836baa52008-02-26 08:18:30 +000042 # Wait for the server to be ready.
43 self.evt.wait()
44 self.evt.clear()
Christian Heimes5e696852008-04-09 08:37:03 +000045 ftplib.FTP.port = self.port
Guido van Rossumd8faa362007-04-27 19:54:29 +000046
47 def tearDown(self):
48 self.evt.wait()
49
50 def testBasic(self):
51 # do nothing
52 ftplib.FTP()
53
54 # connects
Christian Heimes5e696852008-04-09 08:37:03 +000055 ftp = ftplib.FTP(HOST)
Christian Heimes836baa52008-02-26 08:18:30 +000056 self.evt.wait()
Georg Brandlf78e02b2008-06-10 17:40:04 +000057 ftp.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +000058
59 def testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +000060 # default -- use global socket timeout
61 self.assert_(socket.getdefaulttimeout() is None)
62 socket.setdefaulttimeout(30)
63 try:
64 ftp = ftplib.FTP("localhost")
65 finally:
66 socket.setdefaulttimeout(None)
67 self.assertEqual(ftp.sock.gettimeout(), 30)
68 self.evt.wait()
69 ftp.close()
70
71 def testTimeoutNone(self):
72 # no timeout -- do not use global socket timeout
73 self.assert_(socket.getdefaulttimeout() is None)
74 socket.setdefaulttimeout(30)
75 try:
76 ftp = ftplib.FTP("localhost", timeout=None)
77 finally:
78 socket.setdefaulttimeout(None)
Guido van Rossumd8faa362007-04-27 19:54:29 +000079 self.assertTrue(ftp.sock.gettimeout() is None)
Christian Heimes836baa52008-02-26 08:18:30 +000080 self.evt.wait()
Georg Brandlf78e02b2008-06-10 17:40:04 +000081 ftp.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +000082
83 def testTimeoutValue(self):
84 # a value
Christian Heimes5e696852008-04-09 08:37:03 +000085 ftp = ftplib.FTP(HOST, timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +000086 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000087 self.evt.wait()
Georg Brandlf78e02b2008-06-10 17:40:04 +000088 ftp.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +000089
90 def testTimeoutConnect(self):
91 ftp = ftplib.FTP()
Christian Heimes5e696852008-04-09 08:37:03 +000092 ftp.connect(HOST, timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +000093 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000094 self.evt.wait()
Georg Brandlf78e02b2008-06-10 17:40:04 +000095 ftp.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +000096
97 def testTimeoutDifferentOrder(self):
98 ftp = ftplib.FTP(timeout=30)
Christian Heimes5e696852008-04-09 08:37:03 +000099 ftp.connect(HOST)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000100 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +0000101 self.evt.wait()
Georg Brandlf78e02b2008-06-10 17:40:04 +0000102 ftp.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000103
104 def testTimeoutDirectAccess(self):
105 ftp = ftplib.FTP()
106 ftp.timeout = 30
Christian Heimes5e696852008-04-09 08:37:03 +0000107 ftp.connect(HOST)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000108 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +0000109 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000110 ftp.close()
111
112
Guido van Rossumd8faa362007-04-27 19:54:29 +0000113def test_main(verbose=None):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000114 support.run_unittest(GeneralTests)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000115
116if __name__ == '__main__':
117 test_main()