blob: 1ff8d088d127a4f44a4cc7e85d4c79211e5eb3ed [file] [log] [blame]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001import socket
2import threading
3import ftplib
4import time
5
6from unittest import TestCase
7from test import test_support
8
Christian Heimes836baa52008-02-26 08:18:30 +00009server_port = None
10
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
15def server(evt):
16 global server_port
Guido van Rossumd8faa362007-04-27 19:54:29 +000017 serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
18 serv.settimeout(3)
19 serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Christian Heimes836baa52008-02-26 08:18:30 +000020 server_port = test_support.bind_port(serv, "", 9091)
Guido van Rossumd8faa362007-04-27 19:54:29 +000021 serv.listen(5)
Christian Heimes836baa52008-02-26 08:18:30 +000022
23 # (1) Signal the caller that we are ready to accept the connection.
24 evt.set()
Guido van Rossumd8faa362007-04-27 19:54:29 +000025 try:
26 conn, addr = serv.accept()
27 except socket.timeout:
28 pass
29 else:
Guido van Rossum8a392d72007-11-21 22:09:45 +000030 conn.send(b"1 Hola mundo\n")
Christian Heimes836baa52008-02-26 08:18:30 +000031 # (2) Signal the caller that it is safe to close the socket.
32 evt.set()
Guido van Rossumd8faa362007-04-27 19:54:29 +000033 conn.close()
34 finally:
35 serv.close()
Christian Heimes836baa52008-02-26 08:18:30 +000036 # (3) Signal the caller that we are done.
Guido van Rossumd8faa362007-04-27 19:54:29 +000037 evt.set()
38
39class GeneralTests(TestCase):
40
41 def setUp(self):
Guido van Rossumd8faa362007-04-27 19:54:29 +000042 self.evt = threading.Event()
Christian Heimes836baa52008-02-26 08:18:30 +000043 threading.Thread(target=server, args=(self.evt,)).start()
44 # Wait for the server to be ready.
45 self.evt.wait()
46 self.evt.clear()
47 ftplib.FTP.port = server_port
Guido van Rossumd8faa362007-04-27 19:54:29 +000048
49 def tearDown(self):
Christian Heimes836baa52008-02-26 08:18:30 +000050 # Wait on the closing of the socket (this shouldn't be necessary).
Guido van Rossumd8faa362007-04-27 19:54:29 +000051 self.evt.wait()
52
53 def testBasic(self):
54 # do nothing
55 ftplib.FTP()
56
57 # connects
58 ftp = ftplib.FTP("localhost")
Christian Heimes836baa52008-02-26 08:18:30 +000059 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000060 ftp.sock.close()
61
62 def testTimeoutDefault(self):
63 # default
64 ftp = ftplib.FTP("localhost")
65 self.assertTrue(ftp.sock.gettimeout() is None)
Christian Heimes836baa52008-02-26 08:18:30 +000066 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000067 ftp.sock.close()
68
69 def testTimeoutValue(self):
70 # a value
71 ftp = ftplib.FTP("localhost", timeout=30)
72 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000073 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000074 ftp.sock.close()
75
76 def testTimeoutConnect(self):
77 ftp = ftplib.FTP()
78 ftp.connect("localhost", timeout=30)
79 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000080 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000081 ftp.sock.close()
82
83 def testTimeoutDifferentOrder(self):
84 ftp = ftplib.FTP(timeout=30)
85 ftp.connect("localhost")
86 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000087 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000088 ftp.sock.close()
89
90 def testTimeoutDirectAccess(self):
91 ftp = ftplib.FTP()
92 ftp.timeout = 30
93 ftp.connect("localhost")
94 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +000095 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +000096 ftp.sock.close()
97
98 def testTimeoutNone(self):
99 # None, having other default
100 previous = socket.getdefaulttimeout()
101 socket.setdefaulttimeout(30)
102 try:
103 ftp = ftplib.FTP("localhost", timeout=None)
104 finally:
105 socket.setdefaulttimeout(previous)
106 self.assertEqual(ftp.sock.gettimeout(), 30)
Christian Heimes836baa52008-02-26 08:18:30 +0000107 self.evt.wait()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000108 ftp.close()
109
110
Guido van Rossumd8faa362007-04-27 19:54:29 +0000111def test_main(verbose=None):
112 test_support.run_unittest(GeneralTests)
113
114if __name__ == '__main__':
115 test_main()