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