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.CommandNames 20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.ReplyCodes 21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.FileEntry 22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.FileSystemEntry 23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.FileSystemException 24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.Permissions 25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/** 27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Abstract superclass for tests of Fake CommandHandlers that store a file (STOR, STOU, APPE) 28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * 29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision: 80 $ - $Date: 2008-07-07 22:15:50 -0400 (Mon, 07 Jul 2008) $ 30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * 31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair 32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */ 33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairabstract class AbstractStoreFileCommandHandlerTest extends AbstractFakeCommandHandlerTest { 34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair protected static final DIR = "/" 36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair protected static final FILENAME = "file.txt" 37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair protected static final FILE = p(DIR, FILENAME) 38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair protected static final CONTENTS = "abc" 39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair //------------------------------------------------------------------------- 41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair // Tests Common to All Subclasses 42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair //------------------------------------------------------------------------- 43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair void testHandleCommand_NoWriteAccessToExistingFile() { 45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair fileSystem.add(new FileEntry(path: FILE)) 46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair fileSystem.getEntry(FILE).permissions = Permissions.NONE 47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair handleCommand([FILE]) 48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', FILE]) 49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair void testHandleCommand_NoWriteAccessToDirectoryForNewFile() { 52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair fileSystem.getEntry(DIR).permissions = new Permissions('r-xr-xr-x') 53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair handleCommand([FILE]) 54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', DIR]) 55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair void testHandleCommand_NoExecuteAccessToDirectory() { 58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair fileSystem.add(new FileEntry(path: FILE)) 59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair fileSystem.getEntry(DIR).permissions = new Permissions('rw-rw-rw-') 60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair handleCommand([FILE]) 61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotExecute', DIR]) 62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair void testHandleCommand_ThrowsFileSystemException() { 65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair fileSystem.addMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY) 66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair handleCommand([FILE]) 68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK) 69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(1, ReplyCodes.WRITE_FILE_ERROR, ERROR_MESSAGE_KEY) 70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair //------------------------------------------------------------------------- 73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair // Abstract Method Declarations 74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair //------------------------------------------------------------------------- 75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair /** 77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Verify the created output file and return its full path 78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @return the full path to the created output file; the path may be absolute or relative 79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */ 80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair protected abstract String verifyOutputFile() 81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair //------------------------------------------------------------------------- 83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair // Helper Methods 84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair //------------------------------------------------------------------------- 85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair protected void testHandleCommand(List parameters, String messageKey, String contents) { 87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair session.dataToRead = CONTENTS.bytes 88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair handleCommand(parameters) 89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK) 90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assertSessionReply(1, ReplyCodes.TRANSFER_DATA_FINAL_OK, messageKey) 91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair def outputFile = verifyOutputFile() 93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair FileSystemEntry fileEntry = fileSystem.getEntry(outputFile) 95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair def actualContents = fileEntry.createInputStream().text 96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assert actualContents == contents 97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair assert fileEntry.permissions == userAccount.defaultPermissionsForNewFile 98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair Command createValidCommand() { 101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair return new Command(CommandNames.APPE, [FILE]) 102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair void setUp() { 105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair super.setUp() 106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair createDirectory(DIR) 107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair } 108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair 109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}