1ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/*
2ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Copyright 2007 the original author or authors.
3ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
4ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * you may not use this file except in compliance with the License.
6ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * You may obtain a copy of the License at
7ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
8ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
10ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Unless required by applicable law or agreed to in writing, software
11ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * See the License for the specific language governing permissions and
14ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * limitations under the License.
15ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
16ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpackage org.mockftpserver.stub.command;
17ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
18ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.util.ListResourceBundle;
19ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.util.ResourceBundle;
20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.apache.log4j.Logger;
22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.Command;
23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.InvocationRecord;
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.session.Session;
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.util.AssertFailedException;
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.stub.command.AbstractStubDataCommandHandler;
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.test.AbstractTest;
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Tests for AbstractStubDataCommandHandler. The class name is prefixed with an underscore
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * so that it is not filtered out by Maven's Surefire test plugin.
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision$ - $Date$
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpublic final class _AbstractStubDataCommandHandlerTest extends AbstractTest {
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final Logger LOG = Logger.getLogger(_AbstractStubDataCommandHandlerTest.class);
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final Command COMMAND = new Command("command", EMPTY);
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final InvocationRecord INVOCATION_RECORD = new InvocationRecord(COMMAND, DEFAULT_HOST);
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final String REPLY_TEXT150 = "reply 150 ... abcdef";
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final String REPLY_TEXT226 = "reply 226 ... abcdef";
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final String REPLY_TEXT222 = "reply 222 ... abcdef";
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final String REPLY_TEXT333 = "reply 333 ... abcdef";
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final String REPLY_TEXT444 = "reply 444 ... abcdef";
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private Session session;
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private ResourceBundle replyTextBundle;
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private AbstractStubDataCommandHandler commandHandler;
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the handleCommand() method
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testHandleCommand() throws Exception {
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(150, REPLY_TEXT150);
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.openDataConnection();
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(222, REPLY_TEXT222);
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(333, REPLY_TEXT333);
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(444, REPLY_TEXT444);
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.closeDataConnection();
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(226, REPLY_TEXT226);
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        replay(session);
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        // Define CommandHandler test subclass
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler = new AbstractStubDataCommandHandler() {
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            protected void beforeProcessData(Command c, Session s, InvocationRecord ir) {
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                verifyParameters(c, s, ir);
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                // Send unique reply code so that we can verify proper method invocation and ordering
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                session.sendReply(222, REPLY_TEXT222);
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            protected void processData(Command c, Session s, InvocationRecord ir) {
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                verifyParameters(c, s, ir);
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                // Send unique reply code so that we can verify proper method invocation and ordering
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                session.sendReply(333, REPLY_TEXT333);
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            protected void afterProcessData(Command c, Session s, InvocationRecord ir) {
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                verifyParameters(c, s, ir);
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                // Send unique reply code so that we can verify proper method invocation and ordering
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                session.sendReply(444, REPLY_TEXT444);
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            private void verifyParameters(Command c, Session s, InvocationRecord ir) {
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                assertSame("command", COMMAND, c);
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                assertSame("session", session, s);
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                assertSame("invocationRecord", INVOCATION_RECORD, ir);
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        };
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setReplyTextBundle(replyTextBundle);
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.handleCommand(COMMAND, session, INVOCATION_RECORD);
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        verify(session);
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the handleCommand() method, overriding the initial reply code and text
102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testHandleCommand_OverrideInitialReplyCodeAndText() throws Exception {
104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        final int OVERRIDE_REPLY_CODE = 333;
106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        final String OVERRIDE_REPLY_TEXT = "reply text";
107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(OVERRIDE_REPLY_CODE, OVERRIDE_REPLY_TEXT);
109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.openDataConnection();
110ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.closeDataConnection();
111ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(226, REPLY_TEXT226);
112ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        replay(session);
113ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
114ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setPreliminaryReplyCode(OVERRIDE_REPLY_CODE);
115ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setPreliminaryReplyText(OVERRIDE_REPLY_TEXT);
116ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setReplyTextBundle(replyTextBundle);
117ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.handleCommand(COMMAND, session, INVOCATION_RECORD);
118ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
119ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        verify(session);
120ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
121ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
122ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
123ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the setPreliminaryReplyCode() method, passing in an invalid value
124ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
125ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testSetPreliminaryReplyCode_Invalid() {
126ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        try {
127ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            commandHandler.setPreliminaryReplyCode(0);
128ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            fail("Expected AssertFailedException");
129ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
130ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        catch (AssertFailedException expected) {
131ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            LOG.info("Expected: " + expected);
132ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
133ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
134ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
135ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
136ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the setFinalReplyCode() method, passing in an invalid value
137ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
138ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testSetFinalReplyCode_Invalid() {
139ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        try {
140ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            commandHandler.setFinalReplyCode(0);
141ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            fail("Expected AssertFailedException");
142ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
143ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        catch (AssertFailedException expected) {
144ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            LOG.info("Expected: " + expected);
145ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
146ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
147ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
148ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
149ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Test setup
150ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
151ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
152ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
153ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Perform initialization before each test
154ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
155ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
156ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
157ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected void setUp() throws Exception {
158ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        super.setUp();
159ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session = (Session) createMock(Session.class);
160ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        replyTextBundle = new ListResourceBundle() {
161ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            protected Object[][] getContents() {
162ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                return new Object[][] {
163ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                        { Integer.toString(150), REPLY_TEXT150 },
164ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                        { Integer.toString(222), REPLY_TEXT222 },
165ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                        { Integer.toString(226), REPLY_TEXT226 },
166ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                        { Integer.toString(333), REPLY_TEXT333 },
167ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                        { Integer.toString(444), REPLY_TEXT444 },
168ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                };
169ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
170ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        };
171ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler = new AbstractStubDataCommandHandler() {
172ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            protected void processData(Command c, Session s, InvocationRecord ir) {
173ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
174ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        };
175ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
176ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
177ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}
178