blob: b91588a3102e50012b0ab98c5451d7a45ca2cbe6 [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()
Guido van Rossumd8faa362007-04-27 19:54:29 +000057 ftp.sock.close()
58
59 def testTimeoutDefault(self):
60 # default
Christian Heimes5e696852008-04-09 08:37:03 +000061 ftp = ftplib.FTP(HOST)
Guido van Rossumd8faa362007-04-27 19:54:29 +000062 self.assertTrue(ftp.sock.gettimeout() is None)
Christian Heimes836baa52008-02-26 08:18:30 +000063 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000064 ftp.sock.close()
65
66 def testTimeoutValue(self):
67 # a value
Christian Heimes5e696852008-04-09 08:37:03 +000068 ftp = ftplib.FTP(HOST, timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +000069 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000070 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000071 ftp.sock.close()
72
73 def testTimeoutConnect(self):
74 ftp = ftplib.FTP()
Christian Heimes5e696852008-04-09 08:37:03 +000075 ftp.connect(HOST, timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +000076 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000077 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000078 ftp.sock.close()
79
80 def testTimeoutDifferentOrder(self):
81 ftp = ftplib.FTP(timeout=30)
Christian Heimes5e696852008-04-09 08:37:03 +000082 ftp.connect(HOST)
Guido van Rossumd8faa362007-04-27 19:54:29 +000083 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000084 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000085 ftp.sock.close()
86
87 def testTimeoutDirectAccess(self):
88 ftp = ftplib.FTP()
89 ftp.timeout = 30
Christian Heimes5e696852008-04-09 08:37:03 +000090 ftp.connect(HOST)
Guido van Rossumd8faa362007-04-27 19:54:29 +000091 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000092 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000093 ftp.sock.close()
94
95 def testTimeoutNone(self):
96 # None, having other default
97 previous = socket.getdefaulttimeout()
98 socket.setdefaulttimeout(30)
99 try:
Christian Heimes5e696852008-04-09 08:37:03 +0000100 ftp = ftplib.FTP(HOST, timeout=None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000101 finally:
102 socket.setdefaulttimeout(previous)
103 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +0000104 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000105 ftp.close()
106
107
Guido van Rossumd8faa362007-04-27 19:54:29 +0000108def test_main(verbose=None):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000109 support.run_unittest(GeneralTests)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000110
111if __name__ == '__main__':
112 test_main()