1ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/*
2ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Copyright 2008 the original author or authors.
3ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
4ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * you may not use this file except in compliance with the License.
6ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * You may obtain a copy of the License at
7ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
8ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
10ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Unless required by applicable law or agreed to in writing, software
11ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * See the License for the specific language governing permissions and
14ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * limitations under the License.
15ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
16ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpackage org.mockftpserver.fake.filesystem
17ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
18ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.util.IoUtil
19ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Tests for subclasses of AbstractFakeFileSystem. Subclasses must define
22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision$ - $Date$
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairabstract class AbstractFakeFileSystemTest extends AbstractFileSystemTest {
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // -------------------------------------------------------------------------
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Tests
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // -------------------------------------------------------------------------
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testDefaultDirectoryListingFormatterClass() {
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.directoryListingFormatter.class == expectedDirectoryListingFormatterClass
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testAdd_PathLocked() {
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def dirEntry = new DirectoryEntry(NEW_DIR)
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(dirEntry)
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def fileEntry = new FileEntry(NEW_FILE)
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(fileEntry)
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        // The path should be locked for both entries
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFail { dirEntry.setPath('abc') }
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFail { fileEntry.setPath('abc') }
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testAdd_Directory_CreateParentDirectoriesAutomatically() {
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        final NEW_SUBDIR = fileSystem.path(NEW_DIR, "sub")
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !fileSystem.exists(NEW_SUBDIR), "Before createDirectory"
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.createParentDirectoriesAutomatically = true
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(new DirectoryEntry(NEW_SUBDIR))
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.exists(NEW_DIR), "After createDirectory"
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.exists(NEW_SUBDIR), "$NEW_SUBDIR: After createDirectory"
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testAdd_File_CreateParentDirectoriesAutomatically() {
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt")
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !fileSystem.exists(NEW_FILE_IN_SUBDIR), "Before createDirectory"
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.createParentDirectoriesAutomatically = true
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR))
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.exists(NEW_DIR), "After createDirectory"
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.exists(NEW_FILE_IN_SUBDIR), "$NEW_FILE_IN_SUBDIR: After createDirectory"
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testAdd_File_CreateParentDirectoriesAutomatically_False() {
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.createParentDirectoriesAutomatically = false
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt")
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !fileSystem.exists(NEW_DIR), "Before createDirectory"
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFail(FileSystemException) { fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR)) }
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !fileSystem.exists(NEW_DIR), "After createDirectory"
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testSetEntries() {
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.createParentDirectoriesAutomatically = false
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def entries = [new FileEntry(NEW_FILE), new DirectoryEntry(NEW_DIR)]
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.setEntries(entries)
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.exists(NEW_DIR)
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.exists(NEW_FILE)
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testToString() {
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        String toString = fileSystem.toString()
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        LOG.info("toString=" + toString)
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert toString.contains(EXISTING_DIR)
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert toString.contains(EXISTING_FILE)
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testFormatDirectoryListing() {
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def fileEntry = new FileEntry(path: 'abc')
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def formatter = [format: {f ->
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            assert f == fileEntry
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            return 'abc'
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }] as DirectoryListingFormatter
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.directoryListingFormatter = formatter
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.formatDirectoryListing(fileEntry) == 'abc'
102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testFormatDirectoryListing_NullDirectoryListingFormatter() {
105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.directoryListingFormatter = null
106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def fileEntry = new FileEntry('abc')
107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFailWithMessageContaining('directoryListingFormatter') { assert fileSystem.formatDirectoryListing(fileEntry) }
108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
110ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testFormatDirectoryListing_NullFileSystemEntry() {
111ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def formatter = [format: {f -> }] as DirectoryListingFormatter
112ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.directoryListingFormatter = formatter
113ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFailWithMessageContaining('fileSystemEntry') { assert fileSystem.formatDirectoryListing(null) }
114ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
115ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
116ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testGetEntry() {
117ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.getEntry(NO_SUCH_DIR) == null
118ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.getEntry(NO_SUCH_FILE) == null
119ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
120ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.getEntry(EXISTING_FILE).path == EXISTING_FILE
121ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileSystem.getEntry(EXISTING_DIR).path == EXISTING_DIR
122ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
123ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def permissions = new Permissions('-wxrwx---')
124ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def fileEntry = new FileEntry(path: NEW_FILE, lastModified: DATE, contents: 'abc', owner: 'owner',
125ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                group: 'group', permissions: permissions)
126ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(fileEntry)
127ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def entry = fileSystem.getEntry(NEW_FILE)
128ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        LOG.info(entry)
129ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert entry.path == NEW_FILE
130ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert !entry.directory
131ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert entry.size == 3
132ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert entry.owner == 'owner'
133ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert entry.group == 'group'
134ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert entry.permissions == permissions
135ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
136ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
137ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testNormalize_Null() {
138ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFailWithMessageContaining("path") { fileSystem.normalize(null) }
139ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
140ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
141ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testGetName_Null() {
142ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        shouldFailWithMessageContaining("path") { fileSystem.getName(null) }
143ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
144ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
145ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //--------------------------------------------------------------------------
146ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Abstract Methods
147ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //--------------------------------------------------------------------------
148ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
149ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected abstract Class getExpectedDirectoryListingFormatterClass()
150ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
151ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //--------------------------------------------------------------------------
152ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Internal Helper Methods
153ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //--------------------------------------------------------------------------
154ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
155ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
156ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Verify the contents of the file at the specified path read from its InputSteam
157ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
158ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param fileSystem - the FileSystem instance
159ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param expectedContents - the expected contents
160ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @throws IOException
161ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see org.mockftpserver.fake.filesystem.AbstractFileSystemTest#verifyFileContents(FileSystem,
162ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * String , String )
163ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
164ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected void verifyFileContents(FileSystem fileSystem, String path, String expectedContents) throws IOException {
165ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def fileEntry = fileSystem.getEntry(path)
166ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        InputStream input = fileEntry.createInputStream()
167ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        byte[] bytes = IoUtil.readBytes(input)
168ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        LOG.info("bytes=[" + new String(bytes) + "]")
169ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertEquals("contents: actual=[" + new String(bytes) + "]", expectedContents.getBytes(), bytes)
170ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
171ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
172ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}