1ad98f727deebfd941b446f0f82337b2244e43b6cchrismair/* 2ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * Copyright 2008 the original author or authors. 3ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * 4ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * you may not use this file except in compliance with the License. 6ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * You may obtain a copy of the License at 7ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * 8ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * http://www.apache.org/licenses/LICENSE-2.0 9ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * 10ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * Unless required by applicable law or agreed to in writing, software 11ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * distributed under the License is distributed on an "AS IS" BASIS, 12ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * See the License for the specific language governing permissions and 14ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * limitations under the License. 15ad98f727deebfd941b446f0f82337b2244e43b6cchrismair */ 16ad98f727deebfd941b446f0f82337b2244e43b6cchrismairpackage org.mockftpserver.fake.command 17ad98f727deebfd941b446f0f82337b2244e43b6cchrismair 18ad98f727deebfd941b446f0f82337b2244e43b6cchrismairimport org.mockftpserver.core.command.Command 19ad98f727deebfd941b446f0f82337b2244e43b6cchrismairimport org.mockftpserver.core.command.CommandHandler 2070cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.core.command.CommandNames 2170cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.core.command.ReplyCodes 22ad98f727deebfd941b446f0f82337b2244e43b6cchrismairimport org.mockftpserver.core.session.SessionKeys 235e9566a04364b1cad5c33001a37d4638bc8a93e6chrismairimport org.mockftpserver.fake.filesystem.DirectoryEntry 245e9566a04364b1cad5c33001a37d4638bc8a93e6chrismairimport org.mockftpserver.fake.filesystem.DirectoryListingFormatter 255e9566a04364b1cad5c33001a37d4638bc8a93e6chrismairimport org.mockftpserver.fake.filesystem.FileEntry 265e9566a04364b1cad5c33001a37d4638bc8a93e6chrismairimport org.mockftpserver.fake.filesystem.FileSystemEntry 275e9566a04364b1cad5c33001a37d4638bc8a93e6chrismairimport org.mockftpserver.fake.filesystem.FileSystemException 285e9566a04364b1cad5c33001a37d4638bc8a93e6chrismairimport org.mockftpserver.fake.filesystem.Permissions 291dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair 30ad98f727deebfd941b446f0f82337b2244e43b6cchrismair/** 31ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * Tests for ListCommandHandler 325e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair * 337d4a3a2990f1a386eaf9d50cf05a9d45fab32de6chrismair * @version $Revision$ - $Date$ 34ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * 35ad98f727deebfd941b446f0f82337b2244e43b6cchrismair * @author Chris Mair 36ad98f727deebfd941b446f0f82337b2244e43b6cchrismair */ 375303c6ae1dde5f399fe48803e677942fc4326344chrismairclass ListCommandHandlerTest extends AbstractFakeCommandHandlerTestCase { 38ad98f727deebfd941b446f0f82337b2244e43b6cchrismair 391e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair private static final DIR = "/usr" 401e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair private static final NAME = "abc.txt" 411e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair private static final LAST_MODIFIED = new Date() 425e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 431e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void testHandleCommand_SingleFile() { 441dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair final entry = new FileEntry(path: p(DIR, NAME), lastModified: LAST_MODIFIED, contents: "abc") 45ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair fileSystem.add(entry) 461e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair handleCommandAndVerifySendDataReplies([DIR]) 4704619350e6e8866897490ea88b9fdf5824ab9bb1chrismair assertSessionDataWithEndOfLine(listingFor(entry)) 485e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 491e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair 501e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void testHandleCommand_FilesAndDirectories() { 511e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair def DATA3 = "".padRight(1000, 'x') 521dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair final entry1 = new FileEntry(path: p(DIR, "abc.txt"), lastModified: LAST_MODIFIED, contents: "abc") 531dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair final entry2 = new DirectoryEntry(path: p(DIR, "OtherFiles"), lastModified: LAST_MODIFIED) 541dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair final entry3 = new FileEntry(path: p(DIR, "another_file.doc"), lastModified: LAST_MODIFIED, contents: DATA3) 55ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair fileSystem.add(entry1) 56ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair fileSystem.add(entry2) 57ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair fileSystem.add(entry3) 581e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair 591e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair handleCommandAndVerifySendDataReplies([DIR]) 605e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 611e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair def actualLines = session.sentData[0].tokenize(endOfLine()) as Set 621e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair LOG.info("actualLines=$actualLines") 631e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair def EXPECTED = [ 641dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair listingFor(entry1), 651dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair listingFor(entry2), 661dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair listingFor(entry3)] as Set 671e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair assert actualLines == EXPECTED 6804619350e6e8866897490ea88b9fdf5824ab9bb1chrismair assertSessionDataEndsWithEndOfLine() 695e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 705e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 711e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void testHandleCommand_NoPath_UseCurrentDirectory() { 721dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair final entry = new FileEntry(path: p(DIR, NAME), lastModified: LAST_MODIFIED, contents: "abc") 73ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair fileSystem.add(entry) 741e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair session.setAttribute(SessionKeys.CURRENT_DIRECTORY, DIR) 751e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair handleCommandAndVerifySendDataReplies([]) 7604619350e6e8866897490ea88b9fdf5824ab9bb1chrismair assertSessionDataWithEndOfLine(listingFor(entry)) 775e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 781e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair 791e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void testHandleCommand_EmptyDirectory() { 801e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair handleCommandAndVerifySendDataReplies([DIR]) 811e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair assertSessionData("") 825e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 835e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 841e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void testHandleCommand_PathSpecifiesAFile() { 851dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair final entry = new FileEntry(path: p(DIR, NAME), lastModified: LAST_MODIFIED, contents: "abc") 86ac0730d4a280669a43eec1f443bccdcb2adef7b3chrismair fileSystem.add(entry) 875e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair handleCommandAndVerifySendDataReplies([p(DIR, NAME)]) 8804619350e6e8866897490ea88b9fdf5824ab9bb1chrismair assertSessionDataWithEndOfLine(listingFor(entry)) 895e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 905e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 911e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void testHandleCommand_PathDoesNotExist() { 921e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair handleCommandAndVerifySendDataReplies(["/DoesNotExist"]) 931e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair assertSessionData("") 945e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 955e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 96e42ece0794bacd19a1a3a984294f0227120109c8chrismair void testHandleCommand_NoReadAccessToDirectory() { 97e42ece0794bacd19a1a3a984294f0227120109c8chrismair fileSystem.getEntry(DIR).permissions = new Permissions('-wx-wx-wx') 98e42ece0794bacd19a1a3a984294f0227120109c8chrismair handleCommand([DIR]) 99e42ece0794bacd19a1a3a984294f0227120109c8chrismair assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK) 100c4a22299b897279a8518308b9067da84af077281chrismair assertSessionReply(1, ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotRead', DIR]) 101e42ece0794bacd19a1a3a984294f0227120109c8chrismair } 102e42ece0794bacd19a1a3a984294f0227120109c8chrismair 10370cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair void testHandleCommand_ListFilesThrowsException() { 104ef13cb2302efe30bdff397e11aae379cbb419b9bchrismair fileSystem.listFilesMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY) 10570cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair handleCommand([DIR]) 106777c1c842d19df00d2529ccf43e4f4c26cfd39fbchrismair assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK) 107777c1c842d19df00d2529ccf43e4f4c26cfd39fbchrismair assertSessionReply(1, ReplyCodes.SYSTEM_ERROR, ERROR_MESSAGE_KEY) 10870cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair } 10970cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair 110ad98f727deebfd941b446f0f82337b2244e43b6cchrismair //------------------------------------------------------------------------- 111ad98f727deebfd941b446f0f82337b2244e43b6cchrismair // Helper Methods 112ad98f727deebfd941b446f0f82337b2244e43b6cchrismair //------------------------------------------------------------------------- 1135e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 1145e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair CommandHandler createCommandHandler() { 1155e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair new ListCommandHandler() 1165e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair } 1175e4167540f70a75ce28b9c69a41db7ee38c22de3chrismair 118ad98f727deebfd941b446f0f82337b2244e43b6cchrismair Command createValidCommand() { 119ad98f727deebfd941b446f0f82337b2244e43b6cchrismair return new Command(CommandNames.LIST, [DIR]) 120ad98f727deebfd941b446f0f82337b2244e43b6cchrismair } 121ad98f727deebfd941b446f0f82337b2244e43b6cchrismair 1221e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair void setUp() { 1231e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair super.setUp() 124e42ece0794bacd19a1a3a984294f0227120109c8chrismair createDirectory(DIR) 1251dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair fileSystem.directoryListingFormatter = [format: {entry -> entry.toString()}] as DirectoryListingFormatter 1261e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair } 1271e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair 1281dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair private listingFor(FileSystemEntry fileSystemEntry) { 1291dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair fileSystemEntry.toString() 1301e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair } 1311e8ba1673aa4e1b7a1cd6489cbf8b58868db53d6chrismair 132ad98f727deebfd941b446f0f82337b2244e43b6cchrismair}