185efb15529d45e32fea8de03c38a968c157c8262chrismair/*
285efb15529d45e32fea8de03c38a968c157c8262chrismair * Copyright 2007 the original author or authors.
385efb15529d45e32fea8de03c38a968c157c8262chrismair *
485efb15529d45e32fea8de03c38a968c157c8262chrismair * Licensed under the Apache License, Version 2.0 (the "License");
585efb15529d45e32fea8de03c38a968c157c8262chrismair * you may not use this file except in compliance with the License.
685efb15529d45e32fea8de03c38a968c157c8262chrismair * You may obtain a copy of the License at
785efb15529d45e32fea8de03c38a968c157c8262chrismair *
885efb15529d45e32fea8de03c38a968c157c8262chrismair *      http://www.apache.org/licenses/LICENSE-2.0
985efb15529d45e32fea8de03c38a968c157c8262chrismair *
1085efb15529d45e32fea8de03c38a968c157c8262chrismair * Unless required by applicable law or agreed to in writing, software
1185efb15529d45e32fea8de03c38a968c157c8262chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1285efb15529d45e32fea8de03c38a968c157c8262chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385efb15529d45e32fea8de03c38a968c157c8262chrismair * See the License for the specific language governing permissions and
1485efb15529d45e32fea8de03c38a968c157c8262chrismair * limitations under the License.
1585efb15529d45e32fea8de03c38a968c157c8262chrismair */
1685efb15529d45e32fea8de03c38a968c157c8262chrismairpackage org.mockftpserver.stub;
1785efb15529d45e32fea8de03c38a968c157c8262chrismair
1885efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.ByteArrayInputStream;
1985efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.ByteArrayOutputStream;
2085efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.IOException;
2185efb15529d45e32fea8de03c38a968c157c8262chrismair
2285efb15529d45e32fea8de03c38a968c157c8262chrismair
2385efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.apache.commons.net.ftp.FTP;
2485efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.apache.commons.net.ftp.FTPClient;
2585efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.apache.commons.net.ftp.FTPFile;
2685efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.apache.log4j.Logger;
2785efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.CommandHandler;
2885efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.CommandNames;
2985efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.InvocationRecord;
3085efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.SimpleCompositeCommandHandler;
3185efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler;
3285efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.StubFtpServer;
3385efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.AppeCommandHandler;
3485efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.CwdCommandHandler;
3585efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.HelpCommandHandler;
3685efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.ListCommandHandler;
3785efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.NlstCommandHandler;
3885efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.PwdCommandHandler;
3985efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.RetrCommandHandler;
4085efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.StatCommandHandler;
4185efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.StorCommandHandler;
4285efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.StouCommandHandler;
4385efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.test.AbstractTest;
4485efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.test.IntegrationTest;
4585efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.test.PortTestUtil;
4685efb15529d45e32fea8de03c38a968c157c8262chrismair
4785efb15529d45e32fea8de03c38a968c157c8262chrismair/**
4885efb15529d45e32fea8de03c38a968c157c8262chrismair * Tests for StubFtpServer using the Apache Jakarta Commons Net FTP client.
4985efb15529d45e32fea8de03c38a968c157c8262chrismair *
5085efb15529d45e32fea8de03c38a968c157c8262chrismair * @version $Revision$ - $Date$
5185efb15529d45e32fea8de03c38a968c157c8262chrismair *
5285efb15529d45e32fea8de03c38a968c157c8262chrismair * @author Chris Mair
5385efb15529d45e32fea8de03c38a968c157c8262chrismair */
5485efb15529d45e32fea8de03c38a968c157c8262chrismairpublic final class StubFtpServerIntegrationTest extends AbstractTest implements IntegrationTest {
5585efb15529d45e32fea8de03c38a968c157c8262chrismair
5685efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final Logger LOG = Logger.getLogger(StubFtpServerIntegrationTest.class);
5785efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final String SERVER = "localhost";
5885efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final String USERNAME = "user123";
5985efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final String PASSWORD = "password";
6085efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final String FILENAME = "abc.txt";
6185efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final String ASCII_CONTENTS = "abcdef\tghijklmnopqr";
6285efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final byte[] BINARY_CONTENTS = new byte[256];
6385efb15529d45e32fea8de03c38a968c157c8262chrismair
6485efb15529d45e32fea8de03c38a968c157c8262chrismair    private StubFtpServer stubFtpServer;
6585efb15529d45e32fea8de03c38a968c157c8262chrismair    private FTPClient ftpClient;
6685efb15529d45e32fea8de03c38a968c157c8262chrismair    private RetrCommandHandler retrCommandHandler;
6785efb15529d45e32fea8de03c38a968c157c8262chrismair    private StorCommandHandler storCommandHandler;
6885efb15529d45e32fea8de03c38a968c157c8262chrismair
6985efb15529d45e32fea8de03c38a968c157c8262chrismair    //-------------------------------------------------------------------------
7085efb15529d45e32fea8de03c38a968c157c8262chrismair    // Tests
7185efb15529d45e32fea8de03c38a968c157c8262chrismair    //-------------------------------------------------------------------------
7285efb15529d45e32fea8de03c38a968c157c8262chrismair
7385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
7485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test connecting and logging in
7585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
7685efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testLogin() throws Exception {
7785efb15529d45e32fea8de03c38a968c157c8262chrismair        // Connect
7885efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Conecting to " + SERVER);
7985efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
8085efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("connect", 220);
8185efb15529d45e32fea8de03c38a968c157c8262chrismair
8285efb15529d45e32fea8de03c38a968c157c8262chrismair        // Login
8385efb15529d45e32fea8de03c38a968c157c8262chrismair        String userAndPassword = USERNAME + "/" + PASSWORD;
8485efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Logging in as " + userAndPassword);
8585efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.login(USERNAME, PASSWORD);
8685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to login with " + userAndPassword, success);
8785efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("login with " + userAndPassword, 230);
8885efb15529d45e32fea8de03c38a968c157c8262chrismair
8985efb15529d45e32fea8de03c38a968c157c8262chrismair        // Quit
9085efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Quit");
9185efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClient.quit();
9285efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("quit", 221);
9385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
9485efb15529d45e32fea8de03c38a968c157c8262chrismair
9585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
9685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the ACCT command
9785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
9885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testAcct() throws Exception {
9985efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
10085efb15529d45e32fea8de03c38a968c157c8262chrismair
10185efb15529d45e32fea8de03c38a968c157c8262chrismair        // ACCT
10285efb15529d45e32fea8de03c38a968c157c8262chrismair        int replyCode = ftpClient.acct("123456");
10385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("acct", 230, replyCode);
10485efb15529d45e32fea8de03c38a968c157c8262chrismair    }
10585efb15529d45e32fea8de03c38a968c157c8262chrismair
10685efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
10785efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the stop() method when no session has ever been started
10885efb15529d45e32fea8de03c38a968c157c8262chrismair     */
10985efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testStop_NoSessionEverStarted() throws Exception {
11085efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Testing a stop() when no session has ever been started");
11185efb15529d45e32fea8de03c38a968c157c8262chrismair    }
11285efb15529d45e32fea8de03c38a968c157c8262chrismair
11385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
11485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test help (HELP)
11585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
11685efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testHelp() throws Exception {
11785efb15529d45e32fea8de03c38a968c157c8262chrismair        // Modify HELP CommandHandler to return a predefined help message
11885efb15529d45e32fea8de03c38a968c157c8262chrismair        final String HELP = "help message";
11985efb15529d45e32fea8de03c38a968c157c8262chrismair        HelpCommandHandler helpCommandHandler = (HelpCommandHandler) stubFtpServer.getCommandHandler(CommandNames.HELP);
12085efb15529d45e32fea8de03c38a968c157c8262chrismair        helpCommandHandler.setHelpMessage(HELP);
12185efb15529d45e32fea8de03c38a968c157c8262chrismair
12285efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
12385efb15529d45e32fea8de03c38a968c157c8262chrismair
12485efb15529d45e32fea8de03c38a968c157c8262chrismair        // HELP
12585efb15529d45e32fea8de03c38a968c157c8262chrismair        String help = ftpClient.listHelp();
12685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Wrong response", help.indexOf(HELP) != -1);
12785efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("listHelp", 214);
12885efb15529d45e32fea8de03c38a968c157c8262chrismair    }
12985efb15529d45e32fea8de03c38a968c157c8262chrismair
13085efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
13185efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the LIST and SYST commands.
13285efb15529d45e32fea8de03c38a968c157c8262chrismair     */
13385efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testList() throws Exception {
13485efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
13585efb15529d45e32fea8de03c38a968c157c8262chrismair
13685efb15529d45e32fea8de03c38a968c157c8262chrismair        // Set directory listing
13785efb15529d45e32fea8de03c38a968c157c8262chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
13885efb15529d45e32fea8de03c38a968c157c8262chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log\n"
13985efb15529d45e32fea8de03c38a968c157c8262chrismair                + "11-01-01 1:30PM <DIR> 0 archive");
14085efb15529d45e32fea8de03c38a968c157c8262chrismair
14185efb15529d45e32fea8de03c38a968c157c8262chrismair        // LIST
14285efb15529d45e32fea8de03c38a968c157c8262chrismair        FTPFile[] files = ftpClient.listFiles();
14385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("number of files", 2, files.length);
14485efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, "File2350.log", 406348L);
14585efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, "archive", 0L);
14685efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("list", 226);
14785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
14885efb15529d45e32fea8de03c38a968c157c8262chrismair
14985efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
15085efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the LIST, PASV and SYST commands, transferring a directory listing in passive mode
15185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
15285efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testList_PassiveMode() throws Exception {
15385efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
15485efb15529d45e32fea8de03c38a968c157c8262chrismair
15585efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClient.enterLocalPassiveMode();
15685efb15529d45e32fea8de03c38a968c157c8262chrismair
15785efb15529d45e32fea8de03c38a968c157c8262chrismair        // Set directory listing
15885efb15529d45e32fea8de03c38a968c157c8262chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
15985efb15529d45e32fea8de03c38a968c157c8262chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log");
16085efb15529d45e32fea8de03c38a968c157c8262chrismair
16185efb15529d45e32fea8de03c38a968c157c8262chrismair        // LIST
16285efb15529d45e32fea8de03c38a968c157c8262chrismair        FTPFile[] files = ftpClient.listFiles();
16385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("number of files", 1, files.length);
16485efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("list", 226);
16585efb15529d45e32fea8de03c38a968c157c8262chrismair    }
16685efb15529d45e32fea8de03c38a968c157c8262chrismair
16785efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
16885efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the NLST command.
16985efb15529d45e32fea8de03c38a968c157c8262chrismair     */
17085efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testNlst() throws Exception {
17185efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
17285efb15529d45e32fea8de03c38a968c157c8262chrismair
17385efb15529d45e32fea8de03c38a968c157c8262chrismair        // Set directory listing
17485efb15529d45e32fea8de03c38a968c157c8262chrismair        NlstCommandHandler nlstCommandHandler = (NlstCommandHandler) stubFtpServer.getCommandHandler(CommandNames.NLST);
17585efb15529d45e32fea8de03c38a968c157c8262chrismair        nlstCommandHandler.setDirectoryListing("File1.txt\nfile2.data");
17685efb15529d45e32fea8de03c38a968c157c8262chrismair
17785efb15529d45e32fea8de03c38a968c157c8262chrismair        // NLST
17885efb15529d45e32fea8de03c38a968c157c8262chrismair        String[] filenames = ftpClient.listNames();
17985efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("number of files", 2, filenames.length);
18085efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals(filenames[0], "File1.txt");
18185efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals(filenames[1], "file2.data");
18285efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("listNames", 226);
18385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
18485efb15529d45e32fea8de03c38a968c157c8262chrismair
18585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
18685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test printing the current working directory (PWD)
18785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
18885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testPwd() throws Exception {
18985efb15529d45e32fea8de03c38a968c157c8262chrismair        // Modify PWD CommandHandler to return a predefined directory
19085efb15529d45e32fea8de03c38a968c157c8262chrismair        final String DIR = "some/dir";
19185efb15529d45e32fea8de03c38a968c157c8262chrismair        PwdCommandHandler pwdCommandHandler = (PwdCommandHandler) stubFtpServer.getCommandHandler(CommandNames.PWD);
19285efb15529d45e32fea8de03c38a968c157c8262chrismair        pwdCommandHandler.setDirectory(DIR);
19385efb15529d45e32fea8de03c38a968c157c8262chrismair
19485efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
19585efb15529d45e32fea8de03c38a968c157c8262chrismair
19685efb15529d45e32fea8de03c38a968c157c8262chrismair        // PWD
19785efb15529d45e32fea8de03c38a968c157c8262chrismair        String dir = ftpClient.printWorkingDirectory();
19885efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("Unable to PWD", DIR, dir);
19985efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("printWorkingDirectory", 257);
20085efb15529d45e32fea8de03c38a968c157c8262chrismair    }
20185efb15529d45e32fea8de03c38a968c157c8262chrismair
20285efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
20385efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test getting the status (STAT)
20485efb15529d45e32fea8de03c38a968c157c8262chrismair     */
20585efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testStat() throws Exception {
20685efb15529d45e32fea8de03c38a968c157c8262chrismair        // Modify Stat CommandHandler to return predefined text
20785efb15529d45e32fea8de03c38a968c157c8262chrismair        final String STATUS = "some information 123";
20885efb15529d45e32fea8de03c38a968c157c8262chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
20985efb15529d45e32fea8de03c38a968c157c8262chrismair        statCommandHandler.setStatus(STATUS);
21085efb15529d45e32fea8de03c38a968c157c8262chrismair
21185efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
21285efb15529d45e32fea8de03c38a968c157c8262chrismair
21385efb15529d45e32fea8de03c38a968c157c8262chrismair        // STAT
21485efb15529d45e32fea8de03c38a968c157c8262chrismair        String status = ftpClient.getStatus();
21585efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("STAT reply", "211 " + STATUS + ".", status.trim());
21685efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("getStatus", 211);
21785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
21885efb15529d45e32fea8de03c38a968c157c8262chrismair
21985efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
22085efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test getting the status (STAT), when the reply text contains multiple lines
22185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
22285efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testStat_MultilineReplyText() throws Exception {
22385efb15529d45e32fea8de03c38a968c157c8262chrismair        // Modify Stat CommandHandler to return predefined text
22485efb15529d45e32fea8de03c38a968c157c8262chrismair        final String STATUS = "System name: abc.def\nVersion 3.5.7\nNumber of failed logins: 2";
22585efb15529d45e32fea8de03c38a968c157c8262chrismair        final String FORMATTED_REPLY_STATUS = "211-System name: abc.def\r\nVersion 3.5.7\r\n211 Number of failed logins: 2.";
22685efb15529d45e32fea8de03c38a968c157c8262chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
22785efb15529d45e32fea8de03c38a968c157c8262chrismair        statCommandHandler.setStatus(STATUS);
22885efb15529d45e32fea8de03c38a968c157c8262chrismair
22985efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
23085efb15529d45e32fea8de03c38a968c157c8262chrismair
23185efb15529d45e32fea8de03c38a968c157c8262chrismair        // STAT
23285efb15529d45e32fea8de03c38a968c157c8262chrismair        String status = ftpClient.getStatus();
23385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("STAT reply", FORMATTED_REPLY_STATUS, status.trim());
23485efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("getStatus", 211);
23585efb15529d45e32fea8de03c38a968c157c8262chrismair    }
23685efb15529d45e32fea8de03c38a968c157c8262chrismair
23785efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
23885efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the System (SYST) command
23985efb15529d45e32fea8de03c38a968c157c8262chrismair     */
24085efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSyst() throws Exception {
24185efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
24285efb15529d45e32fea8de03c38a968c157c8262chrismair
24385efb15529d45e32fea8de03c38a968c157c8262chrismair        // SYST
24485efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("getSystemName()", "\"WINDOWS\" system type.", ftpClient.getSystemName());
24585efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("syst", 215);
24685efb15529d45e32fea8de03c38a968c157c8262chrismair    }
24785efb15529d45e32fea8de03c38a968c157c8262chrismair
24885efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
24985efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test changing the current working directory (CWD)
25085efb15529d45e32fea8de03c38a968c157c8262chrismair     */
25185efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testCwd() throws Exception {
25285efb15529d45e32fea8de03c38a968c157c8262chrismair        // Connect
25385efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Conecting to " + SERVER);
25485efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
25585efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("connect", 220);
25685efb15529d45e32fea8de03c38a968c157c8262chrismair
25785efb15529d45e32fea8de03c38a968c157c8262chrismair        // CWD
25885efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
25985efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to CWD", success);
26085efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("changeWorkingDirectory", 250);
26185efb15529d45e32fea8de03c38a968c157c8262chrismair    }
26285efb15529d45e32fea8de03c38a968c157c8262chrismair
26385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
26485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test changing the current working directory (CWD), when it causes a remote error
26585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
26685efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testCwd_Error() throws Exception {
26785efb15529d45e32fea8de03c38a968c157c8262chrismair        // Override CWD CommandHandler to return error reply code
26885efb15529d45e32fea8de03c38a968c157c8262chrismair        final int REPLY_CODE = 500;
26985efb15529d45e32fea8de03c38a968c157c8262chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
27085efb15529d45e32fea8de03c38a968c157c8262chrismair        stubFtpServer.setCommandHandler("CWD", cwdCommandHandler);
27185efb15529d45e32fea8de03c38a968c157c8262chrismair
27285efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
27385efb15529d45e32fea8de03c38a968c157c8262chrismair
27485efb15529d45e32fea8de03c38a968c157c8262chrismair        // CWD
27585efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
27685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertFalse("Expected failure", success);
27785efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE);
27885efb15529d45e32fea8de03c38a968c157c8262chrismair    }
27985efb15529d45e32fea8de03c38a968c157c8262chrismair
28085efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
28185efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test changing to the parent directory (CDUP)
28285efb15529d45e32fea8de03c38a968c157c8262chrismair     */
28385efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testCdup() throws Exception {
28485efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
28585efb15529d45e32fea8de03c38a968c157c8262chrismair
28685efb15529d45e32fea8de03c38a968c157c8262chrismair        // CDUP
28785efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.changeToParentDirectory();
28885efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to CDUP", success);
28985efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("changeToParentDirectory", 250);
29085efb15529d45e32fea8de03c38a968c157c8262chrismair    }
29185efb15529d45e32fea8de03c38a968c157c8262chrismair
29285efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
29385efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test delete (DELE)
29485efb15529d45e32fea8de03c38a968c157c8262chrismair     */
29585efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testDele() throws Exception {
29685efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
29785efb15529d45e32fea8de03c38a968c157c8262chrismair
29885efb15529d45e32fea8de03c38a968c157c8262chrismair        // DELE
29985efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.deleteFile(FILENAME);
30085efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to DELE", success);
30185efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("deleteFile", 250);
30285efb15529d45e32fea8de03c38a968c157c8262chrismair    }
30385efb15529d45e32fea8de03c38a968c157c8262chrismair
30485efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
30585efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test make directory (MKD)
30685efb15529d45e32fea8de03c38a968c157c8262chrismair     */
30785efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testMkd() throws Exception {
30885efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
30985efb15529d45e32fea8de03c38a968c157c8262chrismair
31085efb15529d45e32fea8de03c38a968c157c8262chrismair        // MKD
31185efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.makeDirectory("dir1/dir2");
31285efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to CWD", success);
31385efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("makeDirectory", 257);
31485efb15529d45e32fea8de03c38a968c157c8262chrismair    }
31585efb15529d45e32fea8de03c38a968c157c8262chrismair
31685efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
31785efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test NOOP
31885efb15529d45e32fea8de03c38a968c157c8262chrismair     */
31985efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testNoop() throws Exception {
32085efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
32185efb15529d45e32fea8de03c38a968c157c8262chrismair
32285efb15529d45e32fea8de03c38a968c157c8262chrismair        // NOOP
32385efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.sendNoOp();
32485efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to NOOP", success);
32585efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("NOOP", 200);
32685efb15529d45e32fea8de03c38a968c157c8262chrismair    }
32785efb15529d45e32fea8de03c38a968c157c8262chrismair
32885efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
32985efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test restart (REST)
33085efb15529d45e32fea8de03c38a968c157c8262chrismair     */
33185efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testRest() throws Exception {
33285efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
33385efb15529d45e32fea8de03c38a968c157c8262chrismair
33485efb15529d45e32fea8de03c38a968c157c8262chrismair        // REST
33585efb15529d45e32fea8de03c38a968c157c8262chrismair        int replyCode = ftpClient.rest("marker");
33685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("Unable to REST", 350, replyCode);
33785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
33885efb15529d45e32fea8de03c38a968c157c8262chrismair
33985efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
34085efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test changing the current working directory (RMD)
34185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
34285efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testRmd() throws Exception {
34385efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
34485efb15529d45e32fea8de03c38a968c157c8262chrismair
34585efb15529d45e32fea8de03c38a968c157c8262chrismair        // RMD
34685efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.removeDirectory("dir1/dir2");
34785efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to RMD", success);
34885efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("removeDirectory", 250);
34985efb15529d45e32fea8de03c38a968c157c8262chrismair    }
35085efb15529d45e32fea8de03c38a968c157c8262chrismair
35185efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
35285efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test rename (RNFR/RNTO)
35385efb15529d45e32fea8de03c38a968c157c8262chrismair     */
35485efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testRename() throws Exception {
35585efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
35685efb15529d45e32fea8de03c38a968c157c8262chrismair
35785efb15529d45e32fea8de03c38a968c157c8262chrismair        // Rename (RNFR, RNTO)
35885efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.rename(FILENAME, "new_" + FILENAME);
35985efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to RENAME", success);
36085efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("rename", 250);
36185efb15529d45e32fea8de03c38a968c157c8262chrismair    }
36285efb15529d45e32fea8de03c38a968c157c8262chrismair
36385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
36485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the ALLO command
36585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
36685efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testAllo() throws Exception {
36785efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
36885efb15529d45e32fea8de03c38a968c157c8262chrismair
36985efb15529d45e32fea8de03c38a968c157c8262chrismair        // ALLO
37085efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("ALLO", ftpClient.allocate(1024));
37185efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("ALLO with recordSize", ftpClient.allocate(1024, 64));
37285efb15529d45e32fea8de03c38a968c157c8262chrismair    }
37385efb15529d45e32fea8de03c38a968c157c8262chrismair
37485efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
37585efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test GET and PUT of ASCII files
37685efb15529d45e32fea8de03c38a968c157c8262chrismair     */
37785efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testTransferAsciiFile() throws Exception {
37885efb15529d45e32fea8de03c38a968c157c8262chrismair        retrCommandHandler.setFileContents(ASCII_CONTENTS);
37985efb15529d45e32fea8de03c38a968c157c8262chrismair
38085efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
38185efb15529d45e32fea8de03c38a968c157c8262chrismair
38285efb15529d45e32fea8de03c38a968c157c8262chrismair        // Get File
38385efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
38485efb15529d45e32fea8de03c38a968c157c8262chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
38585efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue(ftpClient.retrieveFile(FILENAME, outputStream));
38685efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("File contents=[" + outputStream.toString());
38785efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("File contents", ASCII_CONTENTS, outputStream.toString());
38885efb15529d45e32fea8de03c38a968c157c8262chrismair
38985efb15529d45e32fea8de03c38a968c157c8262chrismair        // Put File
39085efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
39185efb15529d45e32fea8de03c38a968c157c8262chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
39285efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue(ftpClient.storeFile(FILENAME, inputStream));
39385efb15529d45e32fea8de03c38a968c157c8262chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
39485efb15529d45e32fea8de03c38a968c157c8262chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
39585efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("File contents=[" + contents + "]");
39685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
39785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
39885efb15529d45e32fea8de03c38a968c157c8262chrismair
39985efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
40085efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test GET and PUT of binary files
40185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
40285efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testTransferBinaryFiles() throws Exception {
40385efb15529d45e32fea8de03c38a968c157c8262chrismair        retrCommandHandler.setFileContents(BINARY_CONTENTS);
40485efb15529d45e32fea8de03c38a968c157c8262chrismair
40585efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
40685efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
40785efb15529d45e32fea8de03c38a968c157c8262chrismair
40885efb15529d45e32fea8de03c38a968c157c8262chrismair        // Get File
40985efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
41085efb15529d45e32fea8de03c38a968c157c8262chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
41185efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("GET", ftpClient.retrieveFile(FILENAME, outputStream));
41285efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("GET File length=" + outputStream.size());
41385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("File contents", BINARY_CONTENTS, outputStream.toByteArray());
41485efb15529d45e32fea8de03c38a968c157c8262chrismair
41585efb15529d45e32fea8de03c38a968c157c8262chrismair        // Put File
41685efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
41785efb15529d45e32fea8de03c38a968c157c8262chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(BINARY_CONTENTS);
41885efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("PUT", ftpClient.storeFile(FILENAME, inputStream));
41985efb15529d45e32fea8de03c38a968c157c8262chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
42085efb15529d45e32fea8de03c38a968c157c8262chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
42185efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("PUT File length=" + contents.length);
42285efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("File contents", BINARY_CONTENTS, contents);
42385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
42485efb15529d45e32fea8de03c38a968c157c8262chrismair
42585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
42685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the STOU command
42785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
42885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testStou() throws Exception {
42985efb15529d45e32fea8de03c38a968c157c8262chrismair        StouCommandHandler stouCommandHandler = (StouCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOU);
43085efb15529d45e32fea8de03c38a968c157c8262chrismair        stouCommandHandler.setFilename(FILENAME);
43185efb15529d45e32fea8de03c38a968c157c8262chrismair
43285efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
43385efb15529d45e32fea8de03c38a968c157c8262chrismair
43485efb15529d45e32fea8de03c38a968c157c8262chrismair        // Stor a File (STOU)
43585efb15529d45e32fea8de03c38a968c157c8262chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
43685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue(ftpClient.storeUniqueFile(FILENAME, inputStream));
43785efb15529d45e32fea8de03c38a968c157c8262chrismair        InvocationRecord invocationRecord = stouCommandHandler.getInvocation(0);
43885efb15529d45e32fea8de03c38a968c157c8262chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
43985efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("File contents=[" + contents + "]");
44085efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
44185efb15529d45e32fea8de03c38a968c157c8262chrismair    }
44285efb15529d45e32fea8de03c38a968c157c8262chrismair
44385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
44485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the APPE command
44585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
44685efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testAppe() throws Exception {
44785efb15529d45e32fea8de03c38a968c157c8262chrismair        AppeCommandHandler appeCommandHandler = (AppeCommandHandler) stubFtpServer.getCommandHandler(CommandNames.APPE);
44885efb15529d45e32fea8de03c38a968c157c8262chrismair
44985efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
45085efb15529d45e32fea8de03c38a968c157c8262chrismair
45185efb15529d45e32fea8de03c38a968c157c8262chrismair        // Append a File (APPE)
45285efb15529d45e32fea8de03c38a968c157c8262chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
45385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue(ftpClient.appendFile(FILENAME, inputStream));
45485efb15529d45e32fea8de03c38a968c157c8262chrismair        InvocationRecord invocationRecord = appeCommandHandler.getInvocation(0);
45585efb15529d45e32fea8de03c38a968c157c8262chrismair        byte[] contents = (byte[]) invocationRecord.getObject(AppeCommandHandler.FILE_CONTENTS_KEY);
45685efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("File contents=[" + contents + "]");
45785efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
45885efb15529d45e32fea8de03c38a968c157c8262chrismair    }
45985efb15529d45e32fea8de03c38a968c157c8262chrismair
46085efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
46185efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the ABOR command
46285efb15529d45e32fea8de03c38a968c157c8262chrismair     */
46385efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testAbor() throws Exception {
46485efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
46585efb15529d45e32fea8de03c38a968c157c8262chrismair
46685efb15529d45e32fea8de03c38a968c157c8262chrismair        // ABOR
46785efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("ABOR", ftpClient.abort());
46885efb15529d45e32fea8de03c38a968c157c8262chrismair    }
46985efb15529d45e32fea8de03c38a968c157c8262chrismair
47085efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
47185efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the Passive (PASV) command
47285efb15529d45e32fea8de03c38a968c157c8262chrismair     */
47385efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testPasv() throws Exception {
47485efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
47585efb15529d45e32fea8de03c38a968c157c8262chrismair
47685efb15529d45e32fea8de03c38a968c157c8262chrismair        // PASV
47785efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClient.enterLocalPassiveMode();
47885efb15529d45e32fea8de03c38a968c157c8262chrismair        // no reply code; the PASV command is sent only when the data connection is opened
47985efb15529d45e32fea8de03c38a968c157c8262chrismair    }
48085efb15529d45e32fea8de03c38a968c157c8262chrismair
48185efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
48285efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test Mode (MODE)
48385efb15529d45e32fea8de03c38a968c157c8262chrismair    */
48485efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testMode() throws Exception {
48585efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
48685efb15529d45e32fea8de03c38a968c157c8262chrismair
48785efb15529d45e32fea8de03c38a968c157c8262chrismair        // MODE
48885efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
48985efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to MODE", success);
49085efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("setFileTransferMode", 200);
49185efb15529d45e32fea8de03c38a968c157c8262chrismair    }
49285efb15529d45e32fea8de03c38a968c157c8262chrismair
49385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
49485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test file structure (STRU)
49585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
49685efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testStru() throws Exception {
49785efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
49885efb15529d45e32fea8de03c38a968c157c8262chrismair
49985efb15529d45e32fea8de03c38a968c157c8262chrismair        // STRU
50085efb15529d45e32fea8de03c38a968c157c8262chrismair        boolean success = ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
50185efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("Unable to STRU", success);
50285efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("setFileStructure", 200);
50385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
50485efb15529d45e32fea8de03c38a968c157c8262chrismair
50585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
50685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the SimpleCompositeCommandHandler
50785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
50885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSimpleCompositeCommandHandler() throws Exception {
50985efb15529d45e32fea8de03c38a968c157c8262chrismair        // Replace CWD CommandHandler with a SimpleCompositeCommandHandler
51085efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler1 = new StaticReplyCommandHandler(500);
51185efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler2 = new CwdCommandHandler();
51285efb15529d45e32fea8de03c38a968c157c8262chrismair        SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler();
51385efb15529d45e32fea8de03c38a968c157c8262chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler1);
51485efb15529d45e32fea8de03c38a968c157c8262chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler2);
51585efb15529d45e32fea8de03c38a968c157c8262chrismair        stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler);
51685efb15529d45e32fea8de03c38a968c157c8262chrismair
51785efb15529d45e32fea8de03c38a968c157c8262chrismair        // Connect
51885efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
51985efb15529d45e32fea8de03c38a968c157c8262chrismair
52085efb15529d45e32fea8de03c38a968c157c8262chrismair        // CWD
52185efb15529d45e32fea8de03c38a968c157c8262chrismair        assertFalse("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
52285efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
52385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
52485efb15529d45e32fea8de03c38a968c157c8262chrismair
52585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
52685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test site parameters (SITE)
52785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
52885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSite() throws Exception {
52985efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
53085efb15529d45e32fea8de03c38a968c157c8262chrismair
53185efb15529d45e32fea8de03c38a968c157c8262chrismair        // SITE
53285efb15529d45e32fea8de03c38a968c157c8262chrismair        int replyCode = ftpClient.site("parameters,1,2,3");
53385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("SITE", 200, replyCode);
53485efb15529d45e32fea8de03c38a968c157c8262chrismair    }
53585efb15529d45e32fea8de03c38a968c157c8262chrismair
53685efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
53785efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test structure mount (SMNT)
53885efb15529d45e32fea8de03c38a968c157c8262chrismair     */
53985efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSmnt() throws Exception {
54085efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
54185efb15529d45e32fea8de03c38a968c157c8262chrismair
54285efb15529d45e32fea8de03c38a968c157c8262chrismair        // SMNT
54385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("SMNT", ftpClient.structureMount("dir1/dir2"));
54485efb15529d45e32fea8de03c38a968c157c8262chrismair        verifyReplyCode("structureMount", 250);
54585efb15529d45e32fea8de03c38a968c157c8262chrismair    }
54685efb15529d45e32fea8de03c38a968c157c8262chrismair
54785efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
54885efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test reinitialize (REIN)
54985efb15529d45e32fea8de03c38a968c157c8262chrismair     */
55085efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testRein() throws Exception {
55185efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
55285efb15529d45e32fea8de03c38a968c157c8262chrismair
55385efb15529d45e32fea8de03c38a968c157c8262chrismair        // REIN
55485efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("REIN", 220, ftpClient.rein());
55585efb15529d45e32fea8de03c38a968c157c8262chrismair    }
55685efb15529d45e32fea8de03c38a968c157c8262chrismair
55785efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
55885efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test that command names in lowercase or mixed upper/lower case are accepted
55985efb15529d45e32fea8de03c38a968c157c8262chrismair     */
56085efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testCommandNamesInLowerOrMixedCase() throws Exception {
56185efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClientConnect();
56285efb15529d45e32fea8de03c38a968c157c8262chrismair
56385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("rein", 220, ftpClient.sendCommand("rein"));
56485efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("rEIn", 220, ftpClient.sendCommand("rEIn"));
56585efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("reiN", 220, ftpClient.sendCommand("reiN"));
56685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("Rein", 220, ftpClient.sendCommand("Rein"));
56785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
56885efb15529d45e32fea8de03c38a968c157c8262chrismair
56985efb15529d45e32fea8de03c38a968c157c8262chrismair    // -------------------------------------------------------------------------
57085efb15529d45e32fea8de03c38a968c157c8262chrismair    // Test setup and tear-down
57185efb15529d45e32fea8de03c38a968c157c8262chrismair    // -------------------------------------------------------------------------
57285efb15529d45e32fea8de03c38a968c157c8262chrismair
57385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
57485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Perform initialization before each test
57585efb15529d45e32fea8de03c38a968c157c8262chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
57685efb15529d45e32fea8de03c38a968c157c8262chrismair     */
57785efb15529d45e32fea8de03c38a968c157c8262chrismair    protected void setUp() throws Exception {
57885efb15529d45e32fea8de03c38a968c157c8262chrismair        super.setUp();
57985efb15529d45e32fea8de03c38a968c157c8262chrismair
58085efb15529d45e32fea8de03c38a968c157c8262chrismair        for (int i = 0; i < BINARY_CONTENTS.length; i++) {
58185efb15529d45e32fea8de03c38a968c157c8262chrismair            BINARY_CONTENTS[i] = (byte) i;
58285efb15529d45e32fea8de03c38a968c157c8262chrismair        }
58385efb15529d45e32fea8de03c38a968c157c8262chrismair
58485efb15529d45e32fea8de03c38a968c157c8262chrismair        stubFtpServer = new StubFtpServer();
58585efb15529d45e32fea8de03c38a968c157c8262chrismair        stubFtpServer.setServerControlPort(PortTestUtil.getFtpServerControlPort());
58685efb15529d45e32fea8de03c38a968c157c8262chrismair        stubFtpServer.start();
58785efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClient = new FTPClient();
58885efb15529d45e32fea8de03c38a968c157c8262chrismair        retrCommandHandler = (RetrCommandHandler) stubFtpServer.getCommandHandler(CommandNames.RETR);
58985efb15529d45e32fea8de03c38a968c157c8262chrismair        storCommandHandler = (StorCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOR);
59085efb15529d45e32fea8de03c38a968c157c8262chrismair    }
59185efb15529d45e32fea8de03c38a968c157c8262chrismair
59285efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
59385efb15529d45e32fea8de03c38a968c157c8262chrismair     * Perform cleanup after each test
59485efb15529d45e32fea8de03c38a968c157c8262chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
59585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
59685efb15529d45e32fea8de03c38a968c157c8262chrismair    protected void tearDown() throws Exception {
59785efb15529d45e32fea8de03c38a968c157c8262chrismair        super.tearDown();
59885efb15529d45e32fea8de03c38a968c157c8262chrismair        stubFtpServer.stop();
59985efb15529d45e32fea8de03c38a968c157c8262chrismair    }
60085efb15529d45e32fea8de03c38a968c157c8262chrismair
60185efb15529d45e32fea8de03c38a968c157c8262chrismair    // -------------------------------------------------------------------------
60285efb15529d45e32fea8de03c38a968c157c8262chrismair    // Internal Helper Methods
60385efb15529d45e32fea8de03c38a968c157c8262chrismair    // -------------------------------------------------------------------------
60485efb15529d45e32fea8de03c38a968c157c8262chrismair
60585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
60685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Connect to the server from the FTPClient
60785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
60885efb15529d45e32fea8de03c38a968c157c8262chrismair    private void ftpClientConnect() throws IOException {
60985efb15529d45e32fea8de03c38a968c157c8262chrismair        ftpClient.connect(SERVER, PortTestUtil.getFtpServerControlPort());
61085efb15529d45e32fea8de03c38a968c157c8262chrismair    }
61185efb15529d45e32fea8de03c38a968c157c8262chrismair
61285efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
61385efb15529d45e32fea8de03c38a968c157c8262chrismair     * Assert that the FtpClient reply code is equal to the expected value
61485efb15529d45e32fea8de03c38a968c157c8262chrismair     *
61585efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param operation - the description of the operation performed; used in the error message
61685efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param expectedReplyCode - the expected FtpClient reply code
61785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
61885efb15529d45e32fea8de03c38a968c157c8262chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
61985efb15529d45e32fea8de03c38a968c157c8262chrismair        int replyCode = ftpClient.getReplyCode();
62085efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode);
62185efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode);
62285efb15529d45e32fea8de03c38a968c157c8262chrismair    }
62385efb15529d45e32fea8de03c38a968c157c8262chrismair
62485efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
62585efb15529d45e32fea8de03c38a968c157c8262chrismair     * Verify that the FTPFile has the specified properties
62685efb15529d45e32fea8de03c38a968c157c8262chrismair     *
62785efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param ftpFile - the FTPFile to verify
62885efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param type - the expected file type
62985efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param name - the expected file name
63085efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param size - the expected file size (will be zero for a directory)
63185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
63285efb15529d45e32fea8de03c38a968c157c8262chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
63385efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info(ftpFile);
63485efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType());
63585efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName());
63685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize());
63785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
63885efb15529d45e32fea8de03c38a968c157c8262chrismair
63985efb15529d45e32fea8de03c38a968c157c8262chrismair}
640