summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_ftplib.py
blob: 35e4746a8c56b73a76689f5512baaeacb5fea0e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import socket
import threading
import ftplib
import time

from unittest import TestCase
from test import support

HOST = support.HOST

# 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, serv):
    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(b"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):
        self.evt = threading.Event()
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.settimeout(3)
        self.port = support.bind_port(self.sock)
        threading.Thread(target=server, args=(self.evt,self.sock)).start()
        # Wait for the server to be ready.
        self.evt.wait()
        self.evt.clear()
        ftplib.FTP.port = self.port

    def tearDown(self):
        self.evt.wait()

    def testBasic(self):
        # do nothing
        ftplib.FTP()

        # connects
        ftp = ftplib.FTP(HOST)
        self.evt.wait()
        ftp.close()

    def testTimeoutDefault(self):
        # default -- use global socket timeout
        self.assert_(socket.getdefaulttimeout() is None)
        socket.setdefaulttimeout(30)
        try:
            ftp = ftplib.FTP("localhost")
        finally:
            socket.setdefaulttimeout(None)
        self.assertEqual(ftp.sock.gettimeout(), 30)
        self.evt.wait()
        ftp.close()

    def testTimeoutNone(self):
        # no timeout -- do not use global socket timeout
        self.assert_(socket.getdefaulttimeout() is None)
        socket.setdefaulttimeout(30)
        try:
            ftp = ftplib.FTP("localhost", timeout=None)
        finally:
            socket.setdefaulttimeout(None)
        self.assertTrue(ftp.sock.gettimeout() is None)
        self.evt.wait()
        ftp.close()

    def testTimeoutValue(self):
        # a value
        ftp = ftplib.FTP(HOST, timeout=30)
        self.assertEqual(ftp.sock.gettimeout(), 30)
        self.evt.wait()
        ftp.close()

    def testTimeoutConnect(self):
        ftp = ftplib.FTP()
        ftp.connect(HOST, timeout=30)
        self.assertEqual(ftp.sock.gettimeout(), 30)
        self.evt.wait()
        ftp.close()

    def testTimeoutDifferentOrder(self):
        ftp = ftplib.FTP(timeout=30)
        ftp.connect(HOST)
        self.assertEqual(ftp.sock.gettimeout(), 30)
        self.evt.wait()
        ftp.close()

    def testTimeoutDirectAccess(self):
        ftp = ftplib.FTP()
        ftp.timeout = 30
        ftp.connect(HOST)
        self.assertEqual(ftp.sock.gettimeout(), 30)
        self.evt.wait()
        ftp.close()


def test_main(verbose=None):
    support.run_unittest(GeneralTests)

if __name__ == '__main__':
    test_main()
wd">assertRaises(TypeError, len, repeat(None)) class TestXrange(TestInvariantWithoutMutations): def setUp(self): self.it = iter(xrange(n)) class TestXrangeCustomReversed(TestInvariantWithoutMutations): def setUp(self): self.it = reversed(xrange(n)) class TestTuple(TestInvariantWithoutMutations): def setUp(self): self.it = iter(tuple(xrange(n))) ## ------- Types that should not be mutated during iteration ------- class TestDeque(TestTemporarilyImmutable): def setUp(self): d = deque(xrange(n)) self.it = iter(d) self.mutate = d.pop class TestDequeReversed(TestTemporarilyImmutable): def setUp(self): d = deque(xrange(n)) self.it = reversed(d) self.mutate = d.pop class TestDictKeys(TestTemporarilyImmutable): def setUp(self): d = dict.fromkeys(xrange(n)) self.it = iter(d) self.mutate = d.popitem class TestDictItems(TestTemporarilyImmutable): def setUp(self): d = dict.fromkeys(xrange(n)) self.it = d.iteritems() self.mutate = d.popitem class TestDictValues(TestTemporarilyImmutable): def setUp(self): d = dict.fromkeys(xrange(n)) self.it = d.itervalues() self.mutate = d.popitem class TestSet(TestTemporarilyImmutable): def setUp(self): d = set(xrange(n)) self.it = iter(d) self.mutate = d.pop ## ------- Types that can mutate during iteration ------- class TestList(TestInvariantWithoutMutations): def setUp(self): self.it = iter(range(n)) def test_mutation(self): d = range(n) it = iter(d) it.next() it.next() self.assertEqual(len(it), n-2) d.append(n) self.assertEqual(len(it), n-1) # grow with append d[1:] = [] self.assertEqual(len(it), 0) self.assertEqual(list(it), []) d.extend(xrange(20)) self.assertEqual(len(it), 0) class TestListReversed(TestInvariantWithoutMutations): def setUp(self): self.it = reversed(range(n)) def test_mutation(self): d = range(n) it = reversed(d) it.next() it.next() self.assertEqual(len(it), n-2) d.append(n) self.assertEqual(len(it), n-2) # ignore append d[1:] = [] self.assertEqual(len(it), 0) self.assertEqual(list(it), []) # confirm invariant d.extend(xrange(20)) self.assertEqual(len(it), 0) class TestSeqIter(TestInvariantWithoutMutations): def setUp(self): self.it = iter(UserList(range(n))) def test_mutation(self): d = UserList(range(n)) it = iter(d) it.next() it.next() self.assertEqual(len(it), n-2) d.append(n) self.assertEqual(len(it), n-1) # grow with append d[1:] = [] self.assertEqual(len(it), 0) self.assertEqual(list(it), []) d.extend(xrange(20)) self.assertEqual(len(it), 0) class TestSeqIterReversed(TestInvariantWithoutMutations): def setUp(self): self.it = reversed(UserList(range(n))) def test_mutation(self): d = UserList(range(n)) it = reversed(d) it.next() it.next() self.assertEqual(len(it), n-2) d.append(n) self.assertEqual(len(it), n-2) # ignore append d[1:] = [] self.assertEqual(len(it), 0) self.assertEqual(list(it), []) # confirm invariant d.extend(xrange(20)) self.assertEqual(len(it), 0) def test_main(): unittests = [ TestRepeat, TestXrange, TestXrangeCustomReversed, TestTuple, TestDeque, TestDequeReversed, TestDictKeys, TestDictItems, TestDictValues, TestSet, TestList, TestListReversed, TestSeqIter, TestSeqIterReversed, ] test_support.run_unittest(*unittests) if __name__ == "__main__": test_main()