FakeFtpServerIntegrationTest.groovy revision 75520503341f870a8d2a27e0a82cca14f8aa6a4b
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 */
16bd576ae311a45a994ae6b457fb2e5bb0ffe0d6b5chrismairpackage org.mockftpserver.fake
175c17f34e1a613c319d355112f8298c20015ef7f2chrismair
185aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismairimport org.apache.commons.net.ftp.FTP
195c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.apache.commons.net.ftp.FTPClient
20741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismairimport org.apache.commons.net.ftp.FTPFile
21dc2f0785d93e376be101f61f005729222061870fchrismairimport org.mockftpserver.core.command.CommandNames
22848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler
23bd576ae311a45a994ae6b457fb2e5bb0ffe0d6b5chrismairimport org.mockftpserver.fake.FakeFtpServer
24bd576ae311a45a994ae6b457fb2e5bb0ffe0d6b5chrismairimport org.mockftpserver.fake.UserAccount
250da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry
260da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.FileEntry
270da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.FileSystem
280da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.UnixFakeFileSystem
290da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.WindowsFakeFileSystem
300da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.stub.command.CwdCommandHandler
315c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.AbstractGroovyTest
325c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.PortTestUtil
335c17f34e1a613c319d355112f8298c20015ef7f2chrismair
345c17f34e1a613c319d355112f8298c20015ef7f2chrismair/**
355c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Integration tests for FakeFtpServer.
365c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
372a0a3f946dba517a01cc26278f905156857c9c91chrismair * @version $Revision$ - $Date$
385c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
395c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @author Chris Mair
405c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
415c17f34e1a613c319d355112f8298c20015ef7f2chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTest {
425c17f34e1a613c319d355112f8298c20015ef7f2chrismair
43aa72126634232b9f007e110204e081807257cd4fchrismair    static final SERVER = "localhost"
44aa72126634232b9f007e110204e081807257cd4fchrismair    static final USERNAME = "user123"
45aa72126634232b9f007e110204e081807257cd4fchrismair    static final PASSWORD = "password"
46fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    static final ACCOUNT = "account123"
47aa72126634232b9f007e110204e081807257cd4fchrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
48aa72126634232b9f007e110204e081807257cd4fchrismair    static final BINARY_DATA = new byte[256]
495e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final ROOT_DIR = "c:/"
505e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final HOME_DIR = p(ROOT_DIR, "home")
51741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR_NAME = 'sub'
52aa72126634232b9f007e110204e081807257cd4fchrismair    static final SUBDIR_NAME2 = "archive"
53741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
54aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME1 = "abc.txt"
55aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME2 = "SomeOtherFile.xml"
56741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
57eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    static final SYSTEM_NAME = "WINDOWS"
585c17f34e1a613c319d355112f8298c20015ef7f2chrismair
59aa72126634232b9f007e110204e081807257cd4fchrismair    private FakeFtpServer ftpServer
60aa72126634232b9f007e110204e081807257cd4fchrismair    private FTPClient ftpClient
615c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private FileSystem fileSystem
62fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    private UserAccount userAccount
635c17f34e1a613c319d355112f8298c20015ef7f2chrismair
645c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
655c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Tests
665c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
675c17f34e1a613c319d355112f8298c20015ef7f2chrismair
685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAbor() {
695aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
705aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.abort()
715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ABOR", 226)
725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
74fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testAcct() {
75fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
76fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.acct(ACCOUNT) == 230
77fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
78fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
795aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAllo() {
805aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
815aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.allocate(99)
825aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ALLO", 200)
835aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
845aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
855aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAppe() {
865aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def ORIGINAL_CONTENTS = '123 456 789'
87ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
885aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
895aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
905aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("Put File for local path [$FILE1]")
925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.appendFile(FILE1, inputStream)
94c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("File contents=[" + contents + "]")
965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
985aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
995e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    void testCdup() {
1005e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        ftpClientConnectAndLogin()
1015e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        assert ftpClient.changeToParentDirectory()
1025e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        verifyReplyCode("changeToParentDirectory", 200)
1035e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    }
1045e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
105741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testCwd() {
106741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
107aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
108aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("changeWorkingDirectory", 250)
109741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
110741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
11138fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    /**
11238fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     * Test that a CWD to ".." properly resolves the current dir (without the "..") so that PWD returns the parent
11338fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     */
11438fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    void testCwd_DotDot_Pwd() {
11538fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        ftpClientConnectAndLogin()
11638fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert ftpClient.changeWorkingDirectory("..")
11738fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        verifyReplyCode("changeWorkingDirectory", 250)
11838fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert p(ftpClient.printWorkingDirectory()) == p(ROOT_DIR)
11938fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert ftpClient.changeWorkingDirectory("home")
12038fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert p(ftpClient.printWorkingDirectory()) == p(HOME_DIR)
12138fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    }
12238fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair
12338fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    /**
12438fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     * Test that a CWD to "." properly resolves the current dir (without the ".") so that PWD returns the parent
12538fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     */
12638fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    void testCwd_Dot_Pwd() {
12738fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        ftpClientConnectAndLogin()
12838fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert ftpClient.changeWorkingDirectory(".")
12938fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        verifyReplyCode("changeWorkingDirectory", 250)
13038fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert p(ftpClient.printWorkingDirectory()) == p(HOME_DIR)
13138fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    }
13238fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair
133848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair    void testCwd_UseStaticReplyCommandHandler() {
134848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        final int REPLY_CODE = 500;
135848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
136dc2f0785d93e376be101f61f005729222061870fchrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
1370da0f84ad9831bea470896e79b5ec207c83f258echrismair
1380da0f84ad9831bea470896e79b5ec207c83f258echrismair        ftpClientConnectAndLogin()
1390da0f84ad9831bea470896e79b5ec207c83f258echrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
1400da0f84ad9831bea470896e79b5ec207c83f258echrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
1410da0f84ad9831bea470896e79b5ec207c83f258echrismair    }
1420da0f84ad9831bea470896e79b5ec207c83f258echrismair
1430da0f84ad9831bea470896e79b5ec207c83f258echrismair    void testCwd_UseStubCommandHandler() {
1440da0f84ad9831bea470896e79b5ec207c83f258echrismair        final int REPLY_CODE = 502;
1450da0f84ad9831bea470896e79b5ec207c83f258echrismair        CwdCommandHandler cwdCommandHandler = new CwdCommandHandler();     // Stub command handler
1460da0f84ad9831bea470896e79b5ec207c83f258echrismair        cwdCommandHandler.setReplyCode(REPLY_CODE);
147dc2f0785d93e376be101f61f005729222061870fchrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
1480da0f84ad9831bea470896e79b5ec207c83f258echrismair
149848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        ftpClientConnectAndLogin()
150848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
1510da0f84ad9831bea470896e79b5ec207c83f258echrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
1520da0f84ad9831bea470896e79b5ec207c83f258echrismair        assert cwdCommandHandler.getInvocation(0)
153848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair    }
154848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair
155741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testDele() {
156d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new FileEntry(FILE1))
157741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
158741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
159aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.deleteFile(FILENAME1)
160aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("deleteFile", 250)
1615f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(FILENAME1)
1625f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1635f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
16475520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair    void testEprt() {
16575520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair        ftpClientConnectAndLogin()
16675520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair        assert ftpClient.sendCommand("EPRT", "|2|1080::8:800:200C:417A|5282|") == 200
16775520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair    }
16875520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair
16975520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair    void testEpsv() {
17075520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair        ftpClientConnectAndLogin()
17175520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair        assert ftpClient.sendCommand("EPSV") == 229
17275520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair    }
17375520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair
174dc2f0785d93e376be101f61f005729222061870fchrismair    void testFeat_UseStaticReplyCommandHandler() {
175dc2f0785d93e376be101f61f005729222061870fchrismair        // The FEAT command is not supported out of the box
176dc2f0785d93e376be101f61f005729222061870fchrismair        StaticReplyCommandHandler featCommandHandler = new StaticReplyCommandHandler(211, "No Features");
177dc2f0785d93e376be101f61f005729222061870fchrismair        ftpServer.setCommandHandler("FEAT", featCommandHandler);
178dc2f0785d93e376be101f61f005729222061870fchrismair
179dc2f0785d93e376be101f61f005729222061870fchrismair        ftpClientConnectAndLogin()
180dc2f0785d93e376be101f61f005729222061870fchrismair        assert ftpClient.sendCommand("FEAT") == 211
181dc2f0785d93e376be101f61f005729222061870fchrismair    }
182dc2f0785d93e376be101f61f005729222061870fchrismair
1835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testHelp() {
1845f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpServer.helpText = [a: 'aaa', '': 'default']
1855f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnect()
1865f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1875f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        String help = ftpClient.listHelp()
1885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('default')
1895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1915f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('a')
1925f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('aaa')
1935f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1945f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1955f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('bad')
1965f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('bad')
1975f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
198741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
199741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
20047fb67a4e600f339064de4c08f10279accc95e92chrismair    void testList() {
20147fb67a4e600f339064de4c08f10279accc95e92chrismair        def LAST_MODIFIED = new Date()
202ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
203ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2), lastModified: LAST_MODIFIED))
20447fb67a4e600f339064de4c08f10279accc95e92chrismair
20547fb67a4e600f339064de4c08f10279accc95e92chrismair        ftpClientConnectAndLogin()
20647fb67a4e600f339064de4c08f10279accc95e92chrismair
20747fb67a4e600f339064de4c08f10279accc95e92chrismair        FTPFile[] files = ftpClient.listFiles(SUBDIR)
2085f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert files.length == 2
209aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
210aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
21147fb67a4e600f339064de4c08f10279accc95e92chrismair        verifyReplyCode("list", 226)
21247fb67a4e600f339064de4c08f10279accc95e92chrismair    }
2135c17f34e1a613c319d355112f8298c20015ef7f2chrismair
214412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair    void testList_Unix() {
215412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        ftpServer.systemName = 'UNIX'
216412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        userAccount.homeDirectory = '/'
217412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
218412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        def unixFileSystem = new UnixFakeFileSystem()
219412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.createParentDirectoriesAutomatically = true
220412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.add(new DirectoryEntry('/'))
221412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        ftpServer.fileSystem = unixFileSystem
222412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
223412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        def LAST_MODIFIED = new Date()
224412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.add(new FileEntry(path: p('/', FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
225412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.add(new DirectoryEntry(path: p('/', SUBDIR_NAME2), lastModified: LAST_MODIFIED))
226412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
227412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        ftpClientConnectAndLogin()
228412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
229412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        FTPFile[] files = ftpClient.listFiles('/')
230412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        assert files.length == 2
231412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        verifyFTPFile(files[0], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
232412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        verifyFTPFile(files[1], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
233412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        verifyReplyCode("list", 226)
234412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair    }
235412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
236fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin() {
237fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
238fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD")
239fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD)
240fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD", 230)
241f2152557999c6eeca3b2018166ddad4c015ddd89chrismair
242f2152557999c6eeca3b2018166ddad4c015ddd89chrismair        assertTrue("isStarted", ftpServer.isStarted());
243f2152557999c6eeca3b2018166ddad4c015ddd89chrismair        assertFalse("isShutdown", ftpServer.isShutdown());
244fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
245fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
246fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin_WithAccount() {
247fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        userAccount.accountRequiredForLogin = true
248fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
249fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD with $ACCOUNT")
250fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD, ACCOUNT)
251fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD with $ACCOUNT", 230)
252fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
253fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
2544974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    void testMkd() {
2554974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        ftpClientConnectAndLogin()
2564974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
2574974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        def DIR = p(HOME_DIR, 'NewDir')
2584974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert ftpClient.makeDirectory(DIR)
2594974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        verifyReplyCode("makeDirectory", 257)
2604974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert fileSystem.isDirectory(DIR)
2614974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    }
2624974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
2635aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testMode() {
2645aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2655aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
2665aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("MODE", 200)
2675aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
269aa72126634232b9f007e110204e081807257cd4fchrismair    void testNlst() {
270ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
271ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
272aa72126634232b9f007e110204e081807257cd4fchrismair
273aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
274aa72126634232b9f007e110204e081807257cd4fchrismair
275aa72126634232b9f007e110204e081807257cd4fchrismair        String[] filenames = ftpClient.listNames(SUBDIR)
2765f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filenames == [FILENAME1, SUBDIR_NAME2]
277aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("listNames", 226)
278aa72126634232b9f007e110204e081807257cd4fchrismair    }
279aa72126634232b9f007e110204e081807257cd4fchrismair
2805f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testNoop() {
2815f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2825f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.sendNoOp()
2835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("NOOP", 200)
2845f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2855f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2865aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testPasv_Nlst() {
287ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
288ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME2)))
2895aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
2905aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClient.enterLocalPassiveMode();
2925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
2935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
2945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert filenames == [FILENAME1, FILENAME2]
2955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("listNames", 226)
2965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
298fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testPwd() {
299fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
300fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
301fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("printWorkingDirectory", 257)
302fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
303fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
304fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testQuit() {
305fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
306fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClient.quit()
307fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("quit", 221)
308fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
309fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
3105aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testRein() {
3115aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
3125aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.rein() == 220
3135aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.cdup() == 530      // now logged out
3145aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
3155aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
316c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    void testRest() {
317c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        ftpClientConnectAndLogin()
318c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        assert ftpClient.rest("marker") == 350
319c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    }
320c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair
321aa72126634232b9f007e110204e081807257cd4fchrismair    void testRetr() {
322ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ASCII_DATA))
323aa72126634232b9f007e110204e081807257cd4fchrismair
324aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
325aa72126634232b9f007e110204e081807257cd4fchrismair
326aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Get File for remotePath [$FILE1]")
327aa72126634232b9f007e110204e081807257cd4fchrismair        def outputStream = new ByteArrayOutputStream()
328aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
329aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[${outputStream.toString()}]")
330aa72126634232b9f007e110204e081807257cd4fchrismair        assert outputStream.toString() == ASCII_DATA
331aa72126634232b9f007e110204e081807257cd4fchrismair    }
332aa72126634232b9f007e110204e081807257cd4fchrismair
333eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRmd() {
334eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
335eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
336eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.removeDirectory(SUBDIR)
337eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("removeDirectory", 250)
3385f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(SUBDIR)
339eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
340eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
341eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRename() {                 // RNFR and RNTO
342d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new FileEntry(FILE1))
343eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
344eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
345eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
346eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
347eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("rename", 250)
348eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert !fileSystem.exists(FILE1)
349eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert fileSystem.exists(FILE1 + "NEW")
350eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
351eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
3525f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testSite() {
3535f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
3545f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.site("parameters,1,2,3") == 200
3555f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
3565f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3571901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair    void testSmnt() {
3581901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair        ftpClientConnectAndLogin()
3591901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair        assert ftpClient.smnt("dir") == 250
3601901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair    }
3611901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair
3623fc03edff55387bae91315653eae3ed0ca9b1f2achrismair    void testStat() {
3633fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        ftpClientConnectAndLogin()
3643fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        def status = ftpClient.getStatus()
3653fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        assert status.contains('Connected')
3663fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        verifyReplyCode("stat", 211)
3673fc03edff55387bae91315653eae3ed0ca9b1f2achrismair    }
3683fc03edff55387bae91315653eae3ed0ca9b1f2achrismair
369aa72126634232b9f007e110204e081807257cd4fchrismair    void testStor() {
370aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
371aa72126634232b9f007e110204e081807257cd4fchrismair
372aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Put File for local path [$FILE1]")
373aa72126634232b9f007e110204e081807257cd4fchrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
374aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.storeFile(FILE1, inputStream)
375c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
376aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[" + contents + "]")
377aa72126634232b9f007e110204e081807257cd4fchrismair        assert contents == ASCII_DATA
378aa72126634232b9f007e110204e081807257cd4fchrismair    }
379aa72126634232b9f007e110204e081807257cd4fchrismair
3805f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testStou() {
3815f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
3825f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
3845f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
3855f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3865f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def names = fileSystem.listNames(HOME_DIR)
3875f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
3885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filename
3895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
390c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(p(HOME_DIR, filename)).createInputStream().text
3915f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        LOG.info("File contents=[" + contents + "]")
3925f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert contents == ASCII_DATA
3935f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
3945f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testStru() {
3965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
3975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
3985aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("STRU", 200)
3995aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
4005aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
401eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testSyst() {
402eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
403eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
404eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        def systemName = ftpClient.getSystemName()
405eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        LOG.info("system name = [$systemName]")
406eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
4075f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("getSystemName", 215)
408eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
409eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
410c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair    void testType() {
411c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        ftpClientConnectAndLogin()
412c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        assert ftpClient.type(FTP.ASCII_FILE_TYPE)
413c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        verifyReplyCode("TYPE", 200)
414c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair    }
415c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair
41649deb463d1cc3132e4aa60bfd4469398c57c1745chrismair    void testUnrecognizedCommand() {
41749deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        ftpClientConnectAndLogin()
41849deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        assert ftpClient.sendCommand("XXX") == 502
41949deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        verifyReplyCode("XXX", 502)
42049deb463d1cc3132e4aa60bfd4469398c57c1745chrismair    }
42149deb463d1cc3132e4aa60bfd4469398c57c1745chrismair
4225c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4235c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Test setup and tear-down
4245c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4255c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4265c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4275c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform initialization before each test
4285c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
4295c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
4305c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void setUp() {
431aa72126634232b9f007e110204e081807257cd4fchrismair        super.setUp()
4325c17f34e1a613c319d355112f8298c20015ef7f2chrismair
433aa72126634232b9f007e110204e081807257cd4fchrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
434aa72126634232b9f007e110204e081807257cd4fchrismair            BINARY_DATA[i] = (byte) i
4355c17f34e1a613c319d355112f8298c20015ef7f2chrismair        }
4365c17f34e1a613c319d355112f8298c20015ef7f2chrismair
437aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer = new FakeFtpServer()
438eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
439eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.systemName = SYSTEM_NAME
4405c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4419e1053c079532bc7e47012d63f8d9d7246df4e96chrismair        fileSystem = new WindowsFakeFileSystem()
442741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createParentDirectoriesAutomatically = true
443d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new DirectoryEntry(SUBDIR))
4445c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.fileSystem = fileSystem
4455c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4467bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair        userAccount = new UserAccount(USERNAME, PASSWORD, HOME_DIR)
4471901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair        ftpServer.addUserAccount(userAccount)
4485c17f34e1a613c319d355112f8298c20015ef7f2chrismair
449aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.start()
450aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient = new FTPClient()
4515c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4525c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4535c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4545c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform cleanup after each test
4555c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
4565c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
4575c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void tearDown() {
458aa72126634232b9f007e110204e081807257cd4fchrismair        super.tearDown()
459aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.stop()
4605c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4615c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4625c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4635c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Internal Helper Methods
4645c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4655c17f34e1a613c319d355112f8298c20015ef7f2chrismair
466741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private ftpClientConnectAndLogin() {
467741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnect()
468741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.login(USERNAME, PASSWORD)
469741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
470741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
4715c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4725c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Connect to the server from the FTPClient
4735c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
474741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void ftpClientConnect() {
475741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        def port = PortTestUtil.getFtpServerControlPort()
476741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        LOG.info("Conecting to $SERVER on port $port")
477aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient.connect(SERVER, port)
478741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("connect", 220)
4795c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4805c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4815c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4825c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Assert that the FtpClient reply code is equal to the expected value
4835c17f34e1a613c319d355112f8298c20015ef7f2chrismair     *
484aa72126634232b9f007e110204e081807257cd4fchrismair     * @param operation - the description of the operation performed used in the error message
4855c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @param expectedReplyCode - the expected FtpClient reply code
4865c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
4875c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
488aa72126634232b9f007e110204e081807257cd4fchrismair        int replyCode = ftpClient.getReplyCode()
489aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
490aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
4915c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4925c17f34e1a613c319d355112f8298c20015ef7f2chrismair
493741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
494aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info(ftpFile)
495aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
496aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
497aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
498741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
499741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
5005c17f34e1a613c319d355112f8298c20015ef7f2chrismair}