1016b6dd21f1a552e28f4c6894b586b770241b0edchrismair/* 21b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair * Copyright 2010 the original author or authors. 3016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * 4016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * you may not use this file except in compliance with the License. 6016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * You may obtain a copy of the License at 7016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * 8016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * http://www.apache.org/licenses/LICENSE-2.0 9016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * 10016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Unless required by applicable law or agreed to in writing, software 11016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * distributed under the License is distributed on an "AS IS" BASIS, 12016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * See the License for the specific language governing permissions and 14016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * limitations under the License. 15016b6dd21f1a552e28f4c6894b586b770241b0edchrismair */ 16016b6dd21f1a552e28f4c6894b586b770241b0edchrismairpackage org.mockftpserver.fake.command 17016b6dd21f1a552e28f4c6894b586b770241b0edchrismair 18016b6dd21f1a552e28f4c6894b586b770241b0edchrismairimport org.mockftpserver.core.command.Command 19016b6dd21f1a552e28f4c6894b586b770241b0edchrismairimport org.mockftpserver.core.command.CommandHandler 2070cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.core.command.CommandNames 2170cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.core.command.ReplyCodes 229b31560d2bb49af587fe31dbc4f272d726eec298chrismairimport org.mockftpserver.core.session.SessionKeys 2370cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.fake.filesystem.FileSystemException 243523138583059ccc39bd3fbd43e2c077747eb1afchrismairimport org.mockftpserver.fake.filesystem.Permissions 2570cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair 26016b6dd21f1a552e28f4c6894b586b770241b0edchrismair/** 27016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Tests for RntoCommandHandler 289b31560d2bb49af587fe31dbc4f272d726eec298chrismair * 297d4a3a2990f1a386eaf9d50cf05a9d45fab32de6chrismair * @version $Revision$ - $Date$ 30016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * 31016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * @author Chris Mair 32016b6dd21f1a552e28f4c6894b586b770241b0edchrismair */ 335303c6ae1dde5f399fe48803e677942fc4326344chrismairclass RntoCommandHandlerTest extends AbstractFakeCommandHandlerTestCase { 34016b6dd21f1a552e28f4c6894b586b770241b0edchrismair 351b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair private static final DIR = '/' 361b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair private static final FROM_FILE = "/from.txt" 371b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair private static final TO_FILE = "/file.txt" 38144c0023f01b817d4b5300ad811084249e4fe851chrismair private static final FROM_DIR = "/subdir" 399b31560d2bb49af587fe31dbc4f272d726eec298chrismair 401b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair void testHandleCommand_SingleFile() { 41d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair createFile(FROM_FILE) 423523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand([TO_FILE]) 436fed98e9c695a9024ede347900c2689979ab5785chrismair assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_FILE, TO_FILE]) 44016b6dd21f1a552e28f4c6894b586b770241b0edchrismair assert !fileSystem.exists(FROM_FILE), FROM_FILE 45016b6dd21f1a552e28f4c6894b586b770241b0edchrismair assert fileSystem.exists(TO_FILE), TO_FILE 463523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(null) 479b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 489b31560d2bb49af587fe31dbc4f272d726eec298chrismair 491b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair void testHandleCommand_SingleFile_PathIsRelative() { 50d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair createFile(FROM_FILE) 513523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand(["file.txt"]) 526fed98e9c695a9024ede347900c2689979ab5785chrismair assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_FILE, 'file.txt']) 53cb6dfe65d98c626326091432c4824764f38ab032chrismair assert !fileSystem.exists(FROM_FILE), FROM_FILE 54cb6dfe65d98c626326091432c4824764f38ab032chrismair assert fileSystem.exists(TO_FILE), TO_FILE 553523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(null) 569b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 579b31560d2bb49af587fe31dbc4f272d726eec298chrismair 58016b6dd21f1a552e28f4c6894b586b770241b0edchrismair void testHandleCommand_FromFileNotSetInSession() { 59016b6dd21f1a552e28f4c6894b586b770241b0edchrismair session.removeAttribute(SessionKeys.RENAME_FROM) 60016b6dd21f1a552e28f4c6894b586b770241b0edchrismair testHandleCommand_MissingRequiredSessionAttribute() 619b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 62016b6dd21f1a552e28f4c6894b586b770241b0edchrismair 63016b6dd21f1a552e28f4c6894b586b770241b0edchrismair void testHandleCommand_ToFilenameNotValid() { 64d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair createFile(FROM_FILE) 653523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand([""]) 66835a1f6146e3521d2751e7b872d9f3fd85d6a43dchrismair assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, "") 673523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(FROM_FILE) 689b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 699b31560d2bb49af587fe31dbc4f272d726eec298chrismair 70144c0023f01b817d4b5300ad811084249e4fe851chrismair void testHandleCommand_EmptyDirectory() { 71144c0023f01b817d4b5300ad811084249e4fe851chrismair final TO_DIR = "/newdir" 72144c0023f01b817d4b5300ad811084249e4fe851chrismair createDirectory(FROM_DIR) 73144c0023f01b817d4b5300ad811084249e4fe851chrismair setRenameFromSessionProperty(FROM_DIR) 74144c0023f01b817d4b5300ad811084249e4fe851chrismair handleCommand([TO_DIR]) 75144c0023f01b817d4b5300ad811084249e4fe851chrismair assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_DIR, TO_DIR]) 76144c0023f01b817d4b5300ad811084249e4fe851chrismair assert !fileSystem.exists(FROM_DIR), FROM_DIR 77144c0023f01b817d4b5300ad811084249e4fe851chrismair assert fileSystem.exists(TO_DIR), TO_DIR 78144c0023f01b817d4b5300ad811084249e4fe851chrismair assertRenameFromSessionProperty(null) 79144c0023f01b817d4b5300ad811084249e4fe851chrismair } 801b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair 81144c0023f01b817d4b5300ad811084249e4fe851chrismair void testHandleCommand_DirectoryContainingFilesAndSubdirectory() { 82144c0023f01b817d4b5300ad811084249e4fe851chrismair final TO_DIR = "/newdir" 83144c0023f01b817d4b5300ad811084249e4fe851chrismair createDirectory(FROM_DIR) 84144c0023f01b817d4b5300ad811084249e4fe851chrismair createFile(FROM_DIR + "/a.txt") 85144c0023f01b817d4b5300ad811084249e4fe851chrismair createFile(FROM_DIR + "/b.txt") 86144c0023f01b817d4b5300ad811084249e4fe851chrismair createDirectory(FROM_DIR + "/child/grandchild") 87144c0023f01b817d4b5300ad811084249e4fe851chrismair setRenameFromSessionProperty(FROM_DIR) 88144c0023f01b817d4b5300ad811084249e4fe851chrismair handleCommand([TO_DIR]) 89144c0023f01b817d4b5300ad811084249e4fe851chrismair assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_DIR, TO_DIR]) 90144c0023f01b817d4b5300ad811084249e4fe851chrismair assert !fileSystem.exists(FROM_DIR), FROM_DIR 91144c0023f01b817d4b5300ad811084249e4fe851chrismair assert fileSystem.exists(TO_DIR), TO_DIR 92144c0023f01b817d4b5300ad811084249e4fe851chrismair assert fileSystem.isFile(TO_DIR + "/a.txt") 93144c0023f01b817d4b5300ad811084249e4fe851chrismair assert fileSystem.isFile(TO_DIR + "/b.txt") 94144c0023f01b817d4b5300ad811084249e4fe851chrismair assert fileSystem.isDirectory(TO_DIR + "/child") 95144c0023f01b817d4b5300ad811084249e4fe851chrismair assert fileSystem.isDirectory(TO_DIR + "/child/grandchild") 96144c0023f01b817d4b5300ad811084249e4fe851chrismair assertRenameFromSessionProperty(null) 97144c0023f01b817d4b5300ad811084249e4fe851chrismair } 98144c0023f01b817d4b5300ad811084249e4fe851chrismair 99144c0023f01b817d4b5300ad811084249e4fe851chrismair void testHandleCommand_ToDirectoryIsChildOfFromDirectory() { 100144c0023f01b817d4b5300ad811084249e4fe851chrismair final TO_DIR = FROM_DIR + "/child" 101144c0023f01b817d4b5300ad811084249e4fe851chrismair createDirectory(FROM_DIR) 102144c0023f01b817d4b5300ad811084249e4fe851chrismair setRenameFromSessionProperty(FROM_DIR) 103144c0023f01b817d4b5300ad811084249e4fe851chrismair handleCommand([TO_DIR]) 104144c0023f01b817d4b5300ad811084249e4fe851chrismair assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.renameFailed', TO_DIR]) 105144c0023f01b817d4b5300ad811084249e4fe851chrismair assertRenameFromSessionProperty(FROM_DIR) 1069b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 1079b31560d2bb49af587fe31dbc4f272d726eec298chrismair 1083523138583059ccc39bd3fbd43e2c077747eb1afchrismair void testHandleCommand_NoWriteAccessToDirectory() { 1093523138583059ccc39bd3fbd43e2c077747eb1afchrismair createFile(FROM_FILE) 1103523138583059ccc39bd3fbd43e2c077747eb1afchrismair fileSystem.getEntry(DIR).permissions = new Permissions('r-xr-xr-x') 1113523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand([TO_FILE]) 1123523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', DIR]) 1133523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(FROM_FILE) 1143523138583059ccc39bd3fbd43e2c077747eb1afchrismair } 1153523138583059ccc39bd3fbd43e2c077747eb1afchrismair 1163523138583059ccc39bd3fbd43e2c077747eb1afchrismair void testHandleCommand_FromFileDoesNotExist() { 1173523138583059ccc39bd3fbd43e2c077747eb1afchrismair createDirectory(DIR) 1183523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand([TO_FILE]) 119b698aacfd0744243d4ec776cfd4eb1d43856961cchrismair assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, ['filesystem.doesNotExist', FROM_FILE]) 1203523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(FROM_FILE) 1213523138583059ccc39bd3fbd43e2c077747eb1afchrismair } 1223523138583059ccc39bd3fbd43e2c077747eb1afchrismair 1233523138583059ccc39bd3fbd43e2c077747eb1afchrismair void testHandleCommand_ToFileParentDirectoryDoesNotExist() { 1243523138583059ccc39bd3fbd43e2c077747eb1afchrismair createFile(FROM_FILE) 1253523138583059ccc39bd3fbd43e2c077747eb1afchrismair final BAD_DIR = p(DIR, 'SUB') 1263523138583059ccc39bd3fbd43e2c077747eb1afchrismair final BAD_TO_FILE = p(BAD_DIR, 'Filename.txt') 1273523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand([BAD_TO_FILE]) 128b698aacfd0744243d4ec776cfd4eb1d43856961cchrismair assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, ['filesystem.doesNotExist', BAD_DIR]) 1293523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(FROM_FILE) 1309b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 1319b31560d2bb49af587fe31dbc4f272d726eec298chrismair 13270cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair void testHandleCommand_RenameThrowsException() { 1333523138583059ccc39bd3fbd43e2c077747eb1afchrismair createDirectory(DIR) 134f11ac5bf4a82c9be1ccd4933dedf730df3276e01chrismair fileSystem.renameMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY) 1353523138583059ccc39bd3fbd43e2c077747eb1afchrismair handleCommand([TO_FILE]) 136c4a22299b897279a8518308b9067da84af077281chrismair assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ERROR_MESSAGE_KEY) 1373523138583059ccc39bd3fbd43e2c077747eb1afchrismair assertRenameFromSessionProperty(FROM_FILE) 1389b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 13970cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair 140016b6dd21f1a552e28f4c6894b586b770241b0edchrismair void testHandleCommand_MissingPathParameter() { 141016b6dd21f1a552e28f4c6894b586b770241b0edchrismair testHandleCommand_MissingRequiredParameter([]) 142016b6dd21f1a552e28f4c6894b586b770241b0edchrismair } 1439b31560d2bb49af587fe31dbc4f272d726eec298chrismair 144016b6dd21f1a552e28f4c6894b586b770241b0edchrismair //------------------------------------------------------------------------- 145016b6dd21f1a552e28f4c6894b586b770241b0edchrismair // Helper Methods 146016b6dd21f1a552e28f4c6894b586b770241b0edchrismair //------------------------------------------------------------------------- 1479b31560d2bb49af587fe31dbc4f272d726eec298chrismair 1489b31560d2bb49af587fe31dbc4f272d726eec298chrismair CommandHandler createCommandHandler() { 1499b31560d2bb49af587fe31dbc4f272d726eec298chrismair new RntoCommandHandler() 1509b31560d2bb49af587fe31dbc4f272d726eec298chrismair } 1519b31560d2bb49af587fe31dbc4f272d726eec298chrismair 152016b6dd21f1a552e28f4c6894b586b770241b0edchrismair Command createValidCommand() { 153016b6dd21f1a552e28f4c6894b586b770241b0edchrismair return new Command(CommandNames.RNTO, [TO_FILE]) 154016b6dd21f1a552e28f4c6894b586b770241b0edchrismair } 155016b6dd21f1a552e28f4c6894b586b770241b0edchrismair 156016b6dd21f1a552e28f4c6894b586b770241b0edchrismair void setUp() { 157016b6dd21f1a552e28f4c6894b586b770241b0edchrismair super.setUp() 158144c0023f01b817d4b5300ad811084249e4fe851chrismair setCurrentDirectory(DIR) 159144c0023f01b817d4b5300ad811084249e4fe851chrismair setRenameFromSessionProperty(FROM_FILE) 160144c0023f01b817d4b5300ad811084249e4fe851chrismair } 161144c0023f01b817d4b5300ad811084249e4fe851chrismair 162144c0023f01b817d4b5300ad811084249e4fe851chrismair private void setRenameFromSessionProperty(String renameFrom) { 163144c0023f01b817d4b5300ad811084249e4fe851chrismair session.setAttribute(SessionKeys.RENAME_FROM, renameFrom) 164016b6dd21f1a552e28f4c6894b586b770241b0edchrismair } 1659b31560d2bb49af587fe31dbc4f272d726eec298chrismair 1663523138583059ccc39bd3fbd43e2c077747eb1afchrismair private void assertRenameFromSessionProperty(String value) { 1673523138583059ccc39bd3fbd43e2c077747eb1afchrismair assert session.getAttribute(SessionKeys.RENAME_FROM) == value 1683523138583059ccc39bd3fbd43e2c077747eb1afchrismair } 1693523138583059ccc39bd3fbd43e2c077747eb1afchrismair 170016b6dd21f1a552e28f4c6894b586b770241b0edchrismair}