Refactor BaseXLSIteratingTest into a Parameterized test to better show which files failed

Simplify exclusion handling
Exclude testEXCEL_3.xls and testEXCEL_4.xls in two tests, not sure why this worked before?!

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1697601 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2015-08-25 08:30:49 +00:00
parent 97fa448a2c
commit 50687e782b
7 changed files with 111 additions and 127 deletions

View File

@ -17,7 +17,6 @@
package org.apache.poi.hssf.dev;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
@ -29,79 +28,79 @@ import java.util.List;
import org.apache.poi.POIDataSamples;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
/**
* Base class for integration-style tests which iterate over all test-files
* and execute the same action to find out if any change breaks these applications.
*
* This test uses {@link Parameterized} to run the test for each file separatedely.
*/
@RunWith(Parameterized.class)
public abstract class BaseXLSIteratingTest {
protected static final OutputStream NULL_OUTPUT_STREAM = new NullOutputStream();
protected static final List<String> EXCLUDED = new ArrayList<String>();
protected static final List<String> SILENT_EXCLUDED = new ArrayList<String>();
@Parameters(name="{index}: {0} using {1}")
public static Iterable<Object[]> files() {
String dataDirName = System.getProperty(POIDataSamples.TEST_PROPERTY);
if(dataDirName == null) {
dataDirName = "test-data";
}
List<Object[]> files = new ArrayList<Object[]>();
findFile(files, dataDirName + "/spreadsheet");
findFile(files, dataDirName + "/hpsf");
return files;
}
private static void findFile(List<Object[]> list, String dir) {
String[] files = new File(dir).list(new FilenameFilter() {
@Override
public boolean accept(File arg0, String arg1) {
return arg1.toLowerCase().endsWith(".xls");
}
});
assertNotNull("Did not find any xls files in directory " + dir, files);
for(String file : files) {
list.add(new Object[] { new File(dir, file) });
}
}
@Parameter
public File file;
@Test
public void testMain() throws Exception {
String dataDirName = System.getProperty(POIDataSamples.TEST_PROPERTY);
if(dataDirName == null) {
dataDirName = "test-data";
}
try {
runOneFile(file);
} catch (Exception e) {
Assume.assumeFalse("File " + file + " is excluded currently",
EXCLUDED.contains(file.getName()));
int count = runWithDir(dataDirName + "/spreadsheet");
count += runWithDir(dataDirName + "/hpsf");
System.out.println("Failed: " + file);
e.printStackTrace();
System.out.println("Had " + count + " files");
}
private int runWithDir(String dir) throws IOException {
List<String> failed = new ArrayList<String>();
String[] files = new File(dir).list(new FilenameFilter() {
@Override
public boolean accept(File arg0, String arg1) {
return arg1.toLowerCase().endsWith(".xls");
}
});
assertNotNull("Did not find any xls files in directory " + dir, files);
runWithArrayOfFiles(files, dir, failed);
assertTrue("Expected to have no failed except the ones excluded, but had: " + failed,
failed.isEmpty());
return files.length;
}
private void runWithArrayOfFiles(String[] files, String dir, List<String> failed) throws IOException {
for(String file : files) {
// 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);
try {
runOneFile(dir, file, failed);
} catch (Exception e) {
if(SILENT_EXCLUDED.contains(file)) {
continue;
}
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 can use SILENT_EXCLUDED instead
FileInputStream stream = new FileInputStream(new File(dir, file));
try {
assertNotNull(new HSSFWorkbook(stream));
} finally {
stream.close();
}
if(!EXCLUDED.contains(file)) {
failed.add(file);
}
assertNotNull(new HSSFWorkbook(stream));
} finally {
stream.close();
}
}
}
abstract void runOneFile(String dir, String file, List<String> failed) throws Exception;
abstract void runOneFile(File file) throws Exception;
/**
* Implementation of an OutputStream which does nothing, used

View File

@ -20,7 +20,6 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
@ -42,13 +41,13 @@ public class TestBiffDrawingToXml extends BaseXLSIteratingTest {
}
@Override
void runOneFile(String dir, String file, List<String> failed)
void runOneFile(File file)
throws Exception {
PrintStream save = System.out;
try {
//System.setOut(new PrintStream(TestBiffViewer.NULL_OUTPUT_STREAM));
// use a NullOutputStream to not write the bytes anywhere for best runtime
InputStream wb = new FileInputStream(new File(dir, file));
InputStream wb = new FileInputStream(file);
try {
BiffDrawingToXml.writeToFile(NULL_OUTPUT_STREAM, wb, false, new String[] {});
} finally {

View File

@ -20,34 +20,30 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.List;
public class TestBiffViewer extends BaseXLSIteratingTest {
static {
// Look at the output of the test for the detailed stacktrace of the failures...
//EXCLUDED.add("");
// these are likely ok to fail
SILENT_EXCLUDED.add("XRefCalc.xls"); // "Buffer overrun"
SILENT_EXCLUDED.add("50833.xls"); // "Name is too long" when setting username
SILENT_EXCLUDED.add("OddStyleRecord.xls");
SILENT_EXCLUDED.add("NoGutsRecords.xls");
SILENT_EXCLUDED.add("51832.xls"); // password
SILENT_EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well
SILENT_EXCLUDED.add("password.xls");
SILENT_EXCLUDED.add("46904.xls");
SILENT_EXCLUDED.add("35897-type4.xls"); // unsupported crypto api header
SILENT_EXCLUDED.add("xor-encryption-abc.xls"); // unsupported XOR-encryption
SILENT_EXCLUDED.add("testEXCEL_2.xls"); // Biff 2 / Excel 2, pre-OLE2
SILENT_EXCLUDED.add("testEXCEL_3.xls"); // Biff 3 / Excel 3, pre-OLE2
SILENT_EXCLUDED.add("testEXCEL_4.xls"); // Biff 4 / Excel 4, pre-OLE2
SILENT_EXCLUDED.add("testEXCEL_5.xls"); // Biff 5 / Excel 5
SILENT_EXCLUDED.add("testEXCEL_95.xls"); // Biff 5 / Excel 95
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("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
}
@Override
void runOneFile(String dir, String file, List<String> failed) throws IOException {
InputStream is = BiffViewer.getPOIFSInputStream(new File(dir, file));
void runOneFile(File file) throws IOException {
InputStream is = BiffViewer.getPOIFSInputStream(file);
try {
// use a NullOutputStream to not write the bytes anywhere for best runtime
BiffViewer.runBiffViewer(new PrintStream(NULL_OUTPUT_STREAM), is, true, true, true, false);

View File

@ -19,36 +19,33 @@ package org.apache.poi.hssf.dev;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.List;
public class TestEFBiffViewer extends BaseXLSIteratingTest {
static {
// Look at the output of the test for the detailed stacktrace of the failures...
//EXCLUDED.add("");
// these are likely ok to fail
SILENT_EXCLUDED.add("XRefCalc.xls");
SILENT_EXCLUDED.add("password.xls");
SILENT_EXCLUDED.add("51832.xls"); // password
SILENT_EXCLUDED.add("xor-encryption-abc.xls"); // password, ty again later!
SILENT_EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well
SILENT_EXCLUDED.add("44958_1.xls"); // known bad file
SILENT_EXCLUDED.add("46904.xls"); // Exception, too old
SILENT_EXCLUDED.add("47251_1.xls"); // Broken test file
SILENT_EXCLUDED.add("testEXCEL_4.xls"); // old unsupported format
SILENT_EXCLUDED.add("testEXCEL_5.xls"); // old unsupported format
SILENT_EXCLUDED.add("testEXCEL_95.xls"); // old unsupported format
SILENT_EXCLUDED.add("35897-type4.xls"); // unsupported encryption
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
}
@Override
void runOneFile(String dir, String file, List<String> failed) throws IOException {
void runOneFile(File file) throws IOException {
PrintStream save = System.out;
try {
// redirect standard out during the test to avoid spamming the console with output
System.setOut(new PrintStream(NULL_OUTPUT_STREAM));
EFBiffViewer.main(new String[] { new File(dir, file).getAbsolutePath() });
EFBiffViewer.main(new String[] { file.getAbsolutePath() });
} finally {
System.setOut(save);
}

View File

@ -18,7 +18,6 @@ package org.apache.poi.hssf.dev;
import java.io.File;
import java.io.PrintStream;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
@ -41,14 +40,14 @@ public class TestFormulaViewer extends BaseXLSIteratingTest {
}
@Override
void runOneFile(String dir, String file, List<String> failed) throws Exception {
void runOneFile(File file) throws Exception {
PrintStream save = System.out;
try {
// redirect standard out during the test to avoid spamming the console with output
System.setOut(new PrintStream(NULL_OUTPUT_STREAM));
FormulaViewer viewer = new FormulaViewer();
viewer.setFile(new File(dir, file).getAbsolutePath());
viewer.setFile(file.getAbsolutePath());
viewer.setList(true);
viewer.run();
} finally {

View File

@ -24,26 +24,21 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.poi.POIDataSamples;
import org.junit.Test;
public class TestReSave 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("49931.xls");
// these are likely ok to fail
SILENT_EXCLUDED.add("password.xls");
SILENT_EXCLUDED.add("43493.xls"); // HSSFWorkbook cannot open it as well
SILENT_EXCLUDED.add("46904.xls");
SILENT_EXCLUDED.add("51832.xls"); // password
SILENT_EXCLUDED.add("44958_1.xls"); // known bad file
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
}
@Override
void runOneFile(String dir, String file, List<String> failed) throws Exception {
void runOneFile(File file) throws Exception {
// avoid running on files leftover from previous failed runs
if(file.endsWith("-saved.xls")) {
if(file.getName().endsWith("-saved.xls")) {
return;
}
@ -52,22 +47,23 @@ public class TestReSave extends BaseXLSIteratingTest {
// redirect standard out during the test to avoid spamming the console with output
System.setOut(new PrintStream(NULL_OUTPUT_STREAM));
File reSavedFile = new File(file.getParentFile(), file.getName().replace(".xls", "-saved.xls"));
try {
ReSave.main(new String[] { new File(dir, file).getAbsolutePath() });
ReSave.main(new String[] { file.getAbsolutePath() });
// also try BiffViewer on the saved file
new TestBiffViewer().runOneFile(dir, file.replace(".xls", "-saved.xls"), failed);
new TestBiffViewer().runOneFile(reSavedFile);
try {
// had one case where the re-saved could not be re-saved!
ReSave.main(new String[] { new File(dir, file.replace(".xls", "-saved.xls")).getAbsolutePath() });
ReSave.main(new String[] { reSavedFile.getAbsolutePath() });
} finally {
// clean up the re-re-saved file
new File(dir, file.replace(".xls", "-saved.xls").replace(".xls", "-saved.xls")).delete();
new File(file.getParentFile(), reSavedFile.getName().replace(".xls", "-saved.xls")).delete();
}
} finally {
// clean up the re-saved file
new File(dir, file.replace(".xls", "-saved.xls")).delete();
reSavedFile.delete();
}
} finally {
@ -75,7 +71,8 @@ public class TestReSave extends BaseXLSIteratingTest {
}
}
@Test
//Only used for local testing
//@Test
public void testOneFile() throws Exception {
String dataDirName = System.getProperty(POIDataSamples.TEST_PROPERTY);
if(dataDirName == null) {
@ -83,7 +80,7 @@ public class TestReSave extends BaseXLSIteratingTest {
}
List<String> failed = new ArrayList<String>();
runOneFile(dataDirName + "/spreadsheet", "49219.xls", failed);
runOneFile(new File(dataDirName + "/spreadsheet", "49931.xls"));
assertTrue("Expected to have no failed except the ones excluded, but had: " + failed,
failed.isEmpty());

View File

@ -19,27 +19,24 @@ package org.apache.poi.hssf.dev;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.List;
public class TestRecordLister 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("");
// these are likely ok to fail
SILENT_EXCLUDED.add("46904.xls");
EXCLUDED.add("46904.xls");
EXCLUDED.add("testEXCEL_3.xls"); // Biff 3 / Excel 3, pre-OLE2
EXCLUDED.add("testEXCEL_4.xls"); // old unsupported format
}
@Override
void runOneFile(String dir, String file, List<String> failed) throws IOException {
void runOneFile(File file) throws IOException {
PrintStream save = System.out;
try {
// redirect standard out during the test to avoid spamming the console with output
System.setOut(new PrintStream(NULL_OUTPUT_STREAM));
RecordLister viewer = new RecordLister();
viewer.setFile(new File(dir, file).getAbsolutePath());
viewer.setFile(file.getAbsolutePath());
viewer.run();
} finally {
System.setOut(save);