1dfb59d50631968ab1a13002ea5421ece93169851chrismair/* 2dfb59d50631968ab1a13002ea5421ece93169851chrismair * Copyright 2007 the original author or authors. 3dfb59d50631968ab1a13002ea5421ece93169851chrismair * 4dfb59d50631968ab1a13002ea5421ece93169851chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5dfb59d50631968ab1a13002ea5421ece93169851chrismair * you may not use this file except in compliance with the License. 6dfb59d50631968ab1a13002ea5421ece93169851chrismair * You may obtain a copy of the License at 7dfb59d50631968ab1a13002ea5421ece93169851chrismair * 8dfb59d50631968ab1a13002ea5421ece93169851chrismair * http://www.apache.org/licenses/LICENSE-2.0 9dfb59d50631968ab1a13002ea5421ece93169851chrismair * 10dfb59d50631968ab1a13002ea5421ece93169851chrismair * Unless required by applicable law or agreed to in writing, software 11dfb59d50631968ab1a13002ea5421ece93169851chrismair * distributed under the License is distributed on an "AS IS" BASIS, 12dfb59d50631968ab1a13002ea5421ece93169851chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dfb59d50631968ab1a13002ea5421ece93169851chrismair * See the License for the specific language governing permissions and 14dfb59d50631968ab1a13002ea5421ece93169851chrismair * limitations under the License. 15dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 16dfb59d50631968ab1a13002ea5421ece93169851chrismairpackage org.mockftpserver.core.command; 17dfb59d50631968ab1a13002ea5421ece93169851chrismair 18dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.apache.log4j.Logger; 19dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.easymock.MockControl; 20dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.session.Session; 21dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.test.AbstractTestCase; 22dfb59d50631968ab1a13002ea5421ece93169851chrismair 23dfb59d50631968ab1a13002ea5421ece93169851chrismairimport java.text.MessageFormat; 24dfb59d50631968ab1a13002ea5421ece93169851chrismairimport java.util.ListResourceBundle; 25dfb59d50631968ab1a13002ea5421ece93169851chrismairimport java.util.ResourceBundle; 26dfb59d50631968ab1a13002ea5421ece93169851chrismair 27dfb59d50631968ab1a13002ea5421ece93169851chrismair/** 28dfb59d50631968ab1a13002ea5421ece93169851chrismair * Abstract superclass for CommandHandler tests 29dfb59d50631968ab1a13002ea5421ece93169851chrismair * 30dfb59d50631968ab1a13002ea5421ece93169851chrismair * @author Chris Mair 31dfb59d50631968ab1a13002ea5421ece93169851chrismair * @version $Revision$ - $Date$ 32dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 33dfb59d50631968ab1a13002ea5421ece93169851chrismairpublic abstract class AbstractCommandHandlerTestCase extends AbstractTestCase { 34dfb59d50631968ab1a13002ea5421ece93169851chrismair 35dfb59d50631968ab1a13002ea5421ece93169851chrismair private static final Logger LOG = Logger.getLogger(AbstractCommandHandlerTestCase.class); 36dfb59d50631968ab1a13002ea5421ece93169851chrismair 37dfb59d50631968ab1a13002ea5421ece93169851chrismair // Some common test constants 38dfb59d50631968ab1a13002ea5421ece93169851chrismair protected static final String DIR1 = "dir1"; 39dfb59d50631968ab1a13002ea5421ece93169851chrismair protected static final String DIR2 = "dir2"; 40dfb59d50631968ab1a13002ea5421ece93169851chrismair protected static final String FILENAME1 = "sample1.txt"; 41dfb59d50631968ab1a13002ea5421ece93169851chrismair protected static final String FILENAME2 = "sample2.txt"; 42dfb59d50631968ab1a13002ea5421ece93169851chrismair 43dfb59d50631968ab1a13002ea5421ece93169851chrismair protected Session session; 44dfb59d50631968ab1a13002ea5421ece93169851chrismair protected ResourceBundle replyTextBundle; 45dfb59d50631968ab1a13002ea5421ece93169851chrismair 46dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 47dfb59d50631968ab1a13002ea5421ece93169851chrismair * Test the handleCommand() method, when one or more parameter is missing or invalid 48dfb59d50631968ab1a13002ea5421ece93169851chrismair * 49dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param commandHandler - the CommandHandler to test 50dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param commandName - the name for the Command 51dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param parameters - the Command parameters 52dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 53dfb59d50631968ab1a13002ea5421ece93169851chrismair protected void testHandleCommand_InvalidParameters(AbstractTrackingCommandHandler commandHandler, 54dfb59d50631968ab1a13002ea5421ece93169851chrismair String commandName, String[] parameters) throws Exception { 55dfb59d50631968ab1a13002ea5421ece93169851chrismair Command command = new Command(commandName, parameters); 56dfb59d50631968ab1a13002ea5421ece93169851chrismair session.sendReply(ReplyCodes.COMMAND_SYNTAX_ERROR, replyTextFor(ReplyCodes.COMMAND_SYNTAX_ERROR)); 57dfb59d50631968ab1a13002ea5421ece93169851chrismair replay(session); 58dfb59d50631968ab1a13002ea5421ece93169851chrismair 59dfb59d50631968ab1a13002ea5421ece93169851chrismair commandHandler.handleCommand(command, session); 60dfb59d50631968ab1a13002ea5421ece93169851chrismair verify(session); 61dfb59d50631968ab1a13002ea5421ece93169851chrismair 62dfb59d50631968ab1a13002ea5421ece93169851chrismair verifyNumberOfInvocations(commandHandler, 1); 63dfb59d50631968ab1a13002ea5421ece93169851chrismair verifyNoDataElements(commandHandler.getInvocation(0)); 64dfb59d50631968ab1a13002ea5421ece93169851chrismair } 65dfb59d50631968ab1a13002ea5421ece93169851chrismair 66dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 67dfb59d50631968ab1a13002ea5421ece93169851chrismair * Verify that the CommandHandler contains the specified number of invocation records 68dfb59d50631968ab1a13002ea5421ece93169851chrismair * 69dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param commandHandler - the CommandHandler 70dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param expected - the expected number of invocations 71dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 72dfb59d50631968ab1a13002ea5421ece93169851chrismair protected void verifyNumberOfInvocations(InvocationHistory commandHandler, int expected) { 73dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals("number of invocations", expected, commandHandler.numberOfInvocations()); 74dfb59d50631968ab1a13002ea5421ece93169851chrismair } 75dfb59d50631968ab1a13002ea5421ece93169851chrismair 76dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 77dfb59d50631968ab1a13002ea5421ece93169851chrismair * Verify that the InvocationRecord contains no data elements 78dfb59d50631968ab1a13002ea5421ece93169851chrismair * 79dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param invocationRecord - the InvocationRecord 80dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 81dfb59d50631968ab1a13002ea5421ece93169851chrismair protected void verifyNoDataElements(InvocationRecord invocationRecord) { 82dfb59d50631968ab1a13002ea5421ece93169851chrismair LOG.info("Verifying: " + invocationRecord); 83dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals("number of data elements", 0, invocationRecord.keySet().size()); 84dfb59d50631968ab1a13002ea5421ece93169851chrismair } 85dfb59d50631968ab1a13002ea5421ece93169851chrismair 86dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 87dfb59d50631968ab1a13002ea5421ece93169851chrismair * Verify that the InvocationRecord contains exactly one data element, with the specified key 88dfb59d50631968ab1a13002ea5421ece93169851chrismair * and value. 89dfb59d50631968ab1a13002ea5421ece93169851chrismair * 90dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param invocationRecord - the InvocationRecord 91dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param key - the expected key 92dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param value - the expected value 93dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 94dfb59d50631968ab1a13002ea5421ece93169851chrismair protected void verifyOneDataElement(InvocationRecord invocationRecord, String key, Object value) { 95dfb59d50631968ab1a13002ea5421ece93169851chrismair LOG.info("Verifying: " + invocationRecord); 96dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals("number of data elements", 1, invocationRecord.keySet().size()); 97dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEqualsAllTypes("value:" + value, value, invocationRecord.getObject(key)); 98dfb59d50631968ab1a13002ea5421ece93169851chrismair } 99dfb59d50631968ab1a13002ea5421ece93169851chrismair 100dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 101dfb59d50631968ab1a13002ea5421ece93169851chrismair * Verify that the InvocationRecord contains exactly two data element, with the specified keys 102dfb59d50631968ab1a13002ea5421ece93169851chrismair * and values. 103dfb59d50631968ab1a13002ea5421ece93169851chrismair * 104dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param invocationRecord - the InvocationRecord 105dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param key1 - the expected key1 106dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param value1 - the expected value1 107dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param key2 - the expected key2 108dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param value2- the expected value2 109dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 110dfb59d50631968ab1a13002ea5421ece93169851chrismair protected void verifyTwoDataElements(InvocationRecord invocationRecord, String key1, Object value1, 111dfb59d50631968ab1a13002ea5421ece93169851chrismair String key2, Object value2) { 112dfb59d50631968ab1a13002ea5421ece93169851chrismair 113dfb59d50631968ab1a13002ea5421ece93169851chrismair LOG.info("Verifying: " + invocationRecord); 114dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals("number of data elements", 2, invocationRecord.keySet().size()); 115dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEqualsAllTypes("value1:" + value1, value1, invocationRecord.getObject(key1)); 116dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEqualsAllTypes("value2:" + value2, value2, invocationRecord.getObject(key2)); 117dfb59d50631968ab1a13002ea5421ece93169851chrismair } 118dfb59d50631968ab1a13002ea5421ece93169851chrismair 119dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 120dfb59d50631968ab1a13002ea5421ece93169851chrismair * Assert that the actual is equal to the expected, using arrays equality comparison if 121dfb59d50631968ab1a13002ea5421ece93169851chrismair * necessary 122dfb59d50631968ab1a13002ea5421ece93169851chrismair * 123dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param message - the message, used if the comparison fails 124dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param expected - the expected value 125dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param actual - the actual value 126dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 127dfb59d50631968ab1a13002ea5421ece93169851chrismair private void assertEqualsAllTypes(String message, Object expected, Object actual) { 128dfb59d50631968ab1a13002ea5421ece93169851chrismair 129dfb59d50631968ab1a13002ea5421ece93169851chrismair if (expected instanceof byte[] || actual instanceof byte[]) { 130dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals(message, (byte[]) expected, (byte[]) actual); 131dfb59d50631968ab1a13002ea5421ece93169851chrismair } else if (expected instanceof Object[] || actual instanceof Object[]) { 132dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals(message, (Object[]) expected, (Object[]) actual); 133dfb59d50631968ab1a13002ea5421ece93169851chrismair } else { 134dfb59d50631968ab1a13002ea5421ece93169851chrismair assertEquals(message, expected, actual); 135dfb59d50631968ab1a13002ea5421ece93169851chrismair } 136dfb59d50631968ab1a13002ea5421ece93169851chrismair } 137dfb59d50631968ab1a13002ea5421ece93169851chrismair 138dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 139dfb59d50631968ab1a13002ea5421ece93169851chrismair * Perform setup before each test 140dfb59d50631968ab1a13002ea5421ece93169851chrismair * 141dfb59d50631968ab1a13002ea5421ece93169851chrismair * @see org.mockftpserver.test.AbstractTestCase#setUp() 142dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 143dfb59d50631968ab1a13002ea5421ece93169851chrismair protected void setUp() throws Exception { 144dfb59d50631968ab1a13002ea5421ece93169851chrismair super.setUp(); 145dfb59d50631968ab1a13002ea5421ece93169851chrismair 146dfb59d50631968ab1a13002ea5421ece93169851chrismair session = (Session) createMock(Session.class); 147dfb59d50631968ab1a13002ea5421ece93169851chrismair control(session).setDefaultMatcher(MockControl.ARRAY_MATCHER); 148dfb59d50631968ab1a13002ea5421ece93169851chrismair control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST); 149dfb59d50631968ab1a13002ea5421ece93169851chrismair 150dfb59d50631968ab1a13002ea5421ece93169851chrismair replyTextBundle = new ListResourceBundle() { 151dfb59d50631968ab1a13002ea5421ece93169851chrismair protected Object[][] getContents() { 152dfb59d50631968ab1a13002ea5421ece93169851chrismair return new Object[][]{ 153dfb59d50631968ab1a13002ea5421ece93169851chrismair {"150", replyTextFor(150)}, 154dfb59d50631968ab1a13002ea5421ece93169851chrismair {"200", replyTextFor(200)}, 155dfb59d50631968ab1a13002ea5421ece93169851chrismair {"211", replyTextWithParameterFor(211)}, 156dfb59d50631968ab1a13002ea5421ece93169851chrismair {"213", replyTextWithParameterFor(213)}, 157dfb59d50631968ab1a13002ea5421ece93169851chrismair {"214", replyTextWithParameterFor(214)}, 158dfb59d50631968ab1a13002ea5421ece93169851chrismair {"215", replyTextWithParameterFor(215)}, 159dfb59d50631968ab1a13002ea5421ece93169851chrismair {"220", replyTextFor(220)}, 160dfb59d50631968ab1a13002ea5421ece93169851chrismair {"221", replyTextFor(221)}, 161dfb59d50631968ab1a13002ea5421ece93169851chrismair {"226", replyTextFor(226)}, 162dfb59d50631968ab1a13002ea5421ece93169851chrismair {"226.WithFilename", replyTextWithParameterFor("226.WithFilename")}, 163dfb59d50631968ab1a13002ea5421ece93169851chrismair {"227", replyTextWithParameterFor(227)}, 164dfb59d50631968ab1a13002ea5421ece93169851chrismair {"229", replyTextWithParameterFor(229)}, 165dfb59d50631968ab1a13002ea5421ece93169851chrismair {"230", replyTextFor(230)}, 166dfb59d50631968ab1a13002ea5421ece93169851chrismair {"250", replyTextFor(250)}, 167dfb59d50631968ab1a13002ea5421ece93169851chrismair {"257", replyTextWithParameterFor(257)}, 168dfb59d50631968ab1a13002ea5421ece93169851chrismair {"331", replyTextFor(331)}, 169dfb59d50631968ab1a13002ea5421ece93169851chrismair {"350", replyTextFor(350)}, 170dfb59d50631968ab1a13002ea5421ece93169851chrismair {"501", replyTextFor(501)}, 171dfb59d50631968ab1a13002ea5421ece93169851chrismair {"502", replyTextFor(502)}, 172dfb59d50631968ab1a13002ea5421ece93169851chrismair }; 173dfb59d50631968ab1a13002ea5421ece93169851chrismair } 174dfb59d50631968ab1a13002ea5421ece93169851chrismair }; 175dfb59d50631968ab1a13002ea5421ece93169851chrismair } 176dfb59d50631968ab1a13002ea5421ece93169851chrismair 177dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 178dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the test-specific reply text for the specified reply code 179dfb59d50631968ab1a13002ea5421ece93169851chrismair * 180dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param replyCode - the reply code 181dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the reply text for the specified reply code 182dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 183dfb59d50631968ab1a13002ea5421ece93169851chrismair protected String replyTextFor(int replyCode) { 184dfb59d50631968ab1a13002ea5421ece93169851chrismair return "Reply for " + replyCode; 185dfb59d50631968ab1a13002ea5421ece93169851chrismair } 186dfb59d50631968ab1a13002ea5421ece93169851chrismair 187dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 188dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the test-specific parameterized reply text for the specified reply code 189dfb59d50631968ab1a13002ea5421ece93169851chrismair * 190dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param replyCode - the reply code 191dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the reply text for the specified reply code 192dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 193dfb59d50631968ab1a13002ea5421ece93169851chrismair protected String replyTextWithParameterFor(int replyCode) { 194dfb59d50631968ab1a13002ea5421ece93169851chrismair return "Reply for " + replyCode + ":{0}"; 195dfb59d50631968ab1a13002ea5421ece93169851chrismair } 196dfb59d50631968ab1a13002ea5421ece93169851chrismair 197dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 198dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the test-specific parameterized reply text for the specified messageKey 199dfb59d50631968ab1a13002ea5421ece93169851chrismair * 200dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param messageKey - the messageKey 201dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the reply text for the specified messageKey 202dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 203dfb59d50631968ab1a13002ea5421ece93169851chrismair protected String replyTextWithParameterFor(String messageKey) { 204dfb59d50631968ab1a13002ea5421ece93169851chrismair return "Reply for " + messageKey + ":{0}"; 205dfb59d50631968ab1a13002ea5421ece93169851chrismair } 206dfb59d50631968ab1a13002ea5421ece93169851chrismair 207dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 208dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the test-specific reply text for the specified reply code and message parameter 209dfb59d50631968ab1a13002ea5421ece93169851chrismair * 210dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param replyCode - the reply code 211dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param parameter - the message parameter value 212dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the reply text for the specified reply code 213dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 214dfb59d50631968ab1a13002ea5421ece93169851chrismair protected String formattedReplyTextFor(int replyCode, Object parameter) { 215dfb59d50631968ab1a13002ea5421ece93169851chrismair return MessageFormat.format(replyTextWithParameterFor(replyCode), objArray(parameter)); 216dfb59d50631968ab1a13002ea5421ece93169851chrismair } 217dfb59d50631968ab1a13002ea5421ece93169851chrismair 218dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 219dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the test-specific reply text for the specified message key and message parameter 220dfb59d50631968ab1a13002ea5421ece93169851chrismair * 221dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param messageKey - the messageKey 222dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param parameter - the message parameter value 223dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the reply text for the specified message key and parameter 224dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 225dfb59d50631968ab1a13002ea5421ece93169851chrismair protected String formattedReplyTextFor(String messageKey, Object parameter) { 226dfb59d50631968ab1a13002ea5421ece93169851chrismair return MessageFormat.format(replyTextWithParameterFor(messageKey), objArray(parameter)); 227dfb59d50631968ab1a13002ea5421ece93169851chrismair } 228dfb59d50631968ab1a13002ea5421ece93169851chrismair 229dfb59d50631968ab1a13002ea5421ece93169851chrismair} 230