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