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