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