16160e1990a6113f42acd7f101b446759cb0a1837chrismair/*
26160e1990a6113f42acd7f101b446759cb0a1837chrismair * Copyright 2008 the original author or authors.
36160e1990a6113f42acd7f101b446759cb0a1837chrismair *
46160e1990a6113f42acd7f101b446759cb0a1837chrismair * Licensed under the Apache License, Version 2.0 (the "License");
56160e1990a6113f42acd7f101b446759cb0a1837chrismair * you may not use this file except in compliance with the License.
66160e1990a6113f42acd7f101b446759cb0a1837chrismair * You may obtain a copy of the License at
76160e1990a6113f42acd7f101b446759cb0a1837chrismair *
86160e1990a6113f42acd7f101b446759cb0a1837chrismair *      http://www.apache.org/licenses/LICENSE-2.0
96160e1990a6113f42acd7f101b446759cb0a1837chrismair *
106160e1990a6113f42acd7f101b446759cb0a1837chrismair * Unless required by applicable law or agreed to in writing, software
116160e1990a6113f42acd7f101b446759cb0a1837chrismair * distributed under the License is distributed on an "AS IS" BASIS,
126160e1990a6113f42acd7f101b446759cb0a1837chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136160e1990a6113f42acd7f101b446759cb0a1837chrismair * See the License for the specific language governing permissions and
146160e1990a6113f42acd7f101b446759cb0a1837chrismair * limitations under the License.
156160e1990a6113f42acd7f101b446759cb0a1837chrismair */
166160e1990a6113f42acd7f101b446759cb0a1837chrismairpackage org.mockftpserver.fake.command
176160e1990a6113f42acd7f101b446759cb0a1837chrismair
1872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismairimport org.mockftpserver.core.CommandSyntaxException
196160e1990a6113f42acd7f101b446759cb0a1837chrismairimport org.mockftpserver.core.IllegalStateException
2072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismairimport org.mockftpserver.core.NotLoggedInException
216160e1990a6113f42acd7f101b446759cb0a1837chrismairimport org.mockftpserver.core.command.Command
2272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismairimport org.mockftpserver.core.command.ReplyCodes
2372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismairimport org.mockftpserver.core.session.Session
246160e1990a6113f42acd7f101b446759cb0a1837chrismairimport org.mockftpserver.core.session.SessionKeys
2572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismairimport org.mockftpserver.core.session.StubSession
26bd576ae311a45a994ae6b457fb2e5bb0ffe0d6b5chrismairimport org.mockftpserver.fake.StubServerConfiguration
27bd576ae311a45a994ae6b457fb2e5bb0ffe0d6b5chrismairimport org.mockftpserver.fake.UserAccount
2872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismairimport org.mockftpserver.fake.filesystem.FileSystemException
296160e1990a6113f42acd7f101b446759cb0a1837chrismairimport org.mockftpserver.fake.filesystem.InvalidFilenameException
309e1053c079532bc7e47012d63f8d9d7246df4e96chrismairimport org.mockftpserver.fake.filesystem.UnixFakeFileSystem
315303c6ae1dde5f399fe48803e677942fc4326344chrismairimport org.mockftpserver.test.AbstractGroovyTestCase
320da0f84ad9831bea470896e79b5ec207c83f258echrismairimport org.mockftpserver.test.StubResourceBundle
3372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
346160e1990a6113f42acd7f101b446759cb0a1837chrismair/**
356160e1990a6113f42acd7f101b446759cb0a1837chrismair * Tests for AbstractFakeCommandHandler
3672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair *
377d4a3a2990f1a386eaf9d50cf05a9d45fab32de6chrismair * @version $Revision$ - $Date$
386160e1990a6113f42acd7f101b446759cb0a1837chrismair *
396160e1990a6113f42acd7f101b446759cb0a1837chrismair * @author Chris Mair
406160e1990a6113f42acd7f101b446759cb0a1837chrismair */
415303c6ae1dde5f399fe48803e677942fc4326344chrismairclass AbstractFakeCommandHandlerClassTest extends AbstractGroovyTestCase {
426160e1990a6113f42acd7f101b446759cb0a1837chrismair
4372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    static PATH = "some/path"
4472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    static REPLY_CODE = 99
455c17f34e1a613c319d355112f8298c20015ef7f2chrismair    static MESSAGE_KEY = "99.WithFilename"
4672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    static ARG = "ABC"
4772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    static MSG = "text {0}"
4872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    static MSG_WITH_ARG = "text ABC"
495c17f34e1a613c319d355112f8298c20015ef7f2chrismair    static MSG_FOR_KEY = "some other message"
50954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair    static INTERNAL_ERROR = AbstractFakeCommandHandler.INTERNAL_ERROR_KEY
51954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair    static MSG_INTERNAL_ERROR = "internal error message {0}"
5272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    private AbstractFakeCommandHandler commandHandler
5372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    private session
5472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    private serverConfiguration
550da0f84ad9831bea470896e79b5ec207c83f258echrismair    private replyTextBundle
5672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    private fileSystem
5781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    private userAccount
5872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
5972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    //-------------------------------------------------------------------------
606160e1990a6113f42acd7f101b446759cb0a1837chrismair    // Tests
616160e1990a6113f42acd7f101b446759cb0a1837chrismair    //-------------------------------------------------------------------------
626160e1990a6113f42acd7f101b446759cb0a1837chrismair
636160e1990a6113f42acd7f101b446759cb0a1837chrismair    void testHandleCommand() {
6472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        def command = new Command("C1", ["abc"])
6572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.handleCommand(command, session)
6672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assert commandHandler.handled
6772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
6872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assertHandleCommandReplyCode(new CommandSyntaxException(""), ReplyCodes.COMMAND_SYNTAX_ERROR)
6972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assertHandleCommandReplyCode(new IllegalStateException(""), ReplyCodes.ILLEGAL_STATE)
7072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assertHandleCommandReplyCode(new NotLoggedInException(""), ReplyCodes.NOT_LOGGED_IN)
7172ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assertHandleCommandReplyCode(new InvalidFilenameException(""), ReplyCodes.FILENAME_NOT_VALID)
7272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
7372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        shouldFail { commandHandler.handleCommand(null, session) }
7472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        shouldFail { commandHandler.handleCommand(command, null) }
7572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
7672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
7772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    void testHandleCommand_FileSystemException() {
78c4a22299b897279a8518308b9067da84af077281chrismair        assertHandleCommandReplyCode(new FileSystemException(PATH, ''), ReplyCodes.READ_FILE_ERROR, PATH)
79c4a22299b897279a8518308b9067da84af077281chrismair        commandHandler.replyCodeForFileSystemException = ReplyCodes.WRITE_FILE_ERROR
80c4a22299b897279a8518308b9067da84af077281chrismair        assertHandleCommandReplyCode(new FileSystemException(PATH, ''), ReplyCodes.WRITE_FILE_ERROR, PATH)
816160e1990a6113f42acd7f101b446759cb0a1837chrismair    }
826160e1990a6113f42acd7f101b446759cb0a1837chrismair
836160e1990a6113f42acd7f101b446759cb0a1837chrismair    void testSendReply() {
8472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.sendReply(session, REPLY_CODE)
8572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assert session.sentReplies[0] == [REPLY_CODE, MSG], session.sentReplies[0]
8672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
8772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.sendReply(session, REPLY_CODE, [ARG])
8872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assert session.sentReplies[1] == [REPLY_CODE, MSG_WITH_ARG], session.sentReplies[0]
8972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
90954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair        shouldFailWithMessageContaining('session') { commandHandler.sendReply(null, REPLY_CODE) }
91626114fa941da4c2add6546f25ed0523e006fb98chrismair        shouldFailWithMessageContaining('reply code') { commandHandler.sendReply(session, 0) }
9272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
9372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
945c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void testSendReply_MessageKey() {
955c17f34e1a613c319d355112f8298c20015ef7f2chrismair        commandHandler.sendReply(session, REPLY_CODE, MESSAGE_KEY)
965c17f34e1a613c319d355112f8298c20015ef7f2chrismair        assert session.sentReplies[0] == [REPLY_CODE, MSG_FOR_KEY], session.sentReplies[0]
975c17f34e1a613c319d355112f8298c20015ef7f2chrismair
98954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair        shouldFailWithMessageContaining('session') { commandHandler.sendReply(null, REPLY_CODE, MESSAGE_KEY) }
99626114fa941da4c2add6546f25ed0523e006fb98chrismair        shouldFailWithMessageContaining('reply code') { commandHandler.sendReply(session, 0, MESSAGE_KEY) }
100954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair    }
101954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair
102954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair    void testSendReply_NullMessageKey() {
103954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair        commandHandler.sendReply(session, REPLY_CODE, null, null)
104954ee7de942a83d2cba85940f8bac0f9d233fbb0chrismair        assert session.sentReplies[0] == [REPLY_CODE, MSG_INTERNAL_ERROR], session.sentReplies[0]
1055c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
1065c17f34e1a613c319d355112f8298c20015ef7f2chrismair
1076160e1990a6113f42acd7f101b446759cb0a1837chrismair    void testAssertValidReplyCode() {
10872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.assertValidReplyCode(1)        // no exception expected
10972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        shouldFail { commandHandler.assertValidReplyCode(0) }
11072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
11172ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
1126160e1990a6113f42acd7f101b446759cb0a1837chrismair    void testGetRequiredSessionAttribute() {
11372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        shouldFail(IllegalStateException) { commandHandler.getRequiredSessionAttribute(session, "undefined") }
1146160e1990a6113f42acd7f101b446759cb0a1837chrismair
11572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        session.setAttribute("abc", "not empty")
11672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.getRequiredSessionAttribute(session, "abc") // no exception
11772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
11872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        session.setAttribute("abc", "")
11972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.getRequiredSessionAttribute(session, "abc") // no exception
12072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
1216160e1990a6113f42acd7f101b446759cb0a1837chrismair
1226160e1990a6113f42acd7f101b446759cb0a1837chrismair    void testVerifyLoggedIn() {
12372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        shouldFail(NotLoggedInException) { commandHandler.verifyLoggedIn(session) }
12481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        session.setAttribute(SessionKeys.USER_ACCOUNT, userAccount)
12572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.verifyLoggedIn(session)        // no exception expected
12672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
12772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
12881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    void testGetUserAccount() {
12981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        assert commandHandler.getUserAccount(session) == null
13081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        session.setAttribute(SessionKeys.USER_ACCOUNT, userAccount)
13181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        assert commandHandler.getUserAccount(session)
13281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
13381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
1348a951b23d1281158e4201bf0d425ced009bfaa89chrismair    void testVerifyFileSystemCondition() {
135777c1c842d19df00d2529ccf43e4f4c26cfd39fbchrismair        commandHandler.verifyFileSystemCondition(true, PATH, '')    // no exception expected
136777c1c842d19df00d2529ccf43e4f4c26cfd39fbchrismair        shouldFail(FileSystemException) { commandHandler.verifyFileSystemCondition(false, PATH, '') }
1376160e1990a6113f42acd7f101b446759cb0a1837chrismair    }
13872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
139ad98f727deebfd941b446f0f82337b2244e43b6cchrismair    void testGetRealPath() {
1401ce070e55c071c1d1c4ec408c5fc5d961a0dc94achrismair        assert commandHandler.getRealPath(session, "/xxx") == "/xxx"
14172ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
1421ce070e55c071c1d1c4ec408c5fc5d961a0dc94achrismair        session.setAttribute(SessionKeys.CURRENT_DIRECTORY, "/usr/me")
1431ce070e55c071c1d1c4ec408c5fc5d961a0dc94achrismair        assert commandHandler.getRealPath(session, null) == "/usr/me"
1441ce070e55c071c1d1c4ec408c5fc5d961a0dc94achrismair        assert commandHandler.getRealPath(session, "/xxx") == "/xxx"
1451ce070e55c071c1d1c4ec408c5fc5d961a0dc94achrismair        assert commandHandler.getRealPath(session, "xxx") == "/usr/me/xxx"
14638fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert commandHandler.getRealPath(session, "../xxx") == "/usr/xxx"
14738fab1fed5287011ab8fbc41b429c6bbf3b981e0chrismair        assert commandHandler.getRealPath(session, "./xxx") == "/usr/me/xxx"
148ad98f727deebfd941b446f0f82337b2244e43b6cchrismair    }
14972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
1506160e1990a6113f42acd7f101b446759cb0a1837chrismair    //-------------------------------------------------------------------------
1516160e1990a6113f42acd7f101b446759cb0a1837chrismair    // Test Setup
1526160e1990a6113f42acd7f101b446759cb0a1837chrismair    //-------------------------------------------------------------------------
15372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
15472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    void setUp() {
15572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        super.setUp()
15672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler = new TestFakeCommandHandler()
15772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        session = new StubSession()
15872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        serverConfiguration = new StubServerConfiguration()
1590da0f84ad9831bea470896e79b5ec207c83f258echrismair        replyTextBundle = new StubResourceBundle()
16081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount = new UserAccount()
1619e1053c079532bc7e47012d63f8d9d7246df4e96chrismair        fileSystem = new UnixFakeFileSystem()
16272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        serverConfiguration.setFileSystem(fileSystem)
163abc66ab652b34d39ea5a00a75b1d7c7cc157a84fchrismair
1640da0f84ad9831bea470896e79b5ec207c83f258echrismair        replyTextBundle.put(REPLY_CODE as String, MSG)
1650da0f84ad9831bea470896e79b5ec207c83f258echrismair        replyTextBundle.put(MESSAGE_KEY as String, MSG_FOR_KEY)
1660da0f84ad9831bea470896e79b5ec207c83f258echrismair        replyTextBundle.put(INTERNAL_ERROR as String, MSG_INTERNAL_ERROR)
16772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
16872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        commandHandler.serverConfiguration = serverConfiguration
1690da0f84ad9831bea470896e79b5ec207c83f258echrismair        commandHandler.replyTextBundle = replyTextBundle
17072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
1716160e1990a6113f42acd7f101b446759cb0a1837chrismair
1726160e1990a6113f42acd7f101b446759cb0a1837chrismair    //-------------------------------------------------------------------------
1736160e1990a6113f42acd7f101b446759cb0a1837chrismair    // Helper Methods
1746160e1990a6113f42acd7f101b446759cb0a1837chrismair    //-------------------------------------------------------------------------
1756160e1990a6113f42acd7f101b446759cb0a1837chrismair
1766160e1990a6113f42acd7f101b446759cb0a1837chrismair    /**
1776160e1990a6113f42acd7f101b446759cb0a1837chrismair     * Assert that when the CommandHandler handleCommand() method throws the
1786160e1990a6113f42acd7f101b446759cb0a1837chrismair     * specified exception, that the expected reply is sent through the session.
1796160e1990a6113f42acd7f101b446759cb0a1837chrismair     */
180abc66ab652b34d39ea5a00a75b1d7c7cc157a84fchrismair    private void assertHandleCommandReplyCode(Throwable exception, int expected, text = null) {
1816160e1990a6113f42acd7f101b446759cb0a1837chrismair        commandHandler.exception = exception
1826160e1990a6113f42acd7f101b446759cb0a1837chrismair        def command = new Command("C1", ["abc"])
1836160e1990a6113f42acd7f101b446759cb0a1837chrismair        session.sentReplies.clear()
1846160e1990a6113f42acd7f101b446759cb0a1837chrismair        commandHandler.handleCommand(command, session)
18572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        def sentReply = session.sentReplies[0][0]
18672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        assert sentReply == expected
18772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        if (text) {
18872ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair            def sentMessage = session.sentReplies[0][1]
189abc66ab652b34d39ea5a00a75b1d7c7cc157a84fchrismair            assert sentMessage.contains(text), "sentMessage=[$sentMessage] text=[$text]"
19072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        }
1916160e1990a6113f42acd7f101b446759cb0a1837chrismair    }
19272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
19372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair}
1946160e1990a6113f42acd7f101b446759cb0a1837chrismair
1956160e1990a6113f42acd7f101b446759cb0a1837chrismair/**
1966160e1990a6113f42acd7f101b446759cb0a1837chrismair * Concrete subclass of AbstractFakeCommandHandler for testing
1976160e1990a6113f42acd7f101b446759cb0a1837chrismair */
198afca3a690de8d057dca24050db556880fa4721e6chrismairclass TestFakeCommandHandler extends AbstractFakeCommandHandler {
19972ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    boolean handled = false
20072ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    def exception
20172ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair
20272ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    protected void handle(Command command, Session session) {
20372ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        if (exception) {
20472ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair            throw exception
20572ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        }
20672ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair        this.handled = true
20772ebe336afbe7f84dacc2a3952c0e0439bca698bchrismair    }
2086160e1990a6113f42acd7f101b446759cb0a1837chrismair}