100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/*
200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Copyright 2008 the original author or authors.
300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Licensed under the Apache License, Version 2.0 (the "License");
500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * you may not use this file except in compliance with the License.
600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * You may obtain a copy of the License at
700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *      http://www.apache.org/licenses/LICENSE-2.0
900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
1000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Unless required by applicable law or agreed to in writing, software
1100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * See the License for the specific language governing permissions and
1400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * limitations under the License.
1500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
1600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpackage org.mockftpserver.fake
1700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
1800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.apache.commons.net.ftp.FTP
1900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.apache.commons.net.ftp.FTPClient
2000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.apache.commons.net.ftp.FTPFile
2100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.CommandNames
2200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler
2300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
2400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry
2500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.FileEntry
2600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.FileSystem
2700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.UnixFakeFileSystem
2800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.WindowsFakeFileSystem
2900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.stub.command.CwdCommandHandler
3000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.test.AbstractGroovyTestCase
3100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.test.PortTestUtil
3200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/**
3400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Integration tests for FakeFtpServer.
3500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
3600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @version $Revision$ - $Date$
3700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
3800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @author Chris Mair
3900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
4000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTestCase {
4100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
4200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final SERVER = "localhost"
4300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final USERNAME = "user123"
4400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final PASSWORD = "password"
4500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final ACCOUNT = "account123"
4600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
4700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final BINARY_DATA = new byte[256]
4800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final ROOT_DIR = "c:/"
4900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final HOME_DIR = p(ROOT_DIR, "home")
5000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final SUBDIR_NAME = 'sub'
5100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final SUBDIR_NAME2 = "archive"
5200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
5300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final FILENAME1 = "abc.txt"
5400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final FILENAME2 = "SomeOtherFile.xml"
5500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
5600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    static final SYSTEM_NAME = "WINDOWS"
5700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private FakeFtpServer ftpServer
5900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private FTPClient ftpClient
6000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private FileSystem fileSystem
6100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private UserAccount userAccount
6200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
6400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Tests
6500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
6600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAbor() {
6800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
6900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.abort()
7000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("ABOR", 226)
7100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
7200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAcct() {
7400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
7500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.acct(ACCOUNT) == 230
7600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
7700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAllo() {
7900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
8000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.allocate(99)
8100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("ALLO", 200)
8200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
8300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAppe() {
8500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def ORIGINAL_CONTENTS = '123 456 789'
8600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
8700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
8900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Put File for local path [$FILE1]")
9100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
9200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.appendFile(FILE1, inputStream)
9300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
9400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + contents + "]")
9500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
9600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
9700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testCdup() {
9900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
10000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.changeToParentDirectory()
10100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeToParentDirectory", 200)
10200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testCwd() {
10500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
10600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
10700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", 250)
10800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
11100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test that a CWD to ".." properly resolves the current dir (without the "..") so that PWD returns the parent
11200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
11300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testCwd_DotDot_Pwd() {
11400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
11500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.changeWorkingDirectory("..")
11600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", 250)
11700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert p(ftpClient.printWorkingDirectory()) == p(ROOT_DIR)
11800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.changeWorkingDirectory("home")
11900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert p(ftpClient.printWorkingDirectory()) == p(HOME_DIR)
12000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
12100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
12200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
12300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test that a CWD to "." properly resolves the current dir (without the ".") so that PWD returns the parent
12400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
12500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testCwd_Dot_Pwd() {
12600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
12700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.changeWorkingDirectory(".")
12800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", 250)
12900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert p(ftpClient.printWorkingDirectory()) == p(HOME_DIR)
13000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
13100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testCwd_UseStaticReplyCommandHandler() {
13300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final int REPLY_CODE = 500;
13400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
13500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
13600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
13800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
13900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
14000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
14100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testCwd_UseStubCommandHandler() {
14300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final int REPLY_CODE = 502;
14400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        CwdCommandHandler cwdCommandHandler = new CwdCommandHandler();     // Stub command handler
14500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        cwdCommandHandler.setReplyCode(REPLY_CODE);
14600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
14700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
14900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
15000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
15100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert cwdCommandHandler.getInvocation(0)
15200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
15300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testDele() {
15500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(FILE1))
15600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
15800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.deleteFile(FILENAME1)
15900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("deleteFile", 250)
16000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(FILENAME1)
16100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
16200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
16300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testEprt() {
16400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        log("Skipping...")
16500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair//        ftpClientConnectAndLogin()
16600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair//        assert ftpClient.sendCommand("EPRT", "|2|1080::8:800:200C:417A|5282|") == 200
16700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
16800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
16900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testEpsv() {
17000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
17100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.sendCommand("EPSV") == 229
17200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
17300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
17400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testFeat_UseStaticReplyCommandHandler() {
17500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // The FEAT command is not supported out of the box
17600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StaticReplyCommandHandler featCommandHandler = new StaticReplyCommandHandler(211, "No Features");
17700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.setCommandHandler("FEAT", featCommandHandler);
17800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
17900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
18000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.sendCommand("FEAT") == 211
18100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
18200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
18300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHelp() {
18400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.helpText = [a: 'aaa', '': 'default']
18500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect()
18600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
18700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String help = ftpClient.listHelp()
18800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert help.contains('default')
18900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listHelp", 214)
19000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
19100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        help = ftpClient.listHelp('a')
19200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert help.contains('aaa')
19300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listHelp", 214)
19400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
19500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        help = ftpClient.listHelp('bad')
19600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert help.contains('bad')
19700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listHelp", 214)
19800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
19900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
20000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testList() {
20100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def LAST_MODIFIED = new Date()
20200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
20300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2), lastModified: LAST_MODIFIED))
20400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
20500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
20600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
20700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile[] files = ftpClient.listFiles(SUBDIR)
20800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert files.length == 2
20900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
21000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Can't be sure of order
21100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile fileEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[0] : files[1]
21200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile dirEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[1] : files[0]
21300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyFTPFile(fileEntry, FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
21400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyFTPFile(dirEntry, FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
21500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
21600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("list", 226)
21700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
21800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
21900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testList_Unix() {
22000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.systemName = 'UNIX'
22100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        userAccount.homeDirectory = '/'
22200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
22300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def unixFileSystem = new UnixFakeFileSystem()
22400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        unixFileSystem.createParentDirectoriesAutomatically = true
22500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        unixFileSystem.add(new DirectoryEntry('/'))
22600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.fileSystem = unixFileSystem
22700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
22800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def LAST_MODIFIED = new Date()
22900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        unixFileSystem.add(new FileEntry(path: p('/', FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
23000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        unixFileSystem.add(new DirectoryEntry(path: p('/', SUBDIR_NAME2), lastModified: LAST_MODIFIED))
23100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
23200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
23300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
23400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile[] files = ftpClient.listFiles('/')
23500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert files.length == 2
23600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
23700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Can't be sure of order
23800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile fileEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[0] : files[1]
23900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile dirEntry = (files[0].getType() == FTPFile.FILE_TYPE) ? files[1] : files[0]
24000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
24100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyFTPFile(dirEntry, FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
24200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyFTPFile(fileEntry, FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
24300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("list", 226)
24400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
24500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
24600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testLogin() {
24700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect()
24800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Logging in as $USERNAME/$PASSWORD")
24900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.login(USERNAME, PASSWORD)
25000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("login with $USERNAME/$PASSWORD", 230)
25100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
25200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("isStarted", ftpServer.isStarted());
25300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertFalse("isShutdown", ftpServer.isShutdown());
25400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
25500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
25600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testLogin_WithAccount() {
25700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        userAccount.accountRequiredForLogin = true
25800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect()
25900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Logging in as $USERNAME/$PASSWORD with $ACCOUNT")
26000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.login(USERNAME, PASSWORD, ACCOUNT)
26100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("login with $USERNAME/$PASSWORD with $ACCOUNT", 230)
26200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
26300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
26400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testMkd() {
26500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
26600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
26700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def DIR = p(HOME_DIR, 'NewDir')
26800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.makeDirectory(DIR)
26900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("makeDirectory", 257)
27000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.isDirectory(DIR)
27100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
27200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
27300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testMode() {
27400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
27500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
27600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("MODE", 200)
27700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
27800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
27900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testNlst() {
28000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
28100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
28200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
28300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
28400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
28500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
28600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert filenames as Set == [FILENAME1, SUBDIR_NAME2] as Set
28700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listNames", 226)
28800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
28900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
29000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testNoop() {
29100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
29200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.sendNoOp()
29300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("NOOP", 200)
29400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
29500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
29600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testPasv_Nlst() {
29700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
29800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME2)))
29900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
30000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
30100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.enterLocalPassiveMode();
30200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
30300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
30400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert filenames == [FILENAME1, FILENAME2]
30500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listNames", 226)
30600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
30700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
30800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testPwd() {
30900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
31000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
31100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("printWorkingDirectory", 257)
31200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
31300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
31400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testQuit() {
31500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect()
31600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.quit()
31700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("quit", 221)
31800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
31900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
32000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testRein() {
32100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
32200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.rein() == 220
32300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.cdup() == 530      // now logged out
32400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
32500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
32600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testRest() {
32700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
32800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.rest("marker") == 350
32900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
33000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
33100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testRetr() {
33200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ASCII_DATA))
33300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
33400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
33500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
33600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Get File for remotePath [$FILE1]")
33700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def outputStream = new ByteArrayOutputStream()
33800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
33900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[${outputStream.toString()}]")
34000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert outputStream.toString() == ASCII_DATA
34100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
34200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
34300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testRmd() {
34400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
34500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
34600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.removeDirectory(SUBDIR)
34700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("removeDirectory", 250)
34800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(SUBDIR)
34900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
35000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
35100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testRename() {                 // RNFR and RNTO
35200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(FILE1))
35300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
35400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
35500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
35600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
35700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("rename", 250)
35800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(FILE1)
35900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(FILE1 + "NEW")
36000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
36100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
36200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testSite() {
36300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
36400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.site("parameters,1,2,3") == 200
36500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
36600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
36700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testSmnt() {
36800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
36900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.smnt("dir") == 250
37000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
37100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
37200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testStat() {
37300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
37400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def status = ftpClient.getStatus()
37500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert status.contains('Connected')
37600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("stat", 211)
37700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
37800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
37900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testStor() {
38000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
38100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
38200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Put File for local path [$FILE1]")
38300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
38400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.storeFile(FILENAME1, inputStream)      // relative to homeDirectory
38500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
38600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + contents + "]")
38700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert contents == ASCII_DATA
38800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
38900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
39000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testStou() {
39100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
39200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
39300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
39400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
39500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
39600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def names = fileSystem.listNames(HOME_DIR)
39700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
39800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert filename
39900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
40000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def contents = fileSystem.getEntry(p(HOME_DIR, filename)).createInputStream().text
40100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + contents + "]")
40200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert contents == ASCII_DATA
40300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
40400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
40500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testStru() {
40600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
40700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
40800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("STRU", 200)
40900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
41000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
41100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testSyst() {
41200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
41300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
41400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def systemName = ftpClient.getSystemName()
41500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("system name = [$systemName]")
41600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
41700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("getSystemName", 215)
41800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
41900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
42000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testType() {
42100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
42200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.type(FTP.ASCII_FILE_TYPE)
42300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("TYPE", 200)
42400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
42500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
42600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testUnrecognizedCommand() {
42700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnectAndLogin()
42800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.sendCommand("XXX") == 502
42900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("XXX", 502)
43000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
43100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
43200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
43300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Test setup and tear-down
43400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
43500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
43600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
43700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Perform initialization before each test
43800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @see org.mockftpserver.test.AbstractTestCase#setUp()
43900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
44000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void setUp() {
44100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        super.setUp()
44200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
44300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
44400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            BINARY_DATA[i] = (byte) i
44500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
44600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
44700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer = new FakeFtpServer()
44800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
44900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.systemName = SYSTEM_NAME
45000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
45100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem = new WindowsFakeFileSystem()
45200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.createParentDirectoriesAutomatically = true
45300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new DirectoryEntry(SUBDIR))
45400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.fileSystem = fileSystem
45500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
45600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        userAccount = new UserAccount(USERNAME, PASSWORD, HOME_DIR)
45700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.addUserAccount(userAccount)
45800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
45900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.start()
46000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient = new FTPClient()
46100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
46200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
46300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
46400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Perform cleanup after each test
46500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @see org.mockftpserver.test.AbstractTestCase#tearDown()
46600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
46700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void tearDown() {
46800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        super.tearDown()
46900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpServer.stop()
47000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
47100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
47200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
47300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Internal Helper Methods
47400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
47500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
47600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private ftpClientConnectAndLogin() {
47700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect()
47800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert ftpClient.login(USERNAME, PASSWORD)
47900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
48000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
48100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
48200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Connect to the server from the FTPClient
48300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
48400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private void ftpClientConnect() {
48500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def port = PortTestUtil.getFtpServerControlPort()
48600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Conecting to $SERVER on port $port")
48700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.connect(SERVER, port)
48800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("connect", 220)
48900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
49000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
49100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
49200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Assert that the FtpClient reply code is equal to the expected value
49300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
49400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param operation - the description of the operation performed used in the error message
49500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param expectedReplyCode - the expected FtpClient reply code
49600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
49700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
49800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        int replyCode = ftpClient.getReplyCode()
49900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
50000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
50100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
50200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
50300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
50400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info(ftpFile.toString())
50500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
50600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
50700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
50800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
50900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
51000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair}