Modified: poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java?rev=1839201&r1=1839200&r2=1839201&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestDocumentInputStream.java Sun Aug 26 11:55:00 2018 @@ -18,19 +18,17 @@ package org.apache.poi.poifs.filesystem; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import org.apache.poi.POIDataSamples; -import org.apache.poi.poifs.property.DirectoryProperty; -import org.apache.poi.poifs.storage.RawDataBlock; import org.apache.poi.util.SuppressForbidden; import org.junit.Before; import org.junit.Test; @@ -39,448 +37,369 @@ import org.junit.Test; * Class to test DocumentInputStream functionality */ public final class TestDocumentInputStream { - private DocumentNode _workbook_n; - private DocumentNode _workbook_o; - private byte[] _workbook_data; - private static final int _workbook_size = 5000; - - // non-even division of _workbook_size, also non-even division of - // any block size - private static final int _buffer_size = 6; + private DocumentNode _workbook_n; + private byte[] _workbook_data; + private static final int _workbook_size = 5000; + + // non-even division of _workbook_size, also non-even division of + // any block size + private static final int _buffer_size = 6; - @Before - public void setUp() throws Exception { + @Before + public void setUp() throws Exception { int blocks = (_workbook_size + 511) / 512; - _workbook_data = new byte[ 512 * blocks ]; - Arrays.fill(_workbook_data, ( byte ) -1); - for (int j = 0; j < _workbook_size; j++) - { - _workbook_data[ j ] = ( byte ) (j * j); - } - - // Create the Old POIFS Version - RawDataBlock[] rawBlocks = new RawDataBlock[ blocks ]; - ByteArrayInputStream stream = - new ByteArrayInputStream(_workbook_data); - - for (int j = 0; j < blocks; j++) - { - rawBlocks[ j ] = new RawDataBlock(stream); - } - OPOIFSDocument document = new OPOIFSDocument("Workbook", rawBlocks, - _workbook_size); - - _workbook_o = new DocumentNode( - document.getDocumentProperty(), - new DirectoryNode( - new DirectoryProperty("Root Entry"), (POIFSFileSystem)null, null)); - + _workbook_data = new byte[512 * blocks]; + Arrays.fill(_workbook_data, (byte) -1); + for (int j = 0; j < _workbook_size; j++) { + _workbook_data[j] = (byte) (j * j); + } + // Now create the NPOIFS Version byte[] _workbook_data_only = new byte[_workbook_size]; System.arraycopy(_workbook_data, 0, _workbook_data_only, 0, _workbook_size); - + NPOIFSFileSystem npoifs = new NPOIFSFileSystem(); // Make it easy when debugging to see what isn't the doc byte[] minus1 = new byte[512]; - Arrays.fill(minus1, (byte)-1); + Arrays.fill(minus1, (byte) -1); npoifs.getBlockAt(-1).put(minus1); npoifs.getBlockAt(0).put(minus1); npoifs.getBlockAt(1).put(minus1); - + // Create the NPOIFS document - _workbook_n = (DocumentNode)npoifs.createDocument( - new ByteArrayInputStream(_workbook_data_only), - "Workbook" + _workbook_n = (DocumentNode) npoifs.createDocument( + new ByteArrayInputStream(_workbook_data_only), + "Workbook" ); } - /** + /** * test constructor */ @Test public void testConstructor() throws IOException { - DocumentInputStream ostream = new ODocumentInputStream(_workbook_o); - DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); - - assertEquals(_workbook_size, _workbook_o.getSize()); - assertEquals(_workbook_size, _workbook_n.getSize()); - - assertEquals(_workbook_size, available(ostream)); - assertEquals(_workbook_size, available(nstream)); - - ostream.close(); - nstream.close(); + try (DocumentInputStream nstream = new NDocumentInputStream(_workbook_n)) { + assertEquals(_workbook_size, _workbook_n.getSize()); + assertEquals(_workbook_size, available(nstream)); + } } /** * test available() behavior */ - @Test + @Test(expected = IllegalStateException.class) public void testAvailable() throws IOException { - DocumentInputStream ostream = new DocumentInputStream(_workbook_o); DocumentInputStream nstream = new NDocumentInputStream(_workbook_n); - - assertEquals(_workbook_size, available(ostream)); assertEquals(_workbook_size, available(nstream)); - ostream.close(); nstream.close(); - - try { - available(ostream); - fail("Should have caught IOException"); - } catch (IllegalStateException ignored) { - // as expected - } - try { - available(nstream); - fail("Should have caught IOException"); - } catch (IllegalStateException ignored) { - // as expected - } + + available(nstream); } /** * test mark/reset/markSupported. */ + @SuppressWarnings("ResultOfMethodCallIgnored") @Test public void testMarkFunctions() throws IOException { - byte[] buffer = new byte[ _workbook_size / 5 ]; + byte[] buffer = new byte[_workbook_size / 5]; byte[] small_buffer = new byte[212]; - - DocumentInputStream[] streams = new DocumentInputStream[] { - new DocumentInputStream(_workbook_o), - new NDocumentInputStream(_workbook_n) - }; - for(DocumentInputStream stream : streams) { - // Read a fifth of it, and check all's correct - stream.read(buffer); - for (int j = 0; j < buffer.length; j++) { - assertEquals( - "checking byte " + j, - _workbook_data[ j ], buffer[ j ] - ); - } - assertEquals(_workbook_size - buffer.length, available(stream)); - - // Reset, and check the available goes back to being the - // whole of the stream - stream.reset(); - assertEquals(_workbook_size, available(stream)); - - - // Read part of a block - stream.read(small_buffer); - for (int j = 0; j < small_buffer.length; j++) { - assertEquals( - "checking byte " + j, - _workbook_data[ j ], small_buffer[ j ] - ); - } - assertEquals(_workbook_size - small_buffer.length, available(stream)); - stream.mark(0); - - // Read the next part - stream.read(small_buffer); - for (int j = 0; j < small_buffer.length; j++) { - assertEquals( - "checking byte " + j, - _workbook_data[ j+small_buffer.length ], small_buffer[ j ] - ); - } - assertEquals(_workbook_size - 2*small_buffer.length, available(stream)); - - // Reset, check it goes back to where it was - stream.reset(); - assertEquals(_workbook_size - small_buffer.length, available(stream)); - - // Read - stream.read(small_buffer); - for (int j = 0; j < small_buffer.length; j++) { - assertEquals( - "checking byte " + j, - _workbook_data[ j+small_buffer.length ], small_buffer[ j ] - ); - } - assertEquals(_workbook_size - 2*small_buffer.length, available(stream)); - - - // Now read at various points - Arrays.fill(small_buffer, ( byte ) 0); - stream.read(small_buffer, 6, 8); - stream.read(small_buffer, 100, 10); - stream.read(small_buffer, 150, 12); - int pos = small_buffer.length * 2; - for (int j = 0; j < small_buffer.length; j++) { - byte exp = 0; - if(j>= 6 && j<6+8) { - exp = _workbook_data[pos]; - pos++; - } - if(j>= 100 && j<100+10) { - exp = _workbook_data[pos]; - pos++; - } - if(j>= 150 && j<150+12) { - exp = _workbook_data[pos]; - pos++; - } - - assertEquals("checking byte " + j, exp, small_buffer[j]); - } + + DocumentInputStream stream = new NDocumentInputStream(_workbook_n); + // Read a fifth of it, and check all's correct + stream.read(buffer); + for (int j = 0; j < buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[j], buffer[j] + ); + } + assertEquals(_workbook_size - buffer.length, available(stream)); + + // Reset, and check the available goes back to being the + // whole of the stream + stream.reset(); + assertEquals(_workbook_size, available(stream)); + + + // Read part of a block + stream.read(small_buffer); + for (int j = 0; j < small_buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[j], small_buffer[j] + ); + } + assertEquals(_workbook_size - small_buffer.length, available(stream)); + stream.mark(0); + + // Read the next part + stream.read(small_buffer); + for (int j = 0; j < small_buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[j + small_buffer.length], small_buffer[j] + ); + } + assertEquals(_workbook_size - 2 * small_buffer.length, available(stream)); + + // Reset, check it goes back to where it was + stream.reset(); + assertEquals(_workbook_size - small_buffer.length, available(stream)); + + // Read + stream.read(small_buffer); + for (int j = 0; j < small_buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[j + small_buffer.length], small_buffer[j] + ); + } + assertEquals(_workbook_size - 2 * small_buffer.length, available(stream)); + + + // Now read at various points + Arrays.fill(small_buffer, (byte) 0); + stream.read(small_buffer, 6, 8); + stream.read(small_buffer, 100, 10); + stream.read(small_buffer, 150, 12); + int pos = small_buffer.length * 2; + for (int j = 0; j < small_buffer.length; j++) { + byte exp = 0; + if (j >= 6 && j < 6 + 8) { + exp = _workbook_data[pos]; + pos++; + } + if (j >= 100 && j < 100 + 10) { + exp = _workbook_data[pos]; + pos++; + } + if (j >= 150 && j < 150 + 12) { + exp = _workbook_data[pos]; + pos++; + } + + assertEquals("checking byte " + j, exp, small_buffer[j]); } - + // Now repeat it with spanning multiple blocks - streams = new DocumentInputStream[] { - new DocumentInputStream(_workbook_o), - new NDocumentInputStream(_workbook_n) - }; - for(DocumentInputStream stream : streams) { - // Read several blocks work - buffer = new byte[ _workbook_size / 5 ]; - stream.read(buffer); - for (int j = 0; j < buffer.length; j++) { - assertEquals( - "checking byte " + j, - _workbook_data[ j ], buffer[ j ] - ); - } - assertEquals(_workbook_size - buffer.length, available(stream)); - - // Read all of it again, check it began at the start again - stream.reset(); - assertEquals(_workbook_size, available(stream)); - - stream.read(buffer); - for (int j = 0; j < buffer.length; j++) { - assertEquals( - "checking byte " + j, - _workbook_data[ j ], buffer[ j ] - ); - } - - // Mark our position, and read another whole buffer - stream.mark(12); - stream.read(buffer); - assertEquals(_workbook_size - (2 * buffer.length), - available(stream)); - for (int j = buffer.length; j < (2 * buffer.length); j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j - buffer.length ]); - } - - // Reset, should go back to only one buffer full read - stream.reset(); - assertEquals(_workbook_size - buffer.length, available(stream)); - - // Read the buffer again - stream.read(buffer); - assertEquals(_workbook_size - (2 * buffer.length), - available(stream)); - for (int j = buffer.length; j < (2 * buffer.length); j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j - buffer.length ]); - } - assertTrue(stream.markSupported()); + stream = new NDocumentInputStream(_workbook_n); + // Read several blocks work + buffer = new byte[_workbook_size / 5]; + stream.read(buffer); + for (int j = 0; j < buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[j], buffer[j] + ); + } + assertEquals(_workbook_size - buffer.length, available(stream)); + + // Read all of it again, check it began at the start again + stream.reset(); + assertEquals(_workbook_size, available(stream)); + + stream.read(buffer); + for (int j = 0; j < buffer.length; j++) { + assertEquals( + "checking byte " + j, + _workbook_data[j], buffer[j] + ); + } + + // Mark our position, and read another whole buffer + stream.mark(12); + stream.read(buffer); + assertEquals(_workbook_size - (2 * buffer.length), + available(stream)); + for (int j = buffer.length; j < (2 * buffer.length); j++) { + assertEquals("checking byte " + j, _workbook_data[j], + buffer[j - buffer.length]); + } + + // Reset, should go back to only one buffer full read + stream.reset(); + assertEquals(_workbook_size - buffer.length, available(stream)); + + // Read the buffer again + stream.read(buffer); + assertEquals(_workbook_size - (2 * buffer.length), + available(stream)); + for (int j = buffer.length; j < (2 * buffer.length); j++) { + assertEquals("checking byte " + j, _workbook_data[j], + buffer[j - buffer.length]); } + assertTrue(stream.markSupported()); } /** * test simple read method */ - @Test + @SuppressWarnings("ResultOfMethodCallIgnored") + @Test(expected = IOException.class) public void testReadSingleByte() throws IOException { - DocumentInputStream[] streams = new DocumentInputStream[] { - new DocumentInputStream(_workbook_o), - new NDocumentInputStream(_workbook_n) - }; - for(DocumentInputStream stream : streams) { - int remaining = _workbook_size; - - // Try and read each byte in turn - for (int j = 0; j < _workbook_size; j++) { - int b = stream.read(); - assertTrue("checking sign of " + j, b >= 0); - assertEquals("validating byte " + j, _workbook_data[ j ], - ( byte ) b); - remaining--; - assertEquals("checking remaining after reading byte " + j, - remaining, available(stream)); - } - - // Ensure we fell off the end - assertEquals(-1, stream.read()); - - // Check that after close we can no longer read - stream.close(); - try { - stream.read(); - fail("Should have caught IOException"); - } catch (IOException ignored) { - // as expected - } - } + DocumentInputStream stream = new NDocumentInputStream(_workbook_n); + int remaining = _workbook_size; + + // Try and read each byte in turn + for (int j = 0; j < _workbook_size; j++) { + int b = stream.read(); + assertTrue("checking sign of " + j, b >= 0); + assertEquals("validating byte " + j, _workbook_data[j], + (byte) b); + remaining--; + assertEquals("checking remaining after reading byte " + j, + remaining, available(stream)); + } + + // Ensure we fell off the end + assertEquals(-1, stream.read()); + + // Check that after close we can no longer read + stream.close(); + stream.read(); } /** * Test buffered read */ + @SuppressWarnings("ResultOfMethodCallIgnored") @Test public void testBufferRead() throws IOException { - DocumentInputStream[] streams = new DocumentInputStream[] { - new DocumentInputStream(_workbook_o), - new NDocumentInputStream(_workbook_n) - }; - for(DocumentInputStream stream : streams) { - // Need to give a byte array to read - try { - stream.read(null); - fail("Should have caught NullPointerException"); - } catch (NullPointerException ignored) { - // as expected - } - - // test reading zero length buffer - assertEquals(0, stream.read(new byte[ 0 ])); - assertEquals(_workbook_size, available(stream)); - byte[] buffer = new byte[ _buffer_size ]; - int offset = 0; - - while (available(stream) >= buffer.length) - { - assertEquals(_buffer_size, stream.read(buffer)); - for (byte element : buffer) { + DocumentInputStream stream = new NDocumentInputStream(_workbook_n); + // Need to give a byte array to read + try { + stream.read(null); + fail("Should have caught NullPointerException"); + } catch (NullPointerException ignored) { + // as expected + } + + // test reading zero length buffer + assertEquals(0, stream.read(new byte[0])); + assertEquals(_workbook_size, available(stream)); + byte[] buffer = new byte[_buffer_size]; + int offset = 0; + + while (available(stream) >= buffer.length) { + assertEquals(_buffer_size, stream.read(buffer)); + for (byte element : buffer) { assertEquals("in main loop, byte " + offset, - _workbook_data[ offset ], element); + _workbook_data[offset], element); offset++; - } - assertEquals("offset " + offset, _workbook_size - offset, - available(stream)); - } - assertEquals(_workbook_size % _buffer_size, available(stream)); - Arrays.fill(buffer, ( byte ) 0); - int count = stream.read(buffer); - - assertEquals(_workbook_size % _buffer_size, count); - for (int j = 0; j < count; j++) - { - assertEquals("past main loop, byte " + offset, - _workbook_data[ offset ], buffer[ j ]); - offset++; - } - assertEquals(_workbook_size, offset); - for (int j = count; j < buffer.length; j++) - { - assertEquals("checking remainder, byte " + j, 0, buffer[ j ]); - } - assertEquals(-1, stream.read(buffer)); - stream.close(); - try { - stream.read(buffer); - fail("Should have caught IOException"); - } catch (IOException ignored) { - // as expected - } - } + } + assertEquals("offset " + offset, _workbook_size - offset, + available(stream)); + } + assertEquals(_workbook_size % _buffer_size, available(stream)); + Arrays.fill(buffer, (byte) 0); + int count = stream.read(buffer); + + assertEquals(_workbook_size % _buffer_size, count); + for (int j = 0; j < count; j++) { + assertEquals("past main loop, byte " + offset, + _workbook_data[offset], buffer[j]); + offset++; + } + assertEquals(_workbook_size, offset); + for (int j = count; j < buffer.length; j++) { + assertEquals("checking remainder, byte " + j, 0, buffer[j]); + } + assertEquals(-1, stream.read(buffer)); + stream.close(); + try { + stream.read(buffer); + fail("Should have caught IOException"); + } catch (IOException ignored) { + // as expected + } } /** * Test complex buffered read */ + @SuppressWarnings("ResultOfMethodCallIgnored") @Test public void testComplexBufferRead() throws IOException { - DocumentInputStream[] streams = new DocumentInputStream[] { - new DocumentInputStream(_workbook_o), - new NDocumentInputStream(_workbook_n) - }; - for(DocumentInputStream stream : streams) { - try { - stream.read(null, 0, 1); - fail("Should have caught NullPointerException"); - } catch (IllegalArgumentException ignored) { - // as expected - } - - // test illegal offsets and lengths - try { - stream.read(new byte[ 5 ], -4, 0); - fail("Should have caught IndexOutOfBoundsException"); - } catch (IndexOutOfBoundsException ignored) { - // as expected - } - try { - stream.read(new byte[ 5 ], 0, -4); - fail("Should have caught IndexOutOfBoundsException"); - } catch (IndexOutOfBoundsException ignored) { - // as expected - } - try { - stream.read(new byte[ 5 ], 0, 6); - fail("Should have caught IndexOutOfBoundsException"); - } catch (IndexOutOfBoundsException ignored) { - // as expected - } - - // test reading zero - assertEquals(0, stream.read(new byte[ 5 ], 0, 0)); - assertEquals(_workbook_size, available(stream)); - byte[] buffer = new byte[ _workbook_size ]; - int offset = 0; - - while (available(stream) >= _buffer_size) - { - Arrays.fill(buffer, ( byte ) 0); - assertEquals(_buffer_size, - stream.read(buffer, offset, _buffer_size)); - for (int j = 0; j < offset; j++) - { - assertEquals("checking byte " + j, 0, buffer[ j ]); - } - for (int j = offset; j < (offset + _buffer_size); j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j ]); - } - for (int j = offset + _buffer_size; j < buffer.length; j++) - { - assertEquals("checking byte " + j, 0, buffer[ j ]); - } - offset += _buffer_size; - assertEquals("offset " + offset, _workbook_size - offset, - available(stream)); - } - assertEquals(_workbook_size % _buffer_size, available(stream)); - Arrays.fill(buffer, ( byte ) 0); - int count = stream.read(buffer, offset, + DocumentInputStream stream = new NDocumentInputStream(_workbook_n); + try { + stream.read(null, 0, 1); + fail("Should have caught NullPointerException"); + } catch (IllegalArgumentException ignored) { + // as expected + } + + // test illegal offsets and lengths + try { + stream.read(new byte[5], -4, 0); + fail("Should have caught IndexOutOfBoundsException"); + } catch (IndexOutOfBoundsException ignored) { + // as expected + } + try { + stream.read(new byte[5], 0, -4); + fail("Should have caught IndexOutOfBoundsException"); + } catch (IndexOutOfBoundsException ignored) { + // as expected + } + try { + stream.read(new byte[5], 0, 6); + fail("Should have caught IndexOutOfBoundsException"); + } catch (IndexOutOfBoundsException ignored) { + // as expected + } + + // test reading zero + assertEquals(0, stream.read(new byte[5], 0, 0)); + assertEquals(_workbook_size, available(stream)); + byte[] buffer = new byte[_workbook_size]; + int offset = 0; + + while (available(stream) >= _buffer_size) { + Arrays.fill(buffer, (byte) 0); + assertEquals(_buffer_size, + stream.read(buffer, offset, _buffer_size)); + for (int j = 0; j < offset; j++) { + assertEquals("checking byte " + j, 0, buffer[j]); + } + for (int j = offset; j < (offset + _buffer_size); j++) { + assertEquals("checking byte " + j, _workbook_data[j], + buffer[j]); + } + for (int j = offset + _buffer_size; j < buffer.length; j++) { + assertEquals("checking byte " + j, 0, buffer[j]); + } + offset += _buffer_size; + assertEquals("offset " + offset, _workbook_size - offset, + available(stream)); + } + assertEquals(_workbook_size % _buffer_size, available(stream)); + Arrays.fill(buffer, (byte) 0); + int count = stream.read(buffer, offset, _workbook_size % _buffer_size); - assertEquals(_workbook_size % _buffer_size, count); - for (int j = 0; j < offset; j++) - { - assertEquals("checking byte " + j, 0, buffer[ j ]); - } - for (int j = offset; j < buffer.length; j++) - { - assertEquals("checking byte " + j, _workbook_data[ j ], - buffer[ j ]); - } - assertEquals(_workbook_size, offset + count); - for (int j = count; j < offset; j++) - { - assertEquals("byte " + j, 0, buffer[ j ]); - } - - assertEquals(-1, stream.read(buffer, 0, 1)); - stream.close(); - try { - stream.read(buffer, 0, 1); - fail("Should have caught IOException"); - } catch (IOException ignored) { - // as expected - } - } + assertEquals(_workbook_size % _buffer_size, count); + for (int j = 0; j < offset; j++) { + assertEquals("checking byte " + j, 0, buffer[j]); + } + for (int j = offset; j < buffer.length; j++) { + assertEquals("checking byte " + j, _workbook_data[j], + buffer[j]); + } + assertEquals(_workbook_size, offset + count); + for (int j = count; j < offset; j++) { + assertEquals("byte " + j, 0, buffer[j]); + } + + assertEquals(-1, stream.read(buffer, 0, 1)); + stream.close(); + try { + stream.read(buffer, 0, 1); + fail("Should have caught IOException"); + } catch (IOException ignored) { + // as expected + } } /** @@ -488,82 +407,67 @@ public final class TestDocumentInputStre */ @Test public void testSkip() throws IOException { - DocumentInputStream[] streams = new DocumentInputStream[] { - new DocumentInputStream(_workbook_o), - new NDocumentInputStream(_workbook_n) - }; - for(DocumentInputStream stream : streams) { - assertEquals(_workbook_size, available(stream)); - int count = available(stream); - - while (available(stream) >= _buffer_size) { - assertEquals(_buffer_size, stream.skip(_buffer_size)); - count -= _buffer_size; - assertEquals(count, available(stream)); - } - assertEquals(_workbook_size % _buffer_size, + DocumentInputStream stream = new NDocumentInputStream(_workbook_n); + assertEquals(_workbook_size, available(stream)); + int count = available(stream); + + while (available(stream) >= _buffer_size) { + assertEquals(_buffer_size, stream.skip(_buffer_size)); + count -= _buffer_size; + assertEquals(count, available(stream)); + } + assertEquals(_workbook_size % _buffer_size, stream.skip(_buffer_size)); - assertEquals(0, available(stream)); - stream.reset(); - assertEquals(_workbook_size, available(stream)); - assertEquals(_workbook_size, stream.skip(_workbook_size * 2)); - assertEquals(0, available(stream)); - stream.reset(); - assertEquals(_workbook_size, available(stream)); - assertEquals(_workbook_size, - stream.skip(2 + ( long ) Integer.MAX_VALUE)); - assertEquals(0, available(stream)); - } + assertEquals(0, available(stream)); + stream.reset(); + assertEquals(_workbook_size, available(stream)); + assertEquals(_workbook_size, stream.skip(_workbook_size * 2)); + assertEquals(0, available(stream)); + stream.reset(); + assertEquals(_workbook_size, available(stream)); + assertEquals(_workbook_size, + stream.skip(2 + (long) Integer.MAX_VALUE)); + assertEquals(0, available(stream)); } - + /** * Test that we can read files at multiple levels down the tree */ @Test public void testReadMultipleTreeLevels() throws Exception { - final POIDataSamples _samples = POIDataSamples.getPublisherInstance(); - File sample = _samples.getFile("Sample.pub"); - - DocumentInputStream stream; - - NPOIFSFileSystem npoifs = new NPOIFSFileSystem(sample); - try { - OPOIFSFileSystem opoifs = new OPOIFSFileSystem(new FileInputStream(sample)); - - // Ensure we have what we expect on the root - assertEquals(npoifs, npoifs.getRoot().getNFileSystem()); - assertEquals(npoifs, npoifs.getRoot().getFileSystem()); - assertEquals(null, npoifs.getRoot().getOFileSystem()); - assertEquals(null, opoifs.getRoot().getFileSystem()); - assertEquals(opoifs, opoifs.getRoot().getOFileSystem()); - assertEquals(null, opoifs.getRoot().getNFileSystem()); - - // Check inside - for(DirectoryNode root : new DirectoryNode[] { opoifs.getRoot(), npoifs.getRoot() }) { - // Top Level - Entry top = root.getEntry("Contents"); - assertEquals(true, top.isDocumentEntry()); - stream = root.createDocumentInputStream(top); - stream.read(); - - // One Level Down - DirectoryNode escher = (DirectoryNode)root.getEntry("Escher"); - Entry one = escher.getEntry("EscherStm"); - assertEquals(true, one.isDocumentEntry()); - stream = escher.createDocumentInputStream(one); - stream.read(); - - // Two Levels Down - DirectoryNode quill = (DirectoryNode)root.getEntry("Quill"); - DirectoryNode quillSub = (DirectoryNode)quill.getEntry("QuillSub"); - Entry two = quillSub.getEntry("CONTENTS"); - assertEquals(true, two.isDocumentEntry()); - stream = quillSub.createDocumentInputStream(two); - stream.read(); - } - } finally { - npoifs.close(); - } + final POIDataSamples _samples = POIDataSamples.getPublisherInstance(); + File sample = _samples.getFile("Sample.pub"); + + DocumentInputStream stream; + + try (NPOIFSFileSystem npoifs = new NPOIFSFileSystem(sample)) { + // Ensure we have what we expect on the root + assertEquals(npoifs, npoifs.getRoot().getNFileSystem()); + assertEquals(npoifs, npoifs.getRoot().getFileSystem()); + + // Check inside + DirectoryNode root = npoifs.getRoot(); + // Top Level + Entry top = root.getEntry("Contents"); + assertTrue(top.isDocumentEntry()); + stream = root.createDocumentInputStream(top); + assertNotEquals(-1, stream.read()); + + // One Level Down + DirectoryNode escher = (DirectoryNode) root.getEntry("Escher"); + Entry one = escher.getEntry("EscherStm"); + assertTrue(one.isDocumentEntry()); + stream = escher.createDocumentInputStream(one); + assertNotEquals(-1, stream.read()); + + // Two Levels Down + DirectoryNode quill = (DirectoryNode) root.getEntry("Quill"); + DirectoryNode quillSub = (DirectoryNode) quill.getEntry("QuillSub"); + Entry two = quillSub.getEntry("CONTENTS"); + assertTrue(two.isDocumentEntry()); + stream = quillSub.createDocumentInputStream(two); + assertNotEquals(-1, stream.read()); + } } @SuppressForbidden("just for testing")
Modified: poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestFileSystemBugs.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestFileSystemBugs.java?rev=1839201&r1=1839200&r2=1839201&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestFileSystemBugs.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestFileSystemBugs.java Sun Aug 26 11:55:00 2018 @@ -17,6 +17,9 @@ package org.apache.poi.poifs.filesystem; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; @@ -26,20 +29,21 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import junit.framework.TestCase; - import org.apache.poi.POIDataSamples; +import org.junit.After; +import org.junit.Test; /** * Tests bugs across both POIFSFileSystem and NPOIFSFileSystem */ -public final class TestFileSystemBugs extends TestCase { - protected static POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); - protected static POIDataSamples _ssSamples = POIDataSamples.getSpreadSheetInstance(); - - protected List<NPOIFSFileSystem> openedFSs; - @Override - protected void tearDown() throws Exception { +public final class TestFileSystemBugs { + private static POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); + private static POIDataSamples _ssSamples = POIDataSamples.getSpreadSheetInstance(); + + private List<NPOIFSFileSystem> openedFSs; + + @After + public void tearDown() { if (openedFSs != null && !openedFSs.isEmpty()) { for (NPOIFSFileSystem fs : openedFSs) { try { @@ -51,65 +55,60 @@ public final class TestFileSystemBugs ex } openedFSs = null; } - protected DirectoryNode[] openSample(String name, boolean oldFails) throws Exception { - return openSamples(new InputStream[] { - _samples.openResourceAsStream(name), - _samples.openResourceAsStream(name) - }, oldFails); - } - protected DirectoryNode[] openSSSample(String name, boolean oldFails) throws Exception { - return openSamples(new InputStream[] { - _ssSamples.openResourceAsStream(name), - _ssSamples.openResourceAsStream(name) - }, oldFails); - } - protected DirectoryNode[] openSamples(InputStream[] inps, boolean oldFails) throws Exception { - NPOIFSFileSystem nfs = new NPOIFSFileSystem(inps[0]); - if (openedFSs == null) openedFSs = new ArrayList<>(); - openedFSs.add(nfs); - - OPOIFSFileSystem ofs = null; - try { - ofs = new OPOIFSFileSystem(inps[1]); - if (oldFails) fail("POIFSFileSystem should have failed but didn't"); - } catch (Exception e) { - if (!oldFails) throw e; + + private DirectoryNode openSample(String name) throws Exception { + try (InputStream inps = _samples.openResourceAsStream(name)) { + return openSample(inps); + } + } + + @SuppressWarnings("SameParameterValue") + private DirectoryNode openSSSample(String name) throws Exception { + try (InputStream inps = _ssSamples.openResourceAsStream(name)) { + return openSample(inps); + } + } + + private DirectoryNode openSample(InputStream inps) throws Exception { + NPOIFSFileSystem nfs = new NPOIFSFileSystem(inps); + if (openedFSs == null) { + openedFSs = new ArrayList<>(); } + openedFSs.add(nfs); - if (ofs == null) return new DirectoryNode[] { nfs.getRoot() }; - return new DirectoryNode[] { ofs.getRoot(), nfs.getRoot() }; + return nfs.getRoot(); } /** * Test that we can open files that come via Lotus notes. * These have a top level directory without a name.... */ + @Test public void testNotesOLE2Files() throws Exception { // Check the contents - for (DirectoryNode root : openSample("Notes.ole2", false)) { - assertEquals(1, root.getEntryCount()); + DirectoryNode root = openSample("Notes.ole2"); + assertEquals(1, root.getEntryCount()); - Entry entry = root.getEntries().next(); - assertTrue(entry.isDirectoryEntry()); - assertTrue(entry instanceof DirectoryEntry); - - // The directory lacks a name! - DirectoryEntry dir = (DirectoryEntry)entry; - assertEquals("", dir.getName()); - - // Has two children - assertEquals(2, dir.getEntryCount()); - - // Check them - Iterator<Entry> it = dir.getEntries(); - entry = it.next(); - assertEquals(true, entry.isDocumentEntry()); - assertEquals(Ole10Native.OLE10_NATIVE, entry.getName()); - - entry = it.next(); - assertEquals(true, entry.isDocumentEntry()); - assertEquals("\u0001CompObj", entry.getName()); - } + Entry entry = root.getEntries().next(); + assertTrue(entry.isDirectoryEntry()); + assertTrue(entry instanceof DirectoryEntry); + + // The directory lacks a name! + DirectoryEntry dir = (DirectoryEntry)entry; + assertEquals("", dir.getName()); + + // Has two children + assertEquals(2, dir.getEntryCount()); + + // Check them + Iterator<Entry> it = dir.getEntries(); + entry = it.next(); + assertTrue(entry.isDocumentEntry()); + assertEquals(Ole10Native.OLE10_NATIVE, entry.getName()); + + entry = it.next(); + assertTrue(entry.isDocumentEntry()); + assertEquals("\u0001CompObj", entry.getName()); } /** @@ -119,46 +118,39 @@ public final class TestFileSystemBugs ex * Note - only works for NPOIFSFileSystem, POIFSFileSystem * can't cope with this level of corruption */ + @Test public void testCorruptedProperties() throws Exception { - for (DirectoryNode root : openSample("unknown_properties.msg", true)) { - assertEquals(42, root.getEntryCount()); - } + DirectoryNode root = openSample("unknown_properties.msg"); + assertEquals(42, root.getEntryCount()); } /** * With heavily nested documents, ensure we still re-write the same */ + @Test public void testHeavilyNestedReWrite() throws Exception { - for (DirectoryNode root : openSSSample("ex42570-20305.xls", false)) { - // Record the structure - Map<String,Integer> entries = new HashMap<>(); - fetchSizes("/", root, entries); - - // Prepare to copy - DirectoryNode dest; - if (root.getNFileSystem() != null) { - dest = (new NPOIFSFileSystem()).getRoot(); - } else { - dest = (new OPOIFSFileSystem()).getRoot(); - } - - // Copy over - EntryUtils.copyNodes(root, dest); - - // Re-load, always as NPOIFS - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - if (root.getNFileSystem() != null) { - root.getNFileSystem().writeFilesystem(baos); - } else { - root.getOFileSystem().writeFilesystem(baos); - } - NPOIFSFileSystem read = new NPOIFSFileSystem( - new ByteArrayInputStream(baos.toByteArray())); - - // Check the structure matches - checkSizes("/", read.getRoot(), entries); - } + DirectoryNode root = openSSSample("ex42570-20305.xls"); + // Record the structure + Map<String,Integer> entries = new HashMap<>(); + fetchSizes("/", root, entries); + + // Prepare to copy + DirectoryNode dest = new NPOIFSFileSystem().getRoot(); + + // Copy over + EntryUtils.copyNodes(root, dest); + + // Re-load, always as NPOIFS + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + root.getNFileSystem().writeFilesystem(baos); + + NPOIFSFileSystem read = new NPOIFSFileSystem( + new ByteArrayInputStream(baos.toByteArray())); + + // Check the structure matches + checkSizes("/", read.getRoot(), entries); } + private void fetchSizes(String path, DirectoryNode dir, Map<String,Integer> entries) { for (Entry entry : dir) { if (entry instanceof DirectoryNode) { Modified: poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java?rev=1839201&r1=1839200&r2=1839201&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java Sun Aug 26 11:55:00 2018 @@ -17,6 +17,26 @@ package org.apache.poi.poifs.filesystem; +import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.Iterator; + import org.apache.poi.POIDataSamples; import org.apache.poi.hpsf.DocumentSummaryInformation; import org.apache.poi.hpsf.PropertySet; @@ -34,14 +54,6 @@ import org.junit.Assume; import org.junit.Ignore; import org.junit.Test; -import java.io.*; -import java.nio.ByteBuffer; -import java.util.Iterator; - -import static org.hamcrest.core.IsCollectionContaining.hasItem; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.*; - /** * Tests for the new NIO POIFSFileSystem implementation */ @@ -52,7 +64,7 @@ public final class TestNPOIFSFileSystem * Returns test files with 512 byte and 4k block sizes, loaded * both from InputStreams and Files */ - protected NPOIFSFileSystem[] get512and4kFileAndInput() throws IOException { + private NPOIFSFileSystem[] get512and4kFileAndInput() throws IOException { NPOIFSFileSystem fsA = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); NPOIFSFileSystem fsB = new NPOIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi")); NPOIFSFileSystem fsC = new NPOIFSFileSystem(_inst.getFile("BlockSize4096.zvi")); @@ -60,7 +72,7 @@ public final class TestNPOIFSFileSystem return new NPOIFSFileSystem[] {fsA,fsB,fsC,fsD}; } - protected static void assertBATCount(NPOIFSFileSystem fs, int expectedBAT, int expectedXBAT) throws IOException { + private static void assertBATCount(NPOIFSFileSystem fs, int expectedBAT, int expectedXBAT) throws IOException { int foundBAT = 0; int foundXBAT = 0; int sz = (int)(fs.size() / fs.getBigBlockSize()); @@ -75,7 +87,7 @@ public final class TestNPOIFSFileSystem assertEquals("Wrong number of BATs", expectedBAT, foundBAT); assertEquals("Wrong number of XBATs with " + expectedBAT + " BATs", expectedXBAT, foundXBAT); } - protected void assertContentsMatches(byte[] expected, DocumentEntry doc) throws IOException { + private void assertContentsMatches(byte[] expected, DocumentEntry doc) throws IOException { NDocumentInputStream inp = new NDocumentInputStream(doc); byte[] contents = new byte[doc.getSize()]; assertEquals(doc.getSize(), inp.read(contents)); @@ -85,21 +97,21 @@ public final class TestNPOIFSFileSystem assertThat(expected, equalTo(contents)); } } - - protected static HeaderBlock writeOutAndReadHeader(NPOIFSFileSystem fs) throws IOException { + + private static HeaderBlock writeOutAndReadHeader(NPOIFSFileSystem fs) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); fs.writeFilesystem(baos); return new HeaderBlock(new ByteArrayInputStream(baos.toByteArray())); } - protected static NPOIFSFileSystem writeOutAndReadBack(NPOIFSFileSystem original) throws IOException { + static NPOIFSFileSystem writeOutAndReadBack(NPOIFSFileSystem original) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); original.writeFilesystem(baos); return new NPOIFSFileSystem(new ByteArrayInputStream(baos.toByteArray())); } - protected static NPOIFSFileSystem writeOutFileAndReadBack(NPOIFSFileSystem original) throws IOException { + private static NPOIFSFileSystem writeOutFileAndReadBack(NPOIFSFileSystem original) throws IOException { final File file = TempFile.createTempFile("TestPOIFS", ".ole2"); try (OutputStream fout = new FileOutputStream(file)) { original.writeFilesystem(fout); @@ -179,7 +191,7 @@ public final class TestNPOIFSFileSystem assertEquals("Image", prop.getName()); prop = pi.next(); assertEquals("Tags", prop.getName()); - assertEquals(false, pi.hasNext()); + assertFalse(pi.hasNext()); // Check the SBAT (Small Blocks FAT) was properly processed @@ -250,7 +262,7 @@ public final class TestNPOIFSFileSystem assertEquals("Image", prop.getName()); prop = pi.next(); assertEquals("Tags", prop.getName()); - assertEquals(false, pi.hasNext()); + assertFalse(pi.hasNext()); // Check the SBAT (Small Blocks FAT) was properly processed @@ -422,7 +434,7 @@ public final class TestNPOIFSFileSystem NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.getFile("BlockSize512.zvi")); // Our first BAT block has spares - assertEquals(true, fs.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + assertTrue(fs.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); // First free one is 100 assertEquals(POIFSConstants.UNUSED_BLOCK, fs.getNextBlock(100)); @@ -463,7 +475,7 @@ public final class TestNPOIFSFileSystem } // Check our BAT knows it's free - assertEquals(true, fs1.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + assertTrue(fs1.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); // Allocate all the spare ones for(int i=100; i<128; i++) { @@ -471,9 +483,9 @@ public final class TestNPOIFSFileSystem } // BAT is now full, but there's only the one - assertEquals(false, fs1.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); try { - assertEquals(false, fs1.getBATBlockAndIndex(128).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(128).getBlock().hasFreeSectors()); fail("Should only be one BAT"); } catch(IndexOutOfBoundsException e) { // expected here @@ -483,9 +495,9 @@ public final class TestNPOIFSFileSystem // Now ask for a free one, will need to extend the file assertEquals(129, fs1.getFreeBlock()); - - assertEquals(false, fs1.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); - assertEquals(true, fs1.getBATBlockAndIndex(128).getBlock().hasFreeSectors()); + + assertFalse(fs1.getBATBlockAndIndex(0).getBlock().hasFreeSectors()); + assertTrue(fs1.getBATBlockAndIndex(128).getBlock().hasFreeSectors()); assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, fs1.getNextBlock(128)); assertEquals(POIFSConstants.UNUSED_BLOCK, fs1.getNextBlock(129)); @@ -502,10 +514,10 @@ public final class TestNPOIFSFileSystem fs1.setNextBlock(free, POIFSConstants.END_OF_CHAIN); } } - - assertEquals(false, fs1.getBATBlockAndIndex(109*128-1).getBlock().hasFreeSectors()); + + assertFalse(fs1.getBATBlockAndIndex(109 * 128 - 1).getBlock().hasFreeSectors()); try { - assertEquals(false, fs1.getBATBlockAndIndex(109*128).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(109 * 128).getBlock().hasFreeSectors()); fail("Should only be 109 BATs"); } catch(IndexOutOfBoundsException e) { // expected here @@ -525,10 +537,10 @@ public final class TestNPOIFSFileSystem free = fs1.getFreeBlock(); assertTrue("Had: " + free, free > 0); - assertEquals(false, fs1.getBATBlockAndIndex(109*128-1).getBlock().hasFreeSectors()); - assertEquals(true, fs1.getBATBlockAndIndex(110*128-1).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(109 * 128 - 1).getBlock().hasFreeSectors()); + assertTrue(fs1.getBATBlockAndIndex(110 * 128 - 1).getBlock().hasFreeSectors()); try { - assertEquals(false, fs1.getBATBlockAndIndex(110*128).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(110 * 128).getBlock().hasFreeSectors()); fail("Should only be 110 BATs"); } catch(IndexOutOfBoundsException e) { // expected here @@ -552,9 +564,9 @@ public final class TestNPOIFSFileSystem } // Should now have 109+127 = 236 BATs - assertEquals(false, fs1.getBATBlockAndIndex(236*128-1).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(236 * 128 - 1).getBlock().hasFreeSectors()); try { - assertEquals(false, fs1.getBATBlockAndIndex(236*128).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(236 * 128).getBlock().hasFreeSectors()); fail("Should only be 236 BATs"); } catch(IndexOutOfBoundsException e) { // expected here @@ -566,10 +578,10 @@ public final class TestNPOIFSFileSystem free = fs1.getFreeBlock(); assertTrue("Had: " + free, free > 0); - assertEquals(false, fs1.getBATBlockAndIndex(236*128-1).getBlock().hasFreeSectors()); - assertEquals(true, fs1.getBATBlockAndIndex(237*128-1).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(236 * 128 - 1).getBlock().hasFreeSectors()); + assertTrue(fs1.getBATBlockAndIndex(237 * 128 - 1).getBlock().hasFreeSectors()); try { - assertEquals(false, fs1.getBATBlockAndIndex(237*128).getBlock().hasFreeSectors()); + assertFalse(fs1.getBATBlockAndIndex(237 * 128).getBlock().hasFreeSectors()); fail("Should only be 237 BATs"); } catch(IndexOutOfBoundsException e) { // expected here @@ -590,10 +602,10 @@ public final class TestNPOIFSFileSystem // Check that it is seen correctly assertBATCount(fs2, 237, 2); - assertEquals(false, fs2.getBATBlockAndIndex(236*128-1).getBlock().hasFreeSectors()); - assertEquals(true, fs2.getBATBlockAndIndex(237*128-1).getBlock().hasFreeSectors()); + assertFalse(fs2.getBATBlockAndIndex(236 * 128 - 1).getBlock().hasFreeSectors()); + assertTrue(fs2.getBATBlockAndIndex(237 * 128 - 1).getBlock().hasFreeSectors()); try { - assertEquals(false, fs2.getBATBlockAndIndex(237*128).getBlock().hasFreeSectors()); + assertFalse(fs2.getBATBlockAndIndex(237 * 128).getBlock().hasFreeSectors()); fail("Should only be 237 BATs"); } catch(IndexOutOfBoundsException e) { // expected here @@ -620,12 +632,12 @@ public final class TestNPOIFSFileSystem Entry si = root.getEntry("\u0005SummaryInformation"); Entry image = root.getEntry("Image"); Entry tags = root.getEntry("Tags"); - - assertEquals(false, thumbnail.isDirectoryEntry()); - assertEquals(false, dsi.isDirectoryEntry()); - assertEquals(false, si.isDirectoryEntry()); - assertEquals(true, image.isDirectoryEntry()); - assertEquals(false, tags.isDirectoryEntry()); + + assertFalse(thumbnail.isDirectoryEntry()); + assertFalse(dsi.isDirectoryEntry()); + assertFalse(si.isDirectoryEntry()); + assertTrue(image.isDirectoryEntry()); + assertFalse(tags.isDirectoryEntry()); // Check via the iterator Iterator<Entry> it = root.getEntries(); @@ -652,8 +664,8 @@ public final class TestNPOIFSFileSystem for(NPOIFSFileSystem fs : get512and4kFileAndInput()) { DirectoryEntry root = fs.getRoot(); Entry si = root.getEntry("\u0005SummaryInformation"); - - assertEquals(true, si.isDocumentEntry()); + + assertTrue(si.isDocumentEntry()); DocumentNode doc = (DocumentNode)si; // Check we can read it @@ -665,9 +677,9 @@ public final class TestNPOIFSFileSystem SummaryInformation inf = (SummaryInformation)ps; // Check some bits in it - assertEquals(null, inf.getApplicationName()); - assertEquals(null, inf.getAuthor()); - assertEquals(null, inf.getSubject()); + assertNull(inf.getApplicationName()); + assertNull(inf.getAuthor()); + assertNull(inf.getSubject()); assertEquals(131333, inf.getOSVersion()); // Finish with this one @@ -676,7 +688,7 @@ public final class TestNPOIFSFileSystem // Try the other summary information si = root.getEntry("\u0005DocumentSummaryInformation"); - assertEquals(true, si.isDocumentEntry()); + assertTrue(si.isDocumentEntry()); doc = (DocumentNode)si; assertContentsMatches(null, doc); @@ -1541,7 +1553,7 @@ public final class TestNPOIFSFileSystem DirectoryEntry vbaProj = (DirectoryEntry)src.getRoot().getEntry("_VBA_PROJECT_CUR"); assertEquals(3, vbaProj.getEntryCount()); // Can't delete yet, has stuff - assertEquals(false, vbaProj.delete()); + assertFalse(vbaProj.delete()); // Recursively delete _recursiveDeletee(vbaProj); @@ -1554,7 +1566,7 @@ public final class TestNPOIFSFileSystem } private void _recursiveDeletee(Entry entry) throws IOException { if (entry.isDocumentEntry()) { - assertEquals(true, entry.delete()); + assertTrue(entry.delete()); return; } @@ -1564,7 +1576,7 @@ public final class TestNPOIFSFileSystem Entry ce = dir.getEntry(name); _recursiveDeletee(ce); } - assertEquals(true, dir.delete()); + assertTrue(dir.delete()); } @SuppressWarnings("unused") private int _countChildren(DirectoryProperty p) { @@ -1677,24 +1689,24 @@ public final class TestNPOIFSFileSystem fs.createDocument(new DummyDataInputStream(s2gb), "Big"); } - protected static class DummyDataInputStream extends InputStream { - protected final long maxSize; - protected long size; - public DummyDataInputStream(long maxSize) { + private static final class DummyDataInputStream extends InputStream { + private final long maxSize; + private long size; + private DummyDataInputStream(long maxSize) { this.maxSize = maxSize; this.size = 0; } - public int read() throws IOException { + public int read() { if (size >= maxSize) return -1; size++; return (int)(size % 128); } - public int read(byte[] b) throws IOException { + public int read(byte[] b) { return read(b, 0, b.length); } - public int read(byte[] b, int offset, int len) throws IOException { + public int read(byte[] b, int offset, int len) { if (size >= maxSize) return -1; int sz = (int)Math.min(len, maxSize-size); for (int i=0; i<sz; i++) { @@ -1715,8 +1727,8 @@ public final class TestNPOIFSFileSystem for (int i = 0; i < iterations; i++) { try (InputStream inputStream = POIDataSamples.getHSMFInstance().openResourceAsStream("lots-of-recipients.msg")) { - OPOIFSFileSystem srcFileSystem = new OPOIFSFileSystem(inputStream); - OPOIFSFileSystem destFileSystem = new OPOIFSFileSystem(); + NPOIFSFileSystem srcFileSystem = new NPOIFSFileSystem(inputStream); + NPOIFSFileSystem destFileSystem = new NPOIFSFileSystem(); copyAllEntries(srcFileSystem.getRoot(), destFileSystem.getRoot()); @@ -1727,7 +1739,6 @@ public final class TestNPOIFSFileSystem assertTrue(file.delete()); if (i % 10 == 0) System.out.print("."); - if (i % 800 == 0 && i > 0) System.out.println(); } } @@ -1754,7 +1765,6 @@ public final class TestNPOIFSFileSystem assertTrue(file.delete()); if (i % 10 == 0) System.out.print("."); - if (i % 800 == 0 && i > 0) System.out.println(); } } Modified: poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java?rev=1839201&r1=1839200&r2=1839201&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java Sun Aug 26 11:55:00 2018 @@ -17,14 +17,16 @@ package org.apache.poi.poifs.filesystem; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; -import junit.framework.TestCase; - import org.apache.poi.POIDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.poifs.common.POIFSBigBlockSize; @@ -34,18 +36,21 @@ import org.apache.poi.poifs.storage.Bloc import org.apache.poi.poifs.storage.HeaderBlock; import org.apache.poi.poifs.storage.RawDataBlockList; import org.apache.poi.util.IOUtils; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; /** * Tests for the older OPOIFS-based POIFSFileSystem */ -public final class TestPOIFSFileSystem extends TestCase { +public final class TestPOIFSFileSystem { private final POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); /** * Mock exception used to ensure correct error handling */ private static final class MyEx extends RuntimeException { - public MyEx() { + MyEx() { // no fields to initialise } } @@ -60,7 +65,7 @@ public final class TestPOIFSFileSystem e private int _currentIx; private boolean _isClosed; - public TestIS(InputStream is, int failIndex) { + TestIS(InputStream is, int failIndex) { _is = is; _failIndex = failIndex; _currentIx = 0; @@ -93,7 +98,7 @@ public final class TestPOIFSFileSystem e _isClosed = true; _is.close(); } - public boolean isClosed() { + boolean isClosed() { return _isClosed; } } @@ -102,29 +107,26 @@ public final class TestPOIFSFileSystem e * Test for undesired behaviour observable as of svn revision 618865 (5-Feb-2008). * POIFSFileSystem was not closing the input stream. */ - public void testAlwaysClose() { + @Test + public void testAlwaysClose() throws IOException { TestIS testIS; // Normal case - read until EOF and close testIS = new TestIS(openSampleStream("13224.xls"), -1); - try { - new OPOIFSFileSystem(testIS); - } catch (IOException e) { - throw new RuntimeException(e); + try (NPOIFSFileSystem ignored = new NPOIFSFileSystem(testIS)){ + assertTrue("input stream was not closed", testIS.isClosed()); } - assertTrue("input stream was not closed", testIS.isClosed()); // intended to crash after reading 10000 bytes testIS = new TestIS(openSampleStream("13224.xls"), 10000); - try { - new OPOIFSFileSystem(testIS); + try (NPOIFSFileSystem ignored = new NPOIFSFileSystem(testIS)){ fail("ex should have been thrown"); - } catch (IOException e) { - throw new RuntimeException(e); } catch (MyEx e) { // expected + assertTrue("input stream was not closed", testIS.isClosed()); // but still should close + } catch (Exception e) { + fail("MyEx is expected to be thrown"); } - assertTrue("input stream was not closed", testIS.isClosed()); // but still should close } /** @@ -138,6 +140,7 @@ public final class TestPOIFSFileSystem e * The other is to fix the handling of the last block in * POIFS, since it seems to be slight wrong */ + @Test public void testShortLastBlock() throws Exception { String[] files = new String[] { "ShortLastBlock.qwp", "ShortLastBlock.wps" @@ -145,7 +148,7 @@ public final class TestPOIFSFileSystem e for (String file : files) { // Open the file up - OPOIFSFileSystem fs = new OPOIFSFileSystem( + NPOIFSFileSystem fs = new NPOIFSFileSystem( _samples.openResourceAsStream(file) ); @@ -156,26 +159,24 @@ public final class TestPOIFSFileSystem e // Check sizes } } - + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + /** * Check that we do the right thing when the list of which * sectors are BAT blocks points off the list of * sectors that exist in the file. */ + @Test public void testFATandDIFATsectors() throws Exception { // Open the file up - try { - InputStream stream = _samples.openResourceAsStream("ReferencesInvalidSectors.mpp"); - try { - new OPOIFSFileSystem(stream); - fail("File is corrupt and shouldn't have been opened"); - } finally { - stream.close(); - } - } catch (IOException e) { - String msg = e.getMessage(); - assertTrue(msg.startsWith("Your file contains 695 sectors")); - } + expectedEx.expect(IndexOutOfBoundsException.class); + expectedEx.expectMessage("Block 1148 not found"); + try (InputStream stream = _samples.openResourceAsStream("ReferencesInvalidSectors.mpp")) { + new NPOIFSFileSystem(stream); + fail("File is corrupt and shouldn't have been opened"); + } } /** @@ -184,9 +185,10 @@ public final class TestPOIFSFileSystem e * However, because a file needs to be at least 6.875mb big * to have an XBAT in it, we don't have a test one. So, generate it. */ + @Test public void testBATandXBAT() throws Exception { byte[] hugeStream = new byte[8*1024*1024]; - OPOIFSFileSystem fs = new OPOIFSFileSystem(); + NPOIFSFileSystem fs = new NPOIFSFileSystem(); fs.getRoot().createDocument( "BIG", new ByteArrayInputStream(hugeStream) ); @@ -229,8 +231,7 @@ public final class TestPOIFSFileSystem e assertEquals(fsData.length / 512, blockList.blockCount() + 1); // Header not counted // Now load it and check - fs = null; - fs = new OPOIFSFileSystem( + fs = new NPOIFSFileSystem( new ByteArrayInputStream(fsData) ); @@ -244,41 +245,39 @@ public final class TestPOIFSFileSystem e * Most OLE2 files use 512byte blocks. However, a small number * use 4k blocks. Check that we can open these. */ + @Test public void test4KBlocks() throws Exception { POIDataSamples _samples = POIDataSamples.getPOIFSInstance(); - InputStream inp = _samples.openResourceAsStream("BlockSize4096.zvi"); - try { - // First up, check that we can process the header properly - HeaderBlock header_block = new HeaderBlock(inp); - POIFSBigBlockSize bigBlockSize = header_block.getBigBlockSize(); - assertEquals(4096, bigBlockSize.getBigBlockSize()); - - // Check the fat info looks sane - assertEquals(1, header_block.getBATArray().length); - assertEquals(1, header_block.getBATCount()); - assertEquals(0, header_block.getXBATCount()); - - // Now check we can get the basic fat - RawDataBlockList data_blocks = new RawDataBlockList(inp, - bigBlockSize); - assertEquals(15, data_blocks.blockCount()); - - // Now try and open properly - OPOIFSFileSystem fs = new OPOIFSFileSystem( - _samples.openResourceAsStream("BlockSize4096.zvi")); - assertTrue(fs.getRoot().getEntryCount() > 3); - - // Check we can get at all the contents - checkAllDirectoryContents(fs.getRoot()); - - // Finally, check we can do a similar 512byte one too - fs = new OPOIFSFileSystem( - _samples.openResourceAsStream("BlockSize512.zvi")); - assertTrue(fs.getRoot().getEntryCount() > 3); - checkAllDirectoryContents(fs.getRoot()); - } finally { - inp.close(); - } + try (InputStream inp = _samples.openResourceAsStream("BlockSize4096.zvi")) { + // First up, check that we can process the header properly + HeaderBlock header_block = new HeaderBlock(inp); + POIFSBigBlockSize bigBlockSize = header_block.getBigBlockSize(); + assertEquals(4096, bigBlockSize.getBigBlockSize()); + + // Check the fat info looks sane + assertEquals(1, header_block.getBATArray().length); + assertEquals(1, header_block.getBATCount()); + assertEquals(0, header_block.getXBATCount()); + + // Now check we can get the basic fat + RawDataBlockList data_blocks = new RawDataBlockList(inp, + bigBlockSize); + assertEquals(15, data_blocks.blockCount()); + + // Now try and open properly + NPOIFSFileSystem fs = new NPOIFSFileSystem( + _samples.openResourceAsStream("BlockSize4096.zvi")); + assertTrue(fs.getRoot().getEntryCount() > 3); + + // Check we can get at all the contents + checkAllDirectoryContents(fs.getRoot()); + + // Finally, check we can do a similar 512byte one too + fs = new NPOIFSFileSystem( + _samples.openResourceAsStream("BlockSize512.zvi")); + assertTrue(fs.getRoot().getEntryCount() > 3); + checkAllDirectoryContents(fs.getRoot()); + } } private void checkAllDirectoryContents(DirectoryEntry dir) throws IOException { for(Entry entry : dir) { @@ -293,6 +292,7 @@ public final class TestPOIFSFileSystem e } } + @SuppressWarnings("SameParameterValue") private static InputStream openSampleStream(String sampleFileName) { return HSSFTestDataSamples.openSampleFileStream(sampleFileName); } Modified: poi/trunk/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java?rev=1839201&r1=1839200&r2=1839201&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java (original) +++ poi/trunk/src/testcases/org/apache/poi/poifs/storage/AllPOIFSStorageTests.java Sun Aug 26 11:55:00 2018 @@ -20,7 +20,7 @@ package org.apache.poi.poifs.storage; import org.junit.runner.RunWith; import org.junit.runners.Suite; /** - * Tests for org.apache.poi.poifs.storage<br> + * Tests for org.apache.poi.poifs.storage */ @RunWith(Suite.class) @Suite.SuiteClasses({ @@ -33,11 +33,7 @@ import org.junit.runners.Suite; TestHeaderBlockWriting.class, TestPropertyBlock.class, TestRawDataBlock.class, - TestRawDataBlockList.class, - TestSmallBlockTableReader.class, - TestSmallBlockTableWriter.class, - TestSmallDocumentBlock.class, - TestSmallDocumentBlockList.class + TestRawDataBlockList.class }) public class AllPOIFSStorageTests { } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
