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
2340658190151b7ded3489ff89c301b470155c95f4chrismair
240da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry
250da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.FileEntry
260da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.FileSystem
270da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.UnixFakeFileSystem
280da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.fake.filesystem.WindowsFakeFileSystem
290da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.stub.command.CwdCommandHandler
305303c6ae1dde5f399fe48803e677942fc4326344chrismairimport org.mockftpserver.test.AbstractGroovyTestCase
315c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.PortTestUtil
325c17f34e1a613c319d355112f8298c20015ef7f2chrismair
335c17f34e1a613c319d355112f8298c20015ef7f2chrismair/**
345c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Integration tests for FakeFtpServer.
355c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
362a0a3f946dba517a01cc26278f905156857c9c91chrismair * @version $Revision$ - $Date$
375c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
385c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @author Chris Mair
395c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
405303c6ae1dde5f399fe48803e677942fc4326344chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTestCase {
415c17f34e1a613c319d355112f8298c20015ef7f2chrismair
42aa72126634232b9f007e110204e081807257cd4fchrismair    static final SERVER = "localhost"
43aa72126634232b9f007e110204e081807257cd4fchrismair    static final USERNAME = "user123"
44aa72126634232b9f007e110204e081807257cd4fchrismair    static final PASSWORD = "password"
45fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    static final ACCOUNT = "account123"
46aa72126634232b9f007e110204e081807257cd4fchrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
47aa72126634232b9f007e110204e081807257cd4fchrismair    static final BINARY_DATA = new byte[256]
485e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final ROOT_DIR = "c:/"
495e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final HOME_DIR = p(ROOT_DIR, "home")
50741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR_NAME = 'sub'
51aa72126634232b9f007e110204e081807257cd4fchrismair    static final SUBDIR_NAME2 = "archive"
52741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
53aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME1 = "abc.txt"
54aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME2 = "SomeOtherFile.xml"
55741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
56eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    static final SYSTEM_NAME = "WINDOWS"
575c17f34e1a613c319d355112f8298c20015ef7f2chrismair
58aa72126634232b9f007e110204e081807257cd4fchrismair    private FakeFtpServer ftpServer
59aa72126634232b9f007e110204e081807257cd4fchrismair    private FTPClient ftpClient
605c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private FileSystem fileSystem
61fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    private UserAccount userAccount
625c17f34e1a613c319d355112f8298c20015ef7f2chrismair
635c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
645c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Tests
655c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
665c17f34e1a613c319d355112f8298c20015ef7f2chrismair
675aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAbor() {
685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
695aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.abort()
705aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ABOR", 226)
715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
73fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testAcct() {
74fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
75fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.acct(ACCOUNT) == 230
76fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
77fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
785aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAllo() {
795aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
805aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.allocate(99)
815aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ALLO", 200)
825aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
835aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
845aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAppe() {
855aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def ORIGINAL_CONTENTS = '123 456 789'
86ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
875aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
885aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
895aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
905aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("Put File for local path [$FILE1]")
915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.appendFile(FILE1, inputStream)
93c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("File contents=[" + contents + "]")
955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
985e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    void testCdup() {
995e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        ftpClientConnectAndLogin()
1005e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        assert ftpClient.changeToParentDirectory()
1015e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        verifyReplyCode("changeToParentDirectory", 200)
1025e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    }
1035e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
104741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testCwd() {
105741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
106aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
107aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("changeWorkingDirectory", 250)
108741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
109741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
11038fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    /**
11138fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     * Test that a CWD to ".." properly resolves the current dir (without the "..") so that PWD returns the parent
11238fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     */
11338fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    void testCwd_DotDot_Pwd() {
11438fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        ftpClientConnectAndLogin()
11538fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert ftpClient.changeWorkingDirectory("..")
11638fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        verifyReplyCode("changeWorkingDirectory", 250)
11738fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert p(ftpClient.printWorkingDirectory()) == p(ROOT_DIR)
11838fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert ftpClient.changeWorkingDirectory("home")
11938fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert p(ftpClient.printWorkingDirectory()) == p(HOME_DIR)
12038fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    }
12138fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair
12238fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    /**
12338fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     * Test that a CWD to "." properly resolves the current dir (without the ".") so that PWD returns the parent
12438fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair     */
12538fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    void testCwd_Dot_Pwd() {
12638fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        ftpClientConnectAndLogin()
12738fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert ftpClient.changeWorkingDirectory(".")
12838fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        verifyReplyCode("changeWorkingDirectory", 250)
12938fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert p(ftpClient.printWorkingDirectory()) == p(HOME_DIR)
13038fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair    }
13138fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair
132848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair    void testCwd_UseStaticReplyCommandHandler() {
133848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        final int REPLY_CODE = 500;
134848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
135dc2f0785d93e376be101f61f005729222061870fchrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
1360da0f84ad9831bea470896e79b5ec207c83f258echrismair
1370da0f84ad9831bea470896e79b5ec207c83f258echrismair        ftpClientConnectAndLogin()
1380da0f84ad9831bea470896e79b5ec207c83f258echrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
1390da0f84ad9831bea470896e79b5ec207c83f258echrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
1400da0f84ad9831bea470896e79b5ec207c83f258echrismair    }
1410da0f84ad9831bea470896e79b5ec207c83f258echrismair
1420da0f84ad9831bea470896e79b5ec207c83f258echrismair    void testCwd_UseStubCommandHandler() {
1430da0f84ad9831bea470896e79b5ec207c83f258echrismair        final int REPLY_CODE = 502;
1440da0f84ad9831bea470896e79b5ec207c83f258echrismair        CwdCommandHandler cwdCommandHandler = new CwdCommandHandler();     // Stub command handler
1450da0f84ad9831bea470896e79b5ec207c83f258echrismair        cwdCommandHandler.setReplyCode(REPLY_CODE);
146dc2f0785d93e376be101f61f005729222061870fchrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
1470da0f84ad9831bea470896e79b5ec207c83f258echrismair
148848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        ftpClientConnectAndLogin()
149848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
1500da0f84ad9831bea470896e79b5ec207c83f258echrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
1510da0f84ad9831bea470896e79b5ec207c83f258echrismair        assert cwdCommandHandler.getInvocation(0)
152848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair    }
153848932d9e7c6953b3c345c9aa6b0b6c3cfe20d79chrismair
154741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testDele() {
155d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new FileEntry(FILE1))
156741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
157741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
158aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.deleteFile(FILENAME1)
159aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("deleteFile", 250)
1605f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(FILENAME1)
1615f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1625f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
16375520503341f870a8d2a27e0a82cca14f8aa6a4bchrismair    void testEprt() {
164150ece0932001dba199ecc1a8f98f5eb4060735dchrismair        log("Skipping...")
165150ece0932001dba199ecc1a8f98f5eb4060735dchrismair//        ftpClientConnectAndLogin()
166150ece0932001dba199ecc1a8f98f5eb4060735dchrismair//        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
2093373d667c329b520a33bf4760304e2757ac55292chrismair
2103373d667c329b520a33bf4760304e2757ac55292chrismair        // Can't be sure of order
2113373d667c329b520a33bf4760304e2757ac55292chrismair        FTPFile fileEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[0] : files[1]
2123373d667c329b520a33bf4760304e2757ac55292chrismair        FTPFile dirEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[1] : files[0]
2133373d667c329b520a33bf4760304e2757ac55292chrismair        verifyFTPFile(fileEntry, FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
2143373d667c329b520a33bf4760304e2757ac55292chrismair        verifyFTPFile(dirEntry, FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
2153373d667c329b520a33bf4760304e2757ac55292chrismair
21647fb67a4e600f339064de4c08f10279accc95e92chrismair        verifyReplyCode("list", 226)
21747fb67a4e600f339064de4c08f10279accc95e92chrismair    }
2185c17f34e1a613c319d355112f8298c20015ef7f2chrismair
219412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair    void testList_Unix() {
220412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        ftpServer.systemName = 'UNIX'
221412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        userAccount.homeDirectory = '/'
222412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
223412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        def unixFileSystem = new UnixFakeFileSystem()
224412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.createParentDirectoriesAutomatically = true
225412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.add(new DirectoryEntry('/'))
226412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        ftpServer.fileSystem = unixFileSystem
227412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
228412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        def LAST_MODIFIED = new Date()
229412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.add(new FileEntry(path: p('/', FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
230412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        unixFileSystem.add(new DirectoryEntry(path: p('/', SUBDIR_NAME2), lastModified: LAST_MODIFIED))
231412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
232412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        ftpClientConnectAndLogin()
233412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
234412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        FTPFile[] files = ftpClient.listFiles('/')
235412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        assert files.length == 2
2363373d667c329b520a33bf4760304e2757ac55292chrismair
2373373d667c329b520a33bf4760304e2757ac55292chrismair        // Can't be sure of order
2383373d667c329b520a33bf4760304e2757ac55292chrismair        FTPFile fileEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[0] : files[1]
2393373d667c329b520a33bf4760304e2757ac55292chrismair        FTPFile dirEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[1] : files[0]
2403373d667c329b520a33bf4760304e2757ac55292chrismair
2413373d667c329b520a33bf4760304e2757ac55292chrismair        verifyFTPFile(dirEntry, FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
2423373d667c329b520a33bf4760304e2757ac55292chrismair        verifyFTPFile(fileEntry, FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
243412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair        verifyReplyCode("list", 226)
244412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair    }
245412bd6ebabaf88f22efb2b7d17421fbd2e1bc235chrismair
246fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin() {
247fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
248fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD")
249fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD)
250fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD", 230)
251f2152557999c6eeca3b2018166ddad4c015ddd89chrismair
252f2152557999c6eeca3b2018166ddad4c015ddd89chrismair        assertTrue("isStarted", ftpServer.isStarted());
253f2152557999c6eeca3b2018166ddad4c015ddd89chrismair        assertFalse("isShutdown", ftpServer.isShutdown());
254fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
255fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
256fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testLogin_WithAccount() {
257fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        userAccount.accountRequiredForLogin = true
258fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
259fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        LOG.info("Logging in as $USERNAME/$PASSWORD with $ACCOUNT")
260fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.login(USERNAME, PASSWORD, ACCOUNT)
261fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("login with $USERNAME/$PASSWORD with $ACCOUNT", 230)
262fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
263fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
2644974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    void testMkd() {
2654974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        ftpClientConnectAndLogin()
2664974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
2674974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        def DIR = p(HOME_DIR, 'NewDir')
2684974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert ftpClient.makeDirectory(DIR)
2694974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        verifyReplyCode("makeDirectory", 257)
2704974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert fileSystem.isDirectory(DIR)
2714974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    }
2724974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
2735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testMode() {
2745aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
2765aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("MODE", 200)
2775aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2785aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
279aa72126634232b9f007e110204e081807257cd4fchrismair    void testNlst() {
280ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
281ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
282aa72126634232b9f007e110204e081807257cd4fchrismair
283aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
284aa72126634232b9f007e110204e081807257cd4fchrismair
285aa72126634232b9f007e110204e081807257cd4fchrismair        String[] filenames = ftpClient.listNames(SUBDIR)
2863373d667c329b520a33bf4760304e2757ac55292chrismair        assert filenames as Set == [FILENAME1, SUBDIR_NAME2] as Set
287aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("listNames", 226)
288aa72126634232b9f007e110204e081807257cd4fchrismair    }
289aa72126634232b9f007e110204e081807257cd4fchrismair
2905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testNoop() {
2915f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2925f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.sendNoOp()
2935f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("NOOP", 200)
2945f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2955f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testPasv_Nlst() {
297ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
298ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME2)))
2995aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
3005aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
3015aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClient.enterLocalPassiveMode();
3025aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
3035aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
3045aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert filenames == [FILENAME1, FILENAME2]
3055aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("listNames", 226)
3065aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
3075aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
308fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testPwd() {
309fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnectAndLogin()
310fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
311fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("printWorkingDirectory", 257)
312fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
313fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
314fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    void testQuit() {
315fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClientConnect()
316fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        ftpClient.quit()
317fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair        verifyReplyCode("quit", 221)
318fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair    }
319fa3e4a9d121b1ad40a6d418b925afda82d3567bachrismair
3205aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testRein() {
3215aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
3225aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.rein() == 220
3235aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.cdup() == 530      // now logged out
3245aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
3255aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
326c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    void testRest() {
327c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        ftpClientConnectAndLogin()
328c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair        assert ftpClient.rest("marker") == 350
329c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair    }
330c548d7a6b7cbef8732c090bc1ff5c4f7f29e2575chrismair
331aa72126634232b9f007e110204e081807257cd4fchrismair    void testRetr() {
332ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ASCII_DATA))
333aa72126634232b9f007e110204e081807257cd4fchrismair
334aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
335aa72126634232b9f007e110204e081807257cd4fchrismair
336aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Get File for remotePath [$FILE1]")
337aa72126634232b9f007e110204e081807257cd4fchrismair        def outputStream = new ByteArrayOutputStream()
338aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
339aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[${outputStream.toString()}]")
340aa72126634232b9f007e110204e081807257cd4fchrismair        assert outputStream.toString() == ASCII_DATA
341aa72126634232b9f007e110204e081807257cd4fchrismair    }
342aa72126634232b9f007e110204e081807257cd4fchrismair
343eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRmd() {
344eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
345eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
346eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.removeDirectory(SUBDIR)
347eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("removeDirectory", 250)
3485f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(SUBDIR)
349eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
350eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
351eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRename() {                 // RNFR and RNTO
352d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new FileEntry(FILE1))
353eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
354eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
355eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
356eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
357eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("rename", 250)
358eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert !fileSystem.exists(FILE1)
359eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert fileSystem.exists(FILE1 + "NEW")
360eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
361eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
3625f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testSite() {
3635f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
3645f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.site("parameters,1,2,3") == 200
3655f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
3665f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3671901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair    void testSmnt() {
3681901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair        ftpClientConnectAndLogin()
3691901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair        assert ftpClient.smnt("dir") == 250
3701901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair    }
3711901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair
3723fc03edff55387bae91315653eae3ed0ca9b1f2achrismair    void testStat() {
3733fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        ftpClientConnectAndLogin()
3743fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        def status = ftpClient.getStatus()
3753fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        assert status.contains('Connected')
3763fc03edff55387bae91315653eae3ed0ca9b1f2achrismair        verifyReplyCode("stat", 211)
3773fc03edff55387bae91315653eae3ed0ca9b1f2achrismair    }
3783fc03edff55387bae91315653eae3ed0ca9b1f2achrismair
379aa72126634232b9f007e110204e081807257cd4fchrismair    void testStor() {
380aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
381aa72126634232b9f007e110204e081807257cd4fchrismair
382aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Put File for local path [$FILE1]")
383aa72126634232b9f007e110204e081807257cd4fchrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
38451f3edcb923f87e836613fa9f589fede3c018df3chrismair        assert ftpClient.storeFile(FILENAME1, inputStream)      // relative to homeDirectory
385c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
386aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[" + contents + "]")
387aa72126634232b9f007e110204e081807257cd4fchrismair        assert contents == ASCII_DATA
388aa72126634232b9f007e110204e081807257cd4fchrismair    }
389aa72126634232b9f007e110204e081807257cd4fchrismair
3905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testStou() {
3915f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
3925f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3935f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
3945f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
3955f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
3965f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def names = fileSystem.listNames(HOME_DIR)
3975f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
3985f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filename
3995f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
400c51130cfee05b7294599cc93125db801972d0746chrismair        def contents = fileSystem.getEntry(p(HOME_DIR, filename)).createInputStream().text
4015f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        LOG.info("File contents=[" + contents + "]")
4025f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert contents == ASCII_DATA
4035f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
4045f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
4055aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testStru() {
4065aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
4075aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
4085aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("STRU", 200)
4095aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
4105aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
411eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testSyst() {
412eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
413eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
414eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        def systemName = ftpClient.getSystemName()
415eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        LOG.info("system name = [$systemName]")
416eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
4175f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("getSystemName", 215)
418eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
419eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
420c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair    void testType() {
421c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        ftpClientConnectAndLogin()
422c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        assert ftpClient.type(FTP.ASCII_FILE_TYPE)
423c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair        verifyReplyCode("TYPE", 200)
424c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair    }
425c7e1a6e6ba1ae236ed0209a01132b8fedbbaeabfchrismair
42649deb463d1cc3132e4aa60bfd4469398c57c1745chrismair    void testUnrecognizedCommand() {
42749deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        ftpClientConnectAndLogin()
42849deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        assert ftpClient.sendCommand("XXX") == 502
42949deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        verifyReplyCode("XXX", 502)
43049deb463d1cc3132e4aa60bfd4469398c57c1745chrismair    }
43149deb463d1cc3132e4aa60bfd4469398c57c1745chrismair
4325c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4335c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Test setup and tear-down
4345c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4355c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4365c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4375c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform initialization before each test
43840658190151b7ded3489ff89c301b470155c95f4chrismair     * @see org.mockftpserver.test.AbstractTestCase#setUp()
4395c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
4405c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void setUp() {
441aa72126634232b9f007e110204e081807257cd4fchrismair        super.setUp()
4425c17f34e1a613c319d355112f8298c20015ef7f2chrismair
443aa72126634232b9f007e110204e081807257cd4fchrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
444aa72126634232b9f007e110204e081807257cd4fchrismair            BINARY_DATA[i] = (byte) i
4455c17f34e1a613c319d355112f8298c20015ef7f2chrismair        }
4465c17f34e1a613c319d355112f8298c20015ef7f2chrismair
447aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer = new FakeFtpServer()
448eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
449eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.systemName = SYSTEM_NAME
4505c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4519e1053c079532bc7e47012d63f8d9d7246df4e96chrismair        fileSystem = new WindowsFakeFileSystem()
452741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createParentDirectoriesAutomatically = true
453d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        fileSystem.add(new DirectoryEntry(SUBDIR))
4545c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.fileSystem = fileSystem
4555c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4567bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair        userAccount = new UserAccount(USERNAME, PASSWORD, HOME_DIR)
4571901d3e08564ec02e4e45345f95c1b1bdca2e3c0chrismair        ftpServer.addUserAccount(userAccount)
4585c17f34e1a613c319d355112f8298c20015ef7f2chrismair
459aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.start()
460aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient = new FTPClient()
4615c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4625c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4635c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4645c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform cleanup after each test
46540658190151b7ded3489ff89c301b470155c95f4chrismair     * @see org.mockftpserver.test.AbstractTestCase#tearDown()
4665c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
4675c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void tearDown() {
468aa72126634232b9f007e110204e081807257cd4fchrismair        super.tearDown()
469aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.stop()
4705c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4715c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4725c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4735c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Internal Helper Methods
4745c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
4755c17f34e1a613c319d355112f8298c20015ef7f2chrismair
476741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private ftpClientConnectAndLogin() {
477741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnect()
478741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.login(USERNAME, PASSWORD)
479741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
480741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
4815c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4825c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Connect to the server from the FTPClient
4835c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
484741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void ftpClientConnect() {
485741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        def port = PortTestUtil.getFtpServerControlPort()
486741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        LOG.info("Conecting to $SERVER on port $port")
487aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient.connect(SERVER, port)
488741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("connect", 220)
4895c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
4905c17f34e1a613c319d355112f8298c20015ef7f2chrismair
4915c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
4925c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Assert that the FtpClient reply code is equal to the expected value
4935c17f34e1a613c319d355112f8298c20015ef7f2chrismair     *
494aa72126634232b9f007e110204e081807257cd4fchrismair     * @param operation - the description of the operation performed used in the error message
4955c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @param expectedReplyCode - the expected FtpClient reply code
4965c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
4975c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
498aa72126634232b9f007e110204e081807257cd4fchrismair        int replyCode = ftpClient.getReplyCode()
499aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
500aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
5015c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
5025c17f34e1a613c319d355112f8298c20015ef7f2chrismair
503741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
504dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismair        LOG.info(ftpFile.toString())
505aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
506aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
507aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
508741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
509741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
5105c17f34e1a613c319d355112f8298c20015ef7f2chrismair}