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