1016b6dd21f1a552e28f4c6894b586b770241b0edchrismair/*
21b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair * Copyright 2010 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
351b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair    private static final DIR = '/'
361b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair    private static final FROM_FILE = "/from.txt"
371b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair    private static final TO_FILE = "/file.txt"
38144c0023f01b817d4b5300ad811084249e4fe851chrismair    private static final FROM_DIR = "/subdir"
399b31560d2bb49af587fe31dbc4f272d726eec298chrismair
401b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair    void testHandleCommand_SingleFile() {
41d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        createFile(FROM_FILE)
423523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
436fed98e9c695a9024ede347900c2689979ab5785chrismair        assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_FILE, TO_FILE])
44016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        assert !fileSystem.exists(FROM_FILE), FROM_FILE
45016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        assert fileSystem.exists(TO_FILE), TO_FILE
463523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(null)
479b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
489b31560d2bb49af587fe31dbc4f272d726eec298chrismair
491b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair    void testHandleCommand_SingleFile_PathIsRelative() {
50d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair        createFile(FROM_FILE)
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
70144c0023f01b817d4b5300ad811084249e4fe851chrismair    void testHandleCommand_EmptyDirectory() {
71144c0023f01b817d4b5300ad811084249e4fe851chrismair        final TO_DIR = "/newdir"
72144c0023f01b817d4b5300ad811084249e4fe851chrismair        createDirectory(FROM_DIR)
73144c0023f01b817d4b5300ad811084249e4fe851chrismair        setRenameFromSessionProperty(FROM_DIR)
74144c0023f01b817d4b5300ad811084249e4fe851chrismair        handleCommand([TO_DIR])
75144c0023f01b817d4b5300ad811084249e4fe851chrismair        assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_DIR, TO_DIR])
76144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert !fileSystem.exists(FROM_DIR), FROM_DIR
77144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert fileSystem.exists(TO_DIR), TO_DIR
78144c0023f01b817d4b5300ad811084249e4fe851chrismair        assertRenameFromSessionProperty(null)
79144c0023f01b817d4b5300ad811084249e4fe851chrismair    }
801b2cfa5d5068c4202a07cdd2133c3dc5b73fd953chrismair
81144c0023f01b817d4b5300ad811084249e4fe851chrismair    void testHandleCommand_DirectoryContainingFilesAndSubdirectory() {
82144c0023f01b817d4b5300ad811084249e4fe851chrismair        final TO_DIR = "/newdir"
83144c0023f01b817d4b5300ad811084249e4fe851chrismair        createDirectory(FROM_DIR)
84144c0023f01b817d4b5300ad811084249e4fe851chrismair        createFile(FROM_DIR + "/a.txt")
85144c0023f01b817d4b5300ad811084249e4fe851chrismair        createFile(FROM_DIR + "/b.txt")
86144c0023f01b817d4b5300ad811084249e4fe851chrismair        createDirectory(FROM_DIR + "/child/grandchild")
87144c0023f01b817d4b5300ad811084249e4fe851chrismair        setRenameFromSessionProperty(FROM_DIR)
88144c0023f01b817d4b5300ad811084249e4fe851chrismair        handleCommand([TO_DIR])
89144c0023f01b817d4b5300ad811084249e4fe851chrismair        assertSessionReply(ReplyCodes.RNTO_OK, ['rnto', FROM_DIR, TO_DIR])
90144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert !fileSystem.exists(FROM_DIR), FROM_DIR
91144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert fileSystem.exists(TO_DIR), TO_DIR
92144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert fileSystem.isFile(TO_DIR + "/a.txt")
93144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert fileSystem.isFile(TO_DIR + "/b.txt")
94144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert fileSystem.isDirectory(TO_DIR + "/child")
95144c0023f01b817d4b5300ad811084249e4fe851chrismair        assert fileSystem.isDirectory(TO_DIR + "/child/grandchild")
96144c0023f01b817d4b5300ad811084249e4fe851chrismair        assertRenameFromSessionProperty(null)
97144c0023f01b817d4b5300ad811084249e4fe851chrismair    }
98144c0023f01b817d4b5300ad811084249e4fe851chrismair
99144c0023f01b817d4b5300ad811084249e4fe851chrismair    void testHandleCommand_ToDirectoryIsChildOfFromDirectory() {
100144c0023f01b817d4b5300ad811084249e4fe851chrismair        final TO_DIR = FROM_DIR + "/child"
101144c0023f01b817d4b5300ad811084249e4fe851chrismair        createDirectory(FROM_DIR)
102144c0023f01b817d4b5300ad811084249e4fe851chrismair        setRenameFromSessionProperty(FROM_DIR)
103144c0023f01b817d4b5300ad811084249e4fe851chrismair        handleCommand([TO_DIR])
104144c0023f01b817d4b5300ad811084249e4fe851chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.renameFailed', TO_DIR])
105144c0023f01b817d4b5300ad811084249e4fe851chrismair        assertRenameFromSessionProperty(FROM_DIR)
1069b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
1079b31560d2bb49af587fe31dbc4f272d726eec298chrismair
1083523138583059ccc39bd3fbd43e2c077747eb1afchrismair    void testHandleCommand_NoWriteAccessToDirectory() {
1093523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createFile(FROM_FILE)
1103523138583059ccc39bd3fbd43e2c077747eb1afchrismair        fileSystem.getEntry(DIR).permissions = new Permissions('r-xr-xr-x')
1113523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
1123523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', DIR])
1133523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
1143523138583059ccc39bd3fbd43e2c077747eb1afchrismair    }
1153523138583059ccc39bd3fbd43e2c077747eb1afchrismair
1163523138583059ccc39bd3fbd43e2c077747eb1afchrismair    void testHandleCommand_FromFileDoesNotExist() {
1173523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createDirectory(DIR)
1183523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
119b698aacfd0744243d4ec776cfd4eb1d43856961cchrismair        assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, ['filesystem.doesNotExist', FROM_FILE])
1203523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
1213523138583059ccc39bd3fbd43e2c077747eb1afchrismair    }
1223523138583059ccc39bd3fbd43e2c077747eb1afchrismair
1233523138583059ccc39bd3fbd43e2c077747eb1afchrismair    void testHandleCommand_ToFileParentDirectoryDoesNotExist() {
1243523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createFile(FROM_FILE)
1253523138583059ccc39bd3fbd43e2c077747eb1afchrismair        final BAD_DIR = p(DIR, 'SUB')
1263523138583059ccc39bd3fbd43e2c077747eb1afchrismair        final BAD_TO_FILE = p(BAD_DIR, 'Filename.txt')
1273523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([BAD_TO_FILE])
128b698aacfd0744243d4ec776cfd4eb1d43856961cchrismair        assertSessionReply(ReplyCodes.FILENAME_NOT_VALID, ['filesystem.doesNotExist', BAD_DIR])
1293523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
1309b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
1319b31560d2bb49af587fe31dbc4f272d726eec298chrismair
13270cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair    void testHandleCommand_RenameThrowsException() {
1333523138583059ccc39bd3fbd43e2c077747eb1afchrismair        createDirectory(DIR)
134f11ac5bf4a82c9be1ccd4933dedf730df3276e01chrismair        fileSystem.renameMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY)
1353523138583059ccc39bd3fbd43e2c077747eb1afchrismair        handleCommand([TO_FILE])
136c4a22299b897279a8518308b9067da84af077281chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ERROR_MESSAGE_KEY)
1373523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assertRenameFromSessionProperty(FROM_FILE)
1389b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
13970cc38904cf8c9abc6f9994cec83e2b7685a607dchrismair
140016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void testHandleCommand_MissingPathParameter() {
141016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        testHandleCommand_MissingRequiredParameter([])
142016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    }
1439b31560d2bb49af587fe31dbc4f272d726eec298chrismair
144016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    //-------------------------------------------------------------------------
145016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    // Helper Methods
146016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    //-------------------------------------------------------------------------
1479b31560d2bb49af587fe31dbc4f272d726eec298chrismair
1489b31560d2bb49af587fe31dbc4f272d726eec298chrismair    CommandHandler createCommandHandler() {
1499b31560d2bb49af587fe31dbc4f272d726eec298chrismair        new RntoCommandHandler()
1509b31560d2bb49af587fe31dbc4f272d726eec298chrismair    }
1519b31560d2bb49af587fe31dbc4f272d726eec298chrismair
152016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    Command createValidCommand() {
153016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        return new Command(CommandNames.RNTO, [TO_FILE])
154016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    }
155016b6dd21f1a552e28f4c6894b586b770241b0edchrismair
156016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    void setUp() {
157016b6dd21f1a552e28f4c6894b586b770241b0edchrismair        super.setUp()
158144c0023f01b817d4b5300ad811084249e4fe851chrismair        setCurrentDirectory(DIR)
159144c0023f01b817d4b5300ad811084249e4fe851chrismair        setRenameFromSessionProperty(FROM_FILE)
160144c0023f01b817d4b5300ad811084249e4fe851chrismair    }
161144c0023f01b817d4b5300ad811084249e4fe851chrismair
162144c0023f01b817d4b5300ad811084249e4fe851chrismair    private void setRenameFromSessionProperty(String renameFrom) {
163144c0023f01b817d4b5300ad811084249e4fe851chrismair        session.setAttribute(SessionKeys.RENAME_FROM, renameFrom)
164016b6dd21f1a552e28f4c6894b586b770241b0edchrismair    }
1659b31560d2bb49af587fe31dbc4f272d726eec298chrismair
1663523138583059ccc39bd3fbd43e2c077747eb1afchrismair    private void assertRenameFromSessionProperty(String value) {
1673523138583059ccc39bd3fbd43e2c077747eb1afchrismair        assert session.getAttribute(SessionKeys.RENAME_FROM) == value
1683523138583059ccc39bd3fbd43e2c077747eb1afchrismair    }
1693523138583059ccc39bd3fbd43e2c077747eb1afchrismair
170016b6dd21f1a552e28f4c6894b586b770241b0edchrismair}