12ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/*
22ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Copyright 2008 the original author or authors.
32ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
42ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Licensed under the Apache License, Version 2.0 (the "License");
52ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * you may not use this file except in compliance with the License.
62ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * You may obtain a copy of the License at
72ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
82ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *      http://www.apache.org/licenses/LICENSE-2.0
92ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Unless required by applicable law or agreed to in writing, software
112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * distributed under the License is distributed on an "AS IS" BASIS,
122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * See the License for the specific language governing permissions and
142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * limitations under the License.
152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpackage org.mockftpserver.fake
172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.fake.CustomUserAccount
192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.fake.UserAccount
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.fake.filesystem.FileEntry
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.fake.filesystem.FileSystemEntry
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.fake.filesystem.Permissions
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.test.AbstractGroovyTest
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Tests for UserAccount
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairclass UserAccountTest extends AbstractGroovyTest {
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private static final USERNAME = "user123"
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private static final PASSWORD = "password123"
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private static final HOME_DIR = "/usr/user123"
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private static final GROUP = 'group'
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private UserAccount userAccount
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testConstructor() {
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def acct = new UserAccount(USERNAME, PASSWORD, HOME_DIR)
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert acct.username == USERNAME
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert acct.password == PASSWORD
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert acct.homeDirectory == HOME_DIR
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testGetPrimaryGroup() {
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.primaryGroup == UserAccount.DEFAULT_GROUP
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.groups = ['abc']
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.primaryGroup == 'abc'
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.groups.add('def')
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.primaryGroup == 'abc'
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.groups = []
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.primaryGroup == UserAccount.DEFAULT_GROUP
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testIsValidPassword() {
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.username = USERNAME
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.password = PASSWORD
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.isValidPassword(PASSWORD)
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !userAccount.isValidPassword("")
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !userAccount.isValidPassword("wrong")
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !userAccount.isValidPassword(null)
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testIsValidPassword_UsernameNullOrEmpty() {
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.password = PASSWORD
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFailWithMessageContaining('username') { userAccount.isValidPassword(PASSWORD) }
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.username = ''
762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFailWithMessageContaining('username') { userAccount.isValidPassword(PASSWORD) }
772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testIsValidPassword_OverrideComparePassword() {
802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def customUserAccount = new CustomUserAccount()
812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        customUserAccount.username = USERNAME
822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        customUserAccount.password = PASSWORD
832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        println customUserAccount
842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert customUserAccount.isValidPassword(PASSWORD) == false
852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert customUserAccount.isValidPassword(PASSWORD + "123")
862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testIsValidPassword_PasswordNotCheckedDuringValidation() {
892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.username = USERNAME
902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.password = PASSWORD
912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.passwordCheckedDuringValidation = false
922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.isValidPassword("wrong")
932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testIsValid() {
962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !userAccount.valid
972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.homeDirectory = ""
982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !userAccount.valid
992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.homeDirectory = "/abc"
1002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.valid
1012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testCanRead() {
1042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // No file permissions - readable by all
1052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, GROUP, null, true)
1062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // UserAccount has no username or group; use World permissions
1082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, GROUP, '------r--', true)
1092ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, GROUP, 'rwxrwx-wx', false)
1102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.username = USERNAME
1122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.groups = [GROUP]
1132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, GROUP, 'rwxrwxrwx', true)     // ALL
1152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, GROUP, '---------', false)    // NONE
1162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, null, 'r--------', true)      // User
1182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(USERNAME, null, '-wxrwxrwx', false)
1192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(null, GROUP, '---r-----', true)         // Group
1212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(null, GROUP, 'rwx-wxrwx', false)
1222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(null, null, '------r--', true)          // World
1242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanRead(null, null, 'rwxrwx-wx', false)
1252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testCanWrite() {
1282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // No file permissions - writable by all
1292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, GROUP, null, true)
1302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // UserAccount has no username or group; use World permissions
1322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, GROUP, '-------w-', true)
1332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, GROUP, 'rwxrwxr-x', false)
1342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.username = USERNAME
1362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.groups = [GROUP]
1372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, GROUP, 'rwxrwxrwx', true)     // ALL
1392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, GROUP, '---------', false)    // NONE
1402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, null, '-w-------', true)      // User
1422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(USERNAME, null, 'r-xrwxrwx', false)
1432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(null, GROUP, '----w----', true)         // Group
1452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(null, GROUP, 'rwxr-xrwx', false)
1462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(null, null, '-------w-', true)          // World
1482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanWrite(null, null, 'rwxrwxr-x', false)
1492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testCanExecute() {
1522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // No file permissions - executable by all
1532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, GROUP, null, true)
1542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // UserAccount has no username or group; use World permissions
1562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, GROUP, '--------x', true)
1572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, GROUP, 'rwxrwxrw-', false)
1582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.username = USERNAME
1602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount.groups = [GROUP]
1612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, GROUP, 'rwxrwxrwx', true)     // ALL
1632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, GROUP, '---------', false)    // NONE
1642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, null, '--x------', true)      // User
1662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(USERNAME, null, 'rw-rwxrwx', false)
1672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(null, GROUP, '-----x---', true)         // Group
1692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(null, GROUP, 'rwxrw-rwx', false)
1702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(null, null, '--------x', true)          // World
1722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        testCanExecute(null, null, 'rwxrwxrw-', false)
1732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testDefaultPermissions() {
1762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.defaultPermissionsForNewFile == new Permissions('rw-rw-rw-')
1772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.defaultPermissionsForNewDirectory == Permissions.ALL
1782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //--------------------------------------------------------------------------
1812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // Helper Methods
1822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //--------------------------------------------------------------------------
1832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private void testCanRead(owner, group, permissionsString, expectedResult) {
1852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def file = createFileEntry(owner, permissionsString, group)
1862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.canRead(file) == expectedResult, file
1872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private void testCanWrite(owner, group, permissionsString, expectedResult) {
1902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def file = createFileEntry(owner, permissionsString, group)
1912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.canWrite(file) == expectedResult, file
1922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private void testCanExecute(owner, group, permissionsString, expectedResult) {
1952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def file = createFileEntry(owner, permissionsString, group)
1962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert userAccount.canExecute(file) == expectedResult, file
1972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private FileSystemEntry createFileEntry(owner, permissionsString, group) {
2002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def permissions = permissionsString ? new Permissions(permissionsString) : null
2012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return new FileEntry(path: '', owner: owner, group: group, permissions: permissions)
2022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
2032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
2042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void setUp() {
2052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        super.setUp()
2062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        userAccount = new UserAccount()
2072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
2082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}