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}