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