100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/*
200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Copyright 2008 the original author or authors.
300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Licensed under the Apache License, Version 2.0 (the "License");
500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * you may not use this file except in compliance with the License.
600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * You may obtain a copy of the License at
700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *      http://www.apache.org/licenses/LICENSE-2.0
900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
1000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Unless required by applicable law or agreed to in writing, software
1100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * See the License for the specific language governing permissions and
1400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * limitations under the License.
1500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
1600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpackage org.mockftpserver.fake.command
1700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
1800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.Command
1900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.CommandHandler
2000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.CommandNames
2100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.command.ReplyCodes
2200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.session.SessionKeys
2300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.FileSystemException
2400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.fake.filesystem.Permissions
2500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
2600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/**
2700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Tests for NlstCommandHandler
2800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
2900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @version $Revision$ - $Date$
3000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
3100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @author Chris Mair
3200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
3300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairclass NlstCommandHandlerTest extends AbstractFakeCommandHandlerTestCase {
3400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    def DIR = "/usr"
3600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_SingleFile() {
3800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createFile("/usr/f1.txt")
3900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommandAndVerifySendDataReplies([DIR])
4000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionDataWithEndOfLine("f1.txt")
4100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
4200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
4300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_FilesAndDirectories() {
4400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createFile("/usr/f1.txt")
4500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createDirectory("/usr/OtherFiles")
4600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createFile("/usr/f2.txt")
4700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createDirectory("/usr/Archive")
4800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommandAndVerifySendDataReplies([DIR])
4900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def EXPECTED = ["f1.txt", "OtherFiles", "f2.txt", "Archive"] as Set
5100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def actualLines = session.sentData[0].tokenize(endOfLine()) as Set
5200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("actualLines=$actualLines")
5300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert actualLines == EXPECTED
5400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionDataEndsWithEndOfLine()
5500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
5600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_NoPath_UseCurrentDirectory() {
5800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createFile("/usr/f1.txt")
5900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        session.setAttribute(SessionKeys.CURRENT_DIRECTORY, DIR)
6000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommandAndVerifySendDataReplies([])
6100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionDataWithEndOfLine("f1.txt")
6200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
6300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_EmptyDirectory() {
6500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommandAndVerifySendDataReplies([DIR])
6600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionData("")
6700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
6800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_PathSpecifiesAFile() {
7000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createFile("/usr/f1.txt")
7100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommandAndVerifySendDataReplies(["/usr/f1.txt"])
7200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionDataWithEndOfLine("f1.txt")
7300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
7400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_PathDoesNotExist() {
7600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommandAndVerifySendDataReplies(["/DoesNotExist"])
7700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionData("")
7800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
7900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_NoReadAccessToDirectory() {
8100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.getEntry(DIR).permissions = new Permissions('-wx-wx-wx')
8200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommand([DIR])
8300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
8400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionReply(1, ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotRead', DIR])
8500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
8600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testHandleCommand_ListNamesThrowsException() {
8800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.listNamesMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY)
8900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        handleCommand([DIR])
9000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
9100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertSessionReply(1, ReplyCodes.SYSTEM_ERROR, ERROR_MESSAGE_KEY)
9200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
9300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
9500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Helper Methods
9600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //-------------------------------------------------------------------------
9700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    CommandHandler createCommandHandler() {
9900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        new NlstCommandHandler()
10000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    Command createValidCommand() {
10300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        return new Command(CommandNames.NLST, [DIR])
10400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void setUp() {
10700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        super.setUp()
10800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        createDirectory(DIR)
10900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
11000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair}