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.UserAccount
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Tests for UserCommandHandler
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision$ - $Date$
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairclass UserCommandHandlerTest extends AbstractFakeCommandHandlerTest {
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    static final USERNAME = "user123"
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    static final HOME_DIRECTORY = "/"
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    UserAccount userAccount
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    boolean testNotLoggedIn = false
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_UserExists() {
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([USERNAME])
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.USER_NEED_PASSWORD_OK, 'user.needPassword')
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertUsernameInSession(true)
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertCurrentDirectory(null)
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_NoSuchUser() {
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([USERNAME])
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        // Will return OK, even if username is not recognized
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.USER_NEED_PASSWORD_OK, 'user.needPassword')
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertUsernameInSession(true)
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertCurrentDirectory(null)
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_PasswordNotRequiredForLogin() {
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        userAccount.passwordRequiredForLogin = false
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([USERNAME])
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.USER_LOGGED_IN_OK, 'user.loggedIn')
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert session.getAttribute(SessionKeys.USER_ACCOUNT) == userAccount
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertUsernameInSession(false)
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertCurrentDirectory(HOME_DIRECTORY)
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_UserExists_HomeDirectoryNotDefinedForUser() {
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        userAccount.homeDirectory = ''
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([USERNAME])
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.userAccountNotValid")
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertUsernameInSession(false)
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertCurrentDirectory(null)
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_UserExists_HomeDirectoryDoesNotExist() {
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        userAccount.homeDirectory = '/abc/def'
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([USERNAME])
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.homeDirectoryNotValid")
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertUsernameInSession(false)
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertCurrentDirectory(null)
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_MissingUsernameParameter() {
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        testHandleCommand_MissingRequiredParameter([])
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertUsernameInSession(false)
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertCurrentDirectory(null)
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Abstract and Overridden Methods
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void setUp() {
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        super.setUp()
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        createDirectory(HOME_DIRECTORY)
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        userAccount = new UserAccount(username: USERNAME, homeDirectory: HOME_DIRECTORY)
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    CommandHandler createCommandHandler() {
104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        new UserCommandHandler()
105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    Command createValidCommand() {
108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return new Command(CommandNames.USER, [USERNAME])
109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
110ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
111ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
112ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Helper Methods
113ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
114ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
115ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
116ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Assert that the Username is stored in the session, depending on the value of isUsernameInSession.
117ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param isUsernameInSession - true if the Username is expected in the session; false if it is not expected
118ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
119ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private void assertUsernameInSession(boolean isUsernameInSession) {
120ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def expectedValue = isUsernameInSession ? USERNAME : null
121ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert session.getAttribute(SessionKeys.USERNAME) == expectedValue
122ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
123ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
124ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
125ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Assert that the current directory is set in the session, but only if currentDirectory is not null.
126ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param currentDirectory - the curent directory expected in the session; null if it is not expected
127ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
128ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private void assertCurrentDirectory(String currentDirectory) {
129ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert session.getAttribute(SessionKeys.CURRENT_DIRECTORY) == currentDirectory
130ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
131ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}