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