Stream tests for NDocumentOutputStream
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590303 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
73bc57db74
commit
7f5f7d0440
@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
package org.apache.poi.poifs.filesystem;
|
package org.apache.poi.poifs.filesystem;
|
||||||
|
|
||||||
|
import static org.apache.poi.poifs.filesystem.TestNPOIFSFileSystem.writeOutAndReadBack;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
@ -29,6 +32,7 @@ import org.apache.poi.poifs.storage.BATBlock;
|
|||||||
/**
|
/**
|
||||||
* Tests {@link NPOIFSStream}
|
* Tests {@link NPOIFSStream}
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("resource")
|
||||||
public final class TestNPOIFSStream extends TestCase {
|
public final class TestNPOIFSStream extends TestCase {
|
||||||
private static final POIDataSamples _inst = POIDataSamples.getPOIFSInstance();
|
private static final POIDataSamples _inst = POIDataSamples.getPOIFSInstance();
|
||||||
|
|
||||||
@ -886,4 +890,194 @@ public final class TestNPOIFSStream extends TestCase {
|
|||||||
|
|
||||||
assertEquals(false, it.hasNext());
|
assertEquals(false, it.hasNext());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a stream, then replaces it
|
||||||
|
*/
|
||||||
|
public void testWriteThenReplace() throws Exception {
|
||||||
|
NPOIFSFileSystem fs = new NPOIFSFileSystem();
|
||||||
|
|
||||||
|
// Starts empty
|
||||||
|
BATBlock bat = fs.getBATBlockAndIndex(0).getBlock();
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(2));
|
||||||
|
|
||||||
|
// Write something that uses a main stream
|
||||||
|
byte[] main4106 = new byte[4106];
|
||||||
|
main4106[0] = -10;
|
||||||
|
main4106[4105] = -11;
|
||||||
|
DocumentEntry normal = fs.getRoot().createDocument(
|
||||||
|
"Normal", new ByteArrayInputStream(main4106));
|
||||||
|
|
||||||
|
// Should have used 9 blocks
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(3, bat.getValueAt(2));
|
||||||
|
assertEquals(4, bat.getValueAt(3));
|
||||||
|
assertEquals(5, bat.getValueAt(4));
|
||||||
|
assertEquals(6, bat.getValueAt(5));
|
||||||
|
assertEquals(7, bat.getValueAt(6));
|
||||||
|
assertEquals(8, bat.getValueAt(7));
|
||||||
|
assertEquals(9, bat.getValueAt(8));
|
||||||
|
assertEquals(10, bat.getValueAt(9));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(10));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(11));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(4106, normal.getSize());
|
||||||
|
assertEquals(4106, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
|
||||||
|
|
||||||
|
// Replace with one still big enough for a main stream, but one block smaller
|
||||||
|
byte[] main4096 = new byte[4096];
|
||||||
|
main4096[0] = -10;
|
||||||
|
main4096[4095] = -11;
|
||||||
|
|
||||||
|
NDocumentOutputStream nout = new NDocumentOutputStream(normal);
|
||||||
|
nout.write(main4096);
|
||||||
|
nout.close();
|
||||||
|
|
||||||
|
// Will have dropped to 8
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(3, bat.getValueAt(2));
|
||||||
|
assertEquals(4, bat.getValueAt(3));
|
||||||
|
assertEquals(5, bat.getValueAt(4));
|
||||||
|
assertEquals(6, bat.getValueAt(5));
|
||||||
|
assertEquals(7, bat.getValueAt(6));
|
||||||
|
assertEquals(8, bat.getValueAt(7));
|
||||||
|
assertEquals(9, bat.getValueAt(8));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(9));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(10));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(11));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(4096, normal.getSize());
|
||||||
|
assertEquals(4096, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
|
||||||
|
|
||||||
|
// Write and check
|
||||||
|
fs = writeOutAndReadBack(fs);
|
||||||
|
bat = fs.getBATBlockAndIndex(0).getBlock();
|
||||||
|
|
||||||
|
// Will have properties, but otherwise the same
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(3, bat.getValueAt(2));
|
||||||
|
assertEquals(4, bat.getValueAt(3));
|
||||||
|
assertEquals(5, bat.getValueAt(4));
|
||||||
|
assertEquals(6, bat.getValueAt(5));
|
||||||
|
assertEquals(7, bat.getValueAt(6));
|
||||||
|
assertEquals(8, bat.getValueAt(7));
|
||||||
|
assertEquals(9, bat.getValueAt(8));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(9)); // End of Normal
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(10)); // Props
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(11));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(4096, normal.getSize());
|
||||||
|
assertEquals(4096, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
|
||||||
|
|
||||||
|
// Make longer, take 1 block after the properties too
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
nout = new NDocumentOutputStream(normal);
|
||||||
|
nout.write(main4106);
|
||||||
|
nout.close();
|
||||||
|
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(3, bat.getValueAt(2));
|
||||||
|
assertEquals(4, bat.getValueAt(3));
|
||||||
|
assertEquals(5, bat.getValueAt(4));
|
||||||
|
assertEquals(6, bat.getValueAt(5));
|
||||||
|
assertEquals(7, bat.getValueAt(6));
|
||||||
|
assertEquals(8, bat.getValueAt(7));
|
||||||
|
assertEquals(9, bat.getValueAt(8));
|
||||||
|
assertEquals(11, bat.getValueAt(9));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(10)); // Props
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(11)); // Normal
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(12));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(4106, normal.getSize());
|
||||||
|
assertEquals(4106, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
|
||||||
|
|
||||||
|
// Make it small, will trigger the SBAT stream and free lots up
|
||||||
|
byte[] mini = new byte[] { 42, 0, 1, 2, 3, 4, 42 };
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
nout = new NDocumentOutputStream(normal);
|
||||||
|
nout.write(mini);
|
||||||
|
nout.close();
|
||||||
|
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(2)); // SBAT
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(3)); // Mini Stream
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(4));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(5));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(6));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(7));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(8));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(9));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(10)); // Props
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(11));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(12));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(7, normal.getSize());
|
||||||
|
assertEquals(7, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
|
||||||
|
|
||||||
|
// Finally back to big again
|
||||||
|
nout = new NDocumentOutputStream(normal);
|
||||||
|
nout.write(main4096);
|
||||||
|
nout.close();
|
||||||
|
|
||||||
|
// Will keep the mini stream, now empty
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(2)); // SBAT
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(3)); // Mini Stream
|
||||||
|
assertEquals(5, bat.getValueAt(4));
|
||||||
|
assertEquals(6, bat.getValueAt(5));
|
||||||
|
assertEquals(7, bat.getValueAt(6));
|
||||||
|
assertEquals(8, bat.getValueAt(7));
|
||||||
|
assertEquals(9, bat.getValueAt(8));
|
||||||
|
assertEquals(11, bat.getValueAt(9));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(10)); // Props
|
||||||
|
assertEquals(12, bat.getValueAt(11));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(12));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(13));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(4096, normal.getSize());
|
||||||
|
assertEquals(4096, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
|
||||||
|
|
||||||
|
// Save, re-load, re-check
|
||||||
|
fs = writeOutAndReadBack(fs);
|
||||||
|
bat = fs.getBATBlockAndIndex(0).getBlock();
|
||||||
|
|
||||||
|
assertEquals(POIFSConstants.FAT_SECTOR_BLOCK, bat.getValueAt(0));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(1));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(2)); // SBAT
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(3)); // Mini Stream
|
||||||
|
assertEquals(5, bat.getValueAt(4));
|
||||||
|
assertEquals(6, bat.getValueAt(5));
|
||||||
|
assertEquals(7, bat.getValueAt(6));
|
||||||
|
assertEquals(8, bat.getValueAt(7));
|
||||||
|
assertEquals(9, bat.getValueAt(8));
|
||||||
|
assertEquals(11, bat.getValueAt(9));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(10)); // Props
|
||||||
|
assertEquals(12, bat.getValueAt(11));
|
||||||
|
assertEquals(POIFSConstants.END_OF_CHAIN, bat.getValueAt(12));
|
||||||
|
assertEquals(POIFSConstants.UNUSED_BLOCK, bat.getValueAt(13));
|
||||||
|
|
||||||
|
normal = (DocumentEntry)fs.getRoot().getEntry("Normal");
|
||||||
|
assertEquals(4096, normal.getSize());
|
||||||
|
assertEquals(4096, ((DocumentNode)normal).getProperty().getSize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user