1a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair/*
2a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Copyright 2007 the original author or authors.
3a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair *
4a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * you may not use this file except in compliance with the License.
6a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * You may obtain a copy of the License at
7a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair *
8a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair *
10a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Unless required by applicable law or agreed to in writing, software
11a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * See the License for the specific language governing permissions and
14a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * limitations under the License.
15a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */
16a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairpackage org.mockftpserver.core.command;
17a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
18a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.apache.log4j.Logger;
19a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.easymock.MockControl;
20a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.mockftpserver.core.session.Session;
21a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.mockftpserver.core.util.AssertFailedException;
22a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.mockftpserver.test.AbstractTest;
23a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
24a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport java.util.ListResourceBundle;
25a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport java.util.ResourceBundle;
26a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
27a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair/**
28a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Tests for the AbstractTrackingCommandHandler class. The class name is prefixed with an
29a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * underscore so that it is not filtered out by Maven's Surefire test plugin.
30a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair *
31a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @author Chris Mair
32a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @version $Revision$ - $Date$
33a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */
34a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairpublic final class _AbstractTrackingCommandHandlerTest extends AbstractTest {
35a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
36a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final Logger LOG = Logger.getLogger(_AbstractTrackingCommandHandlerTest.class);
37a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String COMMAND_NAME = "abc";
38a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final Object ARG = "123";
39a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final Object[] ARGS = {ARG};
40a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final Command COMMAND = new Command(COMMAND_NAME, EMPTY);
41a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final Command COMMAND_WITH_ARGS = new Command(COMMAND_NAME, EMPTY);
42a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final int REPLY_CODE1 = 777;
43a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final int REPLY_CODE2 = 888;
44a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final int REPLY_CODE3 = 999;
45a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String REPLY_TEXT1 = "reply1 ... abcdef";
46a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String REPLY_TEXT2 = "abc {0} def";
47a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String REPLY_TEXT2_FORMATTED = "abc 123 def";
48a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String OVERRIDE_REPLY_TEXT = "overridden reply ... abcdef";
49a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String MESSAGE_KEY = "key.123";
50a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private static final String MESSAGE_TEXT = "message.123";
51a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
52a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private AbstractTrackingCommandHandler commandHandler;
53a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    private Session session;
54a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
55a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
56a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the handleCommand(Command,Session) method
57a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
58a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testHandleCommand() throws Exception {
59a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertEquals("before", 0, commandHandler.numberOfInvocations());
60a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.handleCommand(COMMAND, session);
61a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertEquals("after", 1, commandHandler.numberOfInvocations());
62a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertTrue("locked", commandHandler.getInvocation(0).isLocked());
63a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
64a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
65a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
66a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the handleCommand(Command,Session) method, passing in a null Command
67a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
68a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testHandleCommand_NullCommand() throws Exception {
69a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        try {
70a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            commandHandler.handleCommand(null, session);
71a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            fail("Expected AssertFailedException");
72a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
73a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        catch (AssertFailedException expected) {
74a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            LOG.info("Expected: " + expected);
75a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
76a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
77a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
78a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
79a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the handleCommand(Command,Session) method, passing in a null Session
80a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
81a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testHandleCommand_NullSession() throws Exception {
82a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        try {
83a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            commandHandler.handleCommand(COMMAND, null);
84a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            fail("Expected AssertFailedException");
85a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
86a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        catch (AssertFailedException expected) {
87a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            LOG.info("Expected: " + expected);
88a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
89a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
90a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
91a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
92a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the numberOfInvocations(), addInvocationRecord() and clearInvocationRecord() methods
93a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
94a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testInvocationHistory() throws Exception {
95a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST);
96a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        replay(session);
97a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
98a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertEquals("none", 0, commandHandler.numberOfInvocations());
99a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.handleCommand(COMMAND, session);
100a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertEquals("1", 1, commandHandler.numberOfInvocations());
101a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.handleCommand(COMMAND, session);
102a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertEquals("2", 2, commandHandler.numberOfInvocations());
103a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.clearInvocations();
104a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertEquals("cleared", 0, commandHandler.numberOfInvocations());
105a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
106a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
107a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
108a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the getInvocation() method
109a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     *
110a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * @throws Exception
111a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
112a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testGetInvocation() throws Exception {
113a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        control(session).expectAndDefaultReturn(session.getClientHost(), DEFAULT_HOST);
114a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        replay(session);
115a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
116a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.handleCommand(COMMAND, session);
117a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.handleCommand(COMMAND_WITH_ARGS, session);
118a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertSame("1", COMMAND, commandHandler.getInvocation(0).getCommand());
119a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        assertSame("2", COMMAND_WITH_ARGS, commandHandler.getInvocation(1).getCommand());
120a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
121a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
122a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
123a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the getInvocation() method, passing in an invalid index
124a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
125a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testGetInvocation_IndexOutOfBounds() throws Exception {
126a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.handleCommand(COMMAND, session);
127a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        try {
128a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            commandHandler.getInvocation(2);
129a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            fail("Expected IndexOutOfBoundsException");
130a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
131a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        catch (IndexOutOfBoundsException expected) {
132a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            LOG.info("Expected: " + expected);
133a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
134a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
135a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
136a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
137a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the sendReply() method, when no message arguments are specified
138a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
139a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testSendReply() {
140a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        session.sendReply(REPLY_CODE1, REPLY_TEXT1);
141a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        session.sendReply(REPLY_CODE1, MESSAGE_TEXT);
142a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        session.sendReply(REPLY_CODE1, OVERRIDE_REPLY_TEXT);
143a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        session.sendReply(REPLY_CODE3, null);
144a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        replay(session);
145a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
146a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.sendReply(session, REPLY_CODE1, null, null, null);
147a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.sendReply(session, REPLY_CODE1, MESSAGE_KEY, null, null);
148a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.sendReply(session, REPLY_CODE1, MESSAGE_KEY, OVERRIDE_REPLY_TEXT, null);
149a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.sendReply(session, REPLY_CODE3, null, null, null);
150a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
151a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        verify(session);
152a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
153a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
154a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
155a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the sendReply() method, passing in message arguments
156a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
157a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testSendReply_WithMessageArguments() {
158a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        session.sendReply(REPLY_CODE1, REPLY_TEXT2_FORMATTED);
159a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        replay(session);
160a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
161a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.sendReply(session, REPLY_CODE1, null, REPLY_TEXT2, ARGS);
162a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
163a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        verify(session);
164a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
165a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
166a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
167a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the sendReply() method, passing in a null Session
168a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
169a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testSendReply_NullSession() {
170a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        try {
171a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            commandHandler.sendReply(null, REPLY_CODE1, REPLY_TEXT1, null, null);
172a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            fail("Expected AssertFailedException");
173a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
174a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        catch (AssertFailedException expected) {
175a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            LOG.info("Expected: " + expected);
176a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
177a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
178a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
179a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
180a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Test the sendReply() method, passing in an invalid replyCode
181a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
182a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    public void testSendReply_InvalidReplyCode() {
183a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        try {
184a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            commandHandler.sendReply(session, 0, REPLY_TEXT1, null, null);
185a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            fail("Expected AssertFailedException");
186a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
187a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        catch (AssertFailedException expected) {
188a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            LOG.info("Expected: " + expected);
189a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        }
190a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
191a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
192a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    //-------------------------------------------------------------------------
193a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    // Test setup
194a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    //-------------------------------------------------------------------------
195a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
196a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    /**
197a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * Perform initialization before each test
198a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     *
199a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
200a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair     */
201a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    protected void setUp() throws Exception {
202a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        super.setUp();
203a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        session = (Session) createMock(Session.class);
204a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        control(session).setDefaultMatcher(MockControl.ARRAY_MATCHER);
205a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler = new AbstractTrackingCommandHandler() {
206a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
207a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            }
208a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        };
209a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        ResourceBundle replyTextBundle = new ListResourceBundle() {
210a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            protected Object[][] getContents() {
211a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair                return new Object[][]{
212a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair                        {Integer.toString(REPLY_CODE1), REPLY_TEXT1},
213a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair                        {Integer.toString(REPLY_CODE2), REPLY_TEXT2},
214a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair                        {MESSAGE_KEY, MESSAGE_TEXT}
215a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair                };
216a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair            }
217a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        };
218a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair        commandHandler.setReplyTextBundle(replyTextBundle);
219a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair    }
220a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair
221a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair}
222