1abd32a990e145862f22d15316feedced5ad246aachrismair/* 2abd32a990e145862f22d15316feedced5ad246aachrismair * Copyright 2008 the original author or authors. 3abd32a990e145862f22d15316feedced5ad246aachrismair * 4abd32a990e145862f22d15316feedced5ad246aachrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5abd32a990e145862f22d15316feedced5ad246aachrismair * you may not use this file except in compliance with the License. 6abd32a990e145862f22d15316feedced5ad246aachrismair * You may obtain a copy of the License at 7abd32a990e145862f22d15316feedced5ad246aachrismair * 8abd32a990e145862f22d15316feedced5ad246aachrismair * http://www.apache.org/licenses/LICENSE-2.0 9abd32a990e145862f22d15316feedced5ad246aachrismair * 10abd32a990e145862f22d15316feedced5ad246aachrismair * Unless required by applicable law or agreed to in writing, software 11abd32a990e145862f22d15316feedced5ad246aachrismair * distributed under the License is distributed on an "AS IS" BASIS, 12abd32a990e145862f22d15316feedced5ad246aachrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13abd32a990e145862f22d15316feedced5ad246aachrismair * See the License for the specific language governing permissions and 14abd32a990e145862f22d15316feedced5ad246aachrismair * limitations under the License. 15abd32a990e145862f22d15316feedced5ad246aachrismair */ 16abd32a990e145862f22d15316feedced5ad246aachrismairpackage org.mockftpserver.fake.filesystem 17abd32a990e145862f22d15316feedced5ad246aachrismair 18dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismairimport org.slf4j.Logger; 19dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismairimport org.slf4j.LoggerFactory; 2009415075d96852489d096aea7ae07dd156b58643chrismairimport org.mockftpserver.core.util.IoUtil 21abd32a990e145862f22d15316feedced5ad246aachrismair 22abd32a990e145862f22d15316feedced5ad246aachrismair/** 23abd32a990e145862f22d15316feedced5ad246aachrismair * Tests for FileEntry 2409415075d96852489d096aea7ae07dd156b58643chrismair * 257d4a3a2990f1a386eaf9d50cf05a9d45fab32de6chrismair * @version $Revision$ - $Date$ 26abd32a990e145862f22d15316feedced5ad246aachrismair * 27abd32a990e145862f22d15316feedced5ad246aachrismair * @author Chris Mair 28abd32a990e145862f22d15316feedced5ad246aachrismair */ 295303c6ae1dde5f399fe48803e677942fc4326344chrismairpublic class FileEntryTest extends AbstractFileSystemEntryTestCase { 30abd32a990e145862f22d15316feedced5ad246aachrismair 31dfa40a06dff44f29d8d5e1d3186055ad325fc7b9chrismair private static final LOG = LoggerFactory.getLogger(FileEntryTest) 32abd32a990e145862f22d15316feedced5ad246aachrismair private static final CONTENTS = "abc 123 %^& xxx" 3309415075d96852489d096aea7ae07dd156b58643chrismair 34abd32a990e145862f22d15316feedced5ad246aachrismair private FileEntry entry 35abd32a990e145862f22d15316feedced5ad246aachrismair 36abd32a990e145862f22d15316feedced5ad246aachrismair void testConstructorWithStringContents() { 37abd32a990e145862f22d15316feedced5ad246aachrismair entry = new FileEntry(PATH, CONTENTS) 38abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(CONTENTS) 39abd32a990e145862f22d15316feedced5ad246aachrismair } 4009415075d96852489d096aea7ae07dd156b58643chrismair 41abd32a990e145862f22d15316feedced5ad246aachrismair void testSettingContentsFromString() { 42abd32a990e145862f22d15316feedced5ad246aachrismair entry.setContents(CONTENTS) 43abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(CONTENTS) 44abd32a990e145862f22d15316feedced5ad246aachrismair } 45abd32a990e145862f22d15316feedced5ad246aachrismair 46abd32a990e145862f22d15316feedced5ad246aachrismair void testSettingContentsFromBytes() { 47abd32a990e145862f22d15316feedced5ad246aachrismair byte[] contents = CONTENTS.getBytes() 48abd32a990e145862f22d15316feedced5ad246aachrismair entry.setContents(contents) 49abd32a990e145862f22d15316feedced5ad246aachrismair // Now corrupt the original byte array to make sure the file entry is not affected 5009415075d96852489d096aea7ae07dd156b58643chrismair contents[1] = (byte) '#' 51abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(CONTENTS) 52abd32a990e145862f22d15316feedced5ad246aachrismair } 5309415075d96852489d096aea7ae07dd156b58643chrismair 543b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair void testSetContents_BytesNotInCharSet() { 553b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair byte[] contents = [65, -99, 91, -115] as byte[] 563b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair entry.setContents(contents) 573b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair verifyContents(contents) 583b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair } 593b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair 60abd32a990e145862f22d15316feedced5ad246aachrismair void testSetContents_NullString() { 61d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair entry.setContents((String) null) 62d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair assert entry.size == 0 63abd32a990e145862f22d15316feedced5ad246aachrismair } 6409415075d96852489d096aea7ae07dd156b58643chrismair 65abd32a990e145862f22d15316feedced5ad246aachrismair void testSetContents_NullBytes() { 66d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair entry.setContents((byte[]) null) 67d150a70ca8f8ad6cc300cf56174c8846066a4ad4chrismair assert entry.size == 0 68abd32a990e145862f22d15316feedced5ad246aachrismair } 6909415075d96852489d096aea7ae07dd156b58643chrismair 70abd32a990e145862f22d15316feedced5ad246aachrismair void testCreateOutputStream() { 71abd32a990e145862f22d15316feedced5ad246aachrismair // New, empty file 72abd32a990e145862f22d15316feedced5ad246aachrismair OutputStream out = entry.createOutputStream(false) 73abd32a990e145862f22d15316feedced5ad246aachrismair out.write(CONTENTS.getBytes()) 74abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(CONTENTS) 7509415075d96852489d096aea7ae07dd156b58643chrismair 76abd32a990e145862f22d15316feedced5ad246aachrismair // Another OutputStream, append=false 77abd32a990e145862f22d15316feedced5ad246aachrismair out = entry.createOutputStream(false) 78abd32a990e145862f22d15316feedced5ad246aachrismair out.write(CONTENTS.getBytes()) 79abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(CONTENTS) 8009415075d96852489d096aea7ae07dd156b58643chrismair 81abd32a990e145862f22d15316feedced5ad246aachrismair // Another OutputStream, append=true 82abd32a990e145862f22d15316feedced5ad246aachrismair out = entry.createOutputStream(true) 83abd32a990e145862f22d15316feedced5ad246aachrismair out.write(CONTENTS.getBytes()) 84abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(CONTENTS + CONTENTS) 85abd32a990e145862f22d15316feedced5ad246aachrismair 86abd32a990e145862f22d15316feedced5ad246aachrismair // Set contents directly 87abd32a990e145862f22d15316feedced5ad246aachrismair final String NEW_CONTENTS = ",./'\t\r[]-\n=" 88abd32a990e145862f22d15316feedced5ad246aachrismair entry.setContents(NEW_CONTENTS) 89abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(NEW_CONTENTS) 9009415075d96852489d096aea7ae07dd156b58643chrismair 91abd32a990e145862f22d15316feedced5ad246aachrismair // New OutputStream, append=true (so should append to contents we set directly) 92abd32a990e145862f22d15316feedced5ad246aachrismair out = entry.createOutputStream(true) 93abd32a990e145862f22d15316feedced5ad246aachrismair out.write(CONTENTS.getBytes()) 94abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(NEW_CONTENTS + CONTENTS) 95abd32a990e145862f22d15316feedced5ad246aachrismair 96abd32a990e145862f22d15316feedced5ad246aachrismair // Yet another OutputStream, append=true (so should append to accumulated contents) 97abd32a990e145862f22d15316feedced5ad246aachrismair OutputStream out2 = entry.createOutputStream(true) 98abd32a990e145862f22d15316feedced5ad246aachrismair out2.write(CONTENTS.getBytes()) 99abd32a990e145862f22d15316feedced5ad246aachrismair out2.close() // should have no effect 100abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(NEW_CONTENTS + CONTENTS + CONTENTS) 10109415075d96852489d096aea7ae07dd156b58643chrismair 102abd32a990e145862f22d15316feedced5ad246aachrismair // Write with the previous OutputStream (simulate 2 OututStreams writing "concurrently") 103abd32a990e145862f22d15316feedced5ad246aachrismair out.write(NEW_CONTENTS.getBytes()) 104abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents(NEW_CONTENTS + CONTENTS + CONTENTS + NEW_CONTENTS) 105abd32a990e145862f22d15316feedced5ad246aachrismair } 10609415075d96852489d096aea7ae07dd156b58643chrismair 107abd32a990e145862f22d15316feedced5ad246aachrismair void testCreateInputStream_NullContents() { 108abd32a990e145862f22d15316feedced5ad246aachrismair verifyContents("") 109abd32a990e145862f22d15316feedced5ad246aachrismair } 11009415075d96852489d096aea7ae07dd156b58643chrismair 11109415075d96852489d096aea7ae07dd156b58643chrismair void testCloneWithNewPath() { 11209415075d96852489d096aea7ae07dd156b58643chrismair entry.lastModified = LAST_MODIFIED 11309415075d96852489d096aea7ae07dd156b58643chrismair entry.owner = USER 11409415075d96852489d096aea7ae07dd156b58643chrismair entry.group = GROUP 11509415075d96852489d096aea7ae07dd156b58643chrismair entry.permissions = PERMISSIONS 11609415075d96852489d096aea7ae07dd156b58643chrismair entry.setContents('abc') 11709415075d96852489d096aea7ae07dd156b58643chrismair def clone = entry.cloneWithNewPath(NEW_PATH) 11809415075d96852489d096aea7ae07dd156b58643chrismair 11909415075d96852489d096aea7ae07dd156b58643chrismair assert !clone.is(entry) 12009415075d96852489d096aea7ae07dd156b58643chrismair assert clone.path == NEW_PATH 12109415075d96852489d096aea7ae07dd156b58643chrismair assert clone.lastModified == LAST_MODIFIED 12209415075d96852489d096aea7ae07dd156b58643chrismair assert clone.owner == USER 12309415075d96852489d096aea7ae07dd156b58643chrismair assert clone.group == GROUP 12409415075d96852489d096aea7ae07dd156b58643chrismair assert clone.permissions == PERMISSIONS 125a5c19061b721f203631e1969bf38127301e29414chrismair assert clone.createInputStream().text == 'abc' 126a5c19061b721f203631e1969bf38127301e29414chrismair assert !clone.directory 127a5c19061b721f203631e1969bf38127301e29414chrismair } 128a5c19061b721f203631e1969bf38127301e29414chrismair 129a5c19061b721f203631e1969bf38127301e29414chrismair void testCloneWithNewPath_WriteToOutputStream() { 130a5c19061b721f203631e1969bf38127301e29414chrismair def outputStream = entry.createOutputStream(false) 131a5c19061b721f203631e1969bf38127301e29414chrismair outputStream.withWriter { writer -> writer.write('ABCDEF') } 132a5c19061b721f203631e1969bf38127301e29414chrismair def clone = entry.cloneWithNewPath(NEW_PATH) 133a5c19061b721f203631e1969bf38127301e29414chrismair 134a5c19061b721f203631e1969bf38127301e29414chrismair assert !clone.is(entry) 135a5c19061b721f203631e1969bf38127301e29414chrismair assert clone.path == NEW_PATH 136a5c19061b721f203631e1969bf38127301e29414chrismair assert clone.createInputStream().text == 'ABCDEF' 13709415075d96852489d096aea7ae07dd156b58643chrismair assert !clone.directory 13809415075d96852489d096aea7ae07dd156b58643chrismair } 13909415075d96852489d096aea7ae07dd156b58643chrismair 1401dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// void testEquals() { 1411dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.equals(entry) 1421dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.equals(new FileEntry(path:PATH, lastModified:LAST_MODIFIED)) 1431dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.equals(new FileEntry(path:PATH, lastModified:new Date())) // lastModified ignored 1441dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// 1451dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert !entry.equals(new FileEntry("xyz", lastModified:LAST_MODIFIED)) 1461dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert !entry.equals(new FileEntry(path:PATH, contents:'abc', lastModified:LAST_MODIFIED)) 1471dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert !entry.equals("ABC") 1481dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert !entry.equals(null) 1491dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// } 1501dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// 1511dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// void testHashCode() { 1521dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.hashCode() == entry.hashCode() 1531dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.hashCode() == new FileEntry(path:PATH, contents:'abc', lastModified:LAST_MODIFIED).hashCode() 1541dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.hashCode() == new FileEntry(path:PATH, contents:'abc', new Date()).hashCode() // lastModified ignored 1551dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// 1561dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.hashCode() != new FileEntry(path:PATH, contents:'abc', lastModified:LAST_MODIFIED).hashCode() 1571dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.hashCode() != new FileEntry(path:PATH, contents:'abcdef', lastModified:LAST_MODIFIED).hashCode() 1581dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// 1591dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// assert entry.hashCode() == new DirectoryEntry(path:PATH, lastModified:LAST_MODIFIED).hashCode() 1601dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair// } 1611dfeab57f80c3a156a7ff11871c03f3f53033b9echrismair 162abd32a990e145862f22d15316feedced5ad246aachrismair //------------------------------------------------------------------------- 163abd32a990e145862f22d15316feedced5ad246aachrismair // Implementation of Required Abstract Methods 164abd32a990e145862f22d15316feedced5ad246aachrismair //------------------------------------------------------------------------- 16509415075d96852489d096aea7ae07dd156b58643chrismair 166abd32a990e145862f22d15316feedced5ad246aachrismair /** 1675303c6ae1dde5f399fe48803e677942fc4326344chrismair * @see org.mockftpserver.fake.filesystem.AbstractFileSystemEntryTestCase#getImplementationClass() 168abd32a990e145862f22d15316feedced5ad246aachrismair */ 169abd32a990e145862f22d15316feedced5ad246aachrismair protected Class getImplementationClass() { 170abd32a990e145862f22d15316feedced5ad246aachrismair return FileEntry.class 171abd32a990e145862f22d15316feedced5ad246aachrismair } 172abd32a990e145862f22d15316feedced5ad246aachrismair 173abd32a990e145862f22d15316feedced5ad246aachrismair /** 1745303c6ae1dde5f399fe48803e677942fc4326344chrismair * @see org.mockftpserver.fake.filesystem.AbstractFileSystemEntryTestCase#isDirectory() 175abd32a990e145862f22d15316feedced5ad246aachrismair */ 176abd32a990e145862f22d15316feedced5ad246aachrismair protected boolean isDirectory() { 177abd32a990e145862f22d15316feedced5ad246aachrismair return false 178abd32a990e145862f22d15316feedced5ad246aachrismair } 179abd32a990e145862f22d15316feedced5ad246aachrismair 180abd32a990e145862f22d15316feedced5ad246aachrismair //------------------------------------------------------------------------- 181abd32a990e145862f22d15316feedced5ad246aachrismair // Test setup 182abd32a990e145862f22d15316feedced5ad246aachrismair //------------------------------------------------------------------------- 183abd32a990e145862f22d15316feedced5ad246aachrismair 184abd32a990e145862f22d15316feedced5ad246aachrismair void setUp() { 185abd32a990e145862f22d15316feedced5ad246aachrismair super.setUp() 186abd32a990e145862f22d15316feedced5ad246aachrismair entry = new FileEntry(PATH) 187abd32a990e145862f22d15316feedced5ad246aachrismair } 188abd32a990e145862f22d15316feedced5ad246aachrismair 189abd32a990e145862f22d15316feedced5ad246aachrismair //------------------------------------------------------------------------- 190abd32a990e145862f22d15316feedced5ad246aachrismair // Internal Helper Methods 191abd32a990e145862f22d15316feedced5ad246aachrismair //------------------------------------------------------------------------- 19209415075d96852489d096aea7ae07dd156b58643chrismair 193abd32a990e145862f22d15316feedced5ad246aachrismair /** 194abd32a990e145862f22d15316feedced5ad246aachrismair * Verify the expected contents of the file entry, read from its InputSteam 1953b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair * @param expectedContents - the expected contents, as a String 196abd32a990e145862f22d15316feedced5ad246aachrismair * @throws IOException 197abd32a990e145862f22d15316feedced5ad246aachrismair */ 198abd32a990e145862f22d15316feedced5ad246aachrismair private void verifyContents(String expectedContents) { 1993b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair LOG.info("expectedContents=$expectedContents") 2003b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair verifyContents(expectedContents.bytes) 2013b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair } 2023b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair 2033b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair /** 2043b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair * Verify the expected contents of the file entry, read from its InputSteam 2053b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair * @param expectedContents - the expected contents, as a byte[] 2063b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair * @throws IOException 2073b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair */ 2083b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair private void verifyContents(byte[] expectedContents) { 209abd32a990e145862f22d15316feedced5ad246aachrismair byte[] bytes = IoUtil.readBytes(entry.createInputStream()) 2103b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair def bytesAsList = bytes as List 2113b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair LOG.info("bytes=$bytesAsList") 2123b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair assert bytes == expectedContents, "actual=$bytesAsList expected=${expectedContents as byte[]}" 2133b10a12a6bf22b061eb0861469fbb5fd212de1bcchrismair assert entry.getSize() == expectedContents.length 214abd32a990e145862f22d15316feedced5ad246aachrismair } 21509415075d96852489d096aea7ae07dd156b58643chrismair 216abd32a990e145862f22d15316feedced5ad246aachrismair} 217