193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair/*
293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Copyright 2007 the original author or authors.
393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Licensed under the Apache License, Version 2.0 (the "License");
593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * you may not use this file except in compliance with the License.
693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * You may obtain a copy of the License at
793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *      http://www.apache.org/licenses/LICENSE-2.0
993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
1093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Unless required by applicable law or agreed to in writing, software
1193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * See the License for the specific language governing permissions and
1493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * limitations under the License.
1593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair */
1693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairpackage org.mockftpserver.stub;
1793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
1893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport org.apache.commons.net.ftp.FTP;
1993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport org.apache.commons.net.ftp.FTPClient;
2093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport org.apache.commons.net.ftp.FTPFile;
21dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismairimport org.slf4j.Logger;
22dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismairimport org.slf4j.LoggerFactory;
235940ebc73e32a649d194022c5b4bdb5a276ad386chrismairimport org.mockftpserver.core.command.CommandHandler;
245940ebc73e32a649d194022c5b4bdb5a276ad386chrismairimport org.mockftpserver.core.command.CommandNames;
255940ebc73e32a649d194022c5b4bdb5a276ad386chrismairimport org.mockftpserver.core.command.InvocationRecord;
265940ebc73e32a649d194022c5b4bdb5a276ad386chrismairimport org.mockftpserver.core.command.SimpleCompositeCommandHandler;
275940ebc73e32a649d194022c5b4bdb5a276ad386chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler;
285e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismairimport org.mockftpserver.stub.command.*;
2940658190151b7ded3489ff89c301b470155c95f4chrismairimport org.mockftpserver.test.*;
3040658190151b7ded3489ff89c301b470155c95f4chrismairimport org.mockftpserver.test.AbstractTestCase;
3193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
325e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismairimport java.io.ByteArrayInputStream;
335e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismairimport java.io.ByteArrayOutputStream;
345e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismairimport java.io.IOException;
355e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
3693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair/**
3793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Tests for StubFtpServer using the Apache Jakarta Commons Net FTP client.
385e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair *
3993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * @author Chris Mair
405e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair * @version $Revision$ - $Date$
4193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair */
4240658190151b7ded3489ff89c301b470155c95f4chrismairpublic final class StubFtpServerIntegrationTest extends AbstractTestCase implements IntegrationTest {
4393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
44dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismair    private static final Logger LOG = LoggerFactory.getLogger(StubFtpServerIntegrationTest.class);
4593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private static final String SERVER = "localhost";
4693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private static final String USERNAME = "user123";
4793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private static final String PASSWORD = "password";
4893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private static final String FILENAME = "abc.txt";
4913d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair    private static final String ASCII_CONTENTS = "abcdef\tghijklmnopqr";
5093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private static final byte[] BINARY_CONTENTS = new byte[256];
5193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
5293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private StubFtpServer stubFtpServer;
5393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private FTPClient ftpClient;
5493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private RetrCommandHandler retrCommandHandler;
5593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private StorCommandHandler storCommandHandler;
5693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
5793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    //-------------------------------------------------------------------------
5893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // Tests
5993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    //-------------------------------------------------------------------------
605e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
6193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testLogin() throws Exception {
6293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Connect
6393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Conecting to " + SERVER);
6413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
6593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("connect", 220);
6693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
6793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Login
6893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        String userAndPassword = USERNAME + "/" + PASSWORD;
6993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Logging in as " + userAndPassword);
7093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.login(USERNAME, PASSWORD);
7193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to login with " + userAndPassword, success);
7293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("login with " + userAndPassword, 230);
7393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
74f2152557999c6eeca3b2018166ddad4c015ddd89chrismair        assertTrue("isStarted", stubFtpServer.isStarted());
75f2152557999c6eeca3b2018166ddad4c015ddd89chrismair        assertFalse("isShutdown", stubFtpServer.isShutdown());
76f2152557999c6eeca3b2018166ddad4c015ddd89chrismair
7793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Quit
7893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Quit");
7993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ftpClient.quit();
8093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("quit", 221);
8193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
8293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
8393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testAcct() throws Exception {
8413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
8593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
8693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // ACCT
8793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        int replyCode = ftpClient.acct("123456");
8893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("acct", 230, replyCode);
8993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
9093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
9193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
9293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test the stop() method when no session has ever been started
9393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
9493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testStop_NoSessionEverStarted() throws Exception {
9593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Testing a stop() when no session has ever been started");
9693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
9793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
9893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testHelp() throws Exception {
9993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Modify HELP CommandHandler to return a predefined help message
10093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        final String HELP = "help message";
10193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        HelpCommandHandler helpCommandHandler = (HelpCommandHandler) stubFtpServer.getCommandHandler(CommandNames.HELP);
10293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        helpCommandHandler.setHelpMessage(HELP);
10393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
10413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
10593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
10693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // HELP
10793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        String help = ftpClient.listHelp();
10893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Wrong response", help.indexOf(HELP) != -1);
10993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("listHelp", 214);
11093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
11193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
11293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
11393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test the LIST and SYST commands.
11493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
11593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testList() throws Exception {
11613d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
11793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
11893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Set directory listing
11993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
12093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log\n"
121a5ff87feb19f5ff748fd4375b108d8be4a18686bchrismair                + "11-01-01 1:30PM <DIR>  archive");
12293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
12393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // LIST
12493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        FTPFile[] files = ftpClient.listFiles();
12593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("number of files", 2, files.length);
12693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, "File2350.log", 406348L);
12793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, "archive", 0L);
12893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("list", 226);
12993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
13093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
13193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
13293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test the LIST, PASV and SYST commands, transferring a directory listing in passive mode
13393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
13493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testList_PassiveMode() throws Exception {
13513d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
13693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
13793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ftpClient.enterLocalPassiveMode();
1385e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
13993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Set directory listing
14093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
14193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log");
14293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
14393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // LIST
14493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        FTPFile[] files = ftpClient.listFiles();
14593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("number of files", 1, files.length);
14693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("list", 226);
14793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
14893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
14993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testNlst() throws Exception {
15013d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
15193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
15293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Set directory listing
15393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        NlstCommandHandler nlstCommandHandler = (NlstCommandHandler) stubFtpServer.getCommandHandler(CommandNames.NLST);
15493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        nlstCommandHandler.setDirectoryListing("File1.txt\nfile2.data");
15593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
15693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // NLST
15793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        String[] filenames = ftpClient.listNames();
15893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("number of files", 2, filenames.length);
15993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals(filenames[0], "File1.txt");
16093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals(filenames[1], "file2.data");
16193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("listNames", 226);
16293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
16393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
16493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
16593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test printing the current working directory (PWD)
16693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
16793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testPwd() throws Exception {
16893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Modify PWD CommandHandler to return a predefined directory
16993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        final String DIR = "some/dir";
17093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        PwdCommandHandler pwdCommandHandler = (PwdCommandHandler) stubFtpServer.getCommandHandler(CommandNames.PWD);
17193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        pwdCommandHandler.setDirectory(DIR);
17293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
17313d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
17493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
17593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // PWD
17693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        String dir = ftpClient.printWorkingDirectory();
17793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("Unable to PWD", DIR, dir);
17893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("printWorkingDirectory", 257);
17993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
18093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
18193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testStat() throws Exception {
18293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Modify Stat CommandHandler to return predefined text
18393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        final String STATUS = "some information 123";
18493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
18593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        statCommandHandler.setStatus(STATUS);
18693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
18713d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
18893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
18993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // STAT
19093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        String status = ftpClient.getStatus();
19193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("STAT reply", "211 " + STATUS + ".", status.trim());
19293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("getStatus", 211);
19393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
19493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
19593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
19693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test getting the status (STAT), when the reply text contains multiple lines
19793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
19893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testStat_MultilineReplyText() throws Exception {
19993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Modify Stat CommandHandler to return predefined text
20093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        final String STATUS = "System name: abc.def\nVersion 3.5.7\nNumber of failed logins: 2";
20193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        final String FORMATTED_REPLY_STATUS = "211-System name: abc.def\r\nVersion 3.5.7\r\n211 Number of failed logins: 2.";
20293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
20393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        statCommandHandler.setStatus(STATUS);
20493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
20513d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
20693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
20793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // STAT
20893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        String status = ftpClient.getStatus();
20993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("STAT reply", FORMATTED_REPLY_STATUS, status.trim());
21093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("getStatus", 211);
21193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
21293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
21393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testSyst() throws Exception {
21413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
21593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
21693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // SYST
21793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("getSystemName()", "\"WINDOWS\" system type.", ftpClient.getSystemName());
21893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("syst", 215);
21993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
22093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
22193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testCwd() throws Exception {
22293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Connect
22393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Conecting to " + SERVER);
22413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
22593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("connect", 220);
22693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
22793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // CWD
22893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
22993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to CWD", success);
23093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("changeWorkingDirectory", 250);
23193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
23293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
23393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
23493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test changing the current working directory (CWD), when it causes a remote error
23593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
23693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testCwd_Error() throws Exception {
23793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Override CWD CommandHandler to return error reply code
23893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        final int REPLY_CODE = 500;
23993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
24093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        stubFtpServer.setCommandHandler("CWD", cwdCommandHandler);
24193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
24213d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
24393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
24493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // CWD
24593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
24693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertFalse("Expected failure", success);
24793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE);
24893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
24993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
25093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testCdup() throws Exception {
25113d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
25293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
25393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // CDUP
25493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.changeToParentDirectory();
25593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to CDUP", success);
2565e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair        verifyReplyCode("changeToParentDirectory", 200);
25793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
25893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
25993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testDele() throws Exception {
26013d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
26193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
26293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // DELE
26393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.deleteFile(FILENAME);
26493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to DELE", success);
26593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("deleteFile", 250);
26693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
26793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
2683e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair    public void testEprt() throws Exception {
269150ece0932001dba199ecc1a8f98f5eb4060735dchrismair        LOG.info("Skipping...");
270150ece0932001dba199ecc1a8f98f5eb4060735dchrismair//        ftpClientConnect();
271150ece0932001dba199ecc1a8f98f5eb4060735dchrismair//        ftpClient.sendCommand("EPRT", "|2|1080::8:800:200C:417A|5282|");
272150ece0932001dba199ecc1a8f98f5eb4060735dchrismair//        verifyReplyCode("EPRT", 200);
2733e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair    }
2743e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair
2753e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair    public void testEpsv() throws Exception {
2763e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair        ftpClientConnect();
2773e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair        ftpClient.sendCommand("EPSV");
2783e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair        verifyReplyCode("EPSV", 229);
2793e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair    }
2803e469b93fd10bc09ea2c088516168bf6a5cbaa43chrismair
2815940ebc73e32a649d194022c5b4bdb5a276ad386chrismair    public void testFeat_UseStaticReplyCommandHandler() throws IOException {
2825940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        // The FEAT command is not supported out of the box
2835940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        final String FEAT_TEXT = "Extensions supported:\n" +
2845940ebc73e32a649d194022c5b4bdb5a276ad386chrismair                "MLST size*;create;modify*;perm;media-type\n" +
2855940ebc73e32a649d194022c5b4bdb5a276ad386chrismair                "SIZE\n" +
2865940ebc73e32a649d194022c5b4bdb5a276ad386chrismair                "COMPRESSION\n" +
2875940ebc73e32a649d194022c5b4bdb5a276ad386chrismair                "END";
2885940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        StaticReplyCommandHandler featCommandHandler = new StaticReplyCommandHandler(211, FEAT_TEXT);
2895940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        stubFtpServer.setCommandHandler("FEAT", featCommandHandler);
2905940ebc73e32a649d194022c5b4bdb5a276ad386chrismair
2915940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        ftpClientConnect();
2925940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        assertEquals(ftpClient.sendCommand("FEAT"), 211);
2935940ebc73e32a649d194022c5b4bdb5a276ad386chrismair        LOG.info(ftpClient.getReplyString());
2945940ebc73e32a649d194022c5b4bdb5a276ad386chrismair    }
2955940ebc73e32a649d194022c5b4bdb5a276ad386chrismair
29693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testMkd() throws Exception {
29713d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
29893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
29993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // MKD
30093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.makeDirectory("dir1/dir2");
30193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to CWD", success);
30293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("makeDirectory", 257);
30393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
30493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
30593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testNoop() throws Exception {
30613d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
30793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
30893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // NOOP
30993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.sendNoOp();
31093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to NOOP", success);
31193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("NOOP", 200);
31293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
31393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
31493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testRest() throws Exception {
31513d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
31693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
31793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // REST
31893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        int replyCode = ftpClient.rest("marker");
31993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("Unable to REST", 350, replyCode);
32093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
32193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
32293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testRmd() throws Exception {
32313d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
32493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
32593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // RMD
32693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.removeDirectory("dir1/dir2");
32793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to RMD", success);
32893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("removeDirectory", 250);
32993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
33093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
33193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testRename() throws Exception {
33213d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
33393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
33493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Rename (RNFR, RNTO)
33593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.rename(FILENAME, "new_" + FILENAME);
33693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to RENAME", success);
33793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("rename", 250);
33893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
33993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
34093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testAllo() throws Exception {
34113d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
34293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
34393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // ALLO
34493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("ALLO", ftpClient.allocate(1024));
34593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("ALLO with recordSize", ftpClient.allocate(1024, 64));
34693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
34793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
34893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
34993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test GET and PUT of ASCII files
35093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
35193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testTransferAsciiFile() throws Exception {
35293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        retrCommandHandler.setFileContents(ASCII_CONTENTS);
35393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
35413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
35593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
35693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Get File
35793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
35893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
35993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue(ftpClient.retrieveFile(FILENAME, outputStream));
36093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("File contents=[" + outputStream.toString());
36193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("File contents", ASCII_CONTENTS, outputStream.toString());
36293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
36393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Put File
36493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
36593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
36693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue(ftpClient.storeFile(FILENAME, inputStream));
36793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
36893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
36993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("File contents=[" + contents + "]");
37093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
37193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
37293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
37393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
37493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test GET and PUT of binary files
37593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
37693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testTransferBinaryFiles() throws Exception {
37793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        retrCommandHandler.setFileContents(BINARY_CONTENTS);
37893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
37913d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
38093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
38193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
38293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Get File
38393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
38493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
38593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("GET", ftpClient.retrieveFile(FILENAME, outputStream));
38693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("GET File length=" + outputStream.size());
38793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("File contents", BINARY_CONTENTS, outputStream.toByteArray());
38893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
38993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Put File
39093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
39193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(BINARY_CONTENTS);
39293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("PUT", ftpClient.storeFile(FILENAME, inputStream));
39393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
39493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
39593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("PUT File length=" + contents.length);
39693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("File contents", BINARY_CONTENTS, contents);
39793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
39893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
39993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testStou() throws Exception {
40093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        StouCommandHandler stouCommandHandler = (StouCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOU);
40193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        stouCommandHandler.setFilename(FILENAME);
4025e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
40313d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
40493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
40593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Stor a File (STOU)
40693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
40793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue(ftpClient.storeUniqueFile(FILENAME, inputStream));
40893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        InvocationRecord invocationRecord = stouCommandHandler.getInvocation(0);
40993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
41093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("File contents=[" + contents + "]");
41193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
41293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
41393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
41493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testAppe() throws Exception {
41593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        AppeCommandHandler appeCommandHandler = (AppeCommandHandler) stubFtpServer.getCommandHandler(CommandNames.APPE);
4165e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
41713d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
41893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
41993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Append a File (APPE)
42093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
42193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue(ftpClient.appendFile(FILENAME, inputStream));
42293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        InvocationRecord invocationRecord = appeCommandHandler.getInvocation(0);
42393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        byte[] contents = (byte[]) invocationRecord.getObject(AppeCommandHandler.FILE_CONTENTS_KEY);
42493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("File contents=[" + contents + "]");
42593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
42693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
42793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
42893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testAbor() throws Exception {
42913d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
43093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
43193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // ABOR
43293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("ABOR", ftpClient.abort());
43393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
43493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
43593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testPasv() throws Exception {
43613d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
43793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
43893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // PASV
43993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ftpClient.enterLocalPassiveMode();
44093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // no reply code; the PASV command is sent only when the data connection is opened
44193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
44293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
44393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testMode() throws Exception {
44413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
44593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
44693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // MODE
44793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
44893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to MODE", success);
44993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("setFileTransferMode", 200);
45093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
45193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
45293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testStru() throws Exception {
45313d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
45493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
45593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // STRU
45693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        boolean success = ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
45793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("Unable to STRU", success);
45893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("setFileStructure", 200);
45993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
46093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
46193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testSimpleCompositeCommandHandler() throws Exception {
46293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Replace CWD CommandHandler with a SimpleCompositeCommandHandler
46393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        CommandHandler commandHandler1 = new StaticReplyCommandHandler(500);
46493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        CommandHandler commandHandler2 = new CwdCommandHandler();
46593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler();
46693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler1);
46793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler2);
46893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler);
4695e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
47093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // Connect
47113d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
47293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
47393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // CWD
47493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertFalse("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
47593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
47693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
4775e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
47893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testSite() throws Exception {
47913d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
48093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
48193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // SITE
48293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        int replyCode = ftpClient.site("parameters,1,2,3");
48393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("SITE", 200, replyCode);
48493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
48593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
48693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testSmnt() throws Exception {
48713d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
48893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
48993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // SMNT
49093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertTrue("SMNT", ftpClient.structureMount("dir1/dir2"));
49193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        verifyReplyCode("structureMount", 250);
49293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
49393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
49493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testRein() throws Exception {
49513d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
49693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
49793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        // REIN
49893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("REIN", 220, ftpClient.rein());
49993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
50093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
50193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
50293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Test that command names in lowercase or mixed upper/lower case are accepted
50393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
50493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public void testCommandNamesInLowerOrMixedCase() throws Exception {
50513d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClientConnect();
50693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
50793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("rein", 220, ftpClient.sendCommand("rein"));
50893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("rEIn", 220, ftpClient.sendCommand("rEIn"));
50993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("reiN", 220, ftpClient.sendCommand("reiN"));
51093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("Rein", 220, ftpClient.sendCommand("Rein"));
51193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
5125e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
51349deb463d1cc3132e4aa60bfd4469398c57c1745chrismair    public void testUnrecognizedCommand() throws Exception {
51449deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        ftpClientConnect();
51549deb463d1cc3132e4aa60bfd4469398c57c1745chrismair
51649deb463d1cc3132e4aa60bfd4469398c57c1745chrismair        assertEquals("Unrecognized:XXXX", 502, ftpClient.sendCommand("XXXX"));
51749deb463d1cc3132e4aa60bfd4469398c57c1745chrismair    }
51849deb463d1cc3132e4aa60bfd4469398c57c1745chrismair
51993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // -------------------------------------------------------------------------
52093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // Test setup and tear-down
52193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // -------------------------------------------------------------------------
52293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
52393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
52493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Perform initialization before each test
5255e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     *
52640658190151b7ded3489ff89c301b470155c95f4chrismair     * @see org.mockftpserver.test.AbstractTestCase#setUp()
52793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
52893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    protected void setUp() throws Exception {
52993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        super.setUp();
53093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
53193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        for (int i = 0; i < BINARY_CONTENTS.length; i++) {
53293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair            BINARY_CONTENTS[i] = (byte) i;
53393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        }
53493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
53593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        stubFtpServer = new StubFtpServer();
53613d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        stubFtpServer.setServerControlPort(PortTestUtil.getFtpServerControlPort());
53793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        stubFtpServer.start();
53893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        ftpClient = new FTPClient();
53993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        retrCommandHandler = (RetrCommandHandler) stubFtpServer.getCommandHandler(CommandNames.RETR);
54093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        storCommandHandler = (StorCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOR);
54193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
54293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
54393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
54493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Perform cleanup after each test
5455e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     *
54640658190151b7ded3489ff89c301b470155c95f4chrismair     * @see org.mockftpserver.test.AbstractTestCase#tearDown()
54793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
54893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    protected void tearDown() throws Exception {
54993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        super.tearDown();
55093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        stubFtpServer.stop();
55193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
55293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
55393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // -------------------------------------------------------------------------
55493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // Internal Helper Methods
55593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    // -------------------------------------------------------------------------
55693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
55793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
55813d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair     * Connect to the server from the FTPClient
55913d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair     */
56013d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair    private void ftpClientConnect() throws IOException {
56113d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair        ftpClient.connect(SERVER, PortTestUtil.getFtpServerControlPort());
56213d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair    }
5635e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair
56413d2f24c354c2b2b19d2dc5531b88d642a82a2ccchrismair    /**
56593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Assert that the FtpClient reply code is equal to the expected value
5665e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     *
5675e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     * @param operation         - the description of the operation performed; used in the error message
56893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @param expectedReplyCode - the expected FtpClient reply code
56993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
57093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
57193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        int replyCode = ftpClient.getReplyCode();
57293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode);
57393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode);
57493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
57593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
57693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
57793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Verify that the FTPFile has the specified properties
5785e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     *
57993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @param ftpFile - the FTPFile to verify
5805e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     * @param type    - the expected file type
5815e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     * @param name    - the expected file name
5825e9a0227eb376a4d67ada00c7ea54d3f7962cefdchrismair     * @param size    - the expected file size (will be zero for a directory)
58393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
58493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
585dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismair        LOG.info(ftpFile.toString());
58693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType());
58793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName());
58893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize());
58993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
59093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
59193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair}
592