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