FakeFtpServerIntegrationTest.groovy revision 5aee6e3edf4d3d8decff73d2a5a26cebdd0572f5
15c17f34e1a613c319d355112f8298c20015ef7f2chrismair/*
25c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Copyright 2008 the original author or authors.
35c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
45c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Licensed under the Apache License, Version 2.0 (the "License");
55c17f34e1a613c319d355112f8298c20015ef7f2chrismair * you may not use this file except in compliance with the License.
65c17f34e1a613c319d355112f8298c20015ef7f2chrismair * You may obtain a copy of the License at
75c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
85c17f34e1a613c319d355112f8298c20015ef7f2chrismair *      http://www.apache.org/licenses/LICENSE-2.0
95c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
105c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Unless required by applicable law or agreed to in writing, software
115c17f34e1a613c319d355112f8298c20015ef7f2chrismair * distributed under the License is distributed on an "AS IS" BASIS,
125c17f34e1a613c319d355112f8298c20015ef7f2chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c17f34e1a613c319d355112f8298c20015ef7f2chrismair * See the License for the specific language governing permissions and
145c17f34e1a613c319d355112f8298c20015ef7f2chrismair * limitations under the License.
155c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
165c17f34e1a613c319d355112f8298c20015ef7f2chrismairpackage org.mockftpserver.fake.server
175c17f34e1a613c319d355112f8298c20015ef7f2chrismair
185aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismairimport org.apache.commons.net.ftp.FTP
195c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.apache.commons.net.ftp.FTPClient
20741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismairimport org.apache.commons.net.ftp.FTPFile
2147fb67a4e600f339064de4c08f10279accc95e92chrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry
225c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.filesystem.FakeWindowsFileSystem
2347fb67a4e600f339064de4c08f10279accc95e92chrismairimport org.mockftpserver.fake.filesystem.FileEntry
245c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.filesystem.FileSystem
255c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.fake.user.UserAccount
265c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.AbstractGroovyTest
275c17f34e1a613c319d355112f8298c20015ef7f2chrismairimport org.mockftpserver.test.PortTestUtil
285c17f34e1a613c319d355112f8298c20015ef7f2chrismair
295c17f34e1a613c319d355112f8298c20015ef7f2chrismair/**
305c17f34e1a613c319d355112f8298c20015ef7f2chrismair * Integration tests for FakeFtpServer.
315c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
325c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @version $Revision: 54 $ - $Date: 2008-05-13 21:54:53 -0400 (Tue, 13 May 2008) $
335c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
345c17f34e1a613c319d355112f8298c20015ef7f2chrismair * @author Chris Mair
355c17f34e1a613c319d355112f8298c20015ef7f2chrismair */
365c17f34e1a613c319d355112f8298c20015ef7f2chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTest {
375c17f34e1a613c319d355112f8298c20015ef7f2chrismair
38aa72126634232b9f007e110204e081807257cd4fchrismair    static final SERVER = "localhost"
39aa72126634232b9f007e110204e081807257cd4fchrismair    static final USERNAME = "user123"
40aa72126634232b9f007e110204e081807257cd4fchrismair    static final PASSWORD = "password"
41aa72126634232b9f007e110204e081807257cd4fchrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
42aa72126634232b9f007e110204e081807257cd4fchrismair    static final BINARY_DATA = new byte[256]
435e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final ROOT_DIR = "c:/"
445e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    static final HOME_DIR = p(ROOT_DIR, "home")
45741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR_NAME = 'sub'
46aa72126634232b9f007e110204e081807257cd4fchrismair    static final SUBDIR_NAME2 = "archive"
47741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
48aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME1 = "abc.txt"
49aa72126634232b9f007e110204e081807257cd4fchrismair    static final FILENAME2 = "SomeOtherFile.xml"
50741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
51eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    static final SYSTEM_NAME = "WINDOWS"
525c17f34e1a613c319d355112f8298c20015ef7f2chrismair
53aa72126634232b9f007e110204e081807257cd4fchrismair    private FakeFtpServer ftpServer
54aa72126634232b9f007e110204e081807257cd4fchrismair    private FTPClient ftpClient
555c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private FileSystem fileSystem
565c17f34e1a613c319d355112f8298c20015ef7f2chrismair
575c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
585c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Tests
595c17f34e1a613c319d355112f8298c20015ef7f2chrismair    //-------------------------------------------------------------------------
605c17f34e1a613c319d355112f8298c20015ef7f2chrismair
615aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAbor() {
625aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
635aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.abort()
645aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ABOR", 226)
655aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
665aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
675aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAllo() {
685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
695aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.allocate(99)
705aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("ALLO", 200)
715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testAppe() {
745aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def ORIGINAL_CONTENTS = '123 456 789'
755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        fileSystem.addEntry(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
765aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
775aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
785aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
795aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("Put File for local path [$FILE1]")
805aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
815aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.appendFile(FILE1, inputStream)
825aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        def contents = fileSystem.createInputStream(FILE1).text
835aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        LOG.info("File contents=[" + contents + "]")
845aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
855aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
865aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
875c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void testLogin() {
885c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpClientConnect()
895c17f34e1a613c319d355112f8298c20015ef7f2chrismair        String userAndPassword = USERNAME + "/" + PASSWORD
905c17f34e1a613c319d355112f8298c20015ef7f2chrismair        LOG.info("Logging in as " + userAndPassword)
91741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.login(USERNAME, PASSWORD)
92741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("login with $userAndPassword", 230)
93741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
945c17f34e1a613c319d355112f8298c20015ef7f2chrismair
95741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testQuit() {
96741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnect()
975c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpClient.quit()
985c17f34e1a613c319d355112f8298c20015ef7f2chrismair        verifyReplyCode("quit", 221)
995c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
1005c17f34e1a613c319d355112f8298c20015ef7f2chrismair
101741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testPwd() {
102741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
103741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
104741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("printWorkingDirectory", 257)
105741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
106741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
1075e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    void testCdup() {
1085e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        ftpClientConnectAndLogin()
1095e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        assert ftpClient.changeToParentDirectory()
1105e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        verifyReplyCode("changeToParentDirectory", 200)
1115e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair    }
1125e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
113741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testCwd() {
114741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
115aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
116aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("changeWorkingDirectory", 250)
117741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
118741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
119741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    void testDele() {
120741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createFile(FILE1)
121741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
122741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnectAndLogin()
123aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.deleteFile(FILENAME1)
124aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("deleteFile", 250)
1255f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(FILENAME1)
1265f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1275f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1285f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testHelp() {
1295f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpServer.helpText = [a: 'aaa', '': 'default']
1305f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnect()
1315f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1325f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        String help = ftpClient.listHelp()
1335f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('default')
1345f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1355f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1365f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('a')
1375f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('aaa')
1385f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
1395f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1405f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        help = ftpClient.listHelp('bad')
1415f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert help.contains('bad')
1425f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("listHelp", 214)
143741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
144741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
14547fb67a4e600f339064de4c08f10279accc95e92chrismair    void testList() {
14647fb67a4e600f339064de4c08f10279accc95e92chrismair        def LAST_MODIFIED = new Date()
147aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
148aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2), lastModified: LAST_MODIFIED))
14947fb67a4e600f339064de4c08f10279accc95e92chrismair
15047fb67a4e600f339064de4c08f10279accc95e92chrismair        ftpClientConnectAndLogin()
15147fb67a4e600f339064de4c08f10279accc95e92chrismair
15247fb67a4e600f339064de4c08f10279accc95e92chrismair        FTPFile[] files = ftpClient.listFiles(SUBDIR)
1535f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert files.length == 2
154aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
155aa72126634232b9f007e110204e081807257cd4fchrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
15647fb67a4e600f339064de4c08f10279accc95e92chrismair        verifyReplyCode("list", 226)
15747fb67a4e600f339064de4c08f10279accc95e92chrismair    }
1585c17f34e1a613c319d355112f8298c20015ef7f2chrismair
1594974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    void testMkd() {
1604974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        ftpClientConnectAndLogin()
1614974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
1624974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        def DIR = p(HOME_DIR, 'NewDir')
1634974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert ftpClient.makeDirectory(DIR)
1644974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        verifyReplyCode("makeDirectory", 257)
1654974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair        assert fileSystem.isDirectory(DIR)
1664974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair    }
1674974b7c3f907c483cec2c9399d9d8c8cb99c716achrismair
1685aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testMode() {
1695aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
1705aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
1715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("MODE", 200)
1725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
1735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
174aa72126634232b9f007e110204e081807257cd4fchrismair    void testNlst() {
175aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME1)))
176aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
177aa72126634232b9f007e110204e081807257cd4fchrismair
178aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
179aa72126634232b9f007e110204e081807257cd4fchrismair
180aa72126634232b9f007e110204e081807257cd4fchrismair        String[] filenames = ftpClient.listNames(SUBDIR)
1815f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filenames == [FILENAME1, SUBDIR_NAME2]
182aa72126634232b9f007e110204e081807257cd4fchrismair        verifyReplyCode("listNames", 226)
183aa72126634232b9f007e110204e081807257cd4fchrismair    }
184aa72126634232b9f007e110204e081807257cd4fchrismair
1855f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testNoop() {
1865f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
1875f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.sendNoOp()
1885f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("NOOP", 200)
1895f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
1905f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
1915aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testPasv_Nlst() {
1925aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME1)))
1935aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        fileSystem.addEntry(new FileEntry(path: p(SUBDIR, FILENAME2)))
1945aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
1955aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
1965aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClient.enterLocalPassiveMode();
1975aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
1985aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
1995aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert filenames == [FILENAME1, FILENAME2]
2005aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("listNames", 226)
2015aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2025aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
2035aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testRein() {
2045aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2055aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.rein() == 220
2065aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.cdup() == 530      // now logged out
2075aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2085aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
209aa72126634232b9f007e110204e081807257cd4fchrismair    void testRetr() {
210aa72126634232b9f007e110204e081807257cd4fchrismair        fileSystem.addEntry(new FileEntry(path: FILE1, contents: ASCII_DATA))
211aa72126634232b9f007e110204e081807257cd4fchrismair
212aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
213aa72126634232b9f007e110204e081807257cd4fchrismair
214aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Get File for remotePath [$FILE1]")
215aa72126634232b9f007e110204e081807257cd4fchrismair        def outputStream = new ByteArrayOutputStream()
216aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
217aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[${outputStream.toString()}]")
218aa72126634232b9f007e110204e081807257cd4fchrismair        assert outputStream.toString() == ASCII_DATA
219aa72126634232b9f007e110204e081807257cd4fchrismair    }
220aa72126634232b9f007e110204e081807257cd4fchrismair
221eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRmd() {
222eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
223eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
224eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.removeDirectory(SUBDIR)
225eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("removeDirectory", 250)
2265f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert !fileSystem.exists(SUBDIR)
227eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
228eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
229eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testRename() {                 // RNFR and RNTO
230eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        fileSystem.createFile(FILE1)
231eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
232eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
233eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
234eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
235eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        verifyReplyCode("rename", 250)
236eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert !fileSystem.exists(FILE1)
237eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert fileSystem.exists(FILE1 + "NEW")
238eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
239eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
2405f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testSite() {
2415f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2425f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.site("parameters,1,2,3") == 200
2435f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2445f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
245aa72126634232b9f007e110204e081807257cd4fchrismair    void testStor() {
246aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClientConnectAndLogin()
247aa72126634232b9f007e110204e081807257cd4fchrismair
248aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Put File for local path [$FILE1]")
249aa72126634232b9f007e110204e081807257cd4fchrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
250aa72126634232b9f007e110204e081807257cd4fchrismair        assert ftpClient.storeFile(FILE1, inputStream)
251aa72126634232b9f007e110204e081807257cd4fchrismair        def contents = fileSystem.createInputStream(FILE1).text
252aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("File contents=[" + contents + "]")
253aa72126634232b9f007e110204e081807257cd4fchrismair        assert contents == ASCII_DATA
254aa72126634232b9f007e110204e081807257cd4fchrismair    }
255aa72126634232b9f007e110204e081807257cd4fchrismair
2565f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    void testStou() {
2575f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        ftpClientConnectAndLogin()
2585f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2595f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
2605f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
2615f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2625f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def names = fileSystem.listNames(HOME_DIR)
2635f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
2645f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert filename
2655f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2665f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        def contents = fileSystem.createInputStream(p(HOME_DIR, filename)).text
2675f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        LOG.info("File contents=[" + contents + "]")
2685f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        assert contents == ASCII_DATA
2695f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair    }
2705f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair
2715aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    void testStru() {
2725aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        ftpClientConnectAndLogin()
2735aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
2745aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair        verifyReplyCode("STRU", 200)
2755aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair    }
2765aee6e3edf4d3d8decff73d2a5a26cebdd0572f5chrismair
277eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    void testSyst() {
278eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpClientConnectAndLogin()
279eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
280eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        def systemName = ftpClient.getSystemName()
281eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        LOG.info("system name = [$systemName]")
282eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
2835f38fd8ca104fe456a2cf7fcedc56e9b0ce777d3chrismair        verifyReplyCode("getSystemName", 215)
284eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair    }
285eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair
2865c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
2875c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Test setup and tear-down
2885c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
2895c17f34e1a613c319d355112f8298c20015ef7f2chrismair
2905c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
2915c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform initialization before each test
2925c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
2935c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
2945c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void setUp() {
295aa72126634232b9f007e110204e081807257cd4fchrismair        super.setUp()
2965c17f34e1a613c319d355112f8298c20015ef7f2chrismair
297aa72126634232b9f007e110204e081807257cd4fchrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
298aa72126634232b9f007e110204e081807257cd4fchrismair            BINARY_DATA[i] = (byte) i
2995c17f34e1a613c319d355112f8298c20015ef7f2chrismair        }
3005c17f34e1a613c319d355112f8298c20015ef7f2chrismair
301aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer = new FakeFtpServer()
302eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
303eddc77a4978ece97afb3e2bcf631371c2c75a757chrismair        ftpServer.systemName = SYSTEM_NAME
3045c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3055c17f34e1a613c319d355112f8298c20015ef7f2chrismair        fileSystem = new FakeWindowsFileSystem()
306741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createParentDirectoriesAutomatically = true
307741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        fileSystem.createDirectory(SUBDIR)
3085c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.fileSystem = fileSystem
3095c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3105c17f34e1a613c319d355112f8298c20015ef7f2chrismair        def userAccount = new UserAccount(username: USERNAME, password: PASSWORD,
311741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair                passwordRequiredForLogin: true, homeDirectory: HOME_DIR)
3125c17f34e1a613c319d355112f8298c20015ef7f2chrismair        ftpServer.userAccounts[USERNAME] = userAccount
3135c17f34e1a613c319d355112f8298c20015ef7f2chrismair
314aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.start()
315aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient = new FTPClient()
3165c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3175c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3185c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3195c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Perform cleanup after each test
3205c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
3215c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3225c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void tearDown() {
323aa72126634232b9f007e110204e081807257cd4fchrismair        super.tearDown()
324aa72126634232b9f007e110204e081807257cd4fchrismair        ftpServer.stop()
3255c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3265c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3275c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3285c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // Internal Helper Methods
3295c17f34e1a613c319d355112f8298c20015ef7f2chrismair    // -------------------------------------------------------------------------
3305c17f34e1a613c319d355112f8298c20015ef7f2chrismair
331741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private ftpClientConnectAndLogin() {
332741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        ftpClientConnect()
333741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        assert ftpClient.login(USERNAME, PASSWORD)
334741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
335741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
3365c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3375c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Connect to the server from the FTPClient
3385c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
339741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void ftpClientConnect() {
340741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        def port = PortTestUtil.getFtpServerControlPort()
341741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        LOG.info("Conecting to $SERVER on port $port")
342aa72126634232b9f007e110204e081807257cd4fchrismair        ftpClient.connect(SERVER, port)
343741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair        verifyReplyCode("connect", 220)
3445c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3455c17f34e1a613c319d355112f8298c20015ef7f2chrismair
3465c17f34e1a613c319d355112f8298c20015ef7f2chrismair    /**
3475c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * Assert that the FtpClient reply code is equal to the expected value
3485c17f34e1a613c319d355112f8298c20015ef7f2chrismair     *
349aa72126634232b9f007e110204e081807257cd4fchrismair     * @param operation - the description of the operation performed used in the error message
3505c17f34e1a613c319d355112f8298c20015ef7f2chrismair     * @param expectedReplyCode - the expected FtpClient reply code
3515c17f34e1a613c319d355112f8298c20015ef7f2chrismair     */
3525c17f34e1a613c319d355112f8298c20015ef7f2chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
353aa72126634232b9f007e110204e081807257cd4fchrismair        int replyCode = ftpClient.getReplyCode()
354aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
355aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
3565c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
3575c17f34e1a613c319d355112f8298c20015ef7f2chrismair
358741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
359aa72126634232b9f007e110204e081807257cd4fchrismair        LOG.info(ftpFile)
360aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
361aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
362aa72126634232b9f007e110204e081807257cd4fchrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
363741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair    }
364741e9e72e4f0fca467ee571a11ab7ba8d15e8ad5chrismair
3655c17f34e1a613c319d355112f8298c20015ef7f2chrismair}