]> source.dussan.org Git - poi.git/commitdiff
Enhance integration testing to apply OPCPackage tests to more file-types and also...
authorDominik Stadler <centic@apache.org>
Sun, 13 Sep 2015 19:05:40 +0000 (19:05 +0000)
committerDominik Stadler <centic@apache.org>
Sun, 13 Sep 2015 19:05:40 +0000 (19:05 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1702801 13f79535-47bb-0310-9956-ffa450edef68

src/integrationtest/org/apache/poi/TestAllFiles.java
src/integrationtest/org/apache/poi/stress/OPCFileHandler.java
src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java

index e69224a7c9df8fbb83cc77ef48c5e33e52a12ce5..b7427d4d598bb9e1e11b047873d2a62e1fa55bf5 100644 (file)
@@ -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)) {
index 41245402cae05d18c796bf7b4f7eb21be54ec3fa..50a9577c04f4f703caa9a1deaf8cae2a2facaa2f 100644 (file)
@@ -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
+}
index a268ed46582b2e35e79fa78bb5adb5ebb70e2eee..764ca4ac755ee777fdcd2dc4b026848ebd24e887 100644 (file)
 ==================================================================== */
 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<InputStream> 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