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