1dfb59d50631968ab1a13002ea5421ece93169851chrismair/*
2dfb59d50631968ab1a13002ea5421ece93169851chrismair * Copyright 2008 the original author or authors.
3dfb59d50631968ab1a13002ea5421ece93169851chrismair *
4dfb59d50631968ab1a13002ea5421ece93169851chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5dfb59d50631968ab1a13002ea5421ece93169851chrismair * you may not use this file except in compliance with the License.
6dfb59d50631968ab1a13002ea5421ece93169851chrismair * You may obtain a copy of the License at
7dfb59d50631968ab1a13002ea5421ece93169851chrismair *
8dfb59d50631968ab1a13002ea5421ece93169851chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9dfb59d50631968ab1a13002ea5421ece93169851chrismair *
10dfb59d50631968ab1a13002ea5421ece93169851chrismair * Unless required by applicable law or agreed to in writing, software
11dfb59d50631968ab1a13002ea5421ece93169851chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12dfb59d50631968ab1a13002ea5421ece93169851chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dfb59d50631968ab1a13002ea5421ece93169851chrismair * See the License for the specific language governing permissions and
14dfb59d50631968ab1a13002ea5421ece93169851chrismair * limitations under the License.
15dfb59d50631968ab1a13002ea5421ece93169851chrismair */
16dfb59d50631968ab1a13002ea5421ece93169851chrismairpackage org.mockftpserver.fake.command
17dfb59d50631968ab1a13002ea5421ece93169851chrismair
18dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.Command
19dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.CommandHandler
20dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.CommandNames
21dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.command.ReplyCodes
22dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.session.SessionKeys
23dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.fake.UserAccount
24dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.fake.filesystem.FileSystemException
25dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.fake.filesystem.Permissions
26dfb59d50631968ab1a13002ea5421ece93169851chrismair
27dfb59d50631968ab1a13002ea5421ece93169851chrismair/**
28dfb59d50631968ab1a13002ea5421ece93169851chrismair * Tests for MkdCommandHandler
29dfb59d50631968ab1a13002ea5421ece93169851chrismair *
30dfb59d50631968ab1a13002ea5421ece93169851chrismair * @version $Revision$ - $Date$
31dfb59d50631968ab1a13002ea5421ece93169851chrismair *
32dfb59d50631968ab1a13002ea5421ece93169851chrismair * @author Chris Mair
33dfb59d50631968ab1a13002ea5421ece93169851chrismair */
34dfb59d50631968ab1a13002ea5421ece93169851chrismairclass MkdCommandHandlerTest extends AbstractFakeCommandHandlerTestCase {
35dfb59d50631968ab1a13002ea5421ece93169851chrismair
36dfb59d50631968ab1a13002ea5421ece93169851chrismair    static final PARENT = '/'
37dfb59d50631968ab1a13002ea5421ece93169851chrismair    static final DIRNAME = "usr"
38dfb59d50631968ab1a13002ea5421ece93169851chrismair    static final DIR = p(PARENT, DIRNAME)
39dfb59d50631968ab1a13002ea5421ece93169851chrismair    static final PERMISSIONS = new Permissions('rwx------')
40dfb59d50631968ab1a13002ea5421ece93169851chrismair
41dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand() {
42dfb59d50631968ab1a13002ea5421ece93169851chrismair        userAccount.defaultPermissionsForNewDirectory = PERMISSIONS
43dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
44dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.MKD_OK, ['mkd', DIR])
45dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert fileSystem.exists(DIR)
46dfb59d50631968ab1a13002ea5421ece93169851chrismair        def dirEntry = fileSystem.getEntry(DIR)
47dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert dirEntry.permissions == PERMISSIONS
48dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
49dfb59d50631968ab1a13002ea5421ece93169851chrismair
50dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_PathIsRelative() {
51dfb59d50631968ab1a13002ea5421ece93169851chrismair        session.setAttribute(SessionKeys.CURRENT_DIRECTORY, '/')
52dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIRNAME])
53dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.MKD_OK, ['mkd', DIRNAME])
54dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert fileSystem.exists(DIR)
55dfb59d50631968ab1a13002ea5421ece93169851chrismair        def dirEntry = fileSystem.getEntry(DIR)
56dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert dirEntry.permissions == UserAccount.DEFAULT_PERMISSIONS_FOR_NEW_DIRECTORY
57dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
58dfb59d50631968ab1a13002ea5421ece93169851chrismair
59dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_ParentDirectoryDoesNotExist() {
60dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand(['/abc/def'])
61dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.doesNotExist', '/abc'])
62dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
63dfb59d50631968ab1a13002ea5421ece93169851chrismair
64dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_PathSpecifiesAFile() {
65dfb59d50631968ab1a13002ea5421ece93169851chrismair        createFile(DIR)
66dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
67dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.alreadyExists', DIR])
68dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert fileSystem.exists(DIR)
69dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
70dfb59d50631968ab1a13002ea5421ece93169851chrismair
71dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_MissingPathParameter() {
72dfb59d50631968ab1a13002ea5421ece93169851chrismair        testHandleCommand_MissingRequiredParameter([])
73dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
74dfb59d50631968ab1a13002ea5421ece93169851chrismair
75dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_NoWriteAccessToParentDirectory() {
76dfb59d50631968ab1a13002ea5421ece93169851chrismair        fileSystem.getEntry(PARENT).permissions = new Permissions('r-xr-xr-x')
77dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
78dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotWrite', PARENT])
79dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
80dfb59d50631968ab1a13002ea5421ece93169851chrismair
81dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_NoExecuteAccessToParentDirectory() {
82dfb59d50631968ab1a13002ea5421ece93169851chrismair        fileSystem.getEntry(PARENT).permissions = new Permissions('rw-rw-rw-')
83dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
84dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ['filesystem.cannotExecute', PARENT])
85dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
86dfb59d50631968ab1a13002ea5421ece93169851chrismair
87dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_CreateDirectoryThrowsException() {
88dfb59d50631968ab1a13002ea5421ece93169851chrismair        fileSystem.addMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY)
89dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([DIR])
90dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.READ_FILE_ERROR, ERROR_MESSAGE_KEY)
91dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
92dfb59d50631968ab1a13002ea5421ece93169851chrismair
93dfb59d50631968ab1a13002ea5421ece93169851chrismair    void setUp() {
94dfb59d50631968ab1a13002ea5421ece93169851chrismair        super.setUp()
95dfb59d50631968ab1a13002ea5421ece93169851chrismair        createDirectory(PARENT)
96dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
97dfb59d50631968ab1a13002ea5421ece93169851chrismair
98dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
99dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Helper Methods
100dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
101dfb59d50631968ab1a13002ea5421ece93169851chrismair
102dfb59d50631968ab1a13002ea5421ece93169851chrismair    CommandHandler createCommandHandler() {
103dfb59d50631968ab1a13002ea5421ece93169851chrismair        new MkdCommandHandler()
104dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
105dfb59d50631968ab1a13002ea5421ece93169851chrismair
106dfb59d50631968ab1a13002ea5421ece93169851chrismair    Command createValidCommand() {
107dfb59d50631968ab1a13002ea5421ece93169851chrismair        return new Command(CommandNames.MKD, [DIR])
108dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
109dfb59d50631968ab1a13002ea5421ece93169851chrismair
110dfb59d50631968ab1a13002ea5421ece93169851chrismair}