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;
17
18import java.util.HashMap;
19import java.util.Map;
20import java.util.ResourceBundle;
21
22
23import org.apache.log4j.Logger;
24import org.mockftpserver.core.command.Command;
25import org.mockftpserver.core.command.CommandHandler;
26import org.mockftpserver.core.command.InvocationRecord;
27import org.mockftpserver.core.session.Session;
28import org.mockftpserver.core.util.AssertFailedException;
29import org.mockftpserver.stub.StubFtpServer;
30import org.mockftpserver.stub.command.AbstractStubCommandHandler;
31import org.mockftpserver.stub.command.CwdCommandHandler;
32import org.mockftpserver.test.AbstractTest;
33
34/**
35 * Unit tests for StubFtpServer. Also see {@link StubFtpServer_StartTest}
36 * and {@link StubFtpServerIntegrationTest}.
37 *
38 * @version $Revision$ - $Date$
39 *
40 * @author Chris Mair
41 */
42public final class StubFtpServerTest extends AbstractTest {
43
44    private static final Logger LOG = Logger.getLogger(StubFtpServerTest.class);
45
46    private StubFtpServer stubFtpServer;
47    private AbstractStubCommandHandler commandHandler;
48    private CommandHandler commandHandler_NoReplyTextBundle;
49
50    /**
51     * Test the setCommandHandlers() method
52     */
53    public void testSetCommandHandlers() {
54        Map mapping = new HashMap();
55        mapping.put("AAA", commandHandler);
56        mapping.put("BBB", commandHandler_NoReplyTextBundle);
57
58        stubFtpServer.setCommandHandlers(mapping);
59        assertSame("commandHandler1", commandHandler, stubFtpServer.getCommandHandler("AAA"));
60        assertSame("commandHandler2", commandHandler_NoReplyTextBundle, stubFtpServer.getCommandHandler("BBB"));
61
62        assertSame("replyTextBundle", stubFtpServer.replyTextBundle, commandHandler.getReplyTextBundle());
63
64        // Make sure default CommandHandlers are still set
65        assertEquals("CwdCommandHandler", CwdCommandHandler.class, stubFtpServer.getCommandHandler("CWD").getClass());
66    }
67
68    /**
69     * Test the setCommandHandlers() method, when the Map is null
70     */
71    public void testSetCommandHandlers_Null() {
72        try {
73            stubFtpServer.setCommandHandlers(null);
74            fail("Expected AssertFailedException");
75        }
76        catch (AssertFailedException expected) {
77            LOG.info("Expected: " + expected);
78        }
79    }
80
81    /**
82     * Test the setCommandHandler() method, for a CommandHandler that does not implement ResourceBundleAware
83     */
84    public void testSetCommandHandler_NotReplyTextBundleAware() {
85        stubFtpServer.setCommandHandler("ZZZ", commandHandler_NoReplyTextBundle);
86        assertSame("commandHandler", commandHandler_NoReplyTextBundle, stubFtpServer.getCommandHandler("ZZZ"));
87    }
88
89    /**
90     * Test the setCommandHandler() method, for a CommandHandler that implements ReplyTextBundleAware,
91     * and whose replyTextBundle attribute is null.
92     */
93    public void testSetCommandHandler_NullReplyTextBundle() {
94        stubFtpServer.setCommandHandler("ZZZ", commandHandler);
95        assertSame("commandHandler", commandHandler, stubFtpServer.getCommandHandler("ZZZ"));
96        assertSame("replyTextBundle", stubFtpServer.replyTextBundle, commandHandler.getReplyTextBundle());
97    }
98
99    /**
100     * Test the setCommandHandler() method, when the commandName is null
101     */
102    public void testSetCommandHandler_NullCommandName() {
103        CommandHandler commandHandler = (CommandHandler) createMock(CommandHandler.class);
104        try {
105            stubFtpServer.setCommandHandler(null, commandHandler);
106            fail("Expected AssertFailedException");
107        }
108        catch (AssertFailedException expected) {
109            LOG.info("Expected: " + expected);
110        }
111    }
112
113    /**
114     * Test the setCommandHandler() method, when the commandHandler is null
115     */
116    public void testSetCommandHandler_NullCommandHandler() {
117        try {
118            stubFtpServer.setCommandHandler("ZZZ", null);
119            fail("Expected AssertFailedException");
120        }
121        catch (AssertFailedException expected) {
122            LOG.info("Expected: " + expected);
123        }
124    }
125
126    /**
127     * Test setReplyTextBaseName() method
128     */
129    public void testSetReplyTextBaseName() {
130        stubFtpServer.setReplyTextBaseName("SampleReplyText");
131        CwdCommandHandler commandHandler = new CwdCommandHandler();
132
133        // The resource bundle is passed along to new CommandHandlers (if they don't already have one)
134        stubFtpServer.setCommandHandler("CWD", commandHandler);
135        ResourceBundle resourceBundle = commandHandler.getReplyTextBundle();
136        assertEquals("110", "Testing123", resourceBundle.getString("110"));
137    }
138
139    /**
140     * Test the setCommandHandler() and getCommandHandler() methods for commands in lower case or mixed case
141     */
142    public void testLowerCaseOrMixedCaseCommandNames() {
143        stubFtpServer.setCommandHandler("XXX", commandHandler);
144        assertSame("ZZZ", commandHandler, stubFtpServer.getCommandHandler("XXX"));
145        assertSame("Zzz", commandHandler, stubFtpServer.getCommandHandler("Xxx"));
146        assertSame("zzz", commandHandler, stubFtpServer.getCommandHandler("xxx"));
147
148        stubFtpServer.setCommandHandler("YyY", commandHandler);
149        assertSame("ZZZ", commandHandler, stubFtpServer.getCommandHandler("YYY"));
150        assertSame("Zzz", commandHandler, stubFtpServer.getCommandHandler("Yyy"));
151        assertSame("zzz", commandHandler, stubFtpServer.getCommandHandler("yyy"));
152
153        stubFtpServer.setCommandHandler("zzz", commandHandler);
154        assertSame("ZZZ", commandHandler, stubFtpServer.getCommandHandler("ZZZ"));
155        assertSame("Zzz", commandHandler, stubFtpServer.getCommandHandler("zzZ"));
156        assertSame("zzz", commandHandler, stubFtpServer.getCommandHandler("zzz"));
157    }
158
159    //-------------------------------------------------------------------------
160    // Test setup
161    //-------------------------------------------------------------------------
162
163    /**
164     * @see org.mockftpserver.test.AbstractTest#setUp()
165     */
166    protected void setUp() throws Exception {
167        super.setUp();
168
169        stubFtpServer = new StubFtpServer();
170
171        // Create a CommandHandler instance that also implements ResourceBundleAware
172        commandHandler = new AbstractStubCommandHandler() {
173            protected void handleCommand(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
174            }
175        };
176
177        // Create a CommandHandler instance that does NOT implement ResourceBundleAware
178        commandHandler_NoReplyTextBundle = new CommandHandler() {
179            public void handleCommand(Command command, Session session) throws Exception {
180            }
181        };
182    }
183
184}
185