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