1fba2635c088b01af59300e8a02611bb788ee3bffchrismair/*
2fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Copyright 2008 the original author or authors.
3fba2635c088b01af59300e8a02611bb788ee3bffchrismair *
4fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Licensed under the Apache License, Version 2.0 (the "License");
5fba2635c088b01af59300e8a02611bb788ee3bffchrismair * you may not use this file except in compliance with the License.
6fba2635c088b01af59300e8a02611bb788ee3bffchrismair * You may obtain a copy of the License at
7fba2635c088b01af59300e8a02611bb788ee3bffchrismair *
8fba2635c088b01af59300e8a02611bb788ee3bffchrismair *      http://www.apache.org/licenses/LICENSE-2.0
9fba2635c088b01af59300e8a02611bb788ee3bffchrismair *
10fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Unless required by applicable law or agreed to in writing, software
11fba2635c088b01af59300e8a02611bb788ee3bffchrismair * distributed under the License is distributed on an "AS IS" BASIS,
12fba2635c088b01af59300e8a02611bb788ee3bffchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fba2635c088b01af59300e8a02611bb788ee3bffchrismair * See the License for the specific language governing permissions and
14fba2635c088b01af59300e8a02611bb788ee3bffchrismair * limitations under the License.
15fba2635c088b01af59300e8a02611bb788ee3bffchrismair */
16fba2635c088b01af59300e8a02611bb788ee3bffchrismairpackage org.mockftpserver.fake.command
17fba2635c088b01af59300e8a02611bb788ee3bffchrismair
18fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.Command
19fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.CommandHandler
20fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.CommandNames
21fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.command.ReplyCodes
22fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.core.session.SessionKeys
23fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.fake.filesystem.FileEntry
24fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.fake.filesystem.FileSystemException
25fba2635c088b01af59300e8a02611bb788ee3bffchrismairimport org.mockftpserver.fake.filesystem.Permissions
26fba2635c088b01af59300e8a02611bb788ee3bffchrismair
27fba2635c088b01af59300e8a02611bb788ee3bffchrismair/**
28fba2635c088b01af59300e8a02611bb788ee3bffchrismair * Tests for RetrCommandHandler
29fba2635c088b01af59300e8a02611bb788ee3bffchrismair *
30fba2635c088b01af59300e8a02611bb788ee3bffchrismair * @version $Revision$ - $Date$
31fba2635c088b01af59300e8a02611bb788ee3bffchrismair *
32fba2635c088b01af59300e8a02611bb788ee3bffchrismair * @author Chris Mair
33fba2635c088b01af59300e8a02611bb788ee3bffchrismair */
34fba2635c088b01af59300e8a02611bb788ee3bffchrismairclass RetrCommandHandlerTest extends AbstractFakeCommandHandlerTestCase {
35fba2635c088b01af59300e8a02611bb788ee3bffchrismair
36fba2635c088b01af59300e8a02611bb788ee3bffchrismair    def DIR = "/"
37fba2635c088b01af59300e8a02611bb788ee3bffchrismair    def FILENAME = "file.txt"
38fba2635c088b01af59300e8a02611bb788ee3bffchrismair    def FILE = p(DIR, FILENAME)
39fba2635c088b01af59300e8a02611bb788ee3bffchrismair    def CONTENTS = "abc\ndef\nghi"
40fba2635c088b01af59300e8a02611bb788ee3bffchrismair    def CONTENTS_ASCII = "abc\r\ndef\r\nghi"
41fba2635c088b01af59300e8a02611bb788ee3bffchrismair
42fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_MissingPathParameter() {
43fba2635c088b01af59300e8a02611bb788ee3bffchrismair        testHandleCommand_MissingRequiredParameter([])
44fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
45fba2635c088b01af59300e8a02611bb788ee3bffchrismair
46fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_AbsolutePath() {
47fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommandAndVerifySendDataReplies([FILE])
48fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionData(CONTENTS_ASCII)
49fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
50fba2635c088b01af59300e8a02611bb788ee3bffchrismair
51fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_AbsolutePath_NonAsciiMode() {
52fba2635c088b01af59300e8a02611bb788ee3bffchrismair        session.setAttribute(SessionKeys.ASCII_TYPE, false)
53fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommandAndVerifySendDataReplies([FILE])
54fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionData(CONTENTS)
55fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
56fba2635c088b01af59300e8a02611bb788ee3bffchrismair
57fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_RelativePath() {
58fba2635c088b01af59300e8a02611bb788ee3bffchrismair        setCurrentDirectory(DIR)
59fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommandAndVerifySendDataReplies([FILENAME])
60fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionData(CONTENTS_ASCII)
61fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
62fba2635c088b01af59300e8a02611bb788ee3bffchrismair
63fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_PathSpecifiesAnExistingDirectory() {
64fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommand([DIR])
65fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.isNotAFile', DIR])
66fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
67fba2635c088b01af59300e8a02611bb788ee3bffchrismair
68fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_PathDoesNotExist() {
69fba2635c088b01af59300e8a02611bb788ee3bffchrismair        def path = FILE + "XXX"
70fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommand([path])
71fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.doesNotExist', path])
72fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
73fba2635c088b01af59300e8a02611bb788ee3bffchrismair
74fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_NoReadAccessToFile() {
75fba2635c088b01af59300e8a02611bb788ee3bffchrismair        fileSystem.getEntry(FILE).permissions = Permissions.NONE
76fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommand([FILE])
77fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotRead', FILE])
78fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
79fba2635c088b01af59300e8a02611bb788ee3bffchrismair
80fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_NoExecuteAccessToDirectory() {
81fba2635c088b01af59300e8a02611bb788ee3bffchrismair        fileSystem.getEntry(DIR).permissions = Permissions.NONE
82fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommand([FILE])
83fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotExecute', DIR])
84fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
85fba2635c088b01af59300e8a02611bb788ee3bffchrismair
86fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testHandleCommand_ThrowsFileSystemException() {
87fba2635c088b01af59300e8a02611bb788ee3bffchrismair        fileSystem.delete(FILE)
88fba2635c088b01af59300e8a02611bb788ee3bffchrismair        def fileEntry = new BadFileEntry(FILE)
89fba2635c088b01af59300e8a02611bb788ee3bffchrismair        fileSystem.add(fileEntry)
90fba2635c088b01af59300e8a02611bb788ee3bffchrismair
91fba2635c088b01af59300e8a02611bb788ee3bffchrismair        handleCommand([FILE])
92fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
93fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assertSessionReply(1, ReplyCodes.READ_FILE_ERROR, ERROR_MESSAGE_KEY)
94fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
95fba2635c088b01af59300e8a02611bb788ee3bffchrismair
96fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void testConvertLfToCrLf() {
97fba2635c088b01af59300e8a02611bb788ee3bffchrismair        // LF='\n' and CRLF='\r\n'
98fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assert commandHandler.convertLfToCrLf('abc'.bytes) == 'abc'.bytes
99fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assert commandHandler.convertLfToCrLf('abc\r\ndef'.bytes) == 'abc\r\ndef'.bytes
100fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assert commandHandler.convertLfToCrLf('abc\ndef'.bytes) == 'abc\r\ndef'.bytes
101fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assert commandHandler.convertLfToCrLf('abc\ndef\nghi'.bytes) == 'abc\r\ndef\r\nghi'.bytes
102fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assert commandHandler.convertLfToCrLf('\n'.bytes) == '\r\n'.bytes
103fba2635c088b01af59300e8a02611bb788ee3bffchrismair        assert commandHandler.convertLfToCrLf('\r\nabc\n'.bytes) == '\r\nabc\r\n'.bytes
104fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
105fba2635c088b01af59300e8a02611bb788ee3bffchrismair
106fba2635c088b01af59300e8a02611bb788ee3bffchrismair    //-------------------------------------------------------------------------
107fba2635c088b01af59300e8a02611bb788ee3bffchrismair    // Helper Methods
108fba2635c088b01af59300e8a02611bb788ee3bffchrismair    //-------------------------------------------------------------------------
109fba2635c088b01af59300e8a02611bb788ee3bffchrismair
110fba2635c088b01af59300e8a02611bb788ee3bffchrismair    CommandHandler createCommandHandler() {
111fba2635c088b01af59300e8a02611bb788ee3bffchrismair        new RetrCommandHandler()
112fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
113fba2635c088b01af59300e8a02611bb788ee3bffchrismair
114fba2635c088b01af59300e8a02611bb788ee3bffchrismair    Command createValidCommand() {
115fba2635c088b01af59300e8a02611bb788ee3bffchrismair        return new Command(CommandNames.RETR, [FILE])
116fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
117fba2635c088b01af59300e8a02611bb788ee3bffchrismair
118fba2635c088b01af59300e8a02611bb788ee3bffchrismair    void setUp() {
119fba2635c088b01af59300e8a02611bb788ee3bffchrismair        super.setUp()
120fba2635c088b01af59300e8a02611bb788ee3bffchrismair        createDirectory(DIR)
121fba2635c088b01af59300e8a02611bb788ee3bffchrismair        createFile(FILE, CONTENTS)
122fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
123fba2635c088b01af59300e8a02611bb788ee3bffchrismair
124fba2635c088b01af59300e8a02611bb788ee3bffchrismair}
125fba2635c088b01af59300e8a02611bb788ee3bffchrismair
126fba2635c088b01af59300e8a02611bb788ee3bffchrismairclass BadFileEntry extends FileEntry {
127fba2635c088b01af59300e8a02611bb788ee3bffchrismair
128fba2635c088b01af59300e8a02611bb788ee3bffchrismair    BadFileEntry(String path) {
129fba2635c088b01af59300e8a02611bb788ee3bffchrismair        super(path)
130fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
131fba2635c088b01af59300e8a02611bb788ee3bffchrismair
132fba2635c088b01af59300e8a02611bb788ee3bffchrismair    InputStream createInputStream() {
133fba2635c088b01af59300e8a02611bb788ee3bffchrismair        throw new FileSystemException("BAD", AbstractFakeCommandHandlerTestCase.ERROR_MESSAGE_KEY)
134fba2635c088b01af59300e8a02611bb788ee3bffchrismair    }
135fba2635c088b01af59300e8a02611bb788ee3bffchrismair}