1dfb59d50631968ab1a13002ea5421ece93169851chrismair/*
2dfb59d50631968ab1a13002ea5421ece93169851chrismair * Copyright 2008 the original author or authors.
3dfb59d50631968ab1a13002ea5421ece93169851chrismair *
4dfb59d50631968ab1a13002ea5421ece93169851chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5dfb59d50631968ab1a13002ea5421ece93169851chrismair * you may not use this file except in compliance with the License.
6dfb59d50631968ab1a13002ea5421ece93169851chrismair * You may obtain a copy of the License at
7dfb59d50631968ab1a13002ea5421ece93169851chrismair *
8dfb59d50631968ab1a13002ea5421ece93169851chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9dfb59d50631968ab1a13002ea5421ece93169851chrismair *
10dfb59d50631968ab1a13002ea5421ece93169851chrismair * Unless required by applicable law or agreed to in writing, software
11dfb59d50631968ab1a13002ea5421ece93169851chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12dfb59d50631968ab1a13002ea5421ece93169851chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dfb59d50631968ab1a13002ea5421ece93169851chrismair * See the License for the specific language governing permissions and
14dfb59d50631968ab1a13002ea5421ece93169851chrismair * limitations under the License.
15dfb59d50631968ab1a13002ea5421ece93169851chrismair */
16dfb59d50631968ab1a13002ea5421ece93169851chrismairpackage org.mockftpserver.fake.command
17dfb59d50631968ab1a13002ea5421ece93169851chrismair
18dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.Command
19dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.CommandHandler
20dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.CommandNames
21dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.ReplyCodes
22dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.session.SessionKeys
23dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.fake.filesystem.FileSystemException
24dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.fake.filesystem.Permissions
25dfb59d50631968ab1a13002ea5421ece93169851chrismair
26dfb59d50631968ab1a13002ea5421ece93169851chrismair/**
27dfb59d50631968ab1a13002ea5421ece93169851chrismair * Tests for NlstCommandHandler
28dfb59d50631968ab1a13002ea5421ece93169851chrismair *
29dfb59d50631968ab1a13002ea5421ece93169851chrismair * @version $Revision$ - $Date$
30dfb59d50631968ab1a13002ea5421ece93169851chrismair *
31dfb59d50631968ab1a13002ea5421ece93169851chrismair * @author Chris Mair
32dfb59d50631968ab1a13002ea5421ece93169851chrismair */
33dfb59d50631968ab1a13002ea5421ece93169851chrismairclass NlstCommandHandlerTest extends AbstractFakeCommandHandlerTestCase {
34dfb59d50631968ab1a13002ea5421ece93169851chrismair
35dfb59d50631968ab1a13002ea5421ece93169851chrismair    def DIR = "/usr"
36dfb59d50631968ab1a13002ea5421ece93169851chrismair
37dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_SingleFile() {
38dfb59d50631968ab1a13002ea5421ece93169851chrismair        createFile("/usr/f1.txt")
39dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommandAndVerifySendDataReplies([DIR])
40dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionDataWithEndOfLine("f1.txt")
41dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
42dfb59d50631968ab1a13002ea5421ece93169851chrismair
43dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_FilesAndDirectories() {
44dfb59d50631968ab1a13002ea5421ece93169851chrismair        createFile("/usr/f1.txt")
45dfb59d50631968ab1a13002ea5421ece93169851chrismair        createDirectory("/usr/OtherFiles")
46dfb59d50631968ab1a13002ea5421ece93169851chrismair        createFile("/usr/f2.txt")
47dfb59d50631968ab1a13002ea5421ece93169851chrismair        createDirectory("/usr/Archive")
48dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommandAndVerifySendDataReplies([DIR])
49dfb59d50631968ab1a13002ea5421ece93169851chrismair
50dfb59d50631968ab1a13002ea5421ece93169851chrismair        def EXPECTED = ["f1.txt", "OtherFiles", "f2.txt", "Archive"] as Set
51dfb59d50631968ab1a13002ea5421ece93169851chrismair        def actualLines = session.sentData[0].tokenize(endOfLine()) as Set
52dfb59d50631968ab1a13002ea5421ece93169851chrismair        LOG.info("actualLines=$actualLines")
53dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert actualLines == EXPECTED
54dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionDataEndsWithEndOfLine()
55dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
56dfb59d50631968ab1a13002ea5421ece93169851chrismair
57dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_NoPath_UseCurrentDirectory() {
58dfb59d50631968ab1a13002ea5421ece93169851chrismair        createFile("/usr/f1.txt")
59dfb59d50631968ab1a13002ea5421ece93169851chrismair        session.setAttribute(SessionKeys.CURRENT_DIRECTORY, DIR)
60dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommandAndVerifySendDataReplies([])
61dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionDataWithEndOfLine("f1.txt")
62dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
63dfb59d50631968ab1a13002ea5421ece93169851chrismair
64dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_EmptyDirectory() {
65dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommandAndVerifySendDataReplies([DIR])
66dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionData("")
67dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
68dfb59d50631968ab1a13002ea5421ece93169851chrismair
69dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_PathSpecifiesAFile() {
70dfb59d50631968ab1a13002ea5421ece93169851chrismair        createFile("/usr/f1.txt")
71dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommandAndVerifySendDataReplies(["/usr/f1.txt"])
72dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionDataWithEndOfLine("f1.txt")
73dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
74dfb59d50631968ab1a13002ea5421ece93169851chrismair
75dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_PathDoesNotExist() {
76dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommandAndVerifySendDataReplies(["/DoesNotExist"])
77dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionData("")
78dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
79dfb59d50631968ab1a13002ea5421ece93169851chrismair
80dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_NoReadAccessToDirectory() {
81dfb59d50631968ab1a13002ea5421ece93169851chrismair        fileSystem.getEntry(DIR).permissions = new Permissions('-wx-wx-wx')
82dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
83dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
84dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(1, ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotRead', DIR])
85dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
86dfb59d50631968ab1a13002ea5421ece93169851chrismair
87dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_ListNamesThrowsException() {
88dfb59d50631968ab1a13002ea5421ece93169851chrismair        fileSystem.listNamesMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY)
89dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
90dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
91dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(1, ReplyCodes.SYSTEM_ERROR, ERROR_MESSAGE_KEY)
92dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
93dfb59d50631968ab1a13002ea5421ece93169851chrismair
94dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
95dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Helper Methods
96dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
97dfb59d50631968ab1a13002ea5421ece93169851chrismair
98dfb59d50631968ab1a13002ea5421ece93169851chrismair    CommandHandler createCommandHandler() {
99dfb59d50631968ab1a13002ea5421ece93169851chrismair        new NlstCommandHandler()
100dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
101dfb59d50631968ab1a13002ea5421ece93169851chrismair
102dfb59d50631968ab1a13002ea5421ece93169851chrismair    Command createValidCommand() {
103dfb59d50631968ab1a13002ea5421ece93169851chrismair        return new Command(CommandNames.NLST, [DIR])
104dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
105dfb59d50631968ab1a13002ea5421ece93169851chrismair
106dfb59d50631968ab1a13002ea5421ece93169851chrismair    void setUp() {
107dfb59d50631968ab1a13002ea5421ece93169851chrismair        super.setUp()
108dfb59d50631968ab1a13002ea5421ece93169851chrismair        createDirectory(DIR)
109dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
110dfb59d50631968ab1a13002ea5421ece93169851chrismair
111dfb59d50631968ab1a13002ea5421ece93169851chrismair}