100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/*
200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Copyright 2008 the original author or authors.
300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Licensed under the Apache License, Version 2.0 (the "License");
500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * you may not use this file except in compliance with the License.
600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * You may obtain a copy of the License at
700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *      http://www.apache.org/licenses/LICENSE-2.0
900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
1000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Unless required by applicable law or agreed to in writing, software
1100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * See the License for the specific language governing permissions and
1400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * limitations under the License.
1500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
1600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpackage org.mockftpserver.fake.filesystem
1700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
1800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.util.IoUtil
1900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
2000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/**
2100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Tests for subclasses of AbstractFakeFileSystem. Subclasses must define
2200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
2300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @version $Revision$ - $Date$
2400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair *
2500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @author Chris Mair
2600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */
2700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairabstract class AbstractFakeFileSystemTestCase extends AbstractFileSystemTestCase {
2800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
2900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
3000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Tests
3100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // -------------------------------------------------------------------------
3200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testDefaultDirectoryListingFormatterClass() {
3400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.directoryListingFormatter.class == expectedDirectoryListingFormatterClass
3500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
3600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
3700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAdd_PathLocked() {
3800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def dirEntry = new DirectoryEntry(NEW_DIR)
3900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(dirEntry)
4000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def fileEntry = new FileEntry(NEW_FILE)
4100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(fileEntry)
4200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
4300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        // The path should be locked for both entries
4400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFail { dirEntry.setPath('abc') }
4500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFail { fileEntry.setPath('abc') }
4600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
4700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
4800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAdd_Directory_CreateParentDirectoriesAutomatically() {
4900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final NEW_SUBDIR = fileSystem.path(NEW_DIR, "sub")
5000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
5100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(NEW_SUBDIR), "Before createDirectory"
5200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.createParentDirectoriesAutomatically = true
5400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new DirectoryEntry(NEW_SUBDIR))
5500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(NEW_DIR), "After createDirectory"
5600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(NEW_SUBDIR), "$NEW_SUBDIR: After createDirectory"
5700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
5800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
5900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAdd_File_CreateParentDirectoriesAutomatically() {
6000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt")
6100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
6200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(NEW_FILE_IN_SUBDIR), "Before createDirectory"
6300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
6400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.createParentDirectoriesAutomatically = true
6500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR))
6600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(NEW_DIR), "After createDirectory"
6700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(NEW_FILE_IN_SUBDIR), "$NEW_FILE_IN_SUBDIR: After createDirectory"
6800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
6900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testAdd_File_CreateParentDirectoriesAutomatically_False() {
7100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.createParentDirectoriesAutomatically = false
7200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt")
7300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
7400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFail(FileSystemException) { fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR)) }
7600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !fileSystem.exists(NEW_DIR), "After createDirectory"
7700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
7800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
7900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testSetEntries() {
8000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.createParentDirectoriesAutomatically = false
8100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def entries = [new FileEntry(NEW_FILE), new DirectoryEntry(NEW_DIR)]
8200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.setEntries(entries)
8300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(NEW_DIR)
8400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.exists(NEW_FILE)
8500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
8600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
8700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testToString() {
8800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        String toString = fileSystem.toString()
8900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("toString=" + toString)
9000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert toString.contains(EXISTING_DIR)
9100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert toString.contains(EXISTING_FILE)
9200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
9300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
9400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testFormatDirectoryListing() {
9500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def fileEntry = new FileEntry(path: 'abc')
9600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def formatter = [format: {f ->
9700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            assert f == fileEntry
9800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair            return 'abc'
9900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        }] as DirectoryListingFormatter
10000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.directoryListingFormatter = formatter
10100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.formatDirectoryListing(fileEntry) == 'abc'
10200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
10400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testFormatDirectoryListing_NullDirectoryListingFormatter() {
10500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.directoryListingFormatter = null
10600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def fileEntry = new FileEntry('abc')
10700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFailWithMessageContaining('directoryListingFormatter') { assert fileSystem.formatDirectoryListing(fileEntry) }
10800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
10900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testFormatDirectoryListing_NullFileSystemEntry() {
11100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def formatter = [format: {f -> }] as DirectoryListingFormatter
11200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.directoryListingFormatter = formatter
11300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFailWithMessageContaining('fileSystemEntry') { assert fileSystem.formatDirectoryListing(null) }
11400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
11500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
11600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testGetEntry() {
11700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.getEntry(NO_SUCH_DIR) == null
11800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.getEntry(NO_SUCH_FILE) == null
11900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
12000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.getEntry(EXISTING_FILE).path == EXISTING_FILE
12100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert fileSystem.getEntry(EXISTING_DIR).path == EXISTING_DIR
12200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
12300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def permissions = new Permissions('-wxrwx---')
12400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def fileEntry = new FileEntry(path: NEW_FILE, lastModified: DATE, contents: 'abc', owner: 'owner',
12500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair                group: 'group', permissions: permissions)
12600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        fileSystem.add(fileEntry)
12700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def entry = fileSystem.getEntry(NEW_FILE)
12800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info(entry.toString())
12900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert entry.path == NEW_FILE
13000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert !entry.directory
13100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert entry.size == 3
13200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert entry.owner == 'owner'
13300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert entry.group == 'group'
13400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assert entry.permissions == permissions
13500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
13600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
13700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testNormalize_Null() {
13800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFailWithMessageContaining("path") { fileSystem.normalize(null) }
13900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
14000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    void testGetName_Null() {
14200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        shouldFailWithMessageContaining("path") { fileSystem.getName(null) }
14300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
14400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //--------------------------------------------------------------------------
14600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Abstract Methods
14700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //--------------------------------------------------------------------------
14800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
14900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    protected abstract Class getExpectedDirectoryListingFormatterClass()
15000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //--------------------------------------------------------------------------
15200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    // Internal Helper Methods
15300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    //--------------------------------------------------------------------------
15400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
15500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    /**
15600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * Verify the contents of the file at the specified path read from its InputSteam
15700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     *
15800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param fileSystem - the FileSystem instance
15900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @param expectedContents - the expected contents
16000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @throws IOException
16100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     * @see org.mockftpserver.fake.filesystem.AbstractFileSystemTestCase#verifyFileContents(FileSystem,String,String )
16200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair     */
16300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    protected void verifyFileContents(FileSystem fileSystem, String path, String expectedContents) throws IOException {
16400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        def fileEntry = fileSystem.getEntry(path)
16500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        InputStream input = fileEntry.createInputStream()
16600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        byte[] bytes = IoUtil.readBytes(input)
16700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        LOG.info("bytes=[" + new String(bytes) + "]")
16800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair        assertEquals("contents: actual=[" + new String(bytes) + "]", expectedContents.getBytes(), bytes)
16900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair    }
17000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair
17100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair}