1abd32a990e145862f22d15316feedced5ad246aachrismair/*
2abd32a990e145862f22d15316feedced5ad246aachrismair * Copyright 2008 the original author or authors.
3abd32a990e145862f22d15316feedced5ad246aachrismair *
4abd32a990e145862f22d15316feedced5ad246aachrismair * Licensed under the Apache License, Version 2.0 (the "License");
5abd32a990e145862f22d15316feedced5ad246aachrismair * you may not use this file except in compliance with the License.
6abd32a990e145862f22d15316feedced5ad246aachrismair * You may obtain a copy of the License at
7abd32a990e145862f22d15316feedced5ad246aachrismair *
8abd32a990e145862f22d15316feedced5ad246aachrismair *      http://www.apache.org/licenses/LICENSE-2.0
9abd32a990e145862f22d15316feedced5ad246aachrismair *
10abd32a990e145862f22d15316feedced5ad246aachrismair * Unless required by applicable law or agreed to in writing, software
11abd32a990e145862f22d15316feedced5ad246aachrismair * distributed under the License is distributed on an "AS IS" BASIS,
12abd32a990e145862f22d15316feedced5ad246aachrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abd32a990e145862f22d15316feedced5ad246aachrismair * See the License for the specific language governing permissions and
14abd32a990e145862f22d15316feedced5ad246aachrismair * limitations under the License.
15abd32a990e145862f22d15316feedced5ad246aachrismair */
16bd576ae311a45a994ae6b457fb2e5bb0ffe0d6b5chrismairpackage org.mockftpserver.fake
17abd32a990e145862f22d15316feedced5ad246aachrismair
181dfeab57f80c3a156a7ff11871c03f3f53033b9echrismairimport org.mockftpserver.fake.filesystem.FileEntry
191dfeab57f80c3a156a7ff11871c03f3f53033b9echrismairimport org.mockftpserver.fake.filesystem.FileSystemEntry
2081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismairimport org.mockftpserver.fake.filesystem.Permissions
215303c6ae1dde5f399fe48803e677942fc4326344chrismairimport org.mockftpserver.test.AbstractGroovyTestCase
22abd32a990e145862f22d15316feedced5ad246aachrismair
23abd32a990e145862f22d15316feedced5ad246aachrismair/**
24abd32a990e145862f22d15316feedced5ad246aachrismair * Tests for UserAccount
255c17f34e1a613c319d355112f8298c20015ef7f2chrismair *
267d4a3a2990f1a386eaf9d50cf05a9d45fab32de6chrismair * @version $Revision$ - $Date$
27abd32a990e145862f22d15316feedced5ad246aachrismair *
28abd32a990e145862f22d15316feedced5ad246aachrismair * @author Chris Mair
29abd32a990e145862f22d15316feedced5ad246aachrismair */
305303c6ae1dde5f399fe48803e677942fc4326344chrismairclass UserAccountTest extends AbstractGroovyTestCase {
31abd32a990e145862f22d15316feedced5ad246aachrismair
32abd32a990e145862f22d15316feedced5ad246aachrismair    private static final USERNAME = "user123"
33abd32a990e145862f22d15316feedced5ad246aachrismair    private static final PASSWORD = "password123"
34abd32a990e145862f22d15316feedced5ad246aachrismair    private static final HOME_DIR = "/usr/user123"
3581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    private static final GROUP = 'group'
3681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
37abd32a990e145862f22d15316feedced5ad246aachrismair    private UserAccount userAccount
385c17f34e1a613c319d355112f8298c20015ef7f2chrismair
397bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair    void testConstructor() {
407bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair        def acct = new UserAccount(USERNAME, PASSWORD, HOME_DIR)
417bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair        assert acct.username == USERNAME
427bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair        assert acct.password == PASSWORD
437bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair        assert acct.homeDirectory == HOME_DIR
447bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair    }
457bf26c51e6b1f13707ad90ebb60429eab992fe32chrismair
467d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair    void testGetPrimaryGroup() {
477d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        assert userAccount.primaryGroup == UserAccount.DEFAULT_GROUP
487d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair
497d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        userAccount.groups = ['abc']
507d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        assert userAccount.primaryGroup == 'abc'
517d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair
527d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        userAccount.groups.add('def')
537d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        assert userAccount.primaryGroup == 'abc'
547d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair
557d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        userAccount.groups = []
567d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair        assert userAccount.primaryGroup == UserAccount.DEFAULT_GROUP
577d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair    }
587d00fd0c9917e59d8ee38543e25fcabb0d04f965chrismair
59abd32a990e145862f22d15316feedced5ad246aachrismair    void testIsValidPassword() {
60abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.username = USERNAME
61abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.password = PASSWORD
62abd32a990e145862f22d15316feedced5ad246aachrismair        assert userAccount.isValidPassword(PASSWORD)
635c17f34e1a613c319d355112f8298c20015ef7f2chrismair
641dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        assert !userAccount.isValidPassword("")
651dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        assert !userAccount.isValidPassword("wrong")
661dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        assert !userAccount.isValidPassword(null)
67abd32a990e145862f22d15316feedced5ad246aachrismair    }
685c17f34e1a613c319d355112f8298c20015ef7f2chrismair
69abd32a990e145862f22d15316feedced5ad246aachrismair    void testIsValidPassword_UsernameNullOrEmpty() {
70abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.password = PASSWORD
719cee38234d3b928de5c9ed85d7356aa8c5ad824achrismair        shouldFailWithMessageContaining('username') { userAccount.isValidPassword(PASSWORD) }
72abd32a990e145862f22d15316feedced5ad246aachrismair
73abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.username = ''
749cee38234d3b928de5c9ed85d7356aa8c5ad824achrismair        shouldFailWithMessageContaining('username') { userAccount.isValidPassword(PASSWORD) }
755c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
765c17f34e1a613c319d355112f8298c20015ef7f2chrismair
77abd32a990e145862f22d15316feedced5ad246aachrismair    void testIsValidPassword_OverrideComparePassword() {
78abd32a990e145862f22d15316feedced5ad246aachrismair        def customUserAccount = new CustomUserAccount()
79abd32a990e145862f22d15316feedced5ad246aachrismair        customUserAccount.username = USERNAME
80abd32a990e145862f22d15316feedced5ad246aachrismair        customUserAccount.password = PASSWORD
81abd32a990e145862f22d15316feedced5ad246aachrismair        println customUserAccount
82abd32a990e145862f22d15316feedced5ad246aachrismair        assert customUserAccount.isValidPassword(PASSWORD) == false
83abd32a990e145862f22d15316feedced5ad246aachrismair        assert customUserAccount.isValidPassword(PASSWORD + "123")
84abd32a990e145862f22d15316feedced5ad246aachrismair    }
855c17f34e1a613c319d355112f8298c20015ef7f2chrismair
86abd32a990e145862f22d15316feedced5ad246aachrismair    void testIsValidPassword_PasswordNotCheckedDuringValidation() {
87abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.username = USERNAME
88abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.password = PASSWORD
89abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount.passwordCheckedDuringValidation = false
90abd32a990e145862f22d15316feedced5ad246aachrismair        assert userAccount.isValidPassword("wrong")
91abd32a990e145862f22d15316feedced5ad246aachrismair    }
925c17f34e1a613c319d355112f8298c20015ef7f2chrismair
935c17f34e1a613c319d355112f8298c20015ef7f2chrismair    void testIsValid() {
945c17f34e1a613c319d355112f8298c20015ef7f2chrismair        assert !userAccount.valid
955c17f34e1a613c319d355112f8298c20015ef7f2chrismair        userAccount.homeDirectory = ""
965c17f34e1a613c319d355112f8298c20015ef7f2chrismair        assert !userAccount.valid
975c17f34e1a613c319d355112f8298c20015ef7f2chrismair        userAccount.homeDirectory = "/abc"
985c17f34e1a613c319d355112f8298c20015ef7f2chrismair        assert userAccount.valid
995c17f34e1a613c319d355112f8298c20015ef7f2chrismair    }
1005c17f34e1a613c319d355112f8298c20015ef7f2chrismair
10181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    void testCanRead() {
102fd225022650f63bcba4e6c495e9356861393c002chrismair        // No file permissions - readable by all
103fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanRead(USERNAME, GROUP, null, true)
104fd225022650f63bcba4e6c495e9356861393c002chrismair
105fd225022650f63bcba4e6c495e9356861393c002chrismair        // UserAccount has no username or group; use World permissions
106fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanRead(USERNAME, GROUP, '------r--', true)
107fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanRead(USERNAME, GROUP, 'rwxrwx-wx', false)
108fd225022650f63bcba4e6c495e9356861393c002chrismair
10981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount.username = USERNAME
11081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount.groups = [GROUP]
11181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
11281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(USERNAME, GROUP, 'rwxrwxrwx', true)     // ALL
11381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(USERNAME, GROUP, '---------', false)    // NONE
11481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
11581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(USERNAME, null, 'r--------', true)      // User
11681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(USERNAME, null, '-wxrwxrwx', false)
11781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
11881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(null, GROUP, '---r-----', true)         // Group
11981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(null, GROUP, 'rwx-wxrwx', false)
12081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
12181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(null, null, '------r--', true)          // World
12281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanRead(null, null, 'rwxrwx-wx', false)
12381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
12481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
12581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    void testCanWrite() {
126fd225022650f63bcba4e6c495e9356861393c002chrismair        // No file permissions - writable by all
127fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanWrite(USERNAME, GROUP, null, true)
128fd225022650f63bcba4e6c495e9356861393c002chrismair
129fd225022650f63bcba4e6c495e9356861393c002chrismair        // UserAccount has no username or group; use World permissions
130fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanWrite(USERNAME, GROUP, '-------w-', true)
131fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanWrite(USERNAME, GROUP, 'rwxrwxr-x', false)
132fd225022650f63bcba4e6c495e9356861393c002chrismair
13381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount.username = USERNAME
13481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount.groups = [GROUP]
13581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
13681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(USERNAME, GROUP, 'rwxrwxrwx', true)     // ALL
13781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(USERNAME, GROUP, '---------', false)    // NONE
13881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
13981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(USERNAME, null, '-w-------', true)      // User
14081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(USERNAME, null, 'r-xrwxrwx', false)
14181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
14281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(null, GROUP, '----w----', true)         // Group
14381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(null, GROUP, 'rwxr-xrwx', false)
14481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
14581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(null, null, '-------w-', true)          // World
14681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanWrite(null, null, 'rwxrwxr-x', false)
14781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
14881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
14981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    void testCanExecute() {
150fd225022650f63bcba4e6c495e9356861393c002chrismair        // No file permissions - executable by all
151fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanExecute(USERNAME, GROUP, null, true)
152fd225022650f63bcba4e6c495e9356861393c002chrismair
153fd225022650f63bcba4e6c495e9356861393c002chrismair        // UserAccount has no username or group; use World permissions
154fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanExecute(USERNAME, GROUP, '--------x', true)
155fd225022650f63bcba4e6c495e9356861393c002chrismair        testCanExecute(USERNAME, GROUP, 'rwxrwxrw-', false)
156fd225022650f63bcba4e6c495e9356861393c002chrismair
15781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount.username = USERNAME
15881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        userAccount.groups = [GROUP]
15981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
16081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(USERNAME, GROUP, 'rwxrwxrwx', true)     // ALL
16181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(USERNAME, GROUP, '---------', false)    // NONE
16281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
16381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(USERNAME, null, '--x------', true)      // User
16481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(USERNAME, null, 'rw-rwxrwx', false)
16581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
16681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(null, GROUP, '-----x---', true)         // Group
16781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(null, GROUP, 'rwxrw-rwx', false)
16881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
16981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(null, null, '--------x', true)          // World
17081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        testCanExecute(null, null, 'rwxrwxrw-', false)
17181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
17281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
17310941f2b30409f80cf92399415ffd8b3f0708d3echrismair    void testDefaultPermissions() {
17410941f2b30409f80cf92399415ffd8b3f0708d3echrismair        assert userAccount.defaultPermissionsForNewFile == new Permissions('rw-rw-rw-')
17510941f2b30409f80cf92399415ffd8b3f0708d3echrismair        assert userAccount.defaultPermissionsForNewDirectory == Permissions.ALL
17610941f2b30409f80cf92399415ffd8b3f0708d3echrismair    }
17710941f2b30409f80cf92399415ffd8b3f0708d3echrismair
17881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    //--------------------------------------------------------------------------
17981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    // Helper Methods
18081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    //--------------------------------------------------------------------------
18181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
18281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    private void testCanRead(owner, group, permissionsString, expectedResult) {
1831dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        def file = createFileEntry(owner, permissionsString, group)
18481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        assert userAccount.canRead(file) == expectedResult, file
18581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
18681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
18781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    private void testCanWrite(owner, group, permissionsString, expectedResult) {
1881dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        def file = createFileEntry(owner, permissionsString, group)
18981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        assert userAccount.canWrite(file) == expectedResult, file
19081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
19181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
19281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    private void testCanExecute(owner, group, permissionsString, expectedResult) {
1931dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        def file = createFileEntry(owner, permissionsString, group)
19481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        assert userAccount.canExecute(file) == expectedResult, file
19581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
19681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
1971dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair    private FileSystemEntry createFileEntry(owner, permissionsString, group) {
198fd225022650f63bcba4e6c495e9356861393c002chrismair        def permissions = permissionsString ? new Permissions(permissionsString) : null
1991dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair        return new FileEntry(path: '', owner: owner, group: group, permissions: permissions)
20081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
20181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
202abd32a990e145862f22d15316feedced5ad246aachrismair    void setUp() {
20381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        super.setUp()
204abd32a990e145862f22d15316feedced5ad246aachrismair        userAccount = new UserAccount()
205abd32a990e145862f22d15316feedced5ad246aachrismair    }
206abd32a990e145862f22d15316feedced5ad246aachrismair}