From 92b1045a50eebc06f85c94a3e7672937caa00a25 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 23 Feb 2015 13:21:23 +0000 Subject: [PATCH] Unit tests for OPC handling of files without a Core Properties part git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661663 13f79535-47bb-0310-9956-ffa450edef68 --- .../TestOPCComplianceCoreProperties.java | 81 ++++++++++++++++++ .../OPCCompliance_NoCoreProperties.xlsx | Bin 0 -> 11483 bytes 2 files changed, 81 insertions(+) create mode 100644 test-data/openxml4j/OPCCompliance_NoCoreProperties.xlsx diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java index 0cf5200092..cc6f7ca83d 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java @@ -17,6 +17,10 @@ package org.apache.poi.openxml4j.opc.compliance; +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.net.URI; @@ -34,6 +38,8 @@ import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.openxml4j.opc.TargetMode; +import org.apache.poi.util.IOUtils; +import org.apache.poi.util.TempFile; /** * Test core properties Open Packaging Convention compliance. @@ -224,4 +230,79 @@ public final class TestOPCComplianceCoreProperties extends TestCase { String msg = extractInvalidFormatMessage("LimitedXSITypeAttribute_PresentWithUnauthorizedValueFAIL.docx"); assertEquals("The element 'modified' must have the 'xsi:type' attribute with the value 'dcterms:W3CDTF' !", msg); } + + /** + * Document with no core properties - testing at the OPC level, + * saving into a new stream + */ + public void testNoCoreProperties_saveNew() throws Exception { + String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx"; + OPCPackage pkg = null; + try { + pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + // Empty properties + assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(pkg.getPackageProperties()); + assertNotNull(pkg.getPackageProperties().getLanguageProperty()); + assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); + + // Save and re-load + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + pkg.save(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + + pkg = OPCPackage.open(bais); + + // An Empty Properties part has been added in the save/load + assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(pkg.getPackageProperties()); + assertNotNull(pkg.getPackageProperties().getLanguageProperty()); + assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); + } + + /** + * Document with no core properties - testing at the OPC level, + * from a temp-file, saving in-place + */ + public void testNoCoreProperties_saveInPlace() throws Exception { + String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx"; + + // Copy this into a temp file, so we can play with it + File tmp = TempFile.createTempFile("poi-test", ".opc"); + FileOutputStream out = new FileOutputStream(tmp); + IOUtils.copy( + POIDataSamples.getOpenXML4JInstance().openResourceAsStream(sampleFileName), + out); + out.close(); + + // Open it from that temp file + OPCPackage pkg = OPCPackage.open(tmp); + + // Empty properties + assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(pkg.getPackageProperties()); + assertNotNull(pkg.getPackageProperties().getLanguageProperty()); + assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); + + // Save and close + pkg.close(); + + + // Re-open and check + pkg = OPCPackage.open(tmp); + + // An Empty Properties part has been added in the save/load + assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size()); + assertNotNull(pkg.getPackageProperties()); + assertNotNull(pkg.getPackageProperties().getLanguageProperty()); + assertNull(pkg.getPackageProperties().getLanguageProperty().getValue()); + + // Finish and tidy + pkg.revert(); + tmp.delete(); + } } diff --git a/test-data/openxml4j/OPCCompliance_NoCoreProperties.xlsx b/test-data/openxml4j/OPCCompliance_NoCoreProperties.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fa1049c68d788b928b5bb7c8d44eff9560ab0474 GIT binary patch literal 11483 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 U2bPa6%Si#eaINA2?a_b#1F&?89smFU literal 0 HcmV?d00001