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