Author: ggregory Date: Thu Mar 22 13:47:03 2012 New Revision: 1303781 URL: http://svn.apache.org/viewvc?rev=1303781&view=rev Log: [VFS-407] reading a RAM FileSystem file fails because it never returns EOF -1.
Modified: commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ram/test/CustomRamProviderTest.java commons/proper/vfs/trunk/src/changes/changes.xml Modified: commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ram/test/CustomRamProviderTest.java URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ram/test/CustomRamProviderTest.java?rev=1303781&r1=1303780&r2=1303781&view=diff ============================================================================== --- commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ram/test/CustomRamProviderTest.java (original) +++ commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/ram/test/CustomRamProviderTest.java Thu Mar 22 13:47:03 2012 @@ -17,10 +17,19 @@ package org.apache.commons.vfs2.provider.ram.test; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.fail; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.commons.vfs2.FileContent; import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystemException; import org.apache.commons.vfs2.FileSystemOptions; @@ -34,18 +43,53 @@ import org.junit.Test; /** * Custom tests * - * @author edgar poce - * + * @version $Id$ */ public class CustomRamProviderTest { + private static final byte[] NON_EMPTY_FILE_CONTENT = new byte[]{ 1, 2, 3 }; + + private List<Closeable> closeables = new ArrayList<Closeable>(); + + FileSystemOptions defaultRamFs = new FileSystemOptions(); + DefaultFileSystemManager manager; + FileSystemOptions smallSized = new FileSystemOptions(); + FileSystemOptions zeroSized = new FileSystemOptions(); - FileSystemOptions smallSized = new FileSystemOptions(); + /** + * Closes the given {@link Closeable} during the tearDown phase. + */ + private <C extends Closeable> C closeOnTearDown(C closeable) + { + this.closeables.add(closeable); + return closeable; + } - FileSystemOptions defaultRamFs = new FileSystemOptions(); + private InputStream createEmptyFile() throws FileSystemException, IOException + { + final FileObject root = manager.resolveFile("ram://file"); + root.createFile(); + return this.closeOnTearDown(root.getContent().getInputStream()); + } + + private InputStream createNonEmptyFile() throws FileSystemException, IOException + { + final FileObject root = manager.resolveFile("ram://file"); + root.createFile(); + + final FileContent content = root.getContent(); + final OutputStream output = this.closeOnTearDown(content.getOutputStream()); + output.write(1); + output.write(2); + output.write(3); + output.flush(); + output.close(); + + return this.closeOnTearDown(content.getInputStream()); + } @Before public void setUp() throws Exception @@ -62,26 +106,131 @@ public class CustomRamProviderTest @After public void tearDown() throws Exception { + for (Closeable closeable : this.closeables) + { + try + { + closeable.close(); + } catch (final Exception e) + { + // ignore + } + } manager.close(); } @Test - public void testSmallFS() throws Exception + public void testReadEmptyFileByteByByte() throws FileSystemException, IOException + { + final InputStream input = this.createEmptyFile(); + assertEquals("Empty file didnt return EOF -1", -1, input.read()); + } + + @Test + public void testReadEmptyFileIntoBuffer() throws FileSystemException, IOException + { + final InputStream input = this.createEmptyFile(); + + final byte[] buffer = new byte[100]; + assertEquals("Empty file didnt return when filling buffer", -1, input.read(buffer)); + assertArrayEquals("Buffer was written too", new byte[100], buffer); + } + + @Test + public void testReadEmptyFileIntoBufferWithOffsetAndLength() throws FileSystemException, IOException + { + final InputStream input = this.createEmptyFile(); + final byte[] buffer = new byte[100]; + assertEquals("Empty file didnt return when filling buffer", -1, input.read(buffer, 10, 90)); + assertArrayEquals("Buffer was written too", new byte[100], buffer); + } + + @Test + public void testReadNonEmptyFileByteByByte() throws FileSystemException, IOException { + final InputStream input = this.createNonEmptyFile(); + assertEquals("Read 1st byte failed", 1, input.read()); + assertEquals("Rread 2st byte failed", 2, input.read()); + assertEquals("Read 3st byte failed", 3, input.read()); + assertEquals("File should be empty", -1, input.read()); + } + + @Test + public void testReadNonEmptyFileIntoBuffer() throws FileSystemException, IOException + { + final InputStream input = this.createNonEmptyFile(); + + final byte[] buffer = new byte[100]; + assertEquals("Filling buffer failed when file is not empty", NON_EMPTY_FILE_CONTENT.length, input.read(buffer)); + + final byte[] expectedBuffer = new byte[100]; + System.arraycopy(NON_EMPTY_FILE_CONTENT, 0, expectedBuffer, 0, NON_EMPTY_FILE_CONTENT.length); + assertArrayEquals("Buffer not filled", expectedBuffer, buffer); + + Arrays.fill(buffer, (byte) 0); + Arrays.fill(expectedBuffer, (byte) 0); + + assertEquals("File should be empty after filling buffer", -1, input.read(buffer)); + assertArrayEquals("Buffer was written when empty", expectedBuffer, buffer); + } + + @Test + public void testReadNonEmptyFileIntoBufferWithOffsetAndLength() throws FileSystemException, IOException + { + final InputStream input = this.createNonEmptyFile(); + + final byte[] buffer = new byte[100]; + final int offset = 10; + assertEquals("Filling buffer failed when file is not empty", NON_EMPTY_FILE_CONTENT.length, + input.read(buffer, offset, 100 - offset)); + + final byte[] expectedBuffer = new byte[100]; + System.arraycopy(NON_EMPTY_FILE_CONTENT, 0, expectedBuffer, offset, NON_EMPTY_FILE_CONTENT.length); + assertArrayEquals("Buffer not filled", expectedBuffer, buffer); + + Arrays.fill(buffer, (byte) 0); + Arrays.fill(expectedBuffer, (byte) 0); + assertEquals("File should be empty after filling buffer", -1, input.read(buffer, 10, 90)); + assertArrayEquals("Buffer was written when empty", expectedBuffer, buffer); + } + + /** + * + * Checks root folder exists + * + * @throws FileSystemException + */ + @Test + public void testRootFolderExists() throws FileSystemException + { + FileObject root = manager.resolveFile("ram:///", defaultRamFs); + assertTrue(root.getType().hasChildren()); + + try + { + root.delete(); + fail(); + } catch (FileSystemException e) + { + // Expected + } + + } + + @Test + public void testSmallFS() throws Exception + { // Default FS FileObject fo1 = manager.resolveFile("ram:/"); FileObject fo2 = manager.resolveFile("ram:/"); - assertTrue("Both files should exist in the same fs instance.", fo1 - .getFileSystem() == fo2.getFileSystem()); + assertTrue("Both files should exist in the same fs instance.", fo1.getFileSystem() == fo2.getFileSystem()); // Small FS FileObject fo3 = manager.resolveFile("ram:/fo3", smallSized); FileObject fo4 = manager.resolveFile("ram:/", smallSized); - assertTrue("Both files should exist in different fs instances.", fo3 - .getFileSystem() == fo4.getFileSystem()); - assertTrue("These file shouldn't be in the same file system.", fo1 - .getFileSystem() != fo3.getFileSystem()); + assertTrue("Both files should exist in different fs instances.", fo3.getFileSystem() == fo4.getFileSystem()); + assertTrue("These file shouldn't be in the same file system.", fo1.getFileSystem() != fo3.getFileSystem()); fo3.createFile(); try @@ -89,8 +238,7 @@ public class CustomRamProviderTest OutputStream os = fo3.getContent().getOutputStream(); os.write(new byte[10]); os.close(); - } - catch (FileSystemException e) + } catch (FileSystemException e) { fail("It shouldn't save such a small file"); } @@ -101,33 +249,10 @@ public class CustomRamProviderTest os.write(new byte[11]); os.close(); fail("It shouldn't save such a big file"); - } - catch (FileSystemException e) + } catch (FileSystemException e) { - // exception awaited + // Expected } } - - /** - * - * Checks root folder exists - * - * @throws FileSystemException - */ - @Test - public void testRootFolderExists() throws FileSystemException { - FileObject root = manager.resolveFile("ram:///", defaultRamFs); - assertTrue(root.getType().hasChildren()); - - try { - root.delete(); - fail(); - } catch (FileSystemException e) { - - } - - } - - } Modified: commons/proper/vfs/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1303781&r1=1303780&r2=1303781&view=diff ============================================================================== --- commons/proper/vfs/trunk/src/changes/changes.xml (original) +++ commons/proper/vfs/trunk/src/changes/changes.xml Thu Mar 22 13:47:03 2012 @@ -23,6 +23,9 @@ <body> <release version="2.1" date="TBD" description=""> + <action issue="VFS-407" dev="ggregory" type="fix" due-to="mp1"> + [RAM] Reading a RAM FileSystem file fails because it never returns EOF -1. + </action> <action issue="VFS-404" dev="ggregory" type="update"> [FTP][FTPS] Update Apache Commons Net to 3.1 from 3.0.1 </action>