177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/*
277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Copyright 2008 the original author or authors.
377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Licensed under the Apache License, Version 2.0 (the "License");
577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * you may not use this file except in compliance with the License.
677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * You may obtain a copy of the License at
777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *      http://www.apache.org/licenses/LICENSE-2.0
977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
1077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Unless required by applicable law or agreed to in writing, software
1177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * See the License for the specific language governing permissions and
1477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * limitations under the License.
1577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */
1677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpackage org.mockftpserver.fake.command
1777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
1877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.Command
1977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.CommandHandler
2077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.CommandNames
2177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.ReplyCodes
2277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.session.SessionKeys
2377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.fake.UserAccount
2477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
2577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/**
2677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Tests for UserCommandHandler
2777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
2877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @version $Revision$ - $Date$
2977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
3077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @author Chris Mair
3177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */
3277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairclass UserCommandHandlerTest extends AbstractFakeCommandHandlerTest {
3377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
3477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    static final USERNAME = "user123"
3577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    static final HOME_DIRECTORY = "/"
3677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    UserAccount userAccount
3777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
3877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    boolean testNotLoggedIn = false
3977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
4077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void testHandleCommand_UserExists() {
4177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
4277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        handleCommand([USERNAME])
4377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertSessionReply(ReplyCodes.USER_NEED_PASSWORD_OK, 'user.needPassword')
4477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertUsernameInSession(true)
4577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertCurrentDirectory(null)
4677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
4777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
4877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void testHandleCommand_NoSuchUser() {
4977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        handleCommand([USERNAME])
5077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        // Will return OK, even if username is not recognized
5177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertSessionReply(ReplyCodes.USER_NEED_PASSWORD_OK, 'user.needPassword')
5277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertUsernameInSession(true)
5377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertCurrentDirectory(null)
5477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
5577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
5677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void testHandleCommand_PasswordNotRequiredForLogin() {
5777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        userAccount.passwordRequiredForLogin = false
5877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
5977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
6077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        handleCommand([USERNAME])
6177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertSessionReply(ReplyCodes.USER_LOGGED_IN_OK, 'user.loggedIn')
6277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assert session.getAttribute(SessionKeys.USER_ACCOUNT) == userAccount
6377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertUsernameInSession(false)
6477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertCurrentDirectory(HOME_DIRECTORY)
6577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
6677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
6777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void testHandleCommand_UserExists_HomeDirectoryNotDefinedForUser() {
6877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        userAccount.homeDirectory = ''
6977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
7077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        handleCommand([USERNAME])
7177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.userAccountNotValid")
7277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertUsernameInSession(false)
7377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertCurrentDirectory(null)
7477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
7577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
7677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void testHandleCommand_UserExists_HomeDirectoryDoesNotExist() {
7777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        userAccount.homeDirectory = '/abc/def'
7877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
7977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        handleCommand([USERNAME])
8077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.homeDirectoryNotValid")
8177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertUsernameInSession(false)
8277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertCurrentDirectory(null)
8377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
8477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
8577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void testHandleCommand_MissingUsernameParameter() {
8677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        testHandleCommand_MissingRequiredParameter([])
8777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertUsernameInSession(false)
8877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assertCurrentDirectory(null)
8977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
9077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
9177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    //-------------------------------------------------------------------------
9277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    // Abstract and Overridden Methods
9377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    //-------------------------------------------------------------------------
9477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
9577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    void setUp() {
9677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        super.setUp()
9777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
9877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        createDirectory(HOME_DIRECTORY)
9977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        userAccount = new UserAccount(username: USERNAME, homeDirectory: HOME_DIRECTORY)
10077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
10177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
10277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    CommandHandler createCommandHandler() {
10377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        new UserCommandHandler()
10477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
10577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
10677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    Command createValidCommand() {
10777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        return new Command(CommandNames.USER, [USERNAME])
10877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
10977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
11077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    //-------------------------------------------------------------------------
11177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    // Helper Methods
11277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    //-------------------------------------------------------------------------
11377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
11477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
11577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Assert that the Username is stored in the session, depending on the value of isUsernameInSession.
11677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * @param isUsernameInSession - true if the Username is expected in the session; false if it is not expected
11777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
11877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    private void assertUsernameInSession(boolean isUsernameInSession) {
11977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        def expectedValue = isUsernameInSession ? USERNAME : null
12077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assert session.getAttribute(SessionKeys.USERNAME) == expectedValue
12177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
12277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
12377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
12477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Assert that the current directory is set in the session, but only if currentDirectory is not null.
12577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * @param currentDirectory - the curent directory expected in the session; null if it is not expected
12677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
12777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    private void assertCurrentDirectory(String currentDirectory) {
12877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        assert session.getAttribute(SessionKeys.CURRENT_DIRECTORY) == currentDirectory
12977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
13077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair}