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}