From d390a9bf3f83f15bc5c23a678a0be0558c4a38af Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 13 Sep 2015 19:05:40 +0000 Subject: [PATCH] Enhance integration testing to apply OPCPackage tests to more file-types and also run XSSFReader in XSSFFileHandler git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1702801 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/TestAllFiles.java | 17 +++- .../org/apache/poi/stress/OPCFileHandler.java | 15 ++- .../apache/poi/stress/XSSFFileHandler.java | 98 ++++++++++++++----- 3 files changed, 98 insertions(+), 32 deletions(-) diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java index e69224a7c9..b7427d4d59 100644 --- a/src/integrationtest/org/apache/poi/TestAllFiles.java +++ b/src/integrationtest/org/apache/poi/TestAllFiles.java @@ -271,7 +271,16 @@ public class TestAllFiles { for(String file : scanner.getIncludedFiles()) { file = file.replace('\\', '/'); // ... failures/handlers lookup doesn't work on windows otherwise if (IGNORED.contains(file)) continue; - files.add(new Object[] { file, HANDLERS.get(getExtension(file)) }); + FileHandler handler = HANDLERS.get(getExtension(file)); + files.add(new Object[] { file, handler }); + + // for some file-types also run OPCFileHandler + if(handler instanceof XSSFFileHandler || + handler instanceof XWPFFileHandler || + handler instanceof XSLFFileHandler || + handler instanceof XDGFFileHandler) { + files.add(new Object[] { file, HANDLERS.get(".ooxml") }); + } } return files; @@ -301,8 +310,12 @@ public class TestAllFiles { handler.handleExtracting(inputFile); + // special cases where docx-handling breaks, but OPCPackage handling works + boolean ignoredOPC = (file.endsWith(".docx") || file.endsWith(".xlsx") || file.endsWith(".xlsb")) && + handler instanceof OPCFileHandler; + assertFalse("Expected to fail for file " + file + " and handler " + handler + ", but did not fail!", - EXPECTED_FAILURES.contains(file)); + EXPECTED_FAILURES.contains(file) && !ignoredOPC); } catch (OldWordFileFormatException e) { // for old word files we should still support extracting text if(OLD_FILES.contains(file)) { diff --git a/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java b/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java index 41245402ca..50a9577c04 100644 --- a/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java +++ b/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java @@ -17,6 +17,7 @@ package org.apache.poi.stress; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; @@ -36,19 +37,23 @@ public class OPCFileHandler extends AbstractFileHandler { if (POIXMLDocumentHandler.isEncrypted(stream)) return; OPCPackage p = OPCPackage.open(stream); - + for (PackagePart part : p.getParts()) { if (part.getPartName().toString().equals("/docProps/core.xml")) { assertEquals(ContentTypes.CORE_PROPERTIES_PART, part.getContentType()); } if (part.getPartName().toString().equals("/word/document.xml")) { - assertEquals(XWPFRelation.DOCUMENT.getContentType(), part.getContentType()); + assertTrue("Expected one of " + XWPFRelation.MACRO_DOCUMENT + ", " + XWPFRelation.DOCUMENT + ", " + XWPFRelation.TEMPLATE + + ", but had " + part.getContentType(), + XWPFRelation.DOCUMENT.getContentType().equals(part.getContentType()) || + XWPFRelation.MACRO_DOCUMENT.getContentType().equals(part.getContentType()) || + XWPFRelation.TEMPLATE.getContentType().equals(part.getContentType())); } if (part.getPartName().toString().equals("/word/theme/theme1.xml")) { assertEquals(XWPFRelation.THEME.getContentType(), part.getContentType()); } } - } + } public void handleExtracting(File file) throws Exception { // text-extraction is not possible currenlty for these types of files @@ -57,7 +62,7 @@ public class OPCFileHandler extends AbstractFileHandler { // a test-case to test this locally without executing the full TestAllFiles @Test public void test() throws Exception { - File file = new File("test-data/openxml4j/dcterms_bug_56479.zip"); + File file = new File("test-data/diagram/test.vsdx"); InputStream stream = new PushbackInputStream(new FileInputStream(file), 100000); try { @@ -68,4 +73,4 @@ public class OPCFileHandler extends AbstractFileHandler { handleExtracting(file); } -} \ No newline at end of file +} diff --git a/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java index a268ed4658..764ca4ac75 100644 --- a/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java +++ b/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java @@ -16,14 +16,25 @@ ==================================================================== */ package org.apache.poi.stress; +import static org.junit.Assert.assertNotNull; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; +import java.util.Iterator; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.exceptions.OpenXML4JException; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.extractor.XSSFExportToXml; import org.apache.poi.xssf.usermodel.XSSFMap; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -31,27 +42,64 @@ import org.junit.Test; import org.xml.sax.SAXException; public class XSSFFileHandler extends SpreadsheetHandler { - @Override + @Override public void handleFile(InputStream stream) throws Exception { - // ignore password protected files - if (POIXMLDocumentHandler.isEncrypted(stream)) return; - - XSSFWorkbook wb = new XSSFWorkbook(stream); - - // use the combined handler for HSSF/XSSF - handleWorkbook(wb, ".xlsx"); - + // ignore password protected files + if (POIXMLDocumentHandler.isEncrypted(stream)) return; + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + IOUtils.copy(stream, out); + + XSSFWorkbook wb = new XSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + + // use the combined handler for HSSF/XSSF + handleWorkbook(wb, ".xlsx"); + // TODO: some documents fail currently... //XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(wb); //evaluator.evaluateAll(); - // also verify general POIFS-stuff - new POIXMLDocumentHandler().handlePOIXMLDocument(wb); - - // and finally ensure that exporting to XML works - exportToXML(wb); - } + // also verify general POIFS-stuff + new POIXMLDocumentHandler().handlePOIXMLDocument(wb); + + // and finally ensure that exporting to XML works + exportToXML(wb); + + checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(out.toByteArray()))); + } + + private void checkXSSFReader(OPCPackage p) + throws IOException, OpenXML4JException, InvalidFormatException { + XSSFReader reader = new XSSFReader(p); + + // these can be null... + InputStream sharedStringsData = reader.getSharedStringsData(); + if(sharedStringsData != null) { + sharedStringsData.close(); + } + reader.getSharedStringsTable(); + + InputStream stylesData = reader.getStylesData(); + if(stylesData != null) { + stylesData.close(); + } + reader.getStylesTable(); + + InputStream themesData = reader.getThemesData(); + if(themesData != null) { + themesData.close(); + } + + assertNotNull(reader.getWorkbookData()); + + Iterator sheetsData = reader.getSheetsData(); + while(sheetsData.hasNext()) { + InputStream str = sheetsData.next(); + str.close(); + } + } + private void exportToXML(XSSFWorkbook wb) throws SAXException, ParserConfigurationException, TransformerException { for (XSSFMap map : wb.getCustomXMLMappings()) { @@ -62,16 +110,16 @@ public class XSSFFileHandler extends SpreadsheetHandler { } } - // a test-case to test this locally without executing the full TestAllFiles - @Test - public void test() throws Exception { - InputStream stream = new FileInputStream("test-data/spreadsheet/WithConditionalFormatting.xlsx"); - try { - handleFile(stream); - } finally { - stream.close(); - } - } + // a test-case to test this locally without executing the full TestAllFiles + @Test + public void test() throws Exception { + InputStream stream = new BufferedInputStream(new FileInputStream("test-data/openxml4j/50154.xlsx")); + try { + handleFile(stream); + } finally { + stream.close(); + } + } // a test-case to test this locally without executing the full TestAllFiles @Test -- 2.39.5