12ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/* 22ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Copyright 2008 the original author or authors. 32ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * 42ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Licensed under the Apache License, Version 2.0 (the "License"); 52ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * you may not use this file except in compliance with the License. 62ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * You may obtain a copy of the License at 72ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * 82ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * http://www.apache.org/licenses/LICENSE-2.0 92ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * 102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Unless required by applicable law or agreed to in writing, software 112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * distributed under the License is distributed on an "AS IS" BASIS, 122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * See the License for the specific language governing permissions and 142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * limitations under the License. 152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */ 162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpackage org.mockftpserver.fake.filesystem 172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.util.IoUtil 192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/** 212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Tests for subclasses of AbstractFakeFileSystem. Subclasses must define 222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * 232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$ 242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * 252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair 262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */ 272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairabstract class AbstractFakeFileSystemTest extends AbstractFileSystemTest { 282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair // ------------------------------------------------------------------------- 302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair // Tests 312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair // ------------------------------------------------------------------------- 322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testDefaultDirectoryListingFormatterClass() { 342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.directoryListingFormatter.class == expectedDirectoryListingFormatterClass 352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testAdd_PathLocked() { 382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def dirEntry = new DirectoryEntry(NEW_DIR) 392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.add(dirEntry) 402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def fileEntry = new FileEntry(NEW_FILE) 412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.add(fileEntry) 422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair // The path should be locked for both entries 442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFail { dirEntry.setPath('abc') } 452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFail { fileEntry.setPath('abc') } 462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testAdd_Directory_CreateParentDirectoriesAutomatically() { 492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair final NEW_SUBDIR = fileSystem.path(NEW_DIR, "sub") 502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !fileSystem.exists(NEW_DIR), "Before createDirectory" 512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !fileSystem.exists(NEW_SUBDIR), "Before createDirectory" 522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.createParentDirectoriesAutomatically = true 542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.add(new DirectoryEntry(NEW_SUBDIR)) 552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.exists(NEW_DIR), "After createDirectory" 562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.exists(NEW_SUBDIR), "$NEW_SUBDIR: After createDirectory" 572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testAdd_File_CreateParentDirectoriesAutomatically() { 602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt") 612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !fileSystem.exists(NEW_DIR), "Before createDirectory" 622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !fileSystem.exists(NEW_FILE_IN_SUBDIR), "Before createDirectory" 632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.createParentDirectoriesAutomatically = true 652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR)) 662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.exists(NEW_DIR), "After createDirectory" 672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.exists(NEW_FILE_IN_SUBDIR), "$NEW_FILE_IN_SUBDIR: After createDirectory" 682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testAdd_File_CreateParentDirectoriesAutomatically_False() { 712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.createParentDirectoriesAutomatically = false 722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair final NEW_FILE_IN_SUBDIR = fileSystem.path(NEW_DIR, "abc.txt") 732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !fileSystem.exists(NEW_DIR), "Before createDirectory" 742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFail(FileSystemException) { fileSystem.add(new FileEntry(NEW_FILE_IN_SUBDIR)) } 762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !fileSystem.exists(NEW_DIR), "After createDirectory" 772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testSetEntries() { 802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.createParentDirectoriesAutomatically = false 812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def entries = [new FileEntry(NEW_FILE), new DirectoryEntry(NEW_DIR)] 822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.setEntries(entries) 832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.exists(NEW_DIR) 842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.exists(NEW_FILE) 852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testToString() { 882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair String toString = fileSystem.toString() 892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair LOG.info("toString=" + toString) 902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert toString.contains(EXISTING_DIR) 912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert toString.contains(EXISTING_FILE) 922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testFormatDirectoryListing() { 952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def fileEntry = new FileEntry(path: 'abc') 962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def formatter = [format: {f -> 972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert f == fileEntry 982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair return 'abc' 992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair }] as DirectoryListingFormatter 1002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.directoryListingFormatter = formatter 1012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.formatDirectoryListing(fileEntry) == 'abc' 1022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testFormatDirectoryListing_NullDirectoryListingFormatter() { 1052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.directoryListingFormatter = null 1062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def fileEntry = new FileEntry('abc') 1072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFailWithMessageContaining('directoryListingFormatter') { assert fileSystem.formatDirectoryListing(fileEntry) } 1082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1092ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testFormatDirectoryListing_NullFileSystemEntry() { 1112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def formatter = [format: {f -> }] as DirectoryListingFormatter 1122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.directoryListingFormatter = formatter 1132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFailWithMessageContaining('fileSystemEntry') { assert fileSystem.formatDirectoryListing(null) } 1142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testGetEntry() { 1172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.getEntry(NO_SUCH_DIR) == null 1182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.getEntry(NO_SUCH_FILE) == null 1192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.getEntry(EXISTING_FILE).path == EXISTING_FILE 1212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert fileSystem.getEntry(EXISTING_DIR).path == EXISTING_DIR 1222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def permissions = new Permissions('-wxrwx---') 1242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def fileEntry = new FileEntry(path: NEW_FILE, lastModified: DATE, contents: 'abc', owner: 'owner', 1252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair group: 'group', permissions: permissions) 1262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair fileSystem.add(fileEntry) 1272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def entry = fileSystem.getEntry(NEW_FILE) 1282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair LOG.info(entry) 1292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert entry.path == NEW_FILE 1302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert !entry.directory 1312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert entry.size == 3 1322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert entry.owner == 'owner' 1332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert entry.group == 'group' 1342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assert entry.permissions == permissions 1352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testNormalize_Null() { 1382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFailWithMessageContaining("path") { fileSystem.normalize(null) } 1392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair void testGetName_Null() { 1422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair shouldFailWithMessageContaining("path") { fileSystem.getName(null) } 1432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair //-------------------------------------------------------------------------- 1462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair // Abstract Methods 1472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair //-------------------------------------------------------------------------- 1482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair protected abstract Class getExpectedDirectoryListingFormatterClass() 1502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair //-------------------------------------------------------------------------- 1522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair // Internal Helper Methods 1532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair //-------------------------------------------------------------------------- 1542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair /** 1562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Verify the contents of the file at the specified path read from its InputSteam 1572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * 1582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @param fileSystem - the FileSystem instance 1592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @param expectedContents - the expected contents 1602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @throws IOException 1612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @see org.mockftpserver.fake.filesystem.AbstractFileSystemTest#verifyFileContents(FileSystem, 1622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * String , String ) 1632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */ 1642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair protected void verifyFileContents(FileSystem fileSystem, String path, String expectedContents) throws IOException { 1652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair def fileEntry = fileSystem.getEntry(path) 1662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair InputStream input = fileEntry.createInputStream() 1672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair byte[] bytes = IoUtil.readBytes(input) 1682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair LOG.info("bytes=[" + new String(bytes) + "]") 1692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair assertEquals("contents: actual=[" + new String(bytes) + "]", expectedContents.getBytes(), bytes) 1702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair } 1712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair 1722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}