FakeFtpServerIntegrationTest.groovy revision fa3e4a9d121b1ad40a6d418b925afda82d3567ba
15c17f34e1a613c319d355112f8298c20015ef7f2chrismair/*
25c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Copyright 2008 the original author or authors.
35c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
45c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Licensed under the Apache License, Version 2.0 (the "License");
55c17f34e1a613c319d355112f8298c20015ef7f2chrismair * you may not use this file except in compliance with the License.
65c17f34e1a613c319d355112f8298c20015ef7f2chrismair * You may obtain a copy of the License at
75c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
85c17f34e1a613c319d355112f8298c20015ef7f2chrismair *      http://www.apache.org/licenses/LICENSE-2.0
95c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
105c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Unless required by applicable law or agreed to in writing, software
115c17f34e1a613c319d355112f8298c20015ef7f2chrismair * distributed under the License is distributed on an "AS IS" BASIS,
125c17f34e1a613c319d355112f8298c20015ef7f2chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c17f34e1a613c319d355112f8298c20015ef7f2chrismair * See the License for the specific language governing permissions and
145c17f34e1a613c319d355112f8298c20015ef7f2chrismair * limitations under the License.
155c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
165c17f34e1a613c319d355112f8298c20015ef7f2chrismairpackage org.mockftpserver.fake.server
175c17f34e1a613c319d355112f8298c20015ef7f2chrismair
185aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismairimport org.apache.commons.net.ftp.FTP
195c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.apache.commons.net.ftp.FTPClient
20741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismairimport org.apache.commons.net.ftp.FTPFile
2147fb67a4e600f339064de4c08f10279accc95e92chrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry
225c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.filesystem.FakeWindowsFileSystem
2347fb67a4e600f339064de4c08f10279accc95e92chrismairimport org.mockftpserver.fake.filesystem.FileEntry
245c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.filesystem.FileSystem
255c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.user.UserAccount
265c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.AbstractGroovyTest
275c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.PortTestUtil
285c17f34e1a613c319d355112f8298c20015ef7f2chrismair
295c17f34e1a613c319d355112f8298c20015ef7f2chrismair/**
305c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Integration tests for FakeFtpServer.
315c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
325c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @version $Revision: 54 $ - $Date: 2008-05-13 21:54:53 -0400 (Tue, 13 May 2008) $
335c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
345c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @author Chris Mair
355c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
365c17f34e1a613c319d355112f8298c20015ef7f2chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTest {
375c17f34e1a613c319d355112f8298c20015ef7f2chrismair
38aa72126634232b9f007e110204e081807257cd4fchrismair    static final SERVER = "localhost"
39aa72126634232b9f007e110204e081807257cd4fchrismair    static final USERNAME = "user123"
40aa72126634232b9f007e110204e081807257cd4fchrismair    static final PASSWORD = "password"
41fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    static final ACCOUNT = "account123"
42aa72126634232b9f007e110204e081807257cd4fchrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
43aa72126634232b9f007e110204e081807257cd4fchrismair    static final BINARY_DATA = new byte[256]
445e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final ROOT_DIR = "c:/"
455e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final HOME_DIR = p(ROOT_DIR, "home")
46741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR_NAME = 'sub'
47aa72126634232b9f007e110204e081807257cd4fchrismair    static final SUBDIR_NAME2 = "archive"
48741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
49aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME1 = "abc.txt"
50aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME2 = "SomeOtherFile.xml"
51741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
52eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    static final SYSTEM_NAME = "WINDOWS"
535c17f34e1a613c319d355112f8298c20015ef7f2chrismair
54aa72126634232b9f007e110204e081807257cd4fchrismair    private FakeFtpServer ftpServer
55aa72126634232b9f007e110204e081807257cd4fchrismair    private FTPClient ftpClient
565c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private FileSystem fileSystem
57fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    private UserAccount userAccount
585c17f34e1a613c319d355112f8298c20015ef7f2chrismair
595c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
605c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Tests
615c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
625c17f34e1a613c319d355112f8298c20015ef7f2chrismair
635aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAbor() {
645aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
655aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.abort()
665aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ABOR", 226)
675aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
69fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testAcct() {
70fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
71fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.acct(ACCOUNT) == 230
72fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
73fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
745aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAllo() {
755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
765aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.allocate(99)
775aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ALLO", 200)
785aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
795aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
805aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAppe() {
815aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def ORIGINAL_CONTENTS = '123 456 789'
825aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        fileSystem.addEntry(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
835aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
845aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
855aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
865aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("Put File for local path [$FILE1]")
875aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
885aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.appendFile(FILE1, inputStream)
895aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def contents = fileSystem.createInputStream(FILE1).text
905aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("File contents=[" + contents + "]")
915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
945e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    void testCdup() {
955e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        ftpClientConnectAndLogin()
965e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        assert ftpClient.changeToParentDirectory()
975e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        verifyReplyCode("changeToParentDirectory", 200)
985e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    }
995e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
100741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testCwd() {
101741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
102aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
103aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("changeWorkingDirectory", 250)
104741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
105741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
106741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testDele() {
107741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createFile(FILE1)
108741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
109741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
110aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.deleteFile(FILENAME1)
111aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("deleteFile", 250)
1125f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(FILENAME1)
1135f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1145f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1155f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testHelp() {
1165f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpServer.helpText = [a: 'aaa', '': 'default']
1175f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnect()
1185f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1195f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        String help = ftpClient.listHelp()
1205f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('default')
1215f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1225f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1235f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('a')
1245f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('aaa')
1255f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1265f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1275f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('bad')
1285f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('bad')
1295f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
130741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
131741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
13247fb67a4e600f339064de4c08f10279accc95e92chrismair    void testList() {
13347fb67a4e600f339064de4c08f10279accc95e92chrismair        def LAST_MODIFIED = new Date()
134aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
135aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2), lastModified: LAST_MODIFIED))
13647fb67a4e600f339064de4c08f10279accc95e92chrismair
13747fb67a4e600f339064de4c08f10279accc95e92chrismair        ftpClientConnectAndLogin()
13847fb67a4e600f339064de4c08f10279accc95e92chrismair
13947fb67a4e600f339064de4c08f10279accc95e92chrismair        FTPFile[] files = ftpClient.listFiles(SUBDIR)
1405f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert files.length == 2
141aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
142aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
14347fb67a4e600f339064de4c08f10279accc95e92chrismair        verifyReplyCode("list", 226)
14447fb67a4e600f339064de4c08f10279accc95e92chrismair    }
1455c17f34e1a613c319d355112f8298c20015ef7f2chrismair
146fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin() {
147fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
148fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD")
149fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD)
150fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD", 230)
151fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
152fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
153fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin_WithAccount() {
154fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        userAccount.accountRequiredForLogin = true
155fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
156fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD with $ACCOUNT")
157fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD, ACCOUNT)
158fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD with $ACCOUNT", 230)
159fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
160fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
1614974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    void testMkd() {
1624974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        ftpClientConnectAndLogin()
1634974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
1644974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        def DIR = p(HOME_DIR, 'NewDir')
1654974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert ftpClient.makeDirectory(DIR)
1664974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        verifyReplyCode("makeDirectory", 257)
1674974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert fileSystem.isDirectory(DIR)
1684974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    }
1694974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
1705aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testMode() {
1715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
1725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
1735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("MODE", 200)
1745aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
1755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
176aa72126634232b9f007e110204e081807257cd4fchrismair    void testNlst() {
177aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME1)))
178aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
179aa72126634232b9f007e110204e081807257cd4fchrismair
180aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
181aa72126634232b9f007e110204e081807257cd4fchrismair
182aa72126634232b9f007e110204e081807257cd4fchrismair        String[] filenames = ftpClient.listNames(SUBDIR)
1835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filenames == [FILENAME1, SUBDIR_NAME2]
184aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("listNames", 226)
185aa72126634232b9f007e110204e081807257cd4fchrismair    }
186aa72126634232b9f007e110204e081807257cd4fchrismair
1875f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testNoop() {
1885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
1895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.sendNoOp()
1905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("NOOP", 200)
1915f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1925f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testPasv_Nlst() {
1945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME1)))
1955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME2)))
1965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
1975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
1985aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClient.enterLocalPassiveMode();
1995aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
2005aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
2015aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert filenames == [FILENAME1, FILENAME2]
2025aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("listNames", 226)
2035aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2045aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
205fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testPwd() {
206fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
207fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
208fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("printWorkingDirectory", 257)
209fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
210fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
211fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testQuit() {
212fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
213fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClient.quit()
214fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("quit", 221)
215fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
216fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
2175aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testRein() {
2185aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2195aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.rein() == 220
2205aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.cdup() == 530      // now logged out
2215aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2225aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
223c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    void testRest() {
224c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        ftpClientConnectAndLogin()
225c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        assert ftpClient.rest("marker") == 350
226c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    }
227c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair
228aa72126634232b9f007e110204e081807257cd4fchrismair    void testRetr() {
229aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new FileEntry(path: FILE1, contents: ASCII_DATA))
230aa72126634232b9f007e110204e081807257cd4fchrismair
231aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
232aa72126634232b9f007e110204e081807257cd4fchrismair
233aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Get File for remotePath [$FILE1]")
234aa72126634232b9f007e110204e081807257cd4fchrismair        def outputStream = new ByteArrayOutputStream()
235aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
236aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[${outputStream.toString()}]")
237aa72126634232b9f007e110204e081807257cd4fchrismair        assert outputStream.toString() == ASCII_DATA
238aa72126634232b9f007e110204e081807257cd4fchrismair    }
239aa72126634232b9f007e110204e081807257cd4fchrismair
240eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRmd() {
241eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
242eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
243eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.removeDirectory(SUBDIR)
244eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("removeDirectory", 250)
2455f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(SUBDIR)
246eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
247eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
248eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRename() {                 // RNFR and RNTO
249eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        fileSystem.createFile(FILE1)
250eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
251eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
252eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
253eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
254eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("rename", 250)
255eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert !fileSystem.exists(FILE1)
256eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert fileSystem.exists(FILE1 + "NEW")
257eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
258eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
2595f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testSite() {
2605f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2615f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.site("parameters,1,2,3") == 200
2625f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2635f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
264aa72126634232b9f007e110204e081807257cd4fchrismair    void testStor() {
265aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
266aa72126634232b9f007e110204e081807257cd4fchrismair
267aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Put File for local path [$FILE1]")
268aa72126634232b9f007e110204e081807257cd4fchrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
269aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.storeFile(FILE1, inputStream)
270aa72126634232b9f007e110204e081807257cd4fchrismair        def contents = fileSystem.createInputStream(FILE1).text
271aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[" + contents + "]")
272aa72126634232b9f007e110204e081807257cd4fchrismair        assert contents == ASCII_DATA
273aa72126634232b9f007e110204e081807257cd4fchrismair    }
274aa72126634232b9f007e110204e081807257cd4fchrismair
2755f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testStou() {
2765f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2775f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2785f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
2795f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
2805f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2815f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def names = fileSystem.listNames(HOME_DIR)
2825f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
2835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filename
2845f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2855f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def contents = fileSystem.createInputStream(p(HOME_DIR, filename)).text
2865f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        LOG.info("File contents=[" + contents + "]")
2875f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert contents == ASCII_DATA
2885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2905aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testStru() {
2915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
2935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("STRU", 200)
2945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
296eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testSyst() {
297eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
298eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
299eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        def systemName = ftpClient.getSystemName()
300eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        LOG.info("system name = [$systemName]")
301eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
3025f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("getSystemName", 215)
303eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
304eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
3055c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3065c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Test setup and tear-down
3075c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3085c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3095c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3105c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform initialization before each test
3115c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
3125c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3135c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void setUp() {
314aa72126634232b9f007e110204e081807257cd4fchrismair        super.setUp()
3155c17f34e1a613c319d355112f8298c20015ef7f2chrismair
316aa72126634232b9f007e110204e081807257cd4fchrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
317aa72126634232b9f007e110204e081807257cd4fchrismair            BINARY_DATA[i] = (byte) i
3185c17f34e1a613c319d355112f8298c20015ef7f2chrismair        }
3195c17f34e1a613c319d355112f8298c20015ef7f2chrismair
320aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer = new FakeFtpServer()
321eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
322eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.systemName = SYSTEM_NAME
3235c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3245c17f34e1a613c319d355112f8298c20015ef7f2chrismair        fileSystem = new FakeWindowsFileSystem()
325741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createParentDirectoriesAutomatically = true
326741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createDirectory(SUBDIR)
3275c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.fileSystem = fileSystem
3285c17f34e1a613c319d355112f8298c20015ef7f2chrismair
329fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        userAccount = new UserAccount(username: USERNAME, password: PASSWORD,
330741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair                passwordRequiredForLogin: true, homeDirectory: HOME_DIR)
3315c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.userAccounts[USERNAME] = userAccount
3325c17f34e1a613c319d355112f8298c20015ef7f2chrismair
333aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.start()
334aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient = new FTPClient()
3355c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3365c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3375c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3385c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform cleanup after each test
3395c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
3405c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3415c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void tearDown() {
342aa72126634232b9f007e110204e081807257cd4fchrismair        super.tearDown()
343aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.stop()
3445c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3455c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3465c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3475c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Internal Helper Methods
3485c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3495c17f34e1a613c319d355112f8298c20015ef7f2chrismair
350741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private ftpClientConnectAndLogin() {
351741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnect()
352741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.login(USERNAME, PASSWORD)
353741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
354741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
3555c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3565c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Connect to the server from the FTPClient
3575c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
358741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void ftpClientConnect() {
359741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        def port = PortTestUtil.getFtpServerControlPort()
360741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        LOG.info("Conecting to $SERVER on port $port")
361aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient.connect(SERVER, port)
362741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("connect", 220)
3635c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3645c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3655c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3665c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Assert that the FtpClient reply code is equal to the expected value
3675c17f34e1a613c319d355112f8298c20015ef7f2chrismair     *
368aa72126634232b9f007e110204e081807257cd4fchrismair     * @param operation - the description of the operation performed used in the error message
3695c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @param expectedReplyCode - the expected FtpClient reply code
3705c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3715c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
372aa72126634232b9f007e110204e081807257cd4fchrismair        int replyCode = ftpClient.getReplyCode()
373aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
374aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
3755c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3765c17f34e1a613c319d355112f8298c20015ef7f2chrismair
377741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
378aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info(ftpFile)
379aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
380aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
381aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
382741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
383741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
3845c17f34e1a613c319d355112f8298c20015ef7f2chrismair}