From 6eab79528b01d8c41132b0af9d384e38c1946ef3 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Thu, 30 Jun 2016 22:59:46 +0000 Subject: [PATCH] a few performance fixes to speed-up the tests git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1750867 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hssf/dev/BiffViewer.java | 50 +++++++++----- .../apache/poi/hssf/dev/FormulaViewer.java | 2 +- src/java/org/apache/poi/hssf/dev/ReSave.java | 32 ++++++--- src/java/org/apache/poi/util/HexDump.java | 68 +++++++++++-------- .../apache/poi/openxml4j/opc/TestPackage.java | 5 +- .../poi/hssf/dev/BaseXLSIteratingTest.java | 24 ++++--- .../poi/hssf/dev/TestBiffDrawingToXml.java | 37 ++++++---- .../apache/poi/hssf/dev/TestBiffViewer.java | 40 ++++++----- .../apache/poi/hssf/dev/TestEFBiffViewer.java | 39 ++++++----- .../poi/hssf/dev/TestFormulaViewer.java | 48 ++++++++----- .../org/apache/poi/hssf/dev/TestReSave.java | 41 ++++++----- .../apache/poi/hssf/dev/TestRecordLister.java | 22 +++--- 12 files changed, 251 insertions(+), 157 deletions(-) diff --git a/src/java/org/apache/poi/hssf/dev/BiffViewer.java b/src/java/org/apache/poi/hssf/dev/BiffViewer.java index 35842c319..7a57c5be2 100644 --- a/src/java/org/apache/poi/hssf/dev/BiffViewer.java +++ b/src/java/org/apache/poi/hssf/dev/BiffViewer.java @@ -204,8 +204,8 @@ import org.apache.poi.util.StringUtil; * @see #main */ public final class BiffViewer { - static final String NEW_LINE_CHARS = System.getProperty("line.separator"); - private static POILogger logger = POILogFactory.getLogger(BiffViewer.class); + private static final char[] NEW_LINE_CHARS = System.getProperty("line.separator").toCharArray(); + private static final POILogger logger = POILogFactory.getLogger(BiffViewer.class); private BiffViewer() { // no instances of this class @@ -804,39 +804,55 @@ public final class BiffViewer { } private static void hexDumpLine(Writer w, byte[] data, int lineStartAddress, int lineDataOffset, int startDelta, int endDelta) { - if (startDelta >= endDelta) { + final char[] buf = new char[8+2*COLUMN_SEPARATOR.length+DUMP_LINE_LEN*3-1+DUMP_LINE_LEN+NEW_LINE_CHARS.length]; + + if (startDelta >= endDelta) { throw new IllegalArgumentException("Bad start/end delta"); } + int idx=0; try { - writeHex(w, lineStartAddress, 8); - w.write(COLUMN_SEPARATOR); + writeHex(buf, idx, lineStartAddress, 8); + idx = arraycopy(COLUMN_SEPARATOR, buf, idx+8); // raw hex data for (int i=0; i< DUMP_LINE_LEN; i++) { if (i>0) { - w.write(" "); + buf[idx++] = ' '; } if (i >= startDelta && i < endDelta) { - writeHex(w, data[lineDataOffset+i], 2); + writeHex(buf, idx, data[lineDataOffset+i], 2); } else { - w.write(" "); + buf[idx] = ' '; + buf[idx+1] = ' '; } + idx += 2; } - w.write(COLUMN_SEPARATOR); + idx = arraycopy(COLUMN_SEPARATOR, buf, idx); // interpreted ascii for (int i=0; i< DUMP_LINE_LEN; i++) { + char ch = ' '; if (i >= startDelta && i < endDelta) { - w.write(getPrintableChar(data[lineDataOffset+i])); - } else { - w.write(" "); + ch = getPrintableChar(data[lineDataOffset+i]); } + buf[idx++] = ch; } - w.write(NEW_LINE_CHARS); + + idx = arraycopy(NEW_LINE_CHARS, buf, idx); + + w.write(buf, 0, idx); } catch (IOException e) { throw new RuntimeException(e); } } + private static int arraycopy(char[] in, char[] out, int pos) { + int idx = pos; + for (char c : in) { + out[idx++] = c; + } + return idx; + } + private static char getPrintableChar(byte b) { char ib = (char) (b & 0x00FF); if (ib < 32 || ib > 126) { @@ -845,14 +861,12 @@ public final class BiffViewer { return ib; } - private static void writeHex(Writer w, int value, int nDigits) throws IOException { - char[] buf = new char[nDigits]; + private static void writeHex(char buf[], int startInBuf, int value, int nDigits) throws IOException { int acc = value; for(int i=nDigits-1; i>=0; i--) { int digit = acc & 0x0F; - buf[i] = (char) (digit < 10 ? ('0' + digit) : ('A' + digit - 10)); - acc >>= 4; + buf[startInBuf+i] = (char) (digit < 10 ? ('0' + digit) : ('A' + digit - 10)); + acc >>>= 4; } - w.write(buf); } } diff --git a/src/java/org/apache/poi/hssf/dev/FormulaViewer.java b/src/java/org/apache/poi/hssf/dev/FormulaViewer.java index 8fce8d2e9..3c012dd47 100644 --- a/src/java/org/apache/poi/hssf/dev/FormulaViewer.java +++ b/src/java/org/apache/poi/hssf/dev/FormulaViewer.java @@ -98,7 +98,7 @@ public class FormulaViewer StringBuffer buf = new StringBuffer(); if (token instanceof ExpPtg) return; - buf.append(((OperationPtg) token).toFormulaString()); + buf.append(token.toFormulaString()); buf.append(sep); switch (token.getPtgClass()) { case Ptg.CLASS_REF : diff --git a/src/java/org/apache/poi/hssf/dev/ReSave.java b/src/java/org/apache/poi/hssf/dev/ReSave.java index 9c136ab6b..7f1988897 100644 --- a/src/java/org/apache/poi/hssf/dev/ReSave.java +++ b/src/java/org/apache/poi/hssf/dev/ReSave.java @@ -17,8 +17,10 @@ package org.apache.poi.hssf.dev; +import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.OutputStream; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; @@ -29,13 +31,19 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; * * Usage: ReSave [-dg] input.xls * -dg initialize drawings, causes to re-build escher aggregates in all sheets + * -bos only write to memory instead of a file */ public class ReSave { public static void main(String[] args) throws Exception { boolean initDrawing = false; + boolean saveToMemory = false; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); for(String filename : args) { - if(filename.equals("-dg")) initDrawing = true; - else { + if(filename.equals("-dg")) { + initDrawing = true; + } else if(filename.equals("-bos")) { + saveToMemory = true; + } else { System.out.print("reading " + filename + "..."); FileInputStream is = new FileInputStream(filename); HSSFWorkbook wb = new HSSFWorkbook(is); @@ -48,18 +56,26 @@ public class ReSave { /*HSSFPatriarch dg =*/ sheet.getDrawingPatriarch(); } } - - String outputFile = filename.replace(".xls", "-saved.xls"); - System.out.print("saving to " + outputFile + "..."); - FileOutputStream out = new FileOutputStream(outputFile); + + OutputStream os; + if (saveToMemory) { + bos.reset(); + os = bos; + } else { + String outputFile = filename.replace(".xls", "-saved.xls"); + System.out.print("saving to " + outputFile + "..."); + os = new FileOutputStream(outputFile); + } + try { - wb.write(out); + wb.write(os); } finally { - out.close(); + os.close(); } System.out.println("done"); } finally { wb.close(); + is.close(); } } } diff --git a/src/java/org/apache/poi/util/HexDump.java b/src/java/org/apache/poi/util/HexDump.java index 2e3a45f52..25fb3c275 100644 --- a/src/java/org/apache/poi/util/HexDump.java +++ b/src/java/org/apache/poi/util/HexDump.java @@ -27,7 +27,6 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.nio.charset.Charset; -import java.util.Locale; import org.apache.commons.codec.CharEncoding; @@ -149,10 +148,10 @@ public class HexDump { chars_read = 16; } - buffer.append(xpad(display_offset, 8, "")); + writeHex(buffer, display_offset, 8, ""); for (int k = 0; k < 16; k++) { if (k < chars_read) { - buffer.append(xpad(data[ k + j ], 2, " ")); + writeHex(buffer, data[ k + j ], 2, " "); } else { buffer.append(" "); } @@ -243,12 +242,12 @@ public class HexDump { } final int digits = (int) Math.round(Math.log(value.length) / Math.log(10) + 0.5); StringBuilder retVal = new StringBuilder(); - retVal.append(xpad(0, digits, "")); + writeHex(retVal, 0, digits, ""); retVal.append(": "); for(int x=0, i=-1; x < value.length; x++) { if (++i == bytesPerLine) { retVal.append('\n'); - retVal.append(xpad(x, digits, "")); + writeHex(retVal, x, digits, ""); retVal.append(": "); i = 0; } else if (x>0) { @@ -266,7 +265,9 @@ public class HexDump { * @return The result right padded with 0 */ public static String toHex(short value) { - return xpad(value & 0xFFFF, 4, ""); + StringBuilder sb = new StringBuilder(4); + writeHex(sb, value & 0xFFFF, 4, ""); + return sb.toString(); } /** @@ -276,7 +277,9 @@ public class HexDump { * @return The result right padded with 0 */ public static String toHex(byte value) { - return xpad(value & 0xFF, 2, ""); + StringBuilder sb = new StringBuilder(2); + writeHex(sb, value & 0xFF, 2, ""); + return sb.toString(); } /** @@ -286,7 +289,9 @@ public class HexDump { * @return The result right padded with 0 */ public static String toHex(int value) { - return xpad(value & 0xFFFFFFFFL, 8, ""); + StringBuilder sb = new StringBuilder(8); + writeHex(sb, value & 0xFFFFFFFFL, 8, ""); + return sb.toString(); } /** @@ -296,7 +301,9 @@ public class HexDump { * @return The result right padded with 0 */ public static String toHex(long value) { - return xpad(value, 16, ""); + StringBuilder sb = new StringBuilder(16); + writeHex(sb, value, 16, ""); + return sb.toString(); } /** @@ -352,46 +359,51 @@ public class HexDump { * @return string of 16 (zero padded) uppercase hex chars and prefixed with '0x' */ public static String longToHex(long value) { - return xpad(value, 16, "0x"); + StringBuilder sb = new StringBuilder(18); + writeHex(sb, value, 16, "0x"); + return sb.toString(); } /** * @return string of 8 (zero padded) uppercase hex chars and prefixed with '0x' */ public static String intToHex(int value) { - return xpad(value & 0xFFFFFFFFL, 8, "0x"); + StringBuilder sb = new StringBuilder(10); + writeHex(sb, value & 0xFFFFFFFFL, 8, "0x"); + return sb.toString(); } /** * @return string of 4 (zero padded) uppercase hex chars and prefixed with '0x' */ public static String shortToHex(int value) { - return xpad(value & 0xFFFFL, 4, "0x"); + StringBuilder sb = new StringBuilder(6); + writeHex(sb, value & 0xFFFFL, 4, "0x"); + return sb.toString(); } /** * @return string of 2 (zero padded) uppercase hex chars and prefixed with '0x' */ public static String byteToHex(int value) { - return xpad(value & 0xFFL, 2, "0x"); - } - - private static String xpad(long value, int pad, String prefix) { - String sv = Long.toHexString(value).toUpperCase(Locale.ROOT); - int len = sv.length(); - if ((pad == 0 || len == pad) && "".equals(prefix)) return sv; - StringBuilder sb = new StringBuilder(prefix); - if (len < pad) { - sb.append("0000000000000000", 0, pad-len); - sb.append(sv); - } else if (len > pad) { - sb.append(sv, len-pad, len); - } else { - sb.append(sv); - } + StringBuilder sb = new StringBuilder(4); + writeHex(sb, value & 0xFFL, 2, "0x"); return sb.toString(); } + private static void writeHex(StringBuilder sb, long value, int nDigits, String prefix) { + sb.append(prefix); + char[] buf = new char[nDigits]; + long acc = value; + for(int i=nDigits-1; i>=0; i--) { + int digit = (int)(acc & 0x0F); + buf[i] = (char) (digit < 10 ? ('0' + digit) : ('A' + digit - 10)); + acc >>>= 4; + } + sb.append(buf); + } + + public static void main(String[] args) throws Exception { File file = new File(args[0]); InputStream in = new BufferedInputStream(new FileInputStream(file)); diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java index 54107ff34..d84ecab81 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java @@ -786,7 +786,7 @@ public final class TestPackage { ZipFile zipFile = ZipHelper.openZipFile(OpenXML4JTestDataSamples.getSampleFile("sample.xlsx")); assertNotNull(zipFile); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(2500000); ZipOutputStream append = new ZipOutputStream(bos); // first, copy contents from existing war Enumeration entries = zipFile.entries(); @@ -807,7 +807,8 @@ public final class TestPackage { append.write(bos2.toByteArray(), 0, (int)size); byte spam[] = new byte[0x7FFF]; for (int i=0; i EXCLUDED = new ArrayList(); + @Rule + public ExpectedException thrown = ExpectedException.none(); + + protected static final Map> EXCLUDED = + new HashMap>(); @Parameters(name="{index}: {0}") public static Iterable files() { @@ -85,16 +92,15 @@ public abstract class BaseXLSIteratingTest { public void testMain() throws Exception { // we had intermittent problems when this was set differently somehow, let's try to set it here so it always is set correctly for these tests Biff8EncryptionKey.setCurrentUserPassword(null); + + String fileName = file.getName(); + if (EXCLUDED.containsKey(fileName)) { + thrown.expect(EXCLUDED.get(fileName)); + } try { runOneFile(file); } catch (Exception e) { - Assume.assumeFalse("File " + file + " is excluded currently", - EXCLUDED.contains(file.getName())); - - System.out.println("Failed: " + file); - e.printStackTrace(); - // try to read it in HSSFWorkbook to quickly fail if we cannot read the file there at all and thus probably should use EXCLUDED instead FileInputStream stream = new FileInputStream(file); HSSFWorkbook wb = null; @@ -107,6 +113,8 @@ public abstract class BaseXLSIteratingTest { } stream.close(); } + + throw e; } } diff --git a/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java b/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java index 039a15350..7b1d49b9e 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java @@ -21,22 +21,29 @@ import java.io.FileInputStream; import java.io.InputStream; import java.io.PrintStream; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.hssf.OldExcelFormatException; +import org.apache.poi.hssf.record.RecordInputStream; +import org.junit.BeforeClass; + public class TestBiffDrawingToXml extends BaseXLSIteratingTest { - static { - EXCLUDED.add("35897-type4.xls"); // unsupported crypto api header - EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well - EXCLUDED.add("46904.xls"); - EXCLUDED.add("44958_1.xls"); - EXCLUDED.add("51832.xls"); - EXCLUDED.add("59074.xls"); - EXCLUDED.add("password.xls"); - EXCLUDED.add("testEXCEL_2.xls"); // Biff 2 / Excel 2, pre-OLE2 - EXCLUDED.add("testEXCEL_3.xls"); // Biff 3 / Excel 3, pre-OLE2 - EXCLUDED.add("testEXCEL_4.xls"); // Biff 4 / Excel 4, pre-OLE2 - EXCLUDED.add("testEXCEL_5.xls"); // Biff 5 / Excel 5 - EXCLUDED.add("testEXCEL_95.xls"); // Biff 5 / Excel 95 - EXCLUDED.add("xor-encryption-abc.xls"); - } + @BeforeClass + public static void setup() { + EXCLUDED.clear(); + EXCLUDED.put("35897-type4.xls", EncryptedDocumentException.class); // unsupported crypto api header + EXCLUDED.put("51832.xls", EncryptedDocumentException.class); + EXCLUDED.put("xor-encryption-abc.xls", EncryptedDocumentException.class); + EXCLUDED.put("password.xls", EncryptedDocumentException.class); + EXCLUDED.put("46904.xls", OldExcelFormatException.class); + EXCLUDED.put("59074.xls", OldExcelFormatException.class); + EXCLUDED.put("testEXCEL_2.xls", OldExcelFormatException.class); // Biff 2 / Excel 2, pre-OLE2 + EXCLUDED.put("testEXCEL_3.xls", OldExcelFormatException.class); // Biff 3 / Excel 3, pre-OLE2 + EXCLUDED.put("testEXCEL_4.xls", OldExcelFormatException.class); // Biff 4 / Excel 4, pre-OLE2 + EXCLUDED.put("testEXCEL_5.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 + EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 + EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well + EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); + } @Override void runOneFile(File pFile) throws Exception { diff --git a/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java b/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java index f2e42f140..04070b4c6 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java @@ -22,28 +22,32 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.hssf.OldExcelFormatException; +import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.util.LocaleUtil; +import org.junit.BeforeClass; public class TestBiffViewer extends BaseXLSIteratingTest { - static { - // these are likely ok to fail - EXCLUDED.add("XRefCalc.xls"); // "Buffer overrun" - EXCLUDED.add("50833.xls"); // "Name is too long" when setting username - EXCLUDED.add("OddStyleRecord.xls"); - EXCLUDED.add("NoGutsRecords.xls"); - EXCLUDED.add("51832.xls"); // password - EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well - EXCLUDED.add("password.xls"); - EXCLUDED.add("46904.xls"); - EXCLUDED.add("59074.xls"); // Biff 5 / Excel 95 - EXCLUDED.add("35897-type4.xls"); // unsupported crypto api header - EXCLUDED.add("xor-encryption-abc.xls"); // unsupported XOR-encryption - EXCLUDED.add("testEXCEL_2.xls"); // Biff 2 / Excel 2, pre-OLE2 - EXCLUDED.add("testEXCEL_3.xls"); // Biff 3 / Excel 3, pre-OLE2 - EXCLUDED.add("testEXCEL_4.xls"); // Biff 4 / Excel 4, pre-OLE2 - EXCLUDED.add("testEXCEL_5.xls"); // Biff 5 / Excel 5 - EXCLUDED.add("testEXCEL_95.xls"); // Biff 5 / Excel 95 + @BeforeClass + public static void setup() { + EXCLUDED.clear(); + EXCLUDED.put("35897-type4.xls", EncryptedDocumentException.class); // unsupported crypto api header + EXCLUDED.put("51832.xls", EncryptedDocumentException.class); + EXCLUDED.put("xor-encryption-abc.xls", EncryptedDocumentException.class); + EXCLUDED.put("password.xls", EncryptedDocumentException.class); + EXCLUDED.put("46904.xls", OldExcelFormatException.class); + EXCLUDED.put("59074.xls", OldExcelFormatException.class); + EXCLUDED.put("testEXCEL_2.xls", OldExcelFormatException.class); // Biff 2 / Excel 2, pre-OLE2 + EXCLUDED.put("testEXCEL_3.xls", OldExcelFormatException.class); // Biff 3 / Excel 3, pre-OLE2 + EXCLUDED.put("testEXCEL_4.xls", OldExcelFormatException.class); // Biff 4 / Excel 4, pre-OLE2 + EXCLUDED.put("testEXCEL_5.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 + EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 + EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well + // EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); + EXCLUDED.put("50833.xls", IllegalArgumentException.class); // "Name is too long" when setting username + EXCLUDED.put("XRefCalc.xls", RuntimeException.class); // "Buffer overrun" } @Override diff --git a/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java b/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java index c6ec27e34..620480378 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java @@ -20,26 +20,31 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.hssf.OldExcelFormatException; +import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.util.LocaleUtil; +import org.junit.BeforeClass; public class TestEFBiffViewer extends BaseXLSIteratingTest { - static { - // these are likely ok to fail - EXCLUDED.add("XRefCalc.xls"); - EXCLUDED.add("password.xls"); - EXCLUDED.add("51832.xls"); // password - EXCLUDED.add("xor-encryption-abc.xls"); // password, ty again later! - EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well - EXCLUDED.add("44958_1.xls"); // known bad file - EXCLUDED.add("46904.xls"); // Exception, too old - EXCLUDED.add("47251_1.xls"); // Broken test file - EXCLUDED.add("testEXCEL_3.xls"); // Biff 3 / Excel 3, pre-OLE2 - EXCLUDED.add("testEXCEL_4.xls"); // old unsupported format - EXCLUDED.add("testEXCEL_5.xls"); // old unsupported format - EXCLUDED.add("testEXCEL_95.xls"); // old unsupported format - EXCLUDED.add("35897-type4.xls"); // unsupported encryption - EXCLUDED.add("59074.xls"); // Biff 5 / Excel 95 - } + @BeforeClass + public static void setup() { + EXCLUDED.clear(); + EXCLUDED.put("35897-type4.xls", EncryptedDocumentException.class); // unsupported crypto api header + EXCLUDED.put("51832.xls", EncryptedDocumentException.class); + EXCLUDED.put("xor-encryption-abc.xls", EncryptedDocumentException.class); + EXCLUDED.put("password.xls", EncryptedDocumentException.class); + EXCLUDED.put("46904.xls", OldExcelFormatException.class); + EXCLUDED.put("59074.xls", OldExcelFormatException.class); + EXCLUDED.put("testEXCEL_2.xls", OldExcelFormatException.class); // Biff 2 / Excel 2, pre-OLE2 + EXCLUDED.put("testEXCEL_3.xls", OldExcelFormatException.class); // Biff 3 / Excel 3, pre-OLE2 + EXCLUDED.put("testEXCEL_4.xls", OldExcelFormatException.class); // Biff 4 / Excel 4, pre-OLE2 + EXCLUDED.put("testEXCEL_5.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 + EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 + EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well + EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); + EXCLUDED.put("XRefCalc.xls", RuntimeException.class); // "Buffer overrun" + } @Override void runOneFile(File fileIn) throws IOException { diff --git a/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java b/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java index 1b2ef67e2..6a87ac03c 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java @@ -16,30 +16,36 @@ ==================================================================== */ package org.apache.poi.hssf.dev; +import static org.junit.Assume.assumeTrue; + import java.io.File; import java.io.PrintStream; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.hssf.OldExcelFormatException; +import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.util.LocaleUtil; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.BeforeClass; public class TestFormulaViewer extends BaseXLSIteratingTest { - static { - // TODO: is it ok to fail these? - // Look at the output of the test for the detailed stacktrace of the failures... -// EXCLUDED.add("WORKBOOK_in_capitals.xls"); -// EXCLUDED.add("NoGutsRecords.xls"); -// EXCLUDED.add("BOOK_in_capitals.xls"); -// EXCLUDED.add("46904.xls"); -// EXCLUDED.add("OddStyleRecord.xls"); - } + @BeforeClass + public static void setup() { + EXCLUDED.clear(); + EXCLUDED.put("35897-type4.xls", EncryptedDocumentException.class); // unsupported crypto api header + EXCLUDED.put("51832.xls", EncryptedDocumentException.class); + EXCLUDED.put("xor-encryption-abc.xls", EncryptedDocumentException.class); + EXCLUDED.put("password.xls", EncryptedDocumentException.class); + EXCLUDED.put("46904.xls", OldExcelFormatException.class); + EXCLUDED.put("59074.xls", OldExcelFormatException.class); + EXCLUDED.put("testEXCEL_2.xls", OldExcelFormatException.class); // Biff 2 / Excel 2, pre-OLE2 + EXCLUDED.put("testEXCEL_3.xls", OldExcelFormatException.class); // Biff 3 / Excel 3, pre-OLE2 + EXCLUDED.put("testEXCEL_4.xls", OldExcelFormatException.class); // Biff 4 / Excel 4, pre-OLE2 + EXCLUDED.put("testEXCEL_5.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 + EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 + EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well + EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); + } - @Override - @Ignore("Not yet done, nearly all files fail with various errors, remove this method when done to use the one from the abstract base class!...") - @Test - public void testMain() throws Exception { - } - @Override void runOneFile(File fileIn) throws Exception { PrintStream save = System.out; @@ -51,6 +57,14 @@ public class TestFormulaViewer extends BaseXLSIteratingTest { viewer.setFile(fileIn.getAbsolutePath()); viewer.setList(true); viewer.run(); + } catch (RuntimeException re) { + String m = re.getMessage(); + if (m.startsWith("toFormulaString") || m.startsWith("3D references")) { + // TODO: fix those cases, but ignore them for now ... + assumeTrue(true); + } else { + throw re; + } } finally { System.setOut(save); } diff --git a/src/testcases/org/apache/poi/hssf/dev/TestReSave.java b/src/testcases/org/apache/poi/hssf/dev/TestReSave.java index d858f881e..413815b70 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestReSave.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestReSave.java @@ -23,19 +23,33 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.List; +import org.apache.poi.EncryptedDocumentException; import org.apache.poi.POIDataSamples; +import org.apache.poi.hssf.OldExcelFormatException; +import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.util.LocaleUtil; +import org.junit.BeforeClass; public class TestReSave extends BaseXLSIteratingTest { - static { - // these are likely ok to fail - EXCLUDED.add("password.xls"); - EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well - EXCLUDED.add("46904.xls"); - EXCLUDED.add("51832.xls"); // password - EXCLUDED.add("44958_1.xls"); // known bad file - } - + @BeforeClass + public static void setup() { + EXCLUDED.clear(); + EXCLUDED.put("35897-type4.xls", EncryptedDocumentException.class); // unsupported crypto api header + EXCLUDED.put("51832.xls", EncryptedDocumentException.class); + EXCLUDED.put("xor-encryption-abc.xls", EncryptedDocumentException.class); + EXCLUDED.put("password.xls", EncryptedDocumentException.class); + EXCLUDED.put("46904.xls", OldExcelFormatException.class); + EXCLUDED.put("59074.xls", OldExcelFormatException.class); + EXCLUDED.put("testEXCEL_2.xls", OldExcelFormatException.class); // Biff 2 / Excel 2, pre-OLE2 + EXCLUDED.put("testEXCEL_3.xls", OldExcelFormatException.class); // Biff 3 / Excel 3, pre-OLE2 + EXCLUDED.put("testEXCEL_4.xls", OldExcelFormatException.class); // Biff 4 / Excel 4, pre-OLE2 + EXCLUDED.put("testEXCEL_5.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 + EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 + EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well + EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); + EXCLUDED.put("XRefCalc.xls", RuntimeException.class); // "Buffer overrun" + } + @Override void runOneFile(File fileIn) throws Exception { // avoid running on files leftover from previous failed runs @@ -55,13 +69,8 @@ public class TestReSave extends BaseXLSIteratingTest { // also try BiffViewer on the saved file new TestBiffViewer().runOneFile(reSavedFile); - try { - // had one case where the re-saved could not be re-saved! - ReSave.main(new String[] { reSavedFile.getAbsolutePath() }); - } finally { - // clean up the re-re-saved file - new File(fileIn.getParentFile(), reSavedFile.getName().replace(".xls", "-saved.xls")).delete(); - } + // had one case where the re-saved could not be re-saved! + ReSave.main(new String[] { "-bos", reSavedFile.getAbsolutePath() }); } finally { // clean up the re-saved file reSavedFile.delete(); diff --git a/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java b/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java index ebc26c3e5..5009fa522 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java @@ -20,18 +20,22 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; +import org.apache.poi.hssf.OldExcelFormatException; import org.apache.poi.util.LocaleUtil; +import org.junit.BeforeClass; public class TestRecordLister extends BaseXLSIteratingTest { - static { - // these are likely ok to fail - EXCLUDED.add("46904.xls"); - EXCLUDED.add("testEXCEL_3.xls"); // Biff 3 / Excel 3, pre-OLE2 - EXCLUDED.add("testEXCEL_4.xls"); // old unsupported format - EXCLUDED.add("testEXCEL_5.xls"); // Biff 5 / Excel 5 - EXCLUDED.add("testEXCEL_95.xls"); // Biff 5 / Excel 95 - EXCLUDED.add("59074.xls"); // Biff 5 / Excel 95 - } + @BeforeClass + public static void setup() { + EXCLUDED.clear(); + EXCLUDED.put("46904.xls", OldExcelFormatException.class); + EXCLUDED.put("59074.xls", OldExcelFormatException.class); + EXCLUDED.put("testEXCEL_2.xls", OldExcelFormatException.class); // Biff 2 / Excel 2, pre-OLE2 + EXCLUDED.put("testEXCEL_3.xls", OldExcelFormatException.class); // Biff 3 / Excel 3, pre-OLE2 + EXCLUDED.put("testEXCEL_4.xls", OldExcelFormatException.class); // Biff 4 / Excel 4, pre-OLE2 + EXCLUDED.put("testEXCEL_5.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 + EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 + } @Override void runOneFile(File fileIn) throws IOException {