Refactor some of the NPOIFS write tests, and begin on the last missing write test

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1590149 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2014-04-25 21:11:26 +00:00
parent 184be5c03b
commit 7e3b3b85d9
1 changed files with 89 additions and 78 deletions

View File

@ -17,6 +17,7 @@
package org.apache.poi.poifs.filesystem; package org.apache.poi.poifs.filesystem;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
@ -30,6 +31,7 @@ import java.nio.ByteBuffer;
import java.util.Iterator; import java.util.Iterator;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.PropertySet; import org.apache.poi.hpsf.PropertySet;
import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.PropertySetFactory;
import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.hpsf.SummaryInformation;
@ -74,6 +76,15 @@ public final class TestNPOIFSFileSystem {
assertEquals("Wrong number of BATs", expectedBAT, foundBAT); assertEquals("Wrong number of BATs", expectedBAT, foundBAT);
assertEquals("Wrong number of XBATs with " + expectedBAT + " BATs", expectedXBAT, foundXBAT); assertEquals("Wrong number of XBATs with " + expectedBAT + " BATs", expectedXBAT, foundXBAT);
} }
protected 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));
inp.close();
if (expected != null)
assertThat(expected, equalTo(contents));
}
protected static HeaderBlock writeOutAndReadHeader(NPOIFSFileSystem fs) throws IOException { protected static HeaderBlock writeOutAndReadHeader(NPOIFSFileSystem fs) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -597,13 +608,10 @@ public final class TestNPOIFSFileSystem {
DocumentNode doc = (DocumentNode)si; DocumentNode doc = (DocumentNode)si;
// Check we can read it // Check we can read it
NDocumentInputStream inp = new NDocumentInputStream(doc); assertContentsMatches(null, doc);
byte[] contents = new byte[doc.getSize()];
assertEquals(doc.getSize(), inp.read(contents));
inp.close();
// Now try to build the property set // Now try to build the property set
inp = new NDocumentInputStream(doc); DocumentInputStream inp = new NDocumentInputStream(doc);
PropertySet ps = PropertySetFactory.create(inp); PropertySet ps = PropertySetFactory.create(inp);
SummaryInformation inf = (SummaryInformation)ps; SummaryInformation inf = (SummaryInformation)ps;
@ -611,9 +619,22 @@ public final class TestNPOIFSFileSystem {
assertEquals(null, inf.getApplicationName()); assertEquals(null, inf.getApplicationName());
assertEquals(null, inf.getAuthor()); assertEquals(null, inf.getAuthor());
assertEquals(null, inf.getSubject()); assertEquals(null, inf.getSubject());
assertEquals(131333, inf.getOSVersion());
// Finish // Finish with this one
inp.close(); inp.close();
// Try the other summary information
si = root.getEntry("\u0005DocumentSummaryInformation");
assertEquals(true, si.isDocumentEntry());
doc = (DocumentNode)si;
assertContentsMatches(null, doc);
inp = new NDocumentInputStream(doc);
ps = PropertySetFactory.create(inp);
DocumentSummaryInformation dinf = (DocumentSummaryInformation)ps;
assertEquals(131333, dinf.getOSVersion());
} }
} }
@ -623,42 +644,74 @@ public final class TestNPOIFSFileSystem {
*/ */
@Test @Test
public void readWriteRead() throws Exception { public void readWriteRead() throws Exception {
SummaryInformation sinf = null;
DocumentSummaryInformation dinf = null;
for(NPOIFSFileSystem fs : get512and4kFileAndInput()) { for(NPOIFSFileSystem fs : get512and4kFileAndInput()) {
// Check we can find the entries we expect // Check we can find the entries we expect
DirectoryNode root = fs.getRoot(); DirectoryNode root = fs.getRoot();
assertEquals(5, root.getEntryCount()); assertEquals(5, root.getEntryCount());
assertThat(root.getEntryNames(), hasItem("Thumbnail"));
assertThat(root.getEntryNames(), hasItem("Image"));
assertThat(root.getEntryNames(), hasItem("Tags"));
assertThat(root.getEntryNames(), hasItem("\u0005DocumentSummaryInformation"));
assertThat(root.getEntryNames(), hasItem("\u0005SummaryInformation"));
/*
assertEquals("Thumbnail", prop.getName());
prop = pi.next();
assertEquals("\u0005DocumentSummaryInformation", prop.getName());
prop = pi.next();
assertEquals("\u0005SummaryInformation", prop.getName());
prop = pi.next();
assertEquals("Image", prop.getName());
prop = pi.next();
assertEquals("Tags", prop.getName());
*/
// TODO Add check
// Write out, re-load // Write out, re-load
// TODO Add check fs = writeOutAndReadBack(fs);
// Check they're still there // Check they're still there
// TODO Add check root = fs.getRoot();
assertEquals(5, root.getEntryCount());
assertThat(root.getEntryNames(), hasItem("Thumbnail"));
assertThat(root.getEntryNames(), hasItem("Image"));
assertThat(root.getEntryNames(), hasItem("Tags"));
assertThat(root.getEntryNames(), hasItem("\u0005DocumentSummaryInformation"));
assertThat(root.getEntryNames(), hasItem("\u0005SummaryInformation"));
// Check the contents of them - parse the summary block and check
sinf = (SummaryInformation)PropertySetFactory.create(new NDocumentInputStream(
(DocumentEntry)root.getEntry(SummaryInformation.DEFAULT_STREAM_NAME)));
assertEquals(131333, sinf.getOSVersion());
dinf = (DocumentSummaryInformation)PropertySetFactory.create(new NDocumentInputStream(
(DocumentEntry)root.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME)));
assertEquals(131333, sinf.getOSVersion());
// Check the first few and last few bytes of a few
// TODO Add check
// Add a test mini stream // Add a test mini stream
// TODO Add check DirectoryEntry testDir = root.createDirectory("Testing 123");
byte[] mini = new byte[] { 42, 0, 1, 2, 3, 4, 42 };
testDir.createDocument("Mini", new ByteArrayInputStream(mini));
// Write out, re-load // Write out, re-load
// TODO Add check fs = writeOutAndReadBack(fs);
root = fs.getRoot();
assertEquals(6, root.getEntryCount());
assertThat(root.getEntryNames(), hasItem("Thumbnail"));
assertThat(root.getEntryNames(), hasItem("Image"));
assertThat(root.getEntryNames(), hasItem("Tags"));
assertThat(root.getEntryNames(), hasItem("Testing 123"));
assertThat(root.getEntryNames(), hasItem("\u0005DocumentSummaryInformation"));
assertThat(root.getEntryNames(), hasItem("\u0005SummaryInformation"));
// Check old and new are there // Check old and new are there
// TODO Add check sinf = (SummaryInformation)PropertySetFactory.create(new NDocumentInputStream(
(DocumentEntry)root.getEntry(SummaryInformation.DEFAULT_STREAM_NAME)));
assertEquals(131333, sinf.getOSVersion());
dinf = (DocumentSummaryInformation)PropertySetFactory.create(new NDocumentInputStream(
(DocumentEntry)root.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME)));
assertEquals(131333, sinf.getOSVersion());
testDir = (DirectoryEntry)root.getEntry("Testing 123");
assertContentsMatches(mini, (DocumentEntry)testDir.getEntry("Mini"));
// Add a full stream, delete a full stream // Add a full stream, delete a full stream
// TODO Add check // TODO Add check
@ -684,7 +737,6 @@ public final class TestNPOIFSFileSystem {
@SuppressWarnings("resource") @SuppressWarnings("resource")
public void createWriteRead() throws Exception { public void createWriteRead() throws Exception {
NPOIFSFileSystem fs = new NPOIFSFileSystem(); NPOIFSFileSystem fs = new NPOIFSFileSystem();
NDocumentInputStream inp;
DocumentEntry miniDoc; DocumentEntry miniDoc;
DocumentEntry normDoc; DocumentEntry normDoc;
@ -859,25 +911,13 @@ public final class TestNPOIFSFileSystem {
assertEquals(3, testDir.getEntryCount()); assertEquals(3, testDir.getEntryCount());
miniDoc = (DocumentEntry)testDir.getEntry("Mini"); miniDoc = (DocumentEntry)testDir.getEntry("Mini");
inp = new NDocumentInputStream(miniDoc); assertContentsMatches(mini, miniDoc);
byte[] miniRead = new byte[miniDoc.getSize()];
assertEquals(miniDoc.getSize(), inp.read(miniRead));
assertThat(mini, equalTo(miniRead));
inp.close();
normDoc = (DocumentEntry)testDir.getEntry("Normal4096"); normDoc = (DocumentEntry)testDir.getEntry("Normal4096");
inp = new NDocumentInputStream(normDoc); assertContentsMatches(main4096, normDoc);
byte[] normRead = new byte[normDoc.getSize()];
assertEquals(normDoc.getSize(), inp.read(normRead));
assertThat(main4096, equalTo(normRead));
inp.close();
normDoc = (DocumentEntry)testDir.getEntry("Normal5124"); normDoc = (DocumentEntry)testDir.getEntry("Normal5124");
inp = new NDocumentInputStream(normDoc); assertContentsMatches(main5124, normDoc);
normRead = new byte[normDoc.getSize()];
assertEquals(normDoc.getSize(), inp.read(normRead));
assertThat(main5124, equalTo(normRead));
inp.close();
// All done // All done
fs.close(); fs.close();
@ -886,7 +926,6 @@ public final class TestNPOIFSFileSystem {
@Test @Test
public void addBeforeWrite() throws Exception { public void addBeforeWrite() throws Exception {
NPOIFSFileSystem fs = new NPOIFSFileSystem(); NPOIFSFileSystem fs = new NPOIFSFileSystem();
NDocumentInputStream inp;
DocumentEntry miniDoc; DocumentEntry miniDoc;
DocumentEntry normDoc; DocumentEntry normDoc;
HeaderBlock hdr; HeaderBlock hdr;
@ -945,18 +984,10 @@ public final class TestNPOIFSFileSystem {
// Check that we can read the right data pre-write // Check that we can read the right data pre-write
miniDoc = (DocumentEntry)testDir.getEntry("Mini"); miniDoc = (DocumentEntry)testDir.getEntry("Mini");
inp = new NDocumentInputStream(miniDoc); assertContentsMatches(mini, miniDoc);
byte[] miniRead = new byte[miniDoc.getSize()];
assertEquals(miniDoc.getSize(), inp.read(miniRead));
assertThat(mini, equalTo(miniRead));
inp.close();
normDoc = (DocumentEntry)testDir.getEntry("Normal4096"); normDoc = (DocumentEntry)testDir.getEntry("Normal4096");
inp = new NDocumentInputStream(normDoc); assertContentsMatches(main4096, normDoc);
byte[] normRead = new byte[normDoc.getSize()];
assertEquals(normDoc.getSize(), inp.read(normRead));
assertThat(main4096, equalTo(normRead));
inp.close();
// Write, read, check // Write, read, check
@ -1002,18 +1033,10 @@ public final class TestNPOIFSFileSystem {
assertEquals(2, testDir.getEntryCount()); assertEquals(2, testDir.getEntryCount());
miniDoc = (DocumentEntry)testDir.getEntry("Mini"); miniDoc = (DocumentEntry)testDir.getEntry("Mini");
inp = new NDocumentInputStream(miniDoc); assertContentsMatches(mini, miniDoc);
miniRead = new byte[miniDoc.getSize()];
assertEquals(miniDoc.getSize(), inp.read(miniRead));
assertThat(mini, equalTo(miniRead));
inp.close();
normDoc = (DocumentEntry)testDir.getEntry("Normal4096"); normDoc = (DocumentEntry)testDir.getEntry("Normal4096");
inp = new NDocumentInputStream(normDoc); assertContentsMatches(main4096, normDoc);
normRead = new byte[normDoc.getSize()];
assertEquals(normDoc.getSize(), inp.read(normRead));
assertThat(main4096, equalTo(normRead));
inp.close();
// Add one more stream to each, then save and re-load // Add one more stream to each, then save and re-load
@ -1040,25 +1063,13 @@ public final class TestNPOIFSFileSystem {
assertEquals(4, testDir.getEntryCount()); assertEquals(4, testDir.getEntryCount());
miniDoc = (DocumentEntry)testDir.getEntry("Mini"); miniDoc = (DocumentEntry)testDir.getEntry("Mini");
inp = new NDocumentInputStream(miniDoc); assertContentsMatches(mini, miniDoc);
miniRead = new byte[miniDoc.getSize()];
assertEquals(miniDoc.getSize(), inp.read(miniRead));
assertThat(mini, equalTo(miniRead));
inp.close();
miniDoc = (DocumentEntry)testDir.getEntry("Mini2"); miniDoc = (DocumentEntry)testDir.getEntry("Mini2");
inp = new NDocumentInputStream(miniDoc); assertContentsMatches(mini2, miniDoc);
miniRead = new byte[miniDoc.getSize()];
assertEquals(miniDoc.getSize(), inp.read(miniRead));
assertThat(mini2, equalTo(miniRead));
inp.close();
normDoc = (DocumentEntry)testDir.getEntry("Normal4106"); normDoc = (DocumentEntry)testDir.getEntry("Normal4106");
inp = new NDocumentInputStream(normDoc); assertContentsMatches(main4106, normDoc);
normRead = new byte[normDoc.getSize()];
assertEquals(normDoc.getSize(), inp.read(normRead));
assertThat(main4106, equalTo(normRead));
inp.close();
} }
/** /**