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.filesystem
172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.util.IoUtil
192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Tests for subclasses of AbstractFakeFileSystem. Subclasses must define
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairabstract class AbstractFakeFileSystemTest extends AbstractFileSystemTest {
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // -------------------------------------------------------------------------
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // Tests
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // -------------------------------------------------------------------------
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testDefaultDirectoryListingFormatterClass() {
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.directoryListingFormatter.class == expectedDirectoryListingFormatterClass
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testAdd_PathLocked() {
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def dirEntry = new DirectoryEntry(NEW_DIR)
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.add(dirEntry)
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def fileEntry = new FileEntry(NEW_FILE)
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.add(fileEntry)
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // The path should be locked for both entries
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFail { dirEntry.setPath('abc') }
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFail { fileEntry.setPath('abc') }
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testAdd_Directory_CreateParentDirectoriesAutomatically() {
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        final NEW_SUBDIR = fileSystem.path(NEW_DIR, "sub")
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !fileSystem.exists(NEW_SUBDIR), "Before createDirectory"
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.createParentDirectoriesAutomatically = true
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.add(new DirectoryEntry(NEW_SUBDIR))
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.exists(NEW_DIR), "After createDirectory"
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.exists(NEW_SUBDIR), "$NEW_SUBDIR: After createDirectory"
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testAdd_File_CreateParentDirectoriesAutomatically() {
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt")
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !fileSystem.exists(NEW_FILE_IN_SUBDIR), "Before createDirectory"
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.createParentDirectoriesAutomatically = true
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR))
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.exists(NEW_DIR), "After createDirectory"
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.exists(NEW_FILE_IN_SUBDIR), "$NEW_FILE_IN_SUBDIR: After createDirectory"
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testAdd_File_CreateParentDirectoriesAutomatically_False() {
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.createParentDirectoriesAutomatically = false
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt")
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFail(FileSystemException) { fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR)) }
762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !fileSystem.exists(NEW_DIR), "After createDirectory"
772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testSetEntries() {
802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.createParentDirectoriesAutomatically = false
812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def entries = [new FileEntry(NEW_FILE), new DirectoryEntry(NEW_DIR)]
822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.setEntries(entries)
832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.exists(NEW_DIR)
842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.exists(NEW_FILE)
852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testToString() {
882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        String toString = fileSystem.toString()
892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        LOG.info("toString=" + toString)
902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert toString.contains(EXISTING_DIR)
912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert toString.contains(EXISTING_FILE)
922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testFormatDirectoryListing() {
952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def fileEntry = new FileEntry(path: 'abc')
962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def formatter = [format: {f ->
972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair            assert f == fileEntry
982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair            return 'abc'
992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        }] as DirectoryListingFormatter
1002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.directoryListingFormatter = formatter
1012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.formatDirectoryListing(fileEntry) == 'abc'
1022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testFormatDirectoryListing_NullDirectoryListingFormatter() {
1052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.directoryListingFormatter = null
1062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def fileEntry = new FileEntry('abc')
1072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFailWithMessageContaining('directoryListingFormatter') { assert fileSystem.formatDirectoryListing(fileEntry) }
1082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1092ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testFormatDirectoryListing_NullFileSystemEntry() {
1112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def formatter = [format: {f -> }] as DirectoryListingFormatter
1122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.directoryListingFormatter = formatter
1132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFailWithMessageContaining('fileSystemEntry') { assert fileSystem.formatDirectoryListing(null) }
1142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testGetEntry() {
1172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.getEntry(NO_SUCH_DIR) == null
1182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.getEntry(NO_SUCH_FILE) == null
1192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.getEntry(EXISTING_FILE).path == EXISTING_FILE
1212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert fileSystem.getEntry(EXISTING_DIR).path == EXISTING_DIR
1222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def permissions = new Permissions('-wxrwx---')
1242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def fileEntry = new FileEntry(path: NEW_FILE, lastModified: DATE, contents: 'abc', owner: 'owner',
1252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair                group: 'group', permissions: permissions)
1262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        fileSystem.add(fileEntry)
1272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def entry = fileSystem.getEntry(NEW_FILE)
1282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        LOG.info(entry)
1292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert entry.path == NEW_FILE
1302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert !entry.directory
1312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert entry.size == 3
1322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert entry.owner == 'owner'
1332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert entry.group == 'group'
1342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assert entry.permissions == permissions
1352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testNormalize_Null() {
1382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFailWithMessageContaining("path") { fileSystem.normalize(null) }
1392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    void testGetName_Null() {
1422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        shouldFailWithMessageContaining("path") { fileSystem.getName(null) }
1432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //--------------------------------------------------------------------------
1462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // Abstract Methods
1472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //--------------------------------------------------------------------------
1482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected abstract Class getExpectedDirectoryListingFormatterClass()
1502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //--------------------------------------------------------------------------
1522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // Internal Helper Methods
1532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //--------------------------------------------------------------------------
1542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Verify the contents of the file at the specified path read from its InputSteam
1572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fileSystem - the FileSystem instance
1592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param expectedContents - the expected contents
1602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws IOException
1612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @see org.mockftpserver.fake.filesystem.AbstractFileSystemTest#verifyFileContents(FileSystem,
1622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * String , String )
1632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected void verifyFileContents(FileSystem fileSystem, String path, String expectedContents) throws IOException {
1652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        def fileEntry = fileSystem.getEntry(path)
1662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        InputStream input = fileEntry.createInputStream()
1672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        byte[] bytes = IoUtil.readBytes(input)
1682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        LOG.info("bytes=[" + new String(bytes) + "]")
1692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        assertEquals("contents: actual=[" + new String(bytes) + "]", expectedContents.getBytes(), bytes)
1702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}