1dfb59d50631968ab1a13002ea5421ece93169851chrismair/*
2dfb59d50631968ab1a13002ea5421ece93169851chrismair * Copyright 2007 the original author or authors.
3dfb59d50631968ab1a13002ea5421ece93169851chrismair *
4dfb59d50631968ab1a13002ea5421ece93169851chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5dfb59d50631968ab1a13002ea5421ece93169851chrismair * you may not use this file except in compliance with the License.
6dfb59d50631968ab1a13002ea5421ece93169851chrismair * You may obtain a copy of the License at
7dfb59d50631968ab1a13002ea5421ece93169851chrismair *
8dfb59d50631968ab1a13002ea5421ece93169851chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9dfb59d50631968ab1a13002ea5421ece93169851chrismair *
10dfb59d50631968ab1a13002ea5421ece93169851chrismair * Unless required by applicable law or agreed to in writing, software
11dfb59d50631968ab1a13002ea5421ece93169851chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12dfb59d50631968ab1a13002ea5421ece93169851chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dfb59d50631968ab1a13002ea5421ece93169851chrismair * See the License for the specific language governing permissions and
14dfb59d50631968ab1a13002ea5421ece93169851chrismair * limitations under the License.
15dfb59d50631968ab1a13002ea5421ece93169851chrismair */
16dfb59d50631968ab1a13002ea5421ece93169851chrismairpackage org.mockftpserver.stub;
17dfb59d50631968ab1a13002ea5421ece93169851chrismair
18dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.apache.commons.net.ftp.FTP;
19dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.apache.commons.net.ftp.FTPClient;
20dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.apache.commons.net.ftp.FTPFile;
21dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.apache.log4j.Logger;
22dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.CommandHandler;
23dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.CommandNames;
24dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.InvocationRecord;
25dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.SimpleCompositeCommandHandler;
26dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler;
27dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.stub.command.*;
28dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.test.*;
29dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.test.AbstractTestCase;
30dfb59d50631968ab1a13002ea5421ece93169851chrismair
31dfb59d50631968ab1a13002ea5421ece93169851chrismairimport java.io.ByteArrayInputStream;
32dfb59d50631968ab1a13002ea5421ece93169851chrismairimport java.io.ByteArrayOutputStream;
33dfb59d50631968ab1a13002ea5421ece93169851chrismairimport java.io.IOException;
34dfb59d50631968ab1a13002ea5421ece93169851chrismair
35dfb59d50631968ab1a13002ea5421ece93169851chrismair/**
36dfb59d50631968ab1a13002ea5421ece93169851chrismair * Tests for StubFtpServer using the Apache Jakarta Commons Net FTP client.
37dfb59d50631968ab1a13002ea5421ece93169851chrismair *
38dfb59d50631968ab1a13002ea5421ece93169851chrismair * @author Chris Mair
39dfb59d50631968ab1a13002ea5421ece93169851chrismair * @version $Revision$ - $Date$
40dfb59d50631968ab1a13002ea5421ece93169851chrismair */
41dfb59d50631968ab1a13002ea5421ece93169851chrismairpublic final class StubFtpServerIntegrationTest extends AbstractTestCase implements IntegrationTest {
42dfb59d50631968ab1a13002ea5421ece93169851chrismair
43dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final Logger LOG = Logger.getLogger(StubFtpServerIntegrationTest.class);
44dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final String SERVER = "localhost";
45dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final String USERNAME = "user123";
46dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final String PASSWORD = "password";
47dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final String FILENAME = "abc.txt";
48dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final String ASCII_CONTENTS = "abcdef\tghijklmnopqr";
49dfb59d50631968ab1a13002ea5421ece93169851chrismair    private static final byte[] BINARY_CONTENTS = new byte[256];
50dfb59d50631968ab1a13002ea5421ece93169851chrismair
51dfb59d50631968ab1a13002ea5421ece93169851chrismair    private StubFtpServer stubFtpServer;
52dfb59d50631968ab1a13002ea5421ece93169851chrismair    private FTPClient ftpClient;
53dfb59d50631968ab1a13002ea5421ece93169851chrismair    private RetrCommandHandler retrCommandHandler;
54dfb59d50631968ab1a13002ea5421ece93169851chrismair    private StorCommandHandler storCommandHandler;
55dfb59d50631968ab1a13002ea5421ece93169851chrismair
56dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
57dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Tests
58dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
59dfb59d50631968ab1a13002ea5421ece93169851chrismair
60dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testLogin() throws Exception {
61dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Connect
62dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Conecting to " + SERVER);
63dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
64dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("connect", 220);
65dfb59d50631968ab1a13002ea5421ece93169851chrismair
66dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Login
67dfb59d50631968ab1a13002ea5421ece93169851chrismair        String userAndPassword = USERNAME + "/" + PASSWORD;
68dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Logging in as " + userAndPassword);
69dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.login(USERNAME, PASSWORD);
70dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to login with " + userAndPassword, success);
71dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("login with " + userAndPassword, 230);
72dfb59d50631968ab1a13002ea5421ece93169851chrismair
73dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("isStarted", stubFtpServer.isStarted());
74dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertFalse("isShutdown", stubFtpServer.isShutdown());
75dfb59d50631968ab1a13002ea5421ece93169851chrismair
76dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Quit
77dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Quit");
78dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.quit();
79dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("quit", 221);
80dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
81dfb59d50631968ab1a13002ea5421ece93169851chrismair
82dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testAcct() throws Exception {
83dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
84dfb59d50631968ab1a13002ea5421ece93169851chrismair
85dfb59d50631968ab1a13002ea5421ece93169851chrismair        // ACCT
86dfb59d50631968ab1a13002ea5421ece93169851chrismair        int replyCode = ftpClient.acct("123456");
87dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("acct", 230, replyCode);
88dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
89dfb59d50631968ab1a13002ea5421ece93169851chrismair
90dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
91dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test the stop() method when no session has ever been started
92dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
93dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testStop_NoSessionEverStarted() throws Exception {
94dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Testing a stop() when no session has ever been started");
95dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
96dfb59d50631968ab1a13002ea5421ece93169851chrismair
97dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testHelp() throws Exception {
98dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Modify HELP CommandHandler to return a predefined help message
99dfb59d50631968ab1a13002ea5421ece93169851chrismair        final String HELP = "help message";
100dfb59d50631968ab1a13002ea5421ece93169851chrismair        HelpCommandHandler helpCommandHandler = (HelpCommandHandler) stubFtpServer.getCommandHandler(CommandNames.HELP);
101dfb59d50631968ab1a13002ea5421ece93169851chrismair        helpCommandHandler.setHelpMessage(HELP);
102dfb59d50631968ab1a13002ea5421ece93169851chrismair
103dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
104dfb59d50631968ab1a13002ea5421ece93169851chrismair
105dfb59d50631968ab1a13002ea5421ece93169851chrismair        // HELP
106dfb59d50631968ab1a13002ea5421ece93169851chrismair        String help = ftpClient.listHelp();
107dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Wrong response", help.indexOf(HELP) != -1);
108dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("listHelp", 214);
109dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
110dfb59d50631968ab1a13002ea5421ece93169851chrismair
111dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
112dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test the LIST and SYST commands.
113dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
114dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testList() throws Exception {
115dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
116dfb59d50631968ab1a13002ea5421ece93169851chrismair
117dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Set directory listing
118dfb59d50631968ab1a13002ea5421ece93169851chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
119dfb59d50631968ab1a13002ea5421ece93169851chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log\n"
120dfb59d50631968ab1a13002ea5421ece93169851chrismair                + "11-01-01 1:30PM <DIR> 0 archive");
121dfb59d50631968ab1a13002ea5421ece93169851chrismair
122dfb59d50631968ab1a13002ea5421ece93169851chrismair        // LIST
123dfb59d50631968ab1a13002ea5421ece93169851chrismair        FTPFile[] files = ftpClient.listFiles();
124dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("number of files", 2, files.length);
125dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, "File2350.log", 406348L);
126dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, "archive", 0L);
127dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("list", 226);
128dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
129dfb59d50631968ab1a13002ea5421ece93169851chrismair
130dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
131dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test the LIST, PASV and SYST commands, transferring a directory listing in passive mode
132dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
133dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testList_PassiveMode() throws Exception {
134dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
135dfb59d50631968ab1a13002ea5421ece93169851chrismair
136dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.enterLocalPassiveMode();
137dfb59d50631968ab1a13002ea5421ece93169851chrismair
138dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Set directory listing
139dfb59d50631968ab1a13002ea5421ece93169851chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
140dfb59d50631968ab1a13002ea5421ece93169851chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log");
141dfb59d50631968ab1a13002ea5421ece93169851chrismair
142dfb59d50631968ab1a13002ea5421ece93169851chrismair        // LIST
143dfb59d50631968ab1a13002ea5421ece93169851chrismair        FTPFile[] files = ftpClient.listFiles();
144dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("number of files", 1, files.length);
145dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("list", 226);
146dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
147dfb59d50631968ab1a13002ea5421ece93169851chrismair
148dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testNlst() throws Exception {
149dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
150dfb59d50631968ab1a13002ea5421ece93169851chrismair
151dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Set directory listing
152dfb59d50631968ab1a13002ea5421ece93169851chrismair        NlstCommandHandler nlstCommandHandler = (NlstCommandHandler) stubFtpServer.getCommandHandler(CommandNames.NLST);
153dfb59d50631968ab1a13002ea5421ece93169851chrismair        nlstCommandHandler.setDirectoryListing("File1.txt\nfile2.data");
154dfb59d50631968ab1a13002ea5421ece93169851chrismair
155dfb59d50631968ab1a13002ea5421ece93169851chrismair        // NLST
156dfb59d50631968ab1a13002ea5421ece93169851chrismair        String[] filenames = ftpClient.listNames();
157dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("number of files", 2, filenames.length);
158dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals(filenames[0], "File1.txt");
159dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals(filenames[1], "file2.data");
160dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("listNames", 226);
161dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
162dfb59d50631968ab1a13002ea5421ece93169851chrismair
163dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
164dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test printing the current working directory (PWD)
165dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
166dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testPwd() throws Exception {
167dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Modify PWD CommandHandler to return a predefined directory
168dfb59d50631968ab1a13002ea5421ece93169851chrismair        final String DIR = "some/dir";
169dfb59d50631968ab1a13002ea5421ece93169851chrismair        PwdCommandHandler pwdCommandHandler = (PwdCommandHandler) stubFtpServer.getCommandHandler(CommandNames.PWD);
170dfb59d50631968ab1a13002ea5421ece93169851chrismair        pwdCommandHandler.setDirectory(DIR);
171dfb59d50631968ab1a13002ea5421ece93169851chrismair
172dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
173dfb59d50631968ab1a13002ea5421ece93169851chrismair
174dfb59d50631968ab1a13002ea5421ece93169851chrismair        // PWD
175dfb59d50631968ab1a13002ea5421ece93169851chrismair        String dir = ftpClient.printWorkingDirectory();
176dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("Unable to PWD", DIR, dir);
177dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("printWorkingDirectory", 257);
178dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
179dfb59d50631968ab1a13002ea5421ece93169851chrismair
180dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testStat() throws Exception {
181dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Modify Stat CommandHandler to return predefined text
182dfb59d50631968ab1a13002ea5421ece93169851chrismair        final String STATUS = "some information 123";
183dfb59d50631968ab1a13002ea5421ece93169851chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
184dfb59d50631968ab1a13002ea5421ece93169851chrismair        statCommandHandler.setStatus(STATUS);
185dfb59d50631968ab1a13002ea5421ece93169851chrismair
186dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
187dfb59d50631968ab1a13002ea5421ece93169851chrismair
188dfb59d50631968ab1a13002ea5421ece93169851chrismair        // STAT
189dfb59d50631968ab1a13002ea5421ece93169851chrismair        String status = ftpClient.getStatus();
190dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("STAT reply", "211 " + STATUS + ".", status.trim());
191dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("getStatus", 211);
192dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
193dfb59d50631968ab1a13002ea5421ece93169851chrismair
194dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
195dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test getting the status (STAT), when the reply text contains multiple lines
196dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
197dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testStat_MultilineReplyText() throws Exception {
198dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Modify Stat CommandHandler to return predefined text
199dfb59d50631968ab1a13002ea5421ece93169851chrismair        final String STATUS = "System name: abc.def\nVersion 3.5.7\nNumber of failed logins: 2";
200dfb59d50631968ab1a13002ea5421ece93169851chrismair        final String FORMATTED_REPLY_STATUS = "211-System name: abc.def\r\nVersion 3.5.7\r\n211 Number of failed logins: 2.";
201dfb59d50631968ab1a13002ea5421ece93169851chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
202dfb59d50631968ab1a13002ea5421ece93169851chrismair        statCommandHandler.setStatus(STATUS);
203dfb59d50631968ab1a13002ea5421ece93169851chrismair
204dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
205dfb59d50631968ab1a13002ea5421ece93169851chrismair
206dfb59d50631968ab1a13002ea5421ece93169851chrismair        // STAT
207dfb59d50631968ab1a13002ea5421ece93169851chrismair        String status = ftpClient.getStatus();
208dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("STAT reply", FORMATTED_REPLY_STATUS, status.trim());
209dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("getStatus", 211);
210dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
211dfb59d50631968ab1a13002ea5421ece93169851chrismair
212dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testSyst() throws Exception {
213dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
214dfb59d50631968ab1a13002ea5421ece93169851chrismair
215dfb59d50631968ab1a13002ea5421ece93169851chrismair        // SYST
216dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("getSystemName()", "\"WINDOWS\" system type.", ftpClient.getSystemName());
217dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("syst", 215);
218dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
219dfb59d50631968ab1a13002ea5421ece93169851chrismair
220dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testCwd() throws Exception {
221dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Connect
222dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Conecting to " + SERVER);
223dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
224dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("connect", 220);
225dfb59d50631968ab1a13002ea5421ece93169851chrismair
226dfb59d50631968ab1a13002ea5421ece93169851chrismair        // CWD
227dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
228dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to CWD", success);
229dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("changeWorkingDirectory", 250);
230dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
231dfb59d50631968ab1a13002ea5421ece93169851chrismair
232dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
233dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test changing the current working directory (CWD), when it causes a remote error
234dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
235dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testCwd_Error() throws Exception {
236dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Override CWD CommandHandler to return error reply code
237dfb59d50631968ab1a13002ea5421ece93169851chrismair        final int REPLY_CODE = 500;
238dfb59d50631968ab1a13002ea5421ece93169851chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
239dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer.setCommandHandler("CWD", cwdCommandHandler);
240dfb59d50631968ab1a13002ea5421ece93169851chrismair
241dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
242dfb59d50631968ab1a13002ea5421ece93169851chrismair
243dfb59d50631968ab1a13002ea5421ece93169851chrismair        // CWD
244dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
245dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertFalse("Expected failure", success);
246dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE);
247dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
248dfb59d50631968ab1a13002ea5421ece93169851chrismair
249dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testCdup() throws Exception {
250dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
251dfb59d50631968ab1a13002ea5421ece93169851chrismair
252dfb59d50631968ab1a13002ea5421ece93169851chrismair        // CDUP
253dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.changeToParentDirectory();
254dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to CDUP", success);
255dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("changeToParentDirectory", 200);
256dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
257dfb59d50631968ab1a13002ea5421ece93169851chrismair
258dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testDele() throws Exception {
259dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
260dfb59d50631968ab1a13002ea5421ece93169851chrismair
261dfb59d50631968ab1a13002ea5421ece93169851chrismair        // DELE
262dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.deleteFile(FILENAME);
263dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to DELE", success);
264dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("deleteFile", 250);
265dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
266dfb59d50631968ab1a13002ea5421ece93169851chrismair
267dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testEprt() throws Exception {
268dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
269dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.sendCommand("EPRT", "|2|1080::8:800:200C:417A|5282|");
270dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("EPRT", 200);
271dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
272dfb59d50631968ab1a13002ea5421ece93169851chrismair
273dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testEpsv() throws Exception {
274dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
275dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.sendCommand("EPSV");
276dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("EPSV", 229);
277dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
278dfb59d50631968ab1a13002ea5421ece93169851chrismair
279dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testFeat_UseStaticReplyCommandHandler() throws IOException {
280dfb59d50631968ab1a13002ea5421ece93169851chrismair        // The FEAT command is not supported out of the box
281dfb59d50631968ab1a13002ea5421ece93169851chrismair        final String FEAT_TEXT = "Extensions supported:\n" +
282dfb59d50631968ab1a13002ea5421ece93169851chrismair                "MLST size*;create;modify*;perm;media-type\n" +
283dfb59d50631968ab1a13002ea5421ece93169851chrismair                "SIZE\n" +
284dfb59d50631968ab1a13002ea5421ece93169851chrismair                "COMPRESSION\n" +
285dfb59d50631968ab1a13002ea5421ece93169851chrismair                "END";
286dfb59d50631968ab1a13002ea5421ece93169851chrismair        StaticReplyCommandHandler featCommandHandler = new StaticReplyCommandHandler(211, FEAT_TEXT);
287dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer.setCommandHandler("FEAT", featCommandHandler);
288dfb59d50631968ab1a13002ea5421ece93169851chrismair
289dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
290dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals(ftpClient.sendCommand("FEAT"), 211);
291dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info(ftpClient.getReplyString());
292dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
293dfb59d50631968ab1a13002ea5421ece93169851chrismair
294dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testMkd() throws Exception {
295dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
296dfb59d50631968ab1a13002ea5421ece93169851chrismair
297dfb59d50631968ab1a13002ea5421ece93169851chrismair        // MKD
298dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.makeDirectory("dir1/dir2");
299dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to CWD", success);
300dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("makeDirectory", 257);
301dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
302dfb59d50631968ab1a13002ea5421ece93169851chrismair
303dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testNoop() throws Exception {
304dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
305dfb59d50631968ab1a13002ea5421ece93169851chrismair
306dfb59d50631968ab1a13002ea5421ece93169851chrismair        // NOOP
307dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.sendNoOp();
308dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to NOOP", success);
309dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("NOOP", 200);
310dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
311dfb59d50631968ab1a13002ea5421ece93169851chrismair
312dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testRest() throws Exception {
313dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
314dfb59d50631968ab1a13002ea5421ece93169851chrismair
315dfb59d50631968ab1a13002ea5421ece93169851chrismair        // REST
316dfb59d50631968ab1a13002ea5421ece93169851chrismair        int replyCode = ftpClient.rest("marker");
317dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("Unable to REST", 350, replyCode);
318dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
319dfb59d50631968ab1a13002ea5421ece93169851chrismair
320dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testRmd() throws Exception {
321dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
322dfb59d50631968ab1a13002ea5421ece93169851chrismair
323dfb59d50631968ab1a13002ea5421ece93169851chrismair        // RMD
324dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.removeDirectory("dir1/dir2");
325dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to RMD", success);
326dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("removeDirectory", 250);
327dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
328dfb59d50631968ab1a13002ea5421ece93169851chrismair
329dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testRename() throws Exception {
330dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
331dfb59d50631968ab1a13002ea5421ece93169851chrismair
332dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Rename (RNFR, RNTO)
333dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.rename(FILENAME, "new_" + FILENAME);
334dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to RENAME", success);
335dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("rename", 250);
336dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
337dfb59d50631968ab1a13002ea5421ece93169851chrismair
338dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testAllo() throws Exception {
339dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
340dfb59d50631968ab1a13002ea5421ece93169851chrismair
341dfb59d50631968ab1a13002ea5421ece93169851chrismair        // ALLO
342dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("ALLO", ftpClient.allocate(1024));
343dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("ALLO with recordSize", ftpClient.allocate(1024, 64));
344dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
345dfb59d50631968ab1a13002ea5421ece93169851chrismair
346dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
347dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test GET and PUT of ASCII files
348dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
349dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testTransferAsciiFile() throws Exception {
350dfb59d50631968ab1a13002ea5421ece93169851chrismair        retrCommandHandler.setFileContents(ASCII_CONTENTS);
351dfb59d50631968ab1a13002ea5421ece93169851chrismair
352dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
353dfb59d50631968ab1a13002ea5421ece93169851chrismair
354dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Get File
355dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
356dfb59d50631968ab1a13002ea5421ece93169851chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
357dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue(ftpClient.retrieveFile(FILENAME, outputStream));
358dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("File contents=[" + outputStream.toString());
359dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("File contents", ASCII_CONTENTS, outputStream.toString());
360dfb59d50631968ab1a13002ea5421ece93169851chrismair
361dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Put File
362dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
363dfb59d50631968ab1a13002ea5421ece93169851chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
364dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue(ftpClient.storeFile(FILENAME, inputStream));
365dfb59d50631968ab1a13002ea5421ece93169851chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
366dfb59d50631968ab1a13002ea5421ece93169851chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
367dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("File contents=[" + contents + "]");
368dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
369dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
370dfb59d50631968ab1a13002ea5421ece93169851chrismair
371dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
372dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test GET and PUT of binary files
373dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
374dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testTransferBinaryFiles() throws Exception {
375dfb59d50631968ab1a13002ea5421ece93169851chrismair        retrCommandHandler.setFileContents(BINARY_CONTENTS);
376dfb59d50631968ab1a13002ea5421ece93169851chrismair
377dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
378dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
379dfb59d50631968ab1a13002ea5421ece93169851chrismair
380dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Get File
381dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
382dfb59d50631968ab1a13002ea5421ece93169851chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
383dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("GET", ftpClient.retrieveFile(FILENAME, outputStream));
384dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("GET File length=" + outputStream.size());
385dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("File contents", BINARY_CONTENTS, outputStream.toByteArray());
386dfb59d50631968ab1a13002ea5421ece93169851chrismair
387dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Put File
388dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
389dfb59d50631968ab1a13002ea5421ece93169851chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(BINARY_CONTENTS);
390dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("PUT", ftpClient.storeFile(FILENAME, inputStream));
391dfb59d50631968ab1a13002ea5421ece93169851chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
392dfb59d50631968ab1a13002ea5421ece93169851chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
393dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("PUT File length=" + contents.length);
394dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("File contents", BINARY_CONTENTS, contents);
395dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
396dfb59d50631968ab1a13002ea5421ece93169851chrismair
397dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testStou() throws Exception {
398dfb59d50631968ab1a13002ea5421ece93169851chrismair        StouCommandHandler stouCommandHandler = (StouCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOU);
399dfb59d50631968ab1a13002ea5421ece93169851chrismair        stouCommandHandler.setFilename(FILENAME);
400dfb59d50631968ab1a13002ea5421ece93169851chrismair
401dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
402dfb59d50631968ab1a13002ea5421ece93169851chrismair
403dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Stor a File (STOU)
404dfb59d50631968ab1a13002ea5421ece93169851chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
405dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue(ftpClient.storeUniqueFile(FILENAME, inputStream));
406dfb59d50631968ab1a13002ea5421ece93169851chrismair        InvocationRecord invocationRecord = stouCommandHandler.getInvocation(0);
407dfb59d50631968ab1a13002ea5421ece93169851chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
408dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("File contents=[" + contents + "]");
409dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
410dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
411dfb59d50631968ab1a13002ea5421ece93169851chrismair
412dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testAppe() throws Exception {
413dfb59d50631968ab1a13002ea5421ece93169851chrismair        AppeCommandHandler appeCommandHandler = (AppeCommandHandler) stubFtpServer.getCommandHandler(CommandNames.APPE);
414dfb59d50631968ab1a13002ea5421ece93169851chrismair
415dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
416dfb59d50631968ab1a13002ea5421ece93169851chrismair
417dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Append a File (APPE)
418dfb59d50631968ab1a13002ea5421ece93169851chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
419dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue(ftpClient.appendFile(FILENAME, inputStream));
420dfb59d50631968ab1a13002ea5421ece93169851chrismair        InvocationRecord invocationRecord = appeCommandHandler.getInvocation(0);
421dfb59d50631968ab1a13002ea5421ece93169851chrismair        byte[] contents = (byte[]) invocationRecord.getObject(AppeCommandHandler.FILE_CONTENTS_KEY);
422dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("File contents=[" + contents + "]");
423dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
424dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
425dfb59d50631968ab1a13002ea5421ece93169851chrismair
426dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testAbor() throws Exception {
427dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
428dfb59d50631968ab1a13002ea5421ece93169851chrismair
429dfb59d50631968ab1a13002ea5421ece93169851chrismair        // ABOR
430dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("ABOR", ftpClient.abort());
431dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
432dfb59d50631968ab1a13002ea5421ece93169851chrismair
433dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testPasv() throws Exception {
434dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
435dfb59d50631968ab1a13002ea5421ece93169851chrismair
436dfb59d50631968ab1a13002ea5421ece93169851chrismair        // PASV
437dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.enterLocalPassiveMode();
438dfb59d50631968ab1a13002ea5421ece93169851chrismair        // no reply code; the PASV command is sent only when the data connection is opened
439dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
440dfb59d50631968ab1a13002ea5421ece93169851chrismair
441dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testMode() throws Exception {
442dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
443dfb59d50631968ab1a13002ea5421ece93169851chrismair
444dfb59d50631968ab1a13002ea5421ece93169851chrismair        // MODE
445dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
446dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to MODE", success);
447dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("setFileTransferMode", 200);
448dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
449dfb59d50631968ab1a13002ea5421ece93169851chrismair
450dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testStru() throws Exception {
451dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
452dfb59d50631968ab1a13002ea5421ece93169851chrismair
453dfb59d50631968ab1a13002ea5421ece93169851chrismair        // STRU
454dfb59d50631968ab1a13002ea5421ece93169851chrismair        boolean success = ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
455dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("Unable to STRU", success);
456dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("setFileStructure", 200);
457dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
458dfb59d50631968ab1a13002ea5421ece93169851chrismair
459dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testSimpleCompositeCommandHandler() throws Exception {
460dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Replace CWD CommandHandler with a SimpleCompositeCommandHandler
461dfb59d50631968ab1a13002ea5421ece93169851chrismair        CommandHandler commandHandler1 = new StaticReplyCommandHandler(500);
462dfb59d50631968ab1a13002ea5421ece93169851chrismair        CommandHandler commandHandler2 = new CwdCommandHandler();
463dfb59d50631968ab1a13002ea5421ece93169851chrismair        SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler();
464dfb59d50631968ab1a13002ea5421ece93169851chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler1);
465dfb59d50631968ab1a13002ea5421ece93169851chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler2);
466dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler);
467dfb59d50631968ab1a13002ea5421ece93169851chrismair
468dfb59d50631968ab1a13002ea5421ece93169851chrismair        // Connect
469dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
470dfb59d50631968ab1a13002ea5421ece93169851chrismair
471dfb59d50631968ab1a13002ea5421ece93169851chrismair        // CWD
472dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertFalse("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
473dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
474dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
475dfb59d50631968ab1a13002ea5421ece93169851chrismair
476dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testSite() throws Exception {
477dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
478dfb59d50631968ab1a13002ea5421ece93169851chrismair
479dfb59d50631968ab1a13002ea5421ece93169851chrismair        // SITE
480dfb59d50631968ab1a13002ea5421ece93169851chrismair        int replyCode = ftpClient.site("parameters,1,2,3");
481dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("SITE", 200, replyCode);
482dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
483dfb59d50631968ab1a13002ea5421ece93169851chrismair
484dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testSmnt() throws Exception {
485dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
486dfb59d50631968ab1a13002ea5421ece93169851chrismair
487dfb59d50631968ab1a13002ea5421ece93169851chrismair        // SMNT
488dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertTrue("SMNT", ftpClient.structureMount("dir1/dir2"));
489dfb59d50631968ab1a13002ea5421ece93169851chrismair        verifyReplyCode("structureMount", 250);
490dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
491dfb59d50631968ab1a13002ea5421ece93169851chrismair
492dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testRein() throws Exception {
493dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
494dfb59d50631968ab1a13002ea5421ece93169851chrismair
495dfb59d50631968ab1a13002ea5421ece93169851chrismair        // REIN
496dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("REIN", 220, ftpClient.rein());
497dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
498dfb59d50631968ab1a13002ea5421ece93169851chrismair
499dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
500dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Test that command names in lowercase or mixed upper/lower case are accepted
501dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
502dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testCommandNamesInLowerOrMixedCase() throws Exception {
503dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
504dfb59d50631968ab1a13002ea5421ece93169851chrismair
505dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("rein", 220, ftpClient.sendCommand("rein"));
506dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("rEIn", 220, ftpClient.sendCommand("rEIn"));
507dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("reiN", 220, ftpClient.sendCommand("reiN"));
508dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("Rein", 220, ftpClient.sendCommand("Rein"));
509dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
510dfb59d50631968ab1a13002ea5421ece93169851chrismair
511dfb59d50631968ab1a13002ea5421ece93169851chrismair    public void testUnrecognizedCommand() throws Exception {
512dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClientConnect();
513dfb59d50631968ab1a13002ea5421ece93169851chrismair
514dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("Unrecognized:XXXX", 502, ftpClient.sendCommand("XXXX"));
515dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
516dfb59d50631968ab1a13002ea5421ece93169851chrismair
517dfb59d50631968ab1a13002ea5421ece93169851chrismair    // -------------------------------------------------------------------------
518dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Test setup and tear-down
519dfb59d50631968ab1a13002ea5421ece93169851chrismair    // -------------------------------------------------------------------------
520dfb59d50631968ab1a13002ea5421ece93169851chrismair
521dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
522dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Perform initialization before each test
523dfb59d50631968ab1a13002ea5421ece93169851chrismair     *
524dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @see org.mockftpserver.test.AbstractTestCase#setUp()
525dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
526dfb59d50631968ab1a13002ea5421ece93169851chrismair    protected void setUp() throws Exception {
527dfb59d50631968ab1a13002ea5421ece93169851chrismair        super.setUp();
528dfb59d50631968ab1a13002ea5421ece93169851chrismair
529dfb59d50631968ab1a13002ea5421ece93169851chrismair        for (int i = 0; i < BINARY_CONTENTS.length; i++) {
530dfb59d50631968ab1a13002ea5421ece93169851chrismair            BINARY_CONTENTS[i] = (byte) i;
531dfb59d50631968ab1a13002ea5421ece93169851chrismair        }
532dfb59d50631968ab1a13002ea5421ece93169851chrismair
533dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer = new StubFtpServer();
534dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer.setServerControlPort(PortTestUtil.getFtpServerControlPort());
535dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer.start();
536dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient = new FTPClient();
537dfb59d50631968ab1a13002ea5421ece93169851chrismair        retrCommandHandler = (RetrCommandHandler) stubFtpServer.getCommandHandler(CommandNames.RETR);
538dfb59d50631968ab1a13002ea5421ece93169851chrismair        storCommandHandler = (StorCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOR);
539dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
540dfb59d50631968ab1a13002ea5421ece93169851chrismair
541dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
542dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Perform cleanup after each test
543dfb59d50631968ab1a13002ea5421ece93169851chrismair     *
544dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @see org.mockftpserver.test.AbstractTestCase#tearDown()
545dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
546dfb59d50631968ab1a13002ea5421ece93169851chrismair    protected void tearDown() throws Exception {
547dfb59d50631968ab1a13002ea5421ece93169851chrismair        super.tearDown();
548dfb59d50631968ab1a13002ea5421ece93169851chrismair        stubFtpServer.stop();
549dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
550dfb59d50631968ab1a13002ea5421ece93169851chrismair
551dfb59d50631968ab1a13002ea5421ece93169851chrismair    // -------------------------------------------------------------------------
552dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Internal Helper Methods
553dfb59d50631968ab1a13002ea5421ece93169851chrismair    // -------------------------------------------------------------------------
554dfb59d50631968ab1a13002ea5421ece93169851chrismair
555dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
556dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Connect to the server from the FTPClient
557dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
558dfb59d50631968ab1a13002ea5421ece93169851chrismair    private void ftpClientConnect() throws IOException {
559dfb59d50631968ab1a13002ea5421ece93169851chrismair        ftpClient.connect(SERVER, PortTestUtil.getFtpServerControlPort());
560dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
561dfb59d50631968ab1a13002ea5421ece93169851chrismair
562dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
563dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Assert that the FtpClient reply code is equal to the expected value
564dfb59d50631968ab1a13002ea5421ece93169851chrismair     *
565dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param operation         - the description of the operation performed; used in the error message
566dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param expectedReplyCode - the expected FtpClient reply code
567dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
568dfb59d50631968ab1a13002ea5421ece93169851chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
569dfb59d50631968ab1a13002ea5421ece93169851chrismair        int replyCode = ftpClient.getReplyCode();
570dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode);
571dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode);
572dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
573dfb59d50631968ab1a13002ea5421ece93169851chrismair
574dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
575dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Verify that the FTPFile has the specified properties
576dfb59d50631968ab1a13002ea5421ece93169851chrismair     *
577dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param ftpFile - the FTPFile to verify
578dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param type    - the expected file type
579dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param name    - the expected file name
580dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param size    - the expected file size (will be zero for a directory)
581dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
582dfb59d50631968ab1a13002ea5421ece93169851chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
583dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info(ftpFile);
584dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType());
585dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName());
586dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize());
587dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
588dfb59d50631968ab1a13002ea5421ece93169851chrismair
589dfb59d50631968ab1a13002ea5421ece93169851chrismair}
590