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