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
24dfb59d50631968ab1a13002ea5421ece93169851chrismair
25dfb59d50631968ab1a13002ea5421ece93169851chrismair/**
26dfb59d50631968ab1a13002ea5421ece93169851chrismair * Tests for PassCommandHandler
27dfb59d50631968ab1a13002ea5421ece93169851chrismair *
28dfb59d50631968ab1a13002ea5421ece93169851chrismair * @version $Revision$ - $Date$
29dfb59d50631968ab1a13002ea5421ece93169851chrismair *
30dfb59d50631968ab1a13002ea5421ece93169851chrismair * @author Chris Mair
31dfb59d50631968ab1a13002ea5421ece93169851chrismair */
32dfb59d50631968ab1a13002ea5421ece93169851chrismairclass PassCommandHandlerTest extends AbstractFakeCommandHandlerTestCase {
33dfb59d50631968ab1a13002ea5421ece93169851chrismair
34dfb59d50631968ab1a13002ea5421ece93169851chrismair    def USERNAME = "user123"
35dfb59d50631968ab1a13002ea5421ece93169851chrismair    def PASSWORD = "password123"
36dfb59d50631968ab1a13002ea5421ece93169851chrismair    def HOME_DIRECTORY = "/"
37dfb59d50631968ab1a13002ea5421ece93169851chrismair    UserAccount userAccount
38dfb59d50631968ab1a13002ea5421ece93169851chrismair
39dfb59d50631968ab1a13002ea5421ece93169851chrismair    boolean testNotLoggedIn = false
40dfb59d50631968ab1a13002ea5421ece93169851chrismair
41dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserExists_PasswordCorrect() {
42dfb59d50631968ab1a13002ea5421ece93169851chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
43dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([PASSWORD])
44dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.PASS_OK, 'pass')
45dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(true)
46dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(HOME_DIRECTORY)
47dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
48dfb59d50631968ab1a13002ea5421ece93169851chrismair
49dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserExists_PasswordCorrect_AccountRequired() {
50dfb59d50631968ab1a13002ea5421ece93169851chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
51dfb59d50631968ab1a13002ea5421ece93169851chrismair        userAccount.accountRequiredForLogin = true
52dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([PASSWORD])
53dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.PASS_NEED_ACCOUNT, 'pass.needAccount')
54dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(true)
55dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(HOME_DIRECTORY)
56dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
57dfb59d50631968ab1a13002ea5421ece93169851chrismair
58dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserExists_PasswordIncorrect() {
59dfb59d50631968ab1a13002ea5421ece93169851chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
60dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand(["wrong"])
61dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.PASS_LOG_IN_FAILED, 'pass.loginFailed')
62dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(false)
63dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(null)
64dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
65dfb59d50631968ab1a13002ea5421ece93169851chrismair
66dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserExists_PasswordWrongButIgnored() {
67dfb59d50631968ab1a13002ea5421ece93169851chrismair        userAccount.passwordCheckedDuringValidation = false
68dfb59d50631968ab1a13002ea5421ece93169851chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
69dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand(["wrong"])
70dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.PASS_OK, 'pass')
71dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(true)
72dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(HOME_DIRECTORY)
73dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
74dfb59d50631968ab1a13002ea5421ece93169851chrismair
75dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserExists_HomeDirectoryNotDefinedForUserAccount() {
76dfb59d50631968ab1a13002ea5421ece93169851chrismair        userAccount.homeDirectory = ''
77dfb59d50631968ab1a13002ea5421ece93169851chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
78dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([PASSWORD])
79dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.userAccountNotValid")
80dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(false)
81dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(null)
82dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
83dfb59d50631968ab1a13002ea5421ece93169851chrismair
84dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserExists_HomeDirectoryDoesNotExist() {
85dfb59d50631968ab1a13002ea5421ece93169851chrismair        userAccount.homeDirectory = '/abc/def'
86dfb59d50631968ab1a13002ea5421ece93169851chrismair        serverConfiguration.userAccounts[USERNAME] = userAccount
87dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([PASSWORD])
88dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.homeDirectoryNotValid")
89dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(false)
90dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(null)
91dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
92dfb59d50631968ab1a13002ea5421ece93169851chrismair
93dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UserDoesNotExist() {
94dfb59d50631968ab1a13002ea5421ece93169851chrismair        handleCommand([PASSWORD])
95dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.userAccountNotValid")
96dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(false)
97dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(null)
98dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
99dfb59d50631968ab1a13002ea5421ece93169851chrismair
100dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_UsernameNotSetInSession() {
101dfb59d50631968ab1a13002ea5421ece93169851chrismair        session.removeAttribute(SessionKeys.USERNAME)
102dfb59d50631968ab1a13002ea5421ece93169851chrismair        testHandleCommand_MissingRequiredSessionAttribute()
103dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(false)
104dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(null)
105dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
106dfb59d50631968ab1a13002ea5421ece93169851chrismair
107dfb59d50631968ab1a13002ea5421ece93169851chrismair    void testHandleCommand_MissingPasswordParameter() {
108dfb59d50631968ab1a13002ea5421ece93169851chrismair        testHandleCommand_MissingRequiredParameter([])
109dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertUserAccountInSession(false)
110dfb59d50631968ab1a13002ea5421ece93169851chrismair        assertCurrentDirectory(null)
111dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
112dfb59d50631968ab1a13002ea5421ece93169851chrismair
113dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
114dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Abstract and Overridden Methods
115dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
116dfb59d50631968ab1a13002ea5421ece93169851chrismair
117dfb59d50631968ab1a13002ea5421ece93169851chrismair    void setUp() {
118dfb59d50631968ab1a13002ea5421ece93169851chrismair        super.setUp()
119dfb59d50631968ab1a13002ea5421ece93169851chrismair
120dfb59d50631968ab1a13002ea5421ece93169851chrismair        createDirectory(HOME_DIRECTORY)
121dfb59d50631968ab1a13002ea5421ece93169851chrismair
122dfb59d50631968ab1a13002ea5421ece93169851chrismair        userAccount = new UserAccount(USERNAME, PASSWORD, HOME_DIRECTORY)
123dfb59d50631968ab1a13002ea5421ece93169851chrismair
124dfb59d50631968ab1a13002ea5421ece93169851chrismair        session.setAttribute(SessionKeys.USERNAME, USERNAME)
125dfb59d50631968ab1a13002ea5421ece93169851chrismair        session.removeAttribute(SessionKeys.USER_ACCOUNT)
126dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
127dfb59d50631968ab1a13002ea5421ece93169851chrismair
128dfb59d50631968ab1a13002ea5421ece93169851chrismair    CommandHandler createCommandHandler() {
129dfb59d50631968ab1a13002ea5421ece93169851chrismair        new PassCommandHandler()
130dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
131dfb59d50631968ab1a13002ea5421ece93169851chrismair
132dfb59d50631968ab1a13002ea5421ece93169851chrismair    Command createValidCommand() {
133dfb59d50631968ab1a13002ea5421ece93169851chrismair        return new Command(CommandNames.PASS, [PASSWORD])
134dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
135dfb59d50631968ab1a13002ea5421ece93169851chrismair
136dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
137dfb59d50631968ab1a13002ea5421ece93169851chrismair    // Helper Methods
138dfb59d50631968ab1a13002ea5421ece93169851chrismair    //-------------------------------------------------------------------------
139dfb59d50631968ab1a13002ea5421ece93169851chrismair
140dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
141dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Assert that the UserAccount object is in the session, depending on the value of isUserAccountInSession.
142dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param isUserAccountInSession - true if the UserAccount is expected in the session; false if it is not expected
143dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
144dfb59d50631968ab1a13002ea5421ece93169851chrismair    private void assertUserAccountInSession(boolean isUserAccountInSession) {
145dfb59d50631968ab1a13002ea5421ece93169851chrismair        def expectedValue = isUserAccountInSession ? userAccount : null
146dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert session.getAttribute(SessionKeys.USER_ACCOUNT) == expectedValue
147dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
148dfb59d50631968ab1a13002ea5421ece93169851chrismair
149dfb59d50631968ab1a13002ea5421ece93169851chrismair    /**
150dfb59d50631968ab1a13002ea5421ece93169851chrismair     * Assert that the current directory is set in the session, but only if currentDirectory is not null.
151dfb59d50631968ab1a13002ea5421ece93169851chrismair     * @param currentDirectory - the curent directory expected in the session; null if it is not expected
152dfb59d50631968ab1a13002ea5421ece93169851chrismair     */
153dfb59d50631968ab1a13002ea5421ece93169851chrismair    private void assertCurrentDirectory(String currentDirectory) {
154dfb59d50631968ab1a13002ea5421ece93169851chrismair        assert session.getAttribute(SessionKeys.CURRENT_DIRECTORY) == currentDirectory
155dfb59d50631968ab1a13002ea5421ece93169851chrismair    }
156dfb59d50631968ab1a13002ea5421ece93169851chrismair}