100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/*
200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Copyright 2007 the original author or authors.
300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Licensed under the Apache License, Version 2.0 (the "License");
500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * you may not use this file except in compliance with the License.
600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * You may obtain a copy of the License at
700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *      http://www.apache.org/licenses/LICENSE-2.0
900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
1000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Unless required by applicable law or agreed to in writing, software
1100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * See the License for the specific language governing permissions and
1400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * limitations under the License.
1500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
1600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpackage org.mockftpserver.stub;
1700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
1800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.apache.commons.net.ftp.FTP;
1900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.apache.commons.net.ftp.FTPClient;
2000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.apache.commons.net.ftp.FTPFile;
2100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.slf4j.Logger;
2200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.slf4j.LoggerFactory;
2300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.CommandHandler;
2400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.CommandNames;
2500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.InvocationRecord;
2600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.SimpleCompositeCommandHandler;
2700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler;
2800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.stub.command.*;
2900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.test.*;
3000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.test.AbstractTestCase;
3100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport java.io.ByteArrayInputStream;
3300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport java.io.ByteArrayOutputStream;
3400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport java.io.IOException;
3500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/**
3700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Tests for StubFtpServer using the Apache Jakarta Commons Net FTP client.
3800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
3900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @author Chris Mair
4000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @version $Revision$ - $Date$
4100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
4200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpublic final class StubFtpServerIntegrationTest extends AbstractTestCase implements IntegrationTest {
4300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
4400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final Logger LOG = LoggerFactory.getLogger(StubFtpServerIntegrationTest.class);
4500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String SERVER = "localhost";
4600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String USERNAME = "user123";
4700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String PASSWORD = "password";
4800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String FILENAME = "abc.txt";
4900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final String ASCII_CONTENTS = "abcdef\tghijklmnopqr";
5000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private static final byte[] BINARY_CONTENTS = new byte[256];
5100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private StubFtpServer stubFtpServer;
5300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private FTPClient ftpClient;
5400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private RetrCommandHandler retrCommandHandler;
5500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private StorCommandHandler storCommandHandler;
5600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
5800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Tests
5900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
6000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testLogin() throws Exception {
6200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Connect
6300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Conecting to " + SERVER);
6400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
6500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("connect", 220);
6600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Login
6800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String userAndPassword = USERNAME + "/" + PASSWORD;
6900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Logging in as " + userAndPassword);
7000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.login(USERNAME, PASSWORD);
7100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to login with " + userAndPassword, success);
7200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("login with " + userAndPassword, 230);
7300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("isStarted", stubFtpServer.isStarted());
7500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertFalse("isShutdown", stubFtpServer.isShutdown());
7600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Quit
7800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Quit");
7900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.quit();
8000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("quit", 221);
8100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
8200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testAcct() throws Exception {
8400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
8500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // ACCT
8700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        int replyCode = ftpClient.acct("123456");
8800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("acct", 230, replyCode);
8900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
9000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
9200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the stop() method when no session has ever been started
9300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
9400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testStop_NoSessionEverStarted() throws Exception {
9500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Testing a stop() when no session has ever been started");
9600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
9700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testHelp() throws Exception {
9900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Modify HELP CommandHandler to return a predefined help message
10000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final String HELP = "help message";
10100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        HelpCommandHandler helpCommandHandler = (HelpCommandHandler) stubFtpServer.getCommandHandler(CommandNames.HELP);
10200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        helpCommandHandler.setHelpMessage(HELP);
10300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
10500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // HELP
10700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String help = ftpClient.listHelp();
10800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Wrong response", help.indexOf(HELP) != -1);
10900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listHelp", 214);
11000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
11100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
11300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the LIST and SYST commands.
11400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
11500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testList() throws Exception {
11600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
11700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Set directory listing
11900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
12000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log\n"
12100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                + "11-01-01 1:30PM <DIR>  archive");
12200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
12300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // LIST
12400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile[] files = ftpClient.listFiles();
12500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("number of files", 2, files.length);
12600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, "File2350.log", 406348L);
12700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, "archive", 0L);
12800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("list", 226);
12900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
13000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
13200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test the LIST, PASV and SYST commands, transferring a directory listing in passive mode
13300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
13400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testList_PassiveMode() throws Exception {
13500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
13600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.enterLocalPassiveMode();
13800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Set directory listing
14000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
14100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log");
14200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // LIST
14400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        FTPFile[] files = ftpClient.listFiles();
14500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("number of files", 1, files.length);
14600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("list", 226);
14700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
14800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testNlst() throws Exception {
15000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
15100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Set directory listing
15300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        NlstCommandHandler nlstCommandHandler = (NlstCommandHandler) stubFtpServer.getCommandHandler(CommandNames.NLST);
15400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        nlstCommandHandler.setDirectoryListing("File1.txt\nfile2.data");
15500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // NLST
15700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String[] filenames = ftpClient.listNames();
15800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("number of files", 2, filenames.length);
15900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals(filenames[0], "File1.txt");
16000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals(filenames[1], "file2.data");
16100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("listNames", 226);
16200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
16300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
16400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
16500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test printing the current working directory (PWD)
16600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
16700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testPwd() throws Exception {
16800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Modify PWD CommandHandler to return a predefined directory
16900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final String DIR = "some/dir";
17000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        PwdCommandHandler pwdCommandHandler = (PwdCommandHandler) stubFtpServer.getCommandHandler(CommandNames.PWD);
17100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        pwdCommandHandler.setDirectory(DIR);
17200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
17300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
17400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
17500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // PWD
17600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String dir = ftpClient.printWorkingDirectory();
17700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("Unable to PWD", DIR, dir);
17800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("printWorkingDirectory", 257);
17900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
18000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
18100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testStat() throws Exception {
18200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Modify Stat CommandHandler to return predefined text
18300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final String STATUS = "some information 123";
18400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
18500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        statCommandHandler.setStatus(STATUS);
18600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
18700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
18800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
18900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // STAT
19000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String status = ftpClient.getStatus();
19100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("STAT reply", "211 " + STATUS + ".", status.trim());
19200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("getStatus", 211);
19300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
19400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
19500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
19600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test getting the status (STAT), when the reply text contains multiple lines
19700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
19800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testStat_MultilineReplyText() throws Exception {
19900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Modify Stat CommandHandler to return predefined text
20000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final String STATUS = "System name: abc.def\nVersion 3.5.7\nNumber of failed logins: 2";
20100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final String FORMATTED_REPLY_STATUS = "211-System name: abc.def\r\nVersion 3.5.7\r\n211 Number of failed logins: 2.";
20200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
20300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        statCommandHandler.setStatus(STATUS);
20400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
20500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
20600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
20700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // STAT
20800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String status = ftpClient.getStatus();
20900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("STAT reply", FORMATTED_REPLY_STATUS, status.trim());
21000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("getStatus", 211);
21100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
21200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
21300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSyst() throws Exception {
21400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
21500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
21600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // SYST
21700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("getSystemName()", "\"WINDOWS\" system type.", ftpClient.getSystemName());
21800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("syst", 215);
21900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
22000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
22100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testCwd() throws Exception {
22200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Connect
22300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Conecting to " + SERVER);
22400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
22500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("connect", 220);
22600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
22700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // CWD
22800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
22900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to CWD", success);
23000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", 250);
23100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
23200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
23300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
23400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test changing the current working directory (CWD), when it causes a remote error
23500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
23600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testCwd_Error() throws Exception {
23700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Override CWD CommandHandler to return error reply code
23800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final int REPLY_CODE = 500;
23900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
24000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer.setCommandHandler("CWD", cwdCommandHandler);
24100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
24200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
24300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
24400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // CWD
24500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
24600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertFalse("Expected failure", success);
24700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE);
24800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
24900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
25000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testCdup() throws Exception {
25100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
25200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
25300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // CDUP
25400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.changeToParentDirectory();
25500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to CDUP", success);
25600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("changeToParentDirectory", 200);
25700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
25800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
25900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testDele() throws Exception {
26000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
26100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
26200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // DELE
26300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.deleteFile(FILENAME);
26400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to DELE", success);
26500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("deleteFile", 250);
26600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
26700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
26800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testEprt() throws Exception {
26900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Skipping...");
27000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair//        ftpClientConnect();
27100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair//        ftpClient.sendCommand("EPRT", "|2|1080::8:800:200C:417A|5282|");
27200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair//        verifyReplyCode("EPRT", 200);
27300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
27400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
27500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testEpsv() throws Exception {
27600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
27700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.sendCommand("EPSV");
27800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("EPSV", 229);
27900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
28000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
28100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testFeat_UseStaticReplyCommandHandler() throws IOException {
28200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // The FEAT command is not supported out of the box
28300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final String FEAT_TEXT = "Extensions supported:\n" +
28400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                "MLST size*;create;modify*;perm;media-type\n" +
28500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                "SIZE\n" +
28600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                "COMPRESSION\n" +
28700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                "END";
28800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StaticReplyCommandHandler featCommandHandler = new StaticReplyCommandHandler(211, FEAT_TEXT);
28900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer.setCommandHandler("FEAT", featCommandHandler);
29000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
29100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
29200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals(ftpClient.sendCommand("FEAT"), 211);
29300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info(ftpClient.getReplyString());
29400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
29500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
29600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testMkd() throws Exception {
29700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
29800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
29900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // MKD
30000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.makeDirectory("dir1/dir2");
30100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to CWD", success);
30200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("makeDirectory", 257);
30300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
30400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
30500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testNoop() throws Exception {
30600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
30700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
30800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // NOOP
30900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.sendNoOp();
31000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to NOOP", success);
31100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("NOOP", 200);
31200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
31300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
31400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testRest() throws Exception {
31500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
31600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
31700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // REST
31800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        int replyCode = ftpClient.rest("marker");
31900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("Unable to REST", 350, replyCode);
32000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
32100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
32200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testRmd() throws Exception {
32300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
32400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
32500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // RMD
32600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.removeDirectory("dir1/dir2");
32700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to RMD", success);
32800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("removeDirectory", 250);
32900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
33000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
33100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testRename() throws Exception {
33200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
33300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
33400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Rename (RNFR, RNTO)
33500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.rename(FILENAME, "new_" + FILENAME);
33600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to RENAME", success);
33700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("rename", 250);
33800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
33900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
34000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testAllo() throws Exception {
34100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
34200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
34300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // ALLO
34400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("ALLO", ftpClient.allocate(1024));
34500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("ALLO with recordSize", ftpClient.allocate(1024, 64));
34600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
34700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
34800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
34900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test GET and PUT of ASCII files
35000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
35100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testTransferAsciiFile() throws Exception {
35200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        retrCommandHandler.setFileContents(ASCII_CONTENTS);
35300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
35400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
35500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
35600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Get File
35700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
35800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
35900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue(ftpClient.retrieveFile(FILENAME, outputStream));
36000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + outputStream.toString());
36100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("File contents", ASCII_CONTENTS, outputStream.toString());
36200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
36300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Put File
36400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
36500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
36600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue(ftpClient.storeFile(FILENAME, inputStream));
36700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
36800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
36900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + contents + "]");
37000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
37100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
37200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
37300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
37400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test GET and PUT of binary files
37500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
37600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testTransferBinaryFiles() throws Exception {
37700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        retrCommandHandler.setFileContents(BINARY_CONTENTS);
37800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
37900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
38000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
38100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
38200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Get File
38300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
38400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
38500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("GET", ftpClient.retrieveFile(FILENAME, outputStream));
38600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("GET File length=" + outputStream.size());
38700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("File contents", BINARY_CONTENTS, outputStream.toByteArray());
38800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
38900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Put File
39000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
39100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(BINARY_CONTENTS);
39200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("PUT", ftpClient.storeFile(FILENAME, inputStream));
39300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
39400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
39500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("PUT File length=" + contents.length);
39600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("File contents", BINARY_CONTENTS, contents);
39700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
39800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
39900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testStou() throws Exception {
40000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        StouCommandHandler stouCommandHandler = (StouCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOU);
40100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stouCommandHandler.setFilename(FILENAME);
40200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
40300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
40400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
40500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Stor a File (STOU)
40600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
40700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue(ftpClient.storeUniqueFile(FILENAME, inputStream));
40800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        InvocationRecord invocationRecord = stouCommandHandler.getInvocation(0);
40900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
41000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + contents + "]");
41100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
41200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
41300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
41400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testAppe() throws Exception {
41500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        AppeCommandHandler appeCommandHandler = (AppeCommandHandler) stubFtpServer.getCommandHandler(CommandNames.APPE);
41600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
41700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
41800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
41900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Append a File (APPE)
42000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
42100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue(ftpClient.appendFile(FILENAME, inputStream));
42200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        InvocationRecord invocationRecord = appeCommandHandler.getInvocation(0);
42300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        byte[] contents = (byte[]) invocationRecord.getObject(AppeCommandHandler.FILE_CONTENTS_KEY);
42400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("File contents=[" + contents + "]");
42500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
42600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
42700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
42800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testAbor() throws Exception {
42900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
43000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
43100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // ABOR
43200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("ABOR", ftpClient.abort());
43300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
43400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
43500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testPasv() throws Exception {
43600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
43700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
43800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // PASV
43900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.enterLocalPassiveMode();
44000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // no reply code; the PASV command is sent only when the data connection is opened
44100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
44200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
44300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testMode() throws Exception {
44400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
44500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
44600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // MODE
44700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
44800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to MODE", success);
44900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("setFileTransferMode", 200);
45000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
45100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
45200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testStru() throws Exception {
45300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
45400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
45500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // STRU
45600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        boolean success = ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
45700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("Unable to STRU", success);
45800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("setFileStructure", 200);
45900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
46000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
46100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSimpleCompositeCommandHandler() throws Exception {
46200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Replace CWD CommandHandler with a SimpleCompositeCommandHandler
46300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        CommandHandler commandHandler1 = new StaticReplyCommandHandler(500);
46400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        CommandHandler commandHandler2 = new CwdCommandHandler();
46500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler();
46600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler1);
46700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler2);
46800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler);
46900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
47000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // Connect
47100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
47200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
47300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // CWD
47400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertFalse("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
47500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
47600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
47700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
47800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSite() throws Exception {
47900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
48000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
48100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // SITE
48200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        int replyCode = ftpClient.site("parameters,1,2,3");
48300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("SITE", 200, replyCode);
48400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
48500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
48600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testSmnt() throws Exception {
48700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
48800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
48900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // SMNT
49000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertTrue("SMNT", ftpClient.structureMount("dir1/dir2"));
49100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        verifyReplyCode("structureMount", 250);
49200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
49300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
49400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testRein() throws Exception {
49500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
49600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
49700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // REIN
49800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("REIN", 220, ftpClient.rein());
49900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
50000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
50100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
50200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Test that command names in lowercase or mixed upper/lower case are accepted
50300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
50400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testCommandNamesInLowerOrMixedCase() throws Exception {
50500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
50600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
50700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("rein", 220, ftpClient.sendCommand("rein"));
50800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("rEIn", 220, ftpClient.sendCommand("rEIn"));
50900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("reiN", 220, ftpClient.sendCommand("reiN"));
51000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("Rein", 220, ftpClient.sendCommand("Rein"));
51100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
51200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
51300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    public void testUnrecognizedCommand() throws Exception {
51400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClientConnect();
51500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
51600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("Unrecognized:XXXX", 502, ftpClient.sendCommand("XXXX"));
51700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
51800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
51900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
52000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Test setup and tear-down
52100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
52200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
52300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
52400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Perform initialization before each test
52500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
52600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @see org.mockftpserver.test.AbstractTestCase#setUp()
52700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
52800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    protected void setUp() throws Exception {
52900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        super.setUp();
53000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
53100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        for (int i = 0; i < BINARY_CONTENTS.length; i++) {
53200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            BINARY_CONTENTS[i] = (byte) i;
53300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }
53400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
53500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer = new StubFtpServer();
53600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer.setServerControlPort(PortTestUtil.getFtpServerControlPort());
53700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer.start();
53800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient = new FTPClient();
53900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        retrCommandHandler = (RetrCommandHandler) stubFtpServer.getCommandHandler(CommandNames.RETR);
54000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        storCommandHandler = (StorCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOR);
54100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
54200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
54300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
54400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Perform cleanup after each test
54500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
54600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @see org.mockftpserver.test.AbstractTestCase#tearDown()
54700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
54800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    protected void tearDown() throws Exception {
54900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        super.tearDown();
55000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        stubFtpServer.stop();
55100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
55200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
55300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
55400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Internal Helper Methods
55500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
55600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
55700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
55800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Connect to the server from the FTPClient
55900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
56000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private void ftpClientConnect() throws IOException {
56100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        ftpClient.connect(SERVER, PortTestUtil.getFtpServerControlPort());
56200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
56300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
56400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
56500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Assert that the FtpClient reply code is equal to the expected value
56600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
56700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param operation         - the description of the operation performed; used in the error message
56800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param expectedReplyCode - the expected FtpClient reply code
56900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
57000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
57100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        int replyCode = ftpClient.getReplyCode();
57200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode);
57300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode);
57400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
57500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
57600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
57700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Verify that the FTPFile has the specified properties
57800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
57900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param ftpFile - the FTPFile to verify
58000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param type    - the expected file type
58100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param name    - the expected file name
58200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param size    - the expected file size (will be zero for a directory)
58300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
58400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
58500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info(ftpFile.toString());
58600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType());
58700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName());
58800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize());
58900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
59000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
59100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair}
592