RntoCommandHandlerTest.groovy revision 5303c6ae1dde5f399fe48803e677942fc4326344
1016b6dd21f1a552e28f4c6894b586b770241b0edchrismair/*
2016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Copyright 2008 the original author or authors.
3016b6dd21f1a552e28f4c6894b586b770241b0edchrismair *
4016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Licensed under the Apache License, Version 2.0 (the "License");
5016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * you may not use this file except in compliance with the License.
6016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * You may obtain a copy of the License at
7016b6dd21f1a552e28f4c6894b586b770241b0edchrismair *
8016b6dd21f1a552e28f4c6894b586b770241b0edchrismair *      http://www.apache.org/licenses/LICENSE-2.0
9016b6dd21f1a552e28f4c6894b586b770241b0edchrismair *
10016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Unless required by applicable law or agreed to in writing, software
11016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * distributed under the License is distributed on an "AS IS" BASIS,
12016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * See the License for the specific language governing permissions and
14016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * limitations under the License.
15016b6dd21f1a552e28f4c6894b586b770241b0edchrismair */
16016b6dd21f1a552e28f4c6894b586b770241b0edchrismairpackage org.mockftpserver.fake.command
17016b6dd21f1a552e28f4c6894b586b770241b0edchrismair
18016b6dd21f1a552e28f4c6894b586b770241b0edchrismairimport org.mockftpserver.core.command.Command
19016b6dd21f1a552e28f4c6894b586b770241b0edchrismairimport org.mockftpserver.core.command.CommandHandler
2070cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.core.command.CommandNames
2170cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.core.command.ReplyCodes
229b31560d2bb49af587fe31dbc4f272d726eec298chrismairimport org.mockftpserver.core.session.SessionKeys
2370cc38904cf8c9abc6f9994cec83e2b7685a607dchrismairimport org.mockftpserver.fake.filesystem.FileSystemException
243523138583059ccc39bd3fbd43e2c077747eb1afchrismairimport org.mockftpserver.fake.filesystem.Permissions
2570cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair
26016b6dd21f1a552e28f4c6894b586b770241b0edchrismair/**
27016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * Tests for RntoCommandHandler
289b31560d2bb49af587fe31dbc4f272d726eec298chrismair *
297d4a3a2990f1a386eaf9d50cf05a9d45fab32de6chrismair * @version $Revision$ - $Date$
30016b6dd21f1a552e28f4c6894b586b770241b0edchrismair *
31016b6dd21f1a552e28f4c6894b586b770241b0edchrismair * @author Chris Mair
32016b6dd21f1a552e28f4c6894b586b770241b0edchrismair */
335303c6ae1dde5f399fe48803e677942fc4326344chrismairclass RntoCommandHandlerTest extends AbstractFakeCommandHandlerTestCase {
34016b6dd21f1a552e28f4c6894b586b770241b0edchrismair
353523138583059ccc39bd3fbd43e2c077747eb1afchrismair    static final DIR = '/'
363523138583059ccc39bd3fbd43e2c077747eb1afchrismair    static final FROM_FILE = "/from.txt"
373523138583059ccc39bd3fbd43e2c077747eb1afchrismair    static final TO_FILE = "/file.txt"
389b31560d2bb49af587fe31dbc4f272d726eec298chrismair
39016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void testHandleCommand() {
40d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        createFile(FROM_FILE)
413523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
426fed98e9c695a9024ede347900c2689979ab5785chrismair        assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_FILE, TO_FILE])
43016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        assert !fileSystem.exists(FROM_FILE), FROM_FILE
44016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        assert fileSystem.exists(TO_FILE), TO_FILE
453523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(null)
469b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
479b31560d2bb49af587fe31dbc4f272d726eec298chrismair
48cb6dfe65d98c626326091432c4824764f38ab032chrismair    void testHandleCommand_PathIsRelative() {
49d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        createFile(FROM_FILE)
50cb6dfe65d98c626326091432c4824764f38ab032chrismair        session.setAttribute(SessionKeys.CURRENT_DIRECTORY, "/")
513523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand(["file.txt"])
526fed98e9c695a9024ede347900c2689979ab5785chrismair        assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_FILE, 'file.txt'])
53cb6dfe65d98c626326091432c4824764f38ab032chrismair        assert !fileSystem.exists(FROM_FILE), FROM_FILE
54cb6dfe65d98c626326091432c4824764f38ab032chrismair        assert fileSystem.exists(TO_FILE), TO_FILE
553523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(null)
569b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
579b31560d2bb49af587fe31dbc4f272d726eec298chrismair
58016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void testHandleCommand_FromFileNotSetInSession() {
59016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        session.removeAttribute(SessionKeys.RENAME_FROM)
60016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        testHandleCommand_MissingRequiredSessionAttribute()
619b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
62016b6dd21f1a552e28f4c6894b586b770241b0edchrismair
63016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void testHandleCommand_ToFilenameNotValid() {
64d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        createFile(FROM_FILE)
653523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([""])
66835a1f6146e3521d2751e7b872d9f3fd85d6a43dchrismair        assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, "")
673523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
689b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
699b31560d2bb49af587fe31dbc4f272d726eec298chrismair
70016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void testHandleCommand_ToFilenameSpecifiesADirectory() {
71d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        createDirectory(TO_FILE)
723523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
73c4a22299b897279a8518308b9067da84af077281chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.isDirectory', TO_FILE])
743523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
759b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
769b31560d2bb49af587fe31dbc4f272d726eec298chrismair
773523138583059ccc39bd3fbd43e2c077747eb1afchrismair    void testHandleCommand_NoWriteAccessToDirectory() {
783523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createFile(FROM_FILE)
793523138583059ccc39bd3fbd43e2c077747eb1afchrismair        fileSystem.getEntry(DIR).permissions = new Permissions('r-xr-xr-x')
803523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
813523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', DIR])
823523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
833523138583059ccc39bd3fbd43e2c077747eb1afchrismair    }
843523138583059ccc39bd3fbd43e2c077747eb1afchrismair
853523138583059ccc39bd3fbd43e2c077747eb1afchrismair    void testHandleCommand_FromFileDoesNotExist() {
863523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createDirectory(DIR)
873523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
88b698aacfd0744243d4ec776cfd4eb1d43856961cchrismair        assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, ['filesystem.doesNotExist', FROM_FILE])
893523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
903523138583059ccc39bd3fbd43e2c077747eb1afchrismair    }
913523138583059ccc39bd3fbd43e2c077747eb1afchrismair
923523138583059ccc39bd3fbd43e2c077747eb1afchrismair    void testHandleCommand_ToFileParentDirectoryDoesNotExist() {
933523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createFile(FROM_FILE)
943523138583059ccc39bd3fbd43e2c077747eb1afchrismair        final BAD_DIR = p(DIR, 'SUB')
953523138583059ccc39bd3fbd43e2c077747eb1afchrismair        final BAD_TO_FILE = p(BAD_DIR, 'Filename.txt')
963523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([BAD_TO_FILE])
97b698aacfd0744243d4ec776cfd4eb1d43856961cchrismair        assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, ['filesystem.doesNotExist', BAD_DIR])
983523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
999b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
1009b31560d2bb49af587fe31dbc4f272d726eec298chrismair
10170cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair    void testHandleCommand_RenameThrowsException() {
1023523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createDirectory(DIR)
103f11ac5bf4a82c9be1ccd4933dedf730df3276e01chrismair        fileSystem.renameMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY)
10470cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair
1053523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
106c4a22299b897279a8518308b9067da84af077281chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ERROR_MESSAGE_KEY)
1073523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
1089b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
10970cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair
110016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void testHandleCommand_MissingPathParameter() {
111016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        testHandleCommand_MissingRequiredParameter([])
112016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    }
1139b31560d2bb49af587fe31dbc4f272d726eec298chrismair
114016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    //-------------------------------------------------------------------------
115016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    // Helper Methods
116016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    //-------------------------------------------------------------------------
1179b31560d2bb49af587fe31dbc4f272d726eec298chrismair
1189b31560d2bb49af587fe31dbc4f272d726eec298chrismair    CommandHandler createCommandHandler() {
1199b31560d2bb49af587fe31dbc4f272d726eec298chrismair        new RntoCommandHandler()
1209b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
1219b31560d2bb49af587fe31dbc4f272d726eec298chrismair
122016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    Command createValidCommand() {
123016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        return new Command(CommandNames.RNTO, [TO_FILE])
124016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    }
125016b6dd21f1a552e28f4c6894b586b770241b0edchrismair
126016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void setUp() {
127016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        super.setUp()
128016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        session.setAttribute(SessionKeys.RENAME_FROM, FROM_FILE)
129016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    }
1309b31560d2bb49af587fe31dbc4f272d726eec298chrismair
1313523138583059ccc39bd3fbd43e2c077747eb1afchrismair    private void assertRenameFromSessionProperty(String value) {
1323523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assert session.getAttribute(SessionKeys.RENAME_FROM) == value
1333523138583059ccc39bd3fbd43e2c077747eb1afchrismair    }
1343523138583059ccc39bd3fbd43e2c077747eb1afchrismair
135016b6dd21f1a552e28f4c6894b586b770241b0edchrismair}