177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/* 277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Copyright 2007 the original author or authors. 377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * you may not use this file except in compliance with the License. 677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * You may obtain a copy of the License at 777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * http://www.apache.org/licenses/LICENSE-2.0 977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 1077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Unless required by applicable law or agreed to in writing, software 1177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * distributed under the License is distributed on an "AS IS" BASIS, 1277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * See the License for the specific language governing permissions and 1477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * limitations under the License. 1577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 1677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpackage org.mockftpserver.stub.command; 1777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 1877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.apache.log4j.Logger; 1977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.easymock.ArgumentsMatcher; 2077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.AbstractCommandHandlerTest; 2177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.Command; 2277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.CommandNames; 2377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.ReplyCodes; 2477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.util.AssertFailedException; 2577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 2677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport java.util.Arrays; 2777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 2877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/** 2977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Tests for the FileRetrCommandHandler class 3077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 3177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @author Chris Mair 3277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @version $Revision$ - $Date$ 3377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 3477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpublic final class FileRetrCommandHandlerTest extends AbstractCommandHandlerTest { 3577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 3677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final Logger LOG = Logger.getLogger(FileRetrCommandHandlerTest.class); 3777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final byte BYTE1 = (byte) 7; 3877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final byte BYTE2 = (byte) 21; 3977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 4077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private FileRetrCommandHandler commandHandler; 4177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 4277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 4377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Test the constructor that takes a String, passing in a null 4477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 4577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public void testConstructor_String_Null() { 4677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair try { 4777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair new FileRetrCommandHandler(null); 4877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair fail("Expected AssertFailedException"); 4977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 5077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair catch (AssertFailedException expected) { 5177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair LOG.info("Expected: " + expected); 5277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 5377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 5477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 5577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 5677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Test the setFile(String) method, passing in a null 5777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 5877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public void testSetFile_Null() { 5977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair try { 6077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler.setFile(null); 6177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair fail("Expected AssertFailedException"); 6277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 6377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair catch (AssertFailedException expected) { 6477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair LOG.info("Expected: " + expected); 6577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 6677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 6777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 6877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 6977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Test the handleCommand(Command,Session) method. Create a temporary (binary) file, and 7077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * make sure its contents are written back 7177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 7277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @throws Exception 7377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 7477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public void testHandleCommand() throws Exception { 7577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 7677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair final byte[] BUFFER = new byte[FileRetrCommandHandler.BUFFER_SIZE]; 7777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair Arrays.fill(BUFFER, BYTE1); 7877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 7977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendReply(ReplyCodes.TRANSFER_DATA_INITIAL_OK, replyTextFor(ReplyCodes.TRANSFER_DATA_INITIAL_OK)); 8077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.openDataConnection(); 8177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 8277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair ArgumentsMatcher matcher = new ArgumentsMatcher() { 8377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair int counter = -1; // will increment for each invocation 8477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 8577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public boolean matches(Object[] expected, Object[] actual) { 8677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair counter++; 8777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair byte[] buffer = (byte[]) actual[0]; 8877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair int expectedLength = ((Integer) expected[1]).intValue(); 8977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair int actualLength = ((Integer) actual[1]).intValue(); 9077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair LOG.info("invocation #" + counter + " expected=" + expectedLength + " actualLength=" + actualLength); 9177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair if (counter < 5) { 9277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair assertEquals("buffer for invocation #" + counter, BUFFER, buffer); 9377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } else { 9477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair // TODO Got two invocations here; only expected one 9577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair //assertEquals("length for invocation #" + counter, expectedLength, actualLength); 9677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair assertEquals("buffer[0]", BYTE2, buffer[0]); 9777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair assertEquals("buffer[1]", BYTE2, buffer[1]); 9877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair assertEquals("buffer[2]", BYTE2, buffer[2]); 9977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 10077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair return true; 10177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 10277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 10377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public String toString(Object[] args) { 10477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair return args[0].getClass().getName() + " " + args[1].toString(); 10577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 10677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair }; 10777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 10877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendData(BUFFER, 512); 10977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair control(session).setMatcher(matcher); 11077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendData(BUFFER, 512); 11177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendData(BUFFER, 512); 11277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendData(BUFFER, 512); 11377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendData(BUFFER, 512); 11477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendData(BUFFER, 3); 11577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 11677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.closeDataConnection(); 11777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair session.sendReply(ReplyCodes.TRANSFER_DATA_FINAL_OK, replyTextFor(ReplyCodes.TRANSFER_DATA_FINAL_OK)); 11877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair replay(session); 11977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 12077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler.setFile("Sample.jpg"); 12177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair Command command = new Command(CommandNames.RETR, array(FILENAME1)); 12277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler.handleCommand(command, session); 12377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair verify(session); 12477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 12577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair verifyNumberOfInvocations(commandHandler, 1); 12677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair verifyOneDataElement(commandHandler.getInvocation(0), FileRetrCommandHandler.PATHNAME_KEY, FILENAME1); 12777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 12877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 12977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 13077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Test the handleCommand() method, when no pathname parameter has been specified 13177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 13277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public void testHandleCommand_MissingPathnameParameter() throws Exception { 13377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler.setFile("abc.txt"); // this property must be set 13477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair testHandleCommand_InvalidParameters(commandHandler, CommandNames.RETR, EMPTY); 13577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 13677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 13777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 13877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Test the HandleCommand method, when the file property has not been set 13977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 14077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public void testHandleCommand_FileNotSet() throws Exception { 14177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair try { 14277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler.handleCommand(new Command(CommandNames.RETR, EMPTY), session); 14377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair fail("Expected AssertFailedException"); 14477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 14577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair catch (AssertFailedException expected) { 14677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair LOG.info("Expected: " + expected); 14777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 14877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 14977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 15077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 15177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Perform initialization before each test 15277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 15377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @see org.mockftpserver.core.command.AbstractCommandHandlerTest#setUp() 15477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 15577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair protected void setUp() throws Exception { 15677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair super.setUp(); 15777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler = new FileRetrCommandHandler(); 15877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair commandHandler.setReplyTextBundle(replyTextBundle); 15977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 16077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 16177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// /** 16277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// * Create a sample binary file; 5 buffers full plus 3 extra bytes 16377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// */ 16477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// private void createSampleFile() { 16577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// final String FILE_PATH = "test/org.mockftpserver/command/Sample.jpg"; 16677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// final byte[] BUFFER = new byte[FileRetrCommandHandler.BUFFER_SIZE]; 16777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// Arrays.fill(BUFFER, BYTE1); 16877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// 16977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// File file = new File(FILE_PATH); 17077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// FileOutputStream out = new FileOutputStream(file); 17177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// for (int i = 0; i < 5; i++) { 17277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// out.write(BUFFER); 17377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// } 17477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// Arrays.fill(BUFFER, BYTE2); 17577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// out.write(BUFFER, 0, 3); 17677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// out.close(); 17777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// LOG.info("Created temporary file [" + FILE_PATH + "]: length=" + file.length()); 17877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair// } 17977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 18077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair} 181