FakeFtpServerIntegrationTest.groovy revision c51130cfee05b7294599cc93125db801972d0746
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
2247fb67a4e600f339064de4c08f10279accc95e92chrismairimport org.mockftpserver.fake.filesystem.FileEntry
235c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.filesystem.FileSystem
249e1053c079532bc7e47012d63f8d9d7246df4e96chrismairimport org.mockftpserver.fake.filesystem.WindowsFakeFileSystem
255c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.user.UserAccount
265c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.AbstractGroovyTest
275c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.PortTestUtil
285c17f34e1a613c319d355112f8298c20015ef7f2chrismair
29c51130cfee05b7294599cc93125db801972d0746chrismair
305c17f34e1a613c319d355112f8298c20015ef7f2chrismair/**
315c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Integration tests for FakeFtpServer.
325c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
335c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @version $Revision: 54 $ - $Date: 2008-05-13 21:54:53 -0400 (Tue, 13 May 2008) $
345c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
355c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @author Chris Mair
365c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
375c17f34e1a613c319d355112f8298c20015ef7f2chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTest {
385c17f34e1a613c319d355112f8298c20015ef7f2chrismair
39aa72126634232b9f007e110204e081807257cd4fchrismair    static final SERVER = "localhost"
40aa72126634232b9f007e110204e081807257cd4fchrismair    static final USERNAME = "user123"
41aa72126634232b9f007e110204e081807257cd4fchrismair    static final PASSWORD = "password"
42fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    static final ACCOUNT = "account123"
43aa72126634232b9f007e110204e081807257cd4fchrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
44aa72126634232b9f007e110204e081807257cd4fchrismair    static final BINARY_DATA = new byte[256]
455e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final ROOT_DIR = "c:/"
465e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final HOME_DIR = p(ROOT_DIR, "home")
47741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR_NAME = 'sub'
48aa72126634232b9f007e110204e081807257cd4fchrismair    static final SUBDIR_NAME2 = "archive"
49741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
50aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME1 = "abc.txt"
51aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME2 = "SomeOtherFile.xml"
52741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
53eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    static final SYSTEM_NAME = "WINDOWS"
545c17f34e1a613c319d355112f8298c20015ef7f2chrismair
55aa72126634232b9f007e110204e081807257cd4fchrismair    private FakeFtpServer ftpServer
56aa72126634232b9f007e110204e081807257cd4fchrismair    private FTPClient ftpClient
575c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private FileSystem fileSystem
58fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    private UserAccount userAccount
595c17f34e1a613c319d355112f8298c20015ef7f2chrismair
605c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
615c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Tests
625c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
635c17f34e1a613c319d355112f8298c20015ef7f2chrismair
645aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAbor() {
655aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
665aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.abort()
675aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ABOR", 226)
685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
695aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
70fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testAcct() {
71fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
72fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.acct(ACCOUNT) == 230
73fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
74fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAllo() {
765aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
775aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.allocate(99)
785aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ALLO", 200)
795aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
805aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
815aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAppe() {
825aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def ORIGINAL_CONTENTS = '123 456 789'
83ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
845aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
855aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
865aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
875aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("Put File for local path [$FILE1]")
885aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
895aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.appendFile(FILE1, inputStream)
90c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("File contents=[" + contents + "]")
925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
955e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    void testCdup() {
965e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        ftpClientConnectAndLogin()
975e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        assert ftpClient.changeToParentDirectory()
985e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        verifyReplyCode("changeToParentDirectory", 200)
995e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    }
1005e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
101741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testCwd() {
102741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
103aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
104aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("changeWorkingDirectory", 250)
105741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
106741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
107741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testDele() {
108d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new FileEntry(FILE1))
109741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
110741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
111aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.deleteFile(FILENAME1)
112aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("deleteFile", 250)
1135f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(FILENAME1)
1145f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1155f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1165f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testHelp() {
1175f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpServer.helpText = [a: 'aaa', '': 'default']
1185f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnect()
1195f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1205f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        String help = ftpClient.listHelp()
1215f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('default')
1225f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1235f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1245f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('a')
1255f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('aaa')
1265f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1275f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1285f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('bad')
1295f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('bad')
1305f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
131741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
132741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
13347fb67a4e600f339064de4c08f10279accc95e92chrismair    void testList() {
13447fb67a4e600f339064de4c08f10279accc95e92chrismair        def LAST_MODIFIED = new Date()
135ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
136ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2), lastModified: LAST_MODIFIED))
13747fb67a4e600f339064de4c08f10279accc95e92chrismair
13847fb67a4e600f339064de4c08f10279accc95e92chrismair        ftpClientConnectAndLogin()
13947fb67a4e600f339064de4c08f10279accc95e92chrismair
14047fb67a4e600f339064de4c08f10279accc95e92chrismair        FTPFile[] files = ftpClient.listFiles(SUBDIR)
1415f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert files.length == 2
142aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
143aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
14447fb67a4e600f339064de4c08f10279accc95e92chrismair        verifyReplyCode("list", 226)
14547fb67a4e600f339064de4c08f10279accc95e92chrismair    }
1465c17f34e1a613c319d355112f8298c20015ef7f2chrismair
147fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin() {
148fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
149fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD")
150fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD)
151fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD", 230)
152fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
153fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
154fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin_WithAccount() {
155fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        userAccount.accountRequiredForLogin = true
156fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
157fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD with $ACCOUNT")
158fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD, ACCOUNT)
159fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD with $ACCOUNT", 230)
160fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
161fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
1624974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    void testMkd() {
1634974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        ftpClientConnectAndLogin()
1644974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
1654974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        def DIR = p(HOME_DIR, 'NewDir')
1664974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert ftpClient.makeDirectory(DIR)
1674974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        verifyReplyCode("makeDirectory", 257)
1684974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert fileSystem.isDirectory(DIR)
1694974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    }
1704974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
1715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testMode() {
1725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
1735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
1745aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("MODE", 200)
1755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
1765aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
177aa72126634232b9f007e110204e081807257cd4fchrismair    void testNlst() {
178ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
179ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
180aa72126634232b9f007e110204e081807257cd4fchrismair
181aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
182aa72126634232b9f007e110204e081807257cd4fchrismair
183aa72126634232b9f007e110204e081807257cd4fchrismair        String[] filenames = ftpClient.listNames(SUBDIR)
1845f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filenames == [FILENAME1, SUBDIR_NAME2]
185aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("listNames", 226)
186aa72126634232b9f007e110204e081807257cd4fchrismair    }
187aa72126634232b9f007e110204e081807257cd4fchrismair
1885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testNoop() {
1895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
1905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.sendNoOp()
1915f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("NOOP", 200)
1925f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1935f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testPasv_Nlst() {
195ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
196ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME2)))
1975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
1985aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
1995aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClient.enterLocalPassiveMode();
2005aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
2015aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
2025aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert filenames == [FILENAME1, FILENAME2]
2035aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("listNames", 226)
2045aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2055aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
206fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testPwd() {
207fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
208fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
209fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("printWorkingDirectory", 257)
210fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
211fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
212fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testQuit() {
213fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
214fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClient.quit()
215fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("quit", 221)
216fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
217fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
2185aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testRein() {
2195aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2205aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.rein() == 220
2215aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.cdup() == 530      // now logged out
2225aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2235aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
224c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    void testRest() {
225c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        ftpClientConnectAndLogin()
226c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        assert ftpClient.rest("marker") == 350
227c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    }
228c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair
229aa72126634232b9f007e110204e081807257cd4fchrismair    void testRetr() {
230ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ASCII_DATA))
231aa72126634232b9f007e110204e081807257cd4fchrismair
232aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
233aa72126634232b9f007e110204e081807257cd4fchrismair
234aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Get File for remotePath [$FILE1]")
235aa72126634232b9f007e110204e081807257cd4fchrismair        def outputStream = new ByteArrayOutputStream()
236aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
237aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[${outputStream.toString()}]")
238aa72126634232b9f007e110204e081807257cd4fchrismair        assert outputStream.toString() == ASCII_DATA
239aa72126634232b9f007e110204e081807257cd4fchrismair    }
240aa72126634232b9f007e110204e081807257cd4fchrismair
241eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRmd() {
242eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
243eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
244eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.removeDirectory(SUBDIR)
245eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("removeDirectory", 250)
2465f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(SUBDIR)
247eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
248eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
249eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRename() {                 // RNFR and RNTO
250d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new FileEntry(FILE1))
251eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
252eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
253eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
254eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
255eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("rename", 250)
256eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert !fileSystem.exists(FILE1)
257eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert fileSystem.exists(FILE1 + "NEW")
258eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
259eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
2605f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testSite() {
2615f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2625f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.site("parameters,1,2,3") == 200
2635f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2645f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
265aa72126634232b9f007e110204e081807257cd4fchrismair    void testStor() {
266aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
267aa72126634232b9f007e110204e081807257cd4fchrismair
268aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Put File for local path [$FILE1]")
269aa72126634232b9f007e110204e081807257cd4fchrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
270aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.storeFile(FILE1, inputStream)
271c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
272aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[" + contents + "]")
273aa72126634232b9f007e110204e081807257cd4fchrismair        assert contents == ASCII_DATA
274aa72126634232b9f007e110204e081807257cd4fchrismair    }
275aa72126634232b9f007e110204e081807257cd4fchrismair
2765f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testStou() {
2775f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2785f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2795f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
2805f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
2815f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2825f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def names = fileSystem.listNames(HOME_DIR)
2835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
2845f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filename
2855f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
286c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(p(HOME_DIR, filename)).createInputStream().text
2875f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        LOG.info("File contents=[" + contents + "]")
2885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert contents == ASCII_DATA
2895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testStru() {
2925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
2945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("STRU", 200)
2955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
297eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testSyst() {
298eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
299eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
300eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        def systemName = ftpClient.getSystemName()
301eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        LOG.info("system name = [$systemName]")
302eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
3035f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("getSystemName", 215)
304eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
305eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
306c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair    void testType() {
307c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        ftpClientConnectAndLogin()
308c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        assert ftpClient.type(FTP.ASCII_FILE_TYPE)
309c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        verifyReplyCode("TYPE", 200)
310c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair    }
311c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair
3125c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3135c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Test setup and tear-down
3145c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3155c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3165c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3175c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform initialization before each test
3185c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
3195c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3205c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void setUp() {
321aa72126634232b9f007e110204e081807257cd4fchrismair        super.setUp()
3225c17f34e1a613c319d355112f8298c20015ef7f2chrismair
323aa72126634232b9f007e110204e081807257cd4fchrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
324aa72126634232b9f007e110204e081807257cd4fchrismair            BINARY_DATA[i] = (byte) i
3255c17f34e1a613c319d355112f8298c20015ef7f2chrismair        }
3265c17f34e1a613c319d355112f8298c20015ef7f2chrismair
327aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer = new FakeFtpServer()
328eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
329eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.systemName = SYSTEM_NAME
3305c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3319e1053c079532bc7e47012d63f8d9d7246df4e96chrismair        fileSystem = new WindowsFakeFileSystem()
332741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createParentDirectoriesAutomatically = true
333d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new DirectoryEntry(SUBDIR))
3345c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.fileSystem = fileSystem
3355c17f34e1a613c319d355112f8298c20015ef7f2chrismair
336fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        userAccount = new UserAccount(username: USERNAME, password: PASSWORD,
337741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair                passwordRequiredForLogin: true, homeDirectory: HOME_DIR)
3385c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.userAccounts[USERNAME] = userAccount
3395c17f34e1a613c319d355112f8298c20015ef7f2chrismair
340aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.start()
341aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient = new FTPClient()
3425c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3435c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3445c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3455c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform cleanup after each test
3465c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
3475c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3485c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void tearDown() {
349aa72126634232b9f007e110204e081807257cd4fchrismair        super.tearDown()
350aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.stop()
3515c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3525c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3535c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3545c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Internal Helper Methods
3555c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3565c17f34e1a613c319d355112f8298c20015ef7f2chrismair
357741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private ftpClientConnectAndLogin() {
358741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnect()
359741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.login(USERNAME, PASSWORD)
360741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
361741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
3625c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3635c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Connect to the server from the FTPClient
3645c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
365741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void ftpClientConnect() {
366741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        def port = PortTestUtil.getFtpServerControlPort()
367741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        LOG.info("Conecting to $SERVER on port $port")
368aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient.connect(SERVER, port)
369741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("connect", 220)
3705c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3715c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3725c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3735c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Assert that the FtpClient reply code is equal to the expected value
3745c17f34e1a613c319d355112f8298c20015ef7f2chrismair     *
375aa72126634232b9f007e110204e081807257cd4fchrismair     * @param operation - the description of the operation performed used in the error message
3765c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @param expectedReplyCode - the expected FtpClient reply code
3775c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3785c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
379aa72126634232b9f007e110204e081807257cd4fchrismair        int replyCode = ftpClient.getReplyCode()
380aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
381aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
3825c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3835c17f34e1a613c319d355112f8298c20015ef7f2chrismair
384741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
385aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info(ftpFile)
386aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
387aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
388aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
389741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
390741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
3915c17f34e1a613c319d355112f8298c20015ef7f2chrismair}