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