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