1e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair/* 2e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Copyright 2007 the original author or authors. 3e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 4e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * you may not use this file except in compliance with the License. 6e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * You may obtain a copy of the License at 7e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 8e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * http://www.apache.org/licenses/LICENSE-2.0 9e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 10e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Unless required by applicable law or agreed to in writing, software 11e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * distributed under the License is distributed on an "AS IS" BASIS, 12e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * See the License for the specific language governing permissions and 14e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * limitations under the License. 15e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 16e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairpackage org.mockftpserver.stub; 17e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 18e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.ByteArrayInputStream; 19e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.ByteArrayOutputStream; 20e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 21e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 22e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.commons.net.ftp.FTP; 23e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.commons.net.ftp.FTPClient; 24e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.commons.net.ftp.FTPFile; 25e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.log4j.Logger; 26e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.CommandHandler; 27e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.CommandNames; 28e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.InvocationRecord; 29e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.SimpleCompositeCommandHandler; 30e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler; 31e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.StubFtpServer; 32e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.AppeCommandHandler; 33e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.CwdCommandHandler; 34e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.HelpCommandHandler; 35e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.ListCommandHandler; 36e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.NlstCommandHandler; 37e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.PwdCommandHandler; 38e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.RetrCommandHandler; 39e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.StatCommandHandler; 40e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.StorCommandHandler; 41e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.StouCommandHandler; 42e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.test.AbstractTest; 43e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.test.IntegrationTest; 44e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 45e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair/** 46e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Tests for StubFtpServer using the Apache Jakarta Commons Net FTP client. 47e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 48e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @version $Revision$ - $Date$ 49e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 50e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @author Chris Mair 51e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 52e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairpublic final class StubFtpServerIntegrationTest extends AbstractTest implements IntegrationTest { 53e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 54e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final Logger LOG = Logger.getLogger(StubFtpServerIntegrationTest.class); 55e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final String SERVER = "localhost"; 56e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final String USERNAME = "user123"; 57e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final String PASSWORD = "password"; 58e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final String FILENAME = "abc.txt"; 59e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final String ASCII_CONTENTS = "abcdef\r\nghijkl\r\nmnopqr"; 60e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private static final byte[] BINARY_CONTENTS = new byte[256]; 61e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 62e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private StubFtpServer stubFtpServer; 63e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private FTPClient ftpClient; 64e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private RetrCommandHandler retrCommandHandler; 65e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private StorCommandHandler storCommandHandler; 66e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 67e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair //------------------------------------------------------------------------- 68e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Tests 69e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair //------------------------------------------------------------------------- 70e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 71e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 72e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test connecting and logging in 73e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 74e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testLogin() throws Exception { 75e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Connect 76e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Conecting to " + SERVER); 77e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 78e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("connect", 220); 79e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 80e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Login 81e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair String userAndPassword = USERNAME + "/" + PASSWORD; 82e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Logging in as " + userAndPassword); 83e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.login(USERNAME, PASSWORD); 84e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to login with " + userAndPassword, success); 85e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("login with " + userAndPassword, 230); 86e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 87e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Quit 88e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Quit"); 89e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.quit(); 90e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("quit", 221); 91e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 92e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 93e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 94e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the ACCT command 95e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 96e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testAcct() throws Exception { 97e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 98e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 99e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ACCT 100e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair int replyCode = ftpClient.acct("123456"); 101e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("acct", 230, replyCode); 102e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 103e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 104e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 105e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the stop() method when no session has ever been started 106e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 107e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testStop_NoSessionEverStarted() throws Exception { 108e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Testing a stop() when no session has ever been started"); 109e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 110e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 111e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 112e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test help (HELP) 113e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 114e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testHelp() throws Exception { 115e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Modify HELP CommandHandler to return a predefined help message 116e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair final String HELP = "help message"; 117e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair HelpCommandHandler helpCommandHandler = (HelpCommandHandler) stubFtpServer.getCommandHandler(CommandNames.HELP); 118e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair helpCommandHandler.setHelpMessage(HELP); 119e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 120e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 121e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 122e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // HELP 123e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair String help = ftpClient.listHelp(); 124e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Wrong response", help.indexOf(HELP) != -1); 125e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("listHelp", 214); 126e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 127e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 128e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 129e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the LIST and SYST commands. 130e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 131e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testList() throws Exception { 132e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 133e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 134e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Set directory listing 135e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST); 136e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair listCommandHandler.setDirectoryListing("11-09-01 12:30PM 406348 File2350.log\n" 137e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair + "11-01-01 1:30PM <DIR> 0 archive"); 138e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 139e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // LIST 140e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair FTPFile[] files = ftpClient.listFiles(); 141e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("number of files", 2, files.length); 142e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyFTPFile(files[0], FTPFile.FILE_TYPE, "File2350.log", 406348L); 143e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, "archive", 0L); 144e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("list", 226); 145e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 146e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 147e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 148e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the LIST, PASV and SYST commands, transferring a directory listing in passive mode 149e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 150e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testList_PassiveMode() throws Exception { 151e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 152e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 153e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.enterLocalPassiveMode(); 154e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 155e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Set directory listing 156e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST); 157e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair listCommandHandler.setDirectoryListing("11-09-01 12:30PM 406348 File2350.log"); 158e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 159e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // LIST 160e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair FTPFile[] files = ftpClient.listFiles(); 161e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("number of files", 1, files.length); 162e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("list", 226); 163e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 164e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 165e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 166e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the NLST command. 167e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 168e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testNlst() throws Exception { 169e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 170e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 171e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Set directory listing 172e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair NlstCommandHandler nlstCommandHandler = (NlstCommandHandler) stubFtpServer.getCommandHandler(CommandNames.NLST); 173e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair nlstCommandHandler.setDirectoryListing("File1.txt\nfile2.data"); 174e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 175e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // NLST 176e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair String[] filenames = ftpClient.listNames(); 177e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("number of files", 2, filenames.length); 178e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals(filenames[0], "File1.txt"); 179e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals(filenames[1], "file2.data"); 180e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("listNames", 226); 181e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 182e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 183e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 184e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test printing the current working directory (PWD) 185e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 186e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testPwd() throws Exception { 187e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Modify PWD CommandHandler to return a predefined directory 188e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair final String DIR = "some/dir"; 189e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair PwdCommandHandler pwdCommandHandler = (PwdCommandHandler) stubFtpServer.getCommandHandler(CommandNames.PWD); 190e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair pwdCommandHandler.setDirectory(DIR); 191e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 192e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 193e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 194e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // PWD 195e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair String dir = ftpClient.printWorkingDirectory(); 196e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("Unable to PWD", DIR, dir); 197e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("printWorkingDirectory", 257); 198e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 199e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 200e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 201e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test getting the status (STAT) 202e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 203e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testStat() throws Exception { 204e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Modify Stat CommandHandler to return predefined text 205e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair final String STATUS = "some information 123"; 206e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT); 207e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair statCommandHandler.setStatus(STATUS); 208e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 209e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 210e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 211e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // STAT 212e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair String status = ftpClient.getStatus(); 213e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("STAT reply", "211 " + STATUS + ".", status.trim()); 214e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("getStatus", 211); 215e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 216e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 217e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 218e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test getting the status (STAT), when the reply text contains multiple lines 219e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 220e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testStat_MultilineReplyText() throws Exception { 221e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Modify Stat CommandHandler to return predefined text 222e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair final String STATUS = "System name: abc.def\nVersion 3.5.7\nNumber of failed logins: 2"; 223e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair final String FORMATTED_REPLY_STATUS = "211-System name: abc.def\r\nVersion 3.5.7\r\n211 Number of failed logins: 2."; 224e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT); 225e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair statCommandHandler.setStatus(STATUS); 226e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 227e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 228e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 229e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // STAT 230e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair String status = ftpClient.getStatus(); 231e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("STAT reply", FORMATTED_REPLY_STATUS, status.trim()); 232e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("getStatus", 211); 233e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 234e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 235e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 236e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the System (SYST) command 237e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 238e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testSyst() throws Exception { 239e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 240e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 241e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // SYST 242e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("getSystemName()", "\"WINDOWS\" system type.", ftpClient.getSystemName()); 243e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("syst", 215); 244e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 245e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 246e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 247e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test changing the current working directory (CWD) 248e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 249e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testCwd() throws Exception { 250e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Connect 251e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Conecting to " + SERVER); 252e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 253e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("connect", 220); 254e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 255e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // CWD 256e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.changeWorkingDirectory("dir1/dir2"); 257e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to CWD", success); 258e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("changeWorkingDirectory", 250); 259e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 260e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 261e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 262e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test changing the current working directory (CWD), when it causes a remote error 263e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 264e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testCwd_Error() throws Exception { 265e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Override CWD CommandHandler to return error reply code 266e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair final int REPLY_CODE = 500; 267e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE); 268e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair stubFtpServer.setCommandHandler("CWD", cwdCommandHandler); 269e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 270e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 271e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 272e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // CWD 273e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.changeWorkingDirectory("dir1/dir2"); 274e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertFalse("Expected failure", success); 275e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("changeWorkingDirectory", REPLY_CODE); 276e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 277e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 278e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 279e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test changing to the parent directory (CDUP) 280e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 281e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testCdup() throws Exception { 282e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 283e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 284e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // CDUP 285e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.changeToParentDirectory(); 286e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to CDUP", success); 287e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("changeToParentDirectory", 250); 288e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 289e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 290e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 291e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test delete (DELE) 292e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 293e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testDele() throws Exception { 294e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 295e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 296e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // DELE 297e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.deleteFile(FILENAME); 298e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to DELE", success); 299e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("deleteFile", 250); 300e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 301e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 302e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 303e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test make directory (MKD) 304e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 305e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testMkd() throws Exception { 306e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 307e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 308e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // MKD 309e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.makeDirectory("dir1/dir2"); 310e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to CWD", success); 311e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("makeDirectory", 257); 312e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 313e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 314e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 315e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test NOOP 316e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 317e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testNoop() throws Exception { 318e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 319e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 320e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // NOOP 321e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.sendNoOp(); 322e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to NOOP", success); 323e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("NOOP", 200); 324e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 325e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 326e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 327e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test restart (REST) 328e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 329e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testRest() throws Exception { 330e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 331e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 332e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // REST 333e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair int replyCode = ftpClient.rest("marker"); 334e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("Unable to REST", 350, replyCode); 335e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 336e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 337e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 338e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test changing the current working directory (RMD) 339e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 340e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testRmd() throws Exception { 341e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 342e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 343e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // RMD 344e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.removeDirectory("dir1/dir2"); 345e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to RMD", success); 346e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("removeDirectory", 250); 347e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 348e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 349e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 350e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test rename (RNFR/RNTO) 351e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 352e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testRename() throws Exception { 353e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 354e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 355e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Rename (RNFR, RNTO) 356e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.rename(FILENAME, "new_" + FILENAME); 357e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to RENAME", success); 358e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("rename", 250); 359e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 360e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 361e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 362e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the ALLO command 363e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 364e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testAllo() throws Exception { 365e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 366e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 367e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ALLO 368e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("ALLO", ftpClient.allocate(1024)); 369e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("ALLO with recordSize", ftpClient.allocate(1024, 64)); 370e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 371e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 372e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 373e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test GET and PUT of ASCII files 374e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 375e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testTransferAsciiFile() throws Exception { 376e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair retrCommandHandler.setFileContents(ASCII_CONTENTS); 377e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 378e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 379e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 380e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Get File 381e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Get File for remotePath [" + FILENAME + "]"); 382e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 383e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue(ftpClient.retrieveFile(FILENAME, outputStream)); 384e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("File contents=[" + outputStream.toString()); 385e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("File contents", ASCII_CONTENTS, outputStream.toString()); 386e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 387e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Put File 388e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Put File for local path [" + FILENAME + "]"); 389e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes()); 390e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue(ftpClient.storeFile(FILENAME, inputStream)); 391e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair InvocationRecord invocationRecord = storCommandHandler.getInvocation(0); 392e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY); 393e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("File contents=[" + contents + "]"); 394e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents); 395e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 396e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 397e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 398e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test GET and PUT of binary files 399e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 400e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testTransferBinaryFiles() throws Exception { 401e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair retrCommandHandler.setFileContents(BINARY_CONTENTS); 402e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 403e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 404e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 405e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 406e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Get File 407e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Get File for remotePath [" + FILENAME + "]"); 408e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 409e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("GET", ftpClient.retrieveFile(FILENAME, outputStream)); 410e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("GET File length=" + outputStream.size()); 411e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("File contents", BINARY_CONTENTS, outputStream.toByteArray()); 412e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 413e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Put File 414e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Put File for local path [" + FILENAME + "]"); 415e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ByteArrayInputStream inputStream = new ByteArrayInputStream(BINARY_CONTENTS); 416e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("PUT", ftpClient.storeFile(FILENAME, inputStream)); 417e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair InvocationRecord invocationRecord = storCommandHandler.getInvocation(0); 418e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY); 419e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("PUT File length=" + contents.length); 420e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("File contents", BINARY_CONTENTS, contents); 421e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 422e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 423e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 424e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the STOU command 425e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 426e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testStou() throws Exception { 427e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair StouCommandHandler stouCommandHandler = (StouCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOU); 428e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair stouCommandHandler.setFilename(FILENAME); 429e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 430e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 431e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 432e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Stor a File (STOU) 433e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes()); 434e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue(ftpClient.storeUniqueFile(FILENAME, inputStream)); 435e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair InvocationRecord invocationRecord = stouCommandHandler.getInvocation(0); 436e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY); 437e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("File contents=[" + contents + "]"); 438e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents); 439e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 440e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 441e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 442e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the APPE command 443e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 444e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testAppe() throws Exception { 445e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair AppeCommandHandler appeCommandHandler = (AppeCommandHandler) stubFtpServer.getCommandHandler(CommandNames.APPE); 446e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 447e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 448e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 449e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Append a File (APPE) 450e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes()); 451e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue(ftpClient.appendFile(FILENAME, inputStream)); 452e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair InvocationRecord invocationRecord = appeCommandHandler.getInvocation(0); 453e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair byte[] contents = (byte[]) invocationRecord.getObject(AppeCommandHandler.FILE_CONTENTS_KEY); 454e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("File contents=[" + contents + "]"); 455e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents); 456e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 457e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 458e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 459e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the ABOR command 460e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 461e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testAbor() throws Exception { 462e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 463e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 464e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ABOR 465e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("ABOR", ftpClient.abort()); 466e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 467e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 468e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 469e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the Passive (PASV) command 470e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 471e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testPasv() throws Exception { 472e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 473e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 474e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // PASV 475e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.enterLocalPassiveMode(); 476e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // no reply code; the PASV command is sent only when the data connection is opened 477e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 478e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 479e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 480e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test Mode (MODE) 481e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 482e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testMode() throws Exception { 483e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 484e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 485e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // MODE 486e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); 487e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to MODE", success); 488e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("setFileTransferMode", 200); 489e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 490e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 491e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 492e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test file structure (STRU) 493e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 494e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testStru() throws Exception { 495e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 496e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 497e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // STRU 498e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair boolean success = ftpClient.setFileStructure(FTP.FILE_STRUCTURE); 499e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("Unable to STRU", success); 500e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("setFileStructure", 200); 501e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 502e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 503e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 504e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test the SimpleCompositeCommandHandler 505e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 506e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testSimpleCompositeCommandHandler() throws Exception { 507e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Replace CWD CommandHandler with a SimpleCompositeCommandHandler 508e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair CommandHandler commandHandler1 = new StaticReplyCommandHandler(500); 509e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair CommandHandler commandHandler2 = new CwdCommandHandler(); 510e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler(); 511e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair simpleCompositeCommandHandler.addCommandHandler(commandHandler1); 512e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair simpleCompositeCommandHandler.addCommandHandler(commandHandler2); 513e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler); 514e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 515e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Connect 516e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 517e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 518e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // CWD 519e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertFalse("first", ftpClient.changeWorkingDirectory("dir1/dir2")); 520e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("first", ftpClient.changeWorkingDirectory("dir1/dir2")); 521e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 522e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 523e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 524e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test site parameters (SITE) 525e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 526e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testSite() throws Exception { 527e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 528e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 529e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // SITE 530e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair int replyCode = ftpClient.site("parameters,1,2,3"); 531e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("SITE", 200, replyCode); 532e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 533e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 534e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 535e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test structure mount (SMNT) 536e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 537e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testSmnt() throws Exception { 538e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 539e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 540e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // SMNT 541e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertTrue("SMNT", ftpClient.structureMount("dir1/dir2")); 542e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair verifyReplyCode("structureMount", 250); 543e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 544e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 545e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 546e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test reinitialize (REIN) 547e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 548e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testRein() throws Exception { 549e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 550e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 551e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // REIN 552e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("REIN", 220, ftpClient.rein()); 553e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 554e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 555e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 556e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Test that command names in lowercase or mixed upper/lower case are accepted 557e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 558e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair public void testCommandNamesInLowerOrMixedCase() throws Exception { 559e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient.connect(SERVER); 560e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 561e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("rein", 220, ftpClient.sendCommand("rein")); 562e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("rEIn", 220, ftpClient.sendCommand("rEIn")); 563e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("reiN", 220, ftpClient.sendCommand("reiN")); 564e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("Rein", 220, ftpClient.sendCommand("Rein")); 565e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 566e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 567e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ------------------------------------------------------------------------- 568e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Test setup and tear-down 569e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ------------------------------------------------------------------------- 570e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 571e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 572e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Perform initialization before each test 573e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @see org.mockftpserver.test.AbstractTest#setUp() 574e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 575e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair protected void setUp() throws Exception { 576e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair super.setUp(); 577e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 578e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair for (int i = 0; i < BINARY_CONTENTS.length; i++) { 579e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair BINARY_CONTENTS[i] = (byte) i; 580e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 581e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 582e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair stubFtpServer = new StubFtpServer(); 583e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair stubFtpServer.start(); 584e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair ftpClient = new FTPClient(); 585e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair retrCommandHandler = (RetrCommandHandler) stubFtpServer.getCommandHandler(CommandNames.RETR); 586e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair storCommandHandler = (StorCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOR); 587e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 588e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 589e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 590e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Perform cleanup after each test 591e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @see org.mockftpserver.test.AbstractTest#tearDown() 592e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 593e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair protected void tearDown() throws Exception { 594e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair super.tearDown(); 595e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair stubFtpServer.stop(); 596e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 597e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 598e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ------------------------------------------------------------------------- 599e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // Internal Helper Methods 600e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair // ------------------------------------------------------------------------- 601e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 602e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 603e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Assert that the FtpClient reply code is equal to the expected value 604e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 605e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @param operation - the description of the operation performed; used in the error message 606e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @param expectedReplyCode - the expected FtpClient reply code 607e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 608e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private void verifyReplyCode(String operation, int expectedReplyCode) { 609e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair int replyCode = ftpClient.getReplyCode(); 610e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode); 611e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode); 612e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 613e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 614e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair /** 615e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Verify that the FTPFile has the specified properties 616e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * 617e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @param ftpFile - the FTPFile to verify 618e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @param type - the expected file type 619e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @param name - the expected file name 620e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @param size - the expected file size (will be zero for a directory) 621e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */ 622e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) { 623e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair LOG.info(ftpFile); 624e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("type: " + ftpFile, type, ftpFile.getType()); 625e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("name: " + ftpFile, name, ftpFile.getName()); 626e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair assertEquals("size: " + ftpFile, size, ftpFile.getSize()); 627e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair } 628e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair 629e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair} 630