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}