1b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair/*
2b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * Copyright 2008 the original author or authors.
3b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair *
4b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * you may not use this file except in compliance with the License.
6b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * You may obtain a copy of the License at
7b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair *
8b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair *
10b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * Unless required by applicable law or agreed to in writing, software
11b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * See the License for the specific language governing permissions and
14b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * limitations under the License.
15b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair */
16b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairpackage org.mockftpserver.fake
17b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
18b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.apache.commons.net.ftp.FTP
19b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.apache.commons.net.ftp.FTPClient
20b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.apache.commons.net.ftp.FTPFile
21b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.core.command.CommandNames
22b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler
23b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.FakeFtpServer
24b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.UserAccount
25b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry
26b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.filesystem.FileEntry
27b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.filesystem.FileSystem
28b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.filesystem.UnixFakeFileSystem
29b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.fake.filesystem.WindowsFakeFileSystem
30b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.stub.command.CwdCommandHandler
31b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.test.AbstractGroovyTest
32b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairimport org.mockftpserver.test.PortTestUtil
33b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
34b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair/**
35b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * Integration tests for FakeFtpServer.
36b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair *
37b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * @version $Revision$ - $Date$
38b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair *
39b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair * @author Chris Mair
40b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair */
41b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismairclass FakeFtpServerIntegrationTest extends AbstractGroovyTest {
42b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
43b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final SERVER = "localhost"
44b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final USERNAME = "user123"
45b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final PASSWORD = "password"
46b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final ACCOUNT = "account123"
47b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final ASCII_DATA = "abcdef\tghijklmnopqr"
48b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final BINARY_DATA = new byte[256]
49b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final ROOT_DIR = "c:/"
50b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final HOME_DIR = p(ROOT_DIR, "home")
51b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final SUBDIR_NAME = 'sub'
52b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final SUBDIR_NAME2 = "archive"
53b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final SUBDIR = p(HOME_DIR, SUBDIR_NAME)
54b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final FILENAME1 = "abc.txt"
55b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final FILENAME2 = "SomeOtherFile.xml"
56b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final FILE1 = p(HOME_DIR, FILENAME1)
57b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    static final SYSTEM_NAME = "WINDOWS"
58b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
59b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private FakeFtpServer ftpServer
60b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private FTPClient ftpClient
61b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private FileSystem fileSystem
62b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private UserAccount userAccount
63b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
64b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    //-------------------------------------------------------------------------
65b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // Tests
66b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    //-------------------------------------------------------------------------
67b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
68b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testAbor() {
69b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
70b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.abort()
71b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("ABOR", 226)
72b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
73b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
74b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testAcct() {
75b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
76b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.acct(ACCOUNT) == 230
77b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
78b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
79b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testAllo() {
80b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
81b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.allocate(99)
82b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("ALLO", 200)
83b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
84b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
85b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testAppe() {
86b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def ORIGINAL_CONTENTS = '123 456 789'
87b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ORIGINAL_CONTENTS))
88b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
89b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
90b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
91b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Put File for local path [$FILE1]")
92b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
93b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.appendFile(FILE1, inputStream)
94b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
95b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("File contents=[" + contents + "]")
96b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert contents == ORIGINAL_CONTENTS + ASCII_DATA
97b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
98b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
99b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testCdup() {
100b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
101b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.changeToParentDirectory()
102b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("changeToParentDirectory", 200)
103b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
104b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
105b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testCwd() {
106b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
107b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.changeWorkingDirectory(SUBDIR_NAME)
108b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("changeWorkingDirectory", 250)
109b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
110b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
111b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testCwd_UseStaticReplyCommandHandler() {
112b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        final int REPLY_CODE = 500;
113b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
114b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
115b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
116b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
117b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
118b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
119b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
120b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
121b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testCwd_UseStubCommandHandler() {
122b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        final int REPLY_CODE = 502;
123b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        CwdCommandHandler cwdCommandHandler = new CwdCommandHandler();     // Stub command handler
124b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        cwdCommandHandler.setReplyCode(REPLY_CODE);
125b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.setCommandHandler(CommandNames.CWD, cwdCommandHandler);
126b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
127b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
128b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert !ftpClient.changeWorkingDirectory(SUBDIR_NAME)
129b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE)
130b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert cwdCommandHandler.getInvocation(0)
131b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
132b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
133b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testDele() {
134b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(FILE1))
135b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
136b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
137b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.deleteFile(FILENAME1)
138b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("deleteFile", 250)
139b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert !fileSystem.exists(FILENAME1)
140b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
141b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
142b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testFeat_UseStaticReplyCommandHandler() {
143b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        // The FEAT command is not supported out of the box
144b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        StaticReplyCommandHandler featCommandHandler = new StaticReplyCommandHandler(211, "No Features");
145b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.setCommandHandler("FEAT", featCommandHandler);
146b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
147b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
148b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.sendCommand("FEAT") == 211
149b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
150b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
151b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testHelp() {
152b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.helpText = [a: 'aaa', '': 'default']
153b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnect()
154b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
155b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        String help = ftpClient.listHelp()
156b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert help.contains('default')
157b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("listHelp", 214)
158b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
159b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        help = ftpClient.listHelp('a')
160b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert help.contains('aaa')
161b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("listHelp", 214)
162b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
163b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        help = ftpClient.listHelp('bad')
164b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert help.contains('bad')
165b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("listHelp", 214)
166b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
167b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
168b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testList() {
169b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def LAST_MODIFIED = new Date()
170b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
171b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2), lastModified: LAST_MODIFIED))
172b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
173b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
174b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
175b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        FTPFile[] files = ftpClient.listFiles(SUBDIR)
176b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert files.length == 2
177b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
178b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
179b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("list", 226)
180b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
181b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
182b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testList_Unix() {
183b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.systemName = 'UNIX'
184b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        userAccount.homeDirectory = '/'
185b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
186b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def unixFileSystem = new UnixFakeFileSystem()
187b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        unixFileSystem.createParentDirectoriesAutomatically = true
188b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        unixFileSystem.add(new DirectoryEntry('/'))
189b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.fileSystem = unixFileSystem
190b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
191b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def LAST_MODIFIED = new Date()
192b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        unixFileSystem.add(new FileEntry(path: p('/', FILENAME1), lastModified: LAST_MODIFIED, contents: ASCII_DATA))
193b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        unixFileSystem.add(new DirectoryEntry(path: p('/', SUBDIR_NAME2), lastModified: LAST_MODIFIED))
194b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
195b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
196b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
197b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        FTPFile[] files = ftpClient.listFiles('/')
198b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert files.length == 2
199b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyFTPFile(files[0], FTPFile.DIRECTORY_TYPE, SUBDIR_NAME2, 0)
200b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyFTPFile(files[1], FTPFile.FILE_TYPE, FILENAME1, ASCII_DATA.size())
201b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("list", 226)
202b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
203b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
204b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testLogin() {
205b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnect()
206b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Logging in as $USERNAME/$PASSWORD")
207b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.login(USERNAME, PASSWORD)
208b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("login with $USERNAME/$PASSWORD", 230)
209b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
210b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assertTrue("isStarted", ftpServer.isStarted());
211b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assertFalse("isShutdown", ftpServer.isShutdown());
212b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
213b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
214b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testLogin_WithAccount() {
215b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        userAccount.accountRequiredForLogin = true
216b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnect()
217b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Logging in as $USERNAME/$PASSWORD with $ACCOUNT")
218b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.login(USERNAME, PASSWORD, ACCOUNT)
219b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("login with $USERNAME/$PASSWORD with $ACCOUNT", 230)
220b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
221b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
222b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testMkd() {
223b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
224b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
225b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def DIR = p(HOME_DIR, 'NewDir')
226b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.makeDirectory(DIR)
227b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("makeDirectory", 257)
228b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert fileSystem.isDirectory(DIR)
229b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
230b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
231b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testMode() {
232b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
233b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
234b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("MODE", 200)
235b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
236b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
237b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testNlst() {
238b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
239b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new DirectoryEntry(path: p(SUBDIR, SUBDIR_NAME2)))
240b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
241b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
242b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
243b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
244b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert filenames == [FILENAME1, SUBDIR_NAME2]
245b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("listNames", 226)
246b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
247b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
248b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testNoop() {
249b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
250b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.sendNoOp()
251b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("NOOP", 200)
252b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
253b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
254b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testPasv_Nlst() {
255b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME1)))
256b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(path: p(SUBDIR, FILENAME2)))
257b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
258b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
259b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClient.enterLocalPassiveMode();
260b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
261b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        String[] filenames = ftpClient.listNames(SUBDIR)
262b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert filenames == [FILENAME1, FILENAME2]
263b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("listNames", 226)
264b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
265b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
266b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testPwd() {
267b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
268b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.printWorkingDirectory() == HOME_DIR
269b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("printWorkingDirectory", 257)
270b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
271b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
272b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testQuit() {
273b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnect()
274b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClient.quit()
275b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("quit", 221)
276b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
277b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
278b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testRein() {
279b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
280b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.rein() == 220
281b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.cdup() == 530      // now logged out
282b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
283b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
284b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testRest() {
285b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
286b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.rest("marker") == 350
287b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
288b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
289b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testRetr() {
290b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(path: FILE1, contents: ASCII_DATA))
291b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
292b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
293b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
294b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Get File for remotePath [$FILE1]")
295b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def outputStream = new ByteArrayOutputStream()
296b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.retrieveFile(FILE1, outputStream)
297b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("File contents=[${outputStream.toString()}]")
298b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert outputStream.toString() == ASCII_DATA
299b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
300b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
301b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testRmd() {
302b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
303b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
304b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.removeDirectory(SUBDIR)
305b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("removeDirectory", 250)
306b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert !fileSystem.exists(SUBDIR)
307b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
308b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
309b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testRename() {                 // RNFR and RNTO
310b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new FileEntry(FILE1))
311b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
312b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
313b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
314b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.rename(FILE1, FILE1 + "NEW")
315b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("rename", 250)
316b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert !fileSystem.exists(FILE1)
317b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert fileSystem.exists(FILE1 + "NEW")
318b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
319b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
320b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testSite() {
321b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
322b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.site("parameters,1,2,3") == 200
323b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
324b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
325b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testSmnt() {
326b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
327b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.smnt("dir") == 250
328b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
329b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
330b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testStat() {
331b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
332b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def status = ftpClient.getStatus()
333b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert status.contains('Connected')
334b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("stat", 211)
335b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
336b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
337b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testStor() {
338b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
339b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
340b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Put File for local path [$FILE1]")
341b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
342b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.storeFile(FILE1, inputStream)
343b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def contents = fileSystem.getEntry(FILE1).createInputStream().text
344b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("File contents=[" + contents + "]")
345b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert contents == ASCII_DATA
346b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
347b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
348b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testStou() {
349b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
350b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
351b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def inputStream = new ByteArrayInputStream(ASCII_DATA.getBytes())
352b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.storeUniqueFile(FILENAME1, inputStream)
353b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
354b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def names = fileSystem.listNames(HOME_DIR)
355b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def filename = names.find {name -> name.startsWith(FILENAME1) }
356b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert filename
357b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
358b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def contents = fileSystem.getEntry(p(HOME_DIR, filename)).createInputStream().text
359b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("File contents=[" + contents + "]")
360b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert contents == ASCII_DATA
361b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
362b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
363b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testStru() {
364b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
365b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
366b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("STRU", 200)
367b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
368b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
369b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testSyst() {
370b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
371b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
372b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def systemName = ftpClient.getSystemName()
373b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("system name = [$systemName]")
374b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert systemName.contains('"' + SYSTEM_NAME + '"')
375b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("getSystemName", 215)
376b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
377b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
378b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testType() {
379b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
380b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.type(FTP.ASCII_FILE_TYPE)
381b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("TYPE", 200)
382b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
383b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
384b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void testUnrecognizedCommand() {
385b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnectAndLogin()
386b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.sendCommand("XXX") == 502
387b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("XXX", 502)
388b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
389b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
390b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // -------------------------------------------------------------------------
391b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // Test setup and tear-down
392b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // -------------------------------------------------------------------------
393b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
394b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    /**
395b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * Perform initialization before each test
396b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
397b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     */
398b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void setUp() {
399b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        super.setUp()
400b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
401b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        for (int i = 0; i < BINARY_DATA.length; i++) {
402b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair            BINARY_DATA[i] = (byte) i
403b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        }
404b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
405b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer = new FakeFtpServer()
406b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.serverControlPort = PortTestUtil.getFtpServerControlPort()
407b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.systemName = SYSTEM_NAME
408b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
409b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem = new WindowsFakeFileSystem()
410b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.createParentDirectoriesAutomatically = true
411b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        fileSystem.add(new DirectoryEntry(SUBDIR))
412b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.fileSystem = fileSystem
413b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
414b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        userAccount = new UserAccount(USERNAME, PASSWORD, HOME_DIR)
415b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.addUserAccount(userAccount)
416b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
417b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.start()
418b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClient = new FTPClient()
419b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
420b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
421b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    /**
422b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * Perform cleanup after each test
423b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
424b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     */
425b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    void tearDown() {
426b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        super.tearDown()
427b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpServer.stop()
428b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
429b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
430b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // -------------------------------------------------------------------------
431b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // Internal Helper Methods
432b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    // -------------------------------------------------------------------------
433b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
434b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private ftpClientConnectAndLogin() {
435b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClientConnect()
436b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assert ftpClient.login(USERNAME, PASSWORD)
437b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
438b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
439b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    /**
440b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * Connect to the server from the FTPClient
441b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     */
442b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private void ftpClientConnect() {
443b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        def port = PortTestUtil.getFtpServerControlPort()
444b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Conecting to $SERVER on port $port")
445b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        ftpClient.connect(SERVER, port)
446b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        verifyReplyCode("connect", 220)
447b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
448b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
449b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    /**
450b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * Assert that the FtpClient reply code is equal to the expected value
451b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     *
452b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * @param operation - the description of the operation performed used in the error message
453b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     * @param expectedReplyCode - the expected FtpClient reply code
454b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair     */
455b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
456b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        int replyCode = ftpClient.getReplyCode()
457b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode)
458b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode)
459b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
460b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
461b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
462b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        LOG.info(ftpFile)
463b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType())
464b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName())
465b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize())
466b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair    }
467b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair
468b2f4a2dfc590c250e42b21eb40d9539ac135b495chrismair}