1fba2635c088b01af59300e8a02611bb788ee3bffchrismair/* 2fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Copyright 2008 the original author or authors. 3fba2635c088b01af59300e8a02611bb788ee3bffchrismair * 4fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5fba2635c088b01af59300e8a02611bb788ee3bffchrismair * you may not use this file except in compliance with the License. 6fba2635c088b01af59300e8a02611bb788ee3bffchrismair * You may obtain a copy of the License at 7fba2635c088b01af59300e8a02611bb788ee3bffchrismair * 8fba2635c088b01af59300e8a02611bb788ee3bffchrismair * http://www.apache.org/licenses/LICENSE-2.0 9fba2635c088b01af59300e8a02611bb788ee3bffchrismair * 10fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Unless required by applicable law or agreed to in writing, software 11fba2635c088b01af59300e8a02611bb788ee3bffchrismair * distributed under the License is distributed on an "AS IS" BASIS, 12fba2635c088b01af59300e8a02611bb788ee3bffchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fba2635c088b01af59300e8a02611bb788ee3bffchrismair * See the License for the specific language governing permissions and 14fba2635c088b01af59300e8a02611bb788ee3bffchrismair * limitations under the License. 15fba2635c088b01af59300e8a02611bb788ee3bffchrismair */ 16fba2635c088b01af59300e8a02611bb788ee3bffchrismairpackage org.mockftpserver.fake.command 17fba2635c088b01af59300e8a02611bb788ee3bffchrismair 18fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.Command 19fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.CommandHandler 20fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.CommandNames 21fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.ReplyCodes 22fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.session.SessionKeys 23fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.fake.filesystem.FileEntry 24fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.fake.filesystem.FileSystemException 25fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.fake.filesystem.Permissions 26fba2635c088b01af59300e8a02611bb788ee3bffchrismair 27fba2635c088b01af59300e8a02611bb788ee3bffchrismair/** 28fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Tests for RetrCommandHandler 29fba2635c088b01af59300e8a02611bb788ee3bffchrismair * 30fba2635c088b01af59300e8a02611bb788ee3bffchrismair * @version $Revision$ - $Date$ 31fba2635c088b01af59300e8a02611bb788ee3bffchrismair * 32fba2635c088b01af59300e8a02611bb788ee3bffchrismair * @author Chris Mair 33fba2635c088b01af59300e8a02611bb788ee3bffchrismair */ 34fba2635c088b01af59300e8a02611bb788ee3bffchrismairclass RetrCommandHandlerTest extends AbstractFakeCommandHandlerTestCase { 35fba2635c088b01af59300e8a02611bb788ee3bffchrismair 36fba2635c088b01af59300e8a02611bb788ee3bffchrismair def DIR = "/" 37fba2635c088b01af59300e8a02611bb788ee3bffchrismair def FILENAME = "file.txt" 38fba2635c088b01af59300e8a02611bb788ee3bffchrismair def FILE = p(DIR, FILENAME) 39fba2635c088b01af59300e8a02611bb788ee3bffchrismair def CONTENTS = "abc\ndef\nghi" 40fba2635c088b01af59300e8a02611bb788ee3bffchrismair def CONTENTS_ASCII = "abc\r\ndef\r\nghi" 41fba2635c088b01af59300e8a02611bb788ee3bffchrismair 42fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_MissingPathParameter() { 43fba2635c088b01af59300e8a02611bb788ee3bffchrismair testHandleCommand_MissingRequiredParameter([]) 44fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 45fba2635c088b01af59300e8a02611bb788ee3bffchrismair 46fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_AbsolutePath() { 47fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommandAndVerifySendDataReplies([FILE]) 48fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionData(CONTENTS_ASCII) 49fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 50fba2635c088b01af59300e8a02611bb788ee3bffchrismair 51fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_AbsolutePath_NonAsciiMode() { 52fba2635c088b01af59300e8a02611bb788ee3bffchrismair session.setAttribute(SessionKeys.ASCII_TYPE, false) 53fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommandAndVerifySendDataReplies([FILE]) 54fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionData(CONTENTS) 55fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 56fba2635c088b01af59300e8a02611bb788ee3bffchrismair 57fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_RelativePath() { 58fba2635c088b01af59300e8a02611bb788ee3bffchrismair setCurrentDirectory(DIR) 59fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommandAndVerifySendDataReplies([FILENAME]) 60fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionData(CONTENTS_ASCII) 61fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 62fba2635c088b01af59300e8a02611bb788ee3bffchrismair 63fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_PathSpecifiesAnExistingDirectory() { 64fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommand([DIR]) 65fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.isNotAFile', DIR]) 66fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 67fba2635c088b01af59300e8a02611bb788ee3bffchrismair 68fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_PathDoesNotExist() { 69fba2635c088b01af59300e8a02611bb788ee3bffchrismair def path = FILE + "XXX" 70fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommand([path]) 71fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.doesNotExist', path]) 72fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 73fba2635c088b01af59300e8a02611bb788ee3bffchrismair 74fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_NoReadAccessToFile() { 75fba2635c088b01af59300e8a02611bb788ee3bffchrismair fileSystem.getEntry(FILE).permissions = Permissions.NONE 76fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommand([FILE]) 77fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotRead', FILE]) 78fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 79fba2635c088b01af59300e8a02611bb788ee3bffchrismair 80fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_NoExecuteAccessToDirectory() { 81fba2635c088b01af59300e8a02611bb788ee3bffchrismair fileSystem.getEntry(DIR).permissions = Permissions.NONE 82fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommand([FILE]) 83fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotExecute', DIR]) 84fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 85fba2635c088b01af59300e8a02611bb788ee3bffchrismair 86fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testHandleCommand_ThrowsFileSystemException() { 87fba2635c088b01af59300e8a02611bb788ee3bffchrismair fileSystem.delete(FILE) 88fba2635c088b01af59300e8a02611bb788ee3bffchrismair def fileEntry = new BadFileEntry(FILE) 89fba2635c088b01af59300e8a02611bb788ee3bffchrismair fileSystem.add(fileEntry) 90fba2635c088b01af59300e8a02611bb788ee3bffchrismair 91fba2635c088b01af59300e8a02611bb788ee3bffchrismair handleCommand([FILE]) 92fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK) 93fba2635c088b01af59300e8a02611bb788ee3bffchrismair assertSessionReply(1, ReplyCodes.READ_FILE_ERROR, ERROR_MESSAGE_KEY) 94fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 95fba2635c088b01af59300e8a02611bb788ee3bffchrismair 96fba2635c088b01af59300e8a02611bb788ee3bffchrismair void testConvertLfToCrLf() { 97fba2635c088b01af59300e8a02611bb788ee3bffchrismair // LF='\n' and CRLF='\r\n' 98fba2635c088b01af59300e8a02611bb788ee3bffchrismair assert commandHandler.convertLfToCrLf('abc'.bytes) == 'abc'.bytes 99fba2635c088b01af59300e8a02611bb788ee3bffchrismair assert commandHandler.convertLfToCrLf('abc\r\ndef'.bytes) == 'abc\r\ndef'.bytes 100fba2635c088b01af59300e8a02611bb788ee3bffchrismair assert commandHandler.convertLfToCrLf('abc\ndef'.bytes) == 'abc\r\ndef'.bytes 101fba2635c088b01af59300e8a02611bb788ee3bffchrismair assert commandHandler.convertLfToCrLf('abc\ndef\nghi'.bytes) == 'abc\r\ndef\r\nghi'.bytes 102fba2635c088b01af59300e8a02611bb788ee3bffchrismair assert commandHandler.convertLfToCrLf('\n'.bytes) == '\r\n'.bytes 103fba2635c088b01af59300e8a02611bb788ee3bffchrismair assert commandHandler.convertLfToCrLf('\r\nabc\n'.bytes) == '\r\nabc\r\n'.bytes 104fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 105fba2635c088b01af59300e8a02611bb788ee3bffchrismair 106fba2635c088b01af59300e8a02611bb788ee3bffchrismair //------------------------------------------------------------------------- 107fba2635c088b01af59300e8a02611bb788ee3bffchrismair // Helper Methods 108fba2635c088b01af59300e8a02611bb788ee3bffchrismair //------------------------------------------------------------------------- 109fba2635c088b01af59300e8a02611bb788ee3bffchrismair 110fba2635c088b01af59300e8a02611bb788ee3bffchrismair CommandHandler createCommandHandler() { 111fba2635c088b01af59300e8a02611bb788ee3bffchrismair new RetrCommandHandler() 112fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 113fba2635c088b01af59300e8a02611bb788ee3bffchrismair 114fba2635c088b01af59300e8a02611bb788ee3bffchrismair Command createValidCommand() { 115fba2635c088b01af59300e8a02611bb788ee3bffchrismair return new Command(CommandNames.RETR, [FILE]) 116fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 117fba2635c088b01af59300e8a02611bb788ee3bffchrismair 118fba2635c088b01af59300e8a02611bb788ee3bffchrismair void setUp() { 119fba2635c088b01af59300e8a02611bb788ee3bffchrismair super.setUp() 120fba2635c088b01af59300e8a02611bb788ee3bffchrismair createDirectory(DIR) 121fba2635c088b01af59300e8a02611bb788ee3bffchrismair createFile(FILE, CONTENTS) 122fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 123fba2635c088b01af59300e8a02611bb788ee3bffchrismair 124fba2635c088b01af59300e8a02611bb788ee3bffchrismair} 125fba2635c088b01af59300e8a02611bb788ee3bffchrismair 126fba2635c088b01af59300e8a02611bb788ee3bffchrismairclass BadFileEntry extends FileEntry { 127fba2635c088b01af59300e8a02611bb788ee3bffchrismair 128fba2635c088b01af59300e8a02611bb788ee3bffchrismair BadFileEntry(String path) { 129fba2635c088b01af59300e8a02611bb788ee3bffchrismair super(path) 130fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 131fba2635c088b01af59300e8a02611bb788ee3bffchrismair 132fba2635c088b01af59300e8a02611bb788ee3bffchrismair InputStream createInputStream() { 133fba2635c088b01af59300e8a02611bb788ee3bffchrismair throw new FileSystemException("BAD", AbstractFakeCommandHandlerTestCase.ERROR_MESSAGE_KEY) 134fba2635c088b01af59300e8a02611bb788ee3bffchrismair } 135fba2635c088b01af59300e8a02611bb788ee3bffchrismair}