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}