Browse Source

#58597: Fix tests to not do setAccessible(), add some doPrivileged, too.


git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1713891 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_14_BETA1
Uwe Schindler 8 years ago
parent
commit
5756b4ca25

+ 1
- 1
src/java/org/apache/poi/poifs/storage/RawDataBlock.java View File

@@ -38,7 +38,7 @@ public class RawDataBlock
private byte[] _data;
private boolean _eof;
private boolean _hasData;
private static POILogger log = POILogFactory.getLogger(RawDataBlock.class);
static POILogger log = POILogFactory.getLogger(RawDataBlock.class);

/**
* Constructor RawDataBlock

+ 1
- 1
src/java/org/apache/poi/util/POILogFactory.java View File

@@ -46,7 +46,7 @@ public final class POILogFactory {
* The name of the class to use. Initialised the
* first time we need it
*/
private static String _loggerClassName = null;
static String _loggerClassName = null;

/**
* Construct a POILogFactory.

+ 3
- 6
src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java View File

@@ -32,7 +32,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
@@ -46,6 +45,7 @@ import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.POITestCase;
import org.apache.poi.POIXMLException;
import org.apache.poi.openxml4j.OpenXML4JTestDataSamples;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@@ -579,11 +579,8 @@ public final class TestPackage {
assertTrue(tempFile2.delete());
}

private static ContentTypeManager getContentTypeManager(OPCPackage pkg)
throws IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Field f = OPCPackage.class.getDeclaredField("contentTypeManager");
f.setAccessible(true);
return (ContentTypeManager)f.get(pkg);
private static ContentTypeManager getContentTypeManager(OPCPackage pkg) {
return POITestCase.getFieldValue(OPCPackage.class, pkg, ContentTypeManager.class, "contentTypeManager");
}

@Test

+ 2
- 4
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java View File

@@ -34,7 +34,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
@@ -54,6 +53,7 @@ import java.util.Iterator;
import java.util.List;
import org.apache.poi.POIDataSamples;
import org.apache.poi.POITestCase;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.crypt.dsig.DigestInfo;
@@ -247,9 +247,7 @@ public class TestSignatureInfo {
XSSFWorkbook wb = new XSSFWorkbook(pkg);
wb.setSheetName(0, "manipulated");
// ... I don't know, why commit is protected ...
Method m = XSSFWorkbook.class.getDeclaredMethod("commit");
m.setAccessible(true);
m.invoke(wb);
POITestCase.callMethod(XSSFWorkbook.class, wb, Void.class, "commit", new Class[0], new Object[0]);
// todo: test a manipulation on a package part, which is not signed
// ... maybe in combination with #56164

+ 0
- 29
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java View File

@@ -20,12 +20,9 @@
package org.apache.poi.xslf.usermodel;
import java.io.File;
import java.lang.reflect.Field;
import org.apache.poi.POIDataSamples;
import org.apache.poi.xslf.util.PPTX2PNG;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
@@ -34,32 +31,6 @@ import org.junit.Test;
* @author Yegor Kozlov
*/
public class TestPPTX2PNG {
private static boolean jaxpDebugEnable = false;
@BeforeClass
public static void activateJaxpDebug() {
jaxpDebugEnable = setDebugFld(true);
}
@AfterClass
public static void resetJaxpDebug() {
setDebugFld(jaxpDebugEnable);
}
private static boolean setDebugFld(boolean enable) {
// enable jaxp debugging because of jaxb/stax error in gump build
try {
Class<?> clz = Class.forName("javax.xml.stream.FactoryFinder");
Field fld = clz.getDeclaredField("debug");
fld.setAccessible(true);
boolean isDebug = (Boolean)fld.get(null);
fld.set(null, enable);
return isDebug;
} catch (Exception e) {
// ignore
return false;
}
}
@Test
public void render() throws Exception {

+ 3
- 5
src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java View File

@@ -28,8 +28,8 @@ import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;

import org.apache.poi.POITestCase;
import org.apache.poi.ss.usermodel.BaseTestWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
@@ -106,9 +106,7 @@ public final class TestSXSSFWorkbook extends BaseTestWorkbook {
@SuppressWarnings("resource")
SXSSFWorkbook wb = new SXSSFWorkbook(null, 10, false, true);

Field f = SXSSFWorkbook.class.getDeclaredField("_sharedStringSource");
f.setAccessible(true);
SharedStringsTable sss = (SharedStringsTable)f.get(wb);
SharedStringsTable sss = POITestCase.getFieldValue(SXSSFWorkbook.class, wb, SharedStringsTable.class, "_sharedStringSource");
assertNotNull(sss);

@@ -119,7 +117,7 @@ public final class TestSXSSFWorkbook extends BaseTestWorkbook {
row.createCell(2).setCellValue("A");

XSSFWorkbook xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
sss = (SharedStringsTable)f.get(wb);
sss = POITestCase.getFieldValue(SXSSFWorkbook.class, wb, SharedStringsTable.class, "_sharedStringSource");
assertEquals(2, sss.getUniqueCount());
assertTrue(wb.dispose());


+ 21
- 3
src/scratchpad/testcases/org/apache/poi/hwpf/model/TestDocumentProperties.java View File

@@ -19,12 +19,18 @@ package org.apache.poi.hwpf.model;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Arrays;

import junit.framework.TestCase;

import org.apache.poi.hwpf.HWPFDocFixture;
import org.apache.poi.hwpf.model.types.DOPAbstractType;
import org.apache.poi.util.SuppressForbidden;

// TODO: Add DocumentProperties#equals ???

public final class TestDocumentProperties
extends TestCase
@@ -43,9 +49,21 @@ public final class TestDocumentProperties
DocumentProperties newDocProperties =
new DocumentProperties(buf, 0, size);

Field[] fields = DocumentProperties.class.getSuperclass().getDeclaredFields();
AccessibleObject.setAccessible(fields, true);

final Field[] fields;
try {
fields = AccessController.doPrivileged(new PrivilegedExceptionAction<Field[]>() {
@Override
@SuppressForbidden("Test only")
public Field[] run() throws Exception {
final Field[] fields = DocumentProperties.class.getSuperclass().getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
return fields;
}
});
} catch (PrivilegedActionException pae) {
throw pae.getException();
}
for (int x = 0; x < fields.length; x++)
{
// JaCoCo Code Coverage adds it's own field, don't look at this one here

+ 48
- 0
src/testcases/org/apache/poi/POITestCase.java View File

@@ -21,8 +21,15 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Collection;

import org.apache.poi.util.SuppressForbidden;

/**
* Parent class for POI JUnit TestCases, which provide additional
* features
@@ -67,4 +74,45 @@ public class POITestCase {
}
fail("Unable to find " + needle + " in " + haystack);
}
/** Utility method to get the value of a private/protected field.
* Only use this method in test cases!!!
*/
public static <R,T> R getFieldValue(final Class<? super T> clazz, final T instance, final Class<R> fieldType, final String fieldName) {
try {
return AccessController.doPrivileged(new PrivilegedExceptionAction<R>() {
@Override
@SuppressWarnings("unchecked")
@SuppressForbidden("For test usage only")
public R run() throws Exception {
Field f = clazz.getDeclaredField(fieldName);
f.setAccessible(true);
return (R) f.get(instance);
}
});
} catch (PrivilegedActionException pae) {
throw new AssertionError("Cannot access field '" + fieldName + "' of class " + clazz);
}
}
/** Utility method to call a private/protected method.
* Only use this method in test cases!!!
*/
public static <R,T> R callMethod(final Class<? super T> clazz, final T instance, final Class<R> returnType, final String methodName,
final Class<?>[] parameterTypes, final Object[] parameters) {
try {
return AccessController.doPrivileged(new PrivilegedExceptionAction<R>() {
@Override
@SuppressWarnings("unchecked")
@SuppressForbidden("For test usage only")
public R run() throws Exception {
Method m = clazz.getDeclaredMethod(methodName, parameterTypes);
m.setAccessible(true);
return (R) m.invoke(instance, parameters);
}
});
} catch (PrivilegedActionException pae) {
throw new AssertionError("Cannot access method '" + methodName + "' of class " + clazz);
}
}
}

+ 2
- 16
src/testcases/org/apache/poi/hssf/record/aggregates/TestSharedValueManager.java View File

@@ -17,13 +17,13 @@

package org.apache.poi.hssf.record.aggregates;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;

import junit.framework.AssertionFailedError;
import junit.framework.TestCase;

import org.apache.poi.POITestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SharedFormulaRecord;
@@ -176,21 +176,7 @@ public final class TestSharedValueManager extends TestCase {
* {@link RowRecordsAggregate}.
*/
public static SharedValueManager extractFromRRA(RowRecordsAggregate rra) {
Field f;
try {
f = RowRecordsAggregate.class.getDeclaredField("_sharedValueManager");
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}

f.setAccessible(true);
try {
return (SharedValueManager) f.get(rra);
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
return POITestCase.getFieldValue(RowRecordsAggregate.class, rra, SharedValueManager.class, "_sharedValueManager");
}

public void testBug52527() {

+ 2
- 15
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFName.java View File

@@ -23,6 +23,7 @@ import static org.junit.Assert.fail;

import java.lang.reflect.Field;

import org.apache.poi.POITestCase;
import org.apache.poi.hssf.HSSFITestDataProvider;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.model.HSSFFormulaParser;
@@ -45,21 +46,7 @@ public final class TestHSSFName extends BaseTestNamedRange {
* @return a reference to the wrapped {@link NameRecord}
*/
public static NameRecord getNameRecord(HSSFName definedName) {

Field f;
try {
f = HSSFName.class.getDeclaredField("_definedNameRec");
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
f.setAccessible(true);
try {
return (NameRecord) f.get(definedName);
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
return POITestCase.getFieldValue(HSSFName.class, definedName, NameRecord.class, "_definedNameRec");
}

public TestHSSFName() {

+ 3
- 11
src/testcases/org/apache/poi/hssf/usermodel/TestShapeGroup.java View File

@@ -18,6 +18,8 @@
package org.apache.poi.hssf.usermodel;
import junit.framework.TestCase;
import org.apache.poi.POITestCase;
import org.apache.poi.ddf.EscherContainerRecord;
import org.apache.poi.ddf.EscherSpgrRecord;
import org.apache.poi.hssf.HSSFTestDataSamples;
@@ -228,17 +230,7 @@ public class TestShapeGroup extends TestCase{
}
private static EscherSpgrRecord getSpgrRecord(HSSFShapeGroup group) {
Field spgrField = null;
try {
spgrField = group.getClass().getDeclaredField("_spgrRecord");
spgrField.setAccessible(true);
return (EscherSpgrRecord) spgrField.get(group);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
return POITestCase.getFieldValue(HSSFShapeGroup.class, group, EscherSpgrRecord.class, "_spgrRecord");
}
public void testClearShapes(){

+ 90
- 84
src/testcases/org/apache/poi/poifs/storage/TestRawDataBlock.java View File

@@ -20,12 +20,12 @@ package org.apache.poi.poifs.storage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Random;

import junit.framework.TestCase;

import org.apache.poi.util.DummyPOILogger;
import org.apache.poi.util.POILogger;

/**
* Class to test RawDataBlock functionality
@@ -82,50 +82,53 @@ public final class TestRawDataBlock extends TestCase {
*/
public void testShortConstructor() throws Exception {
// Get the logger to be used
POILogger oldLogger = RawDataBlock.log;
DummyPOILogger logger = new DummyPOILogger();
Field fld = RawDataBlock.class.getDeclaredField("log");
fld.setAccessible(true);
fld.set(null, logger);
assertEquals(0, logger.logged.size());

// Test for various data sizes
for (int k = 1; k <= 512; k++)
{
byte[] data = new byte[ k ];

for (int j = 0; j < k; j++)
{
data[ j ] = ( byte ) j;
}
RawDataBlock block = null;

logger.reset();
assertEquals(0, logger.logged.size());

// Have it created
block = new RawDataBlock(new ByteArrayInputStream(data));
assertNotNull(block);

// Check for the warning is there for <512
if(k < 512) {
assertEquals(
"Warning on " + k + " byte short block",
1, logger.logged.size()
);

// Build the expected warning message, and check
String bts = k + " byte";
if(k > 1) {
bts += "s";
}

assertEquals(
"7 - Unable to read entire block; "+bts+" read before EOF; expected 512 bytes. Your document was either written by software that ignores the spec, or has been truncated!",
logger.logged.get(0)
);
} else {
assertEquals(0, logger.logged.size());
}
try {
RawDataBlock.log = logger;
assertEquals(0, logger.logged.size());
// Test for various data sizes
for (int k = 1; k <= 512; k++)
{
byte[] data = new byte[ k ];
for (int j = 0; j < k; j++)
{
data[ j ] = ( byte ) j;
}
RawDataBlock block = null;
logger.reset();
assertEquals(0, logger.logged.size());
// Have it created
block = new RawDataBlock(new ByteArrayInputStream(data));
assertNotNull(block);
// Check for the warning is there for <512
if(k < 512) {
assertEquals(
"Warning on " + k + " byte short block",
1, logger.logged.size()
);
// Build the expected warning message, and check
String bts = k + " byte";
if(k > 1) {
bts += "s";
}
assertEquals(
"7 - Unable to read entire block; "+bts+" read before EOF; expected 512 bytes. Your document was either written by software that ignores the spec, or has been truncated!",
logger.logged.get(0)
);
} else {
assertEquals(0, logger.logged.size());
}
}
} finally {
RawDataBlock.log = oldLogger;
}
}

@@ -136,46 +139,49 @@ public final class TestRawDataBlock extends TestCase {
*/
public void testSlowInputStream() throws Exception {
// Get the logger to be used
DummyPOILogger logger = new DummyPOILogger();
Field fld = RawDataBlock.class.getDeclaredField("log");
fld.setAccessible(true);
fld.set(null, logger);
assertEquals(0, logger.logged.size());

// Test for various ok data sizes
for (int k = 1; k < 512; k++) {
byte[] data = new byte[ 512 ];
for (int j = 0; j < data.length; j++) {
data[j] = (byte) j;
}

// Shouldn't complain, as there is enough data,
// even if it dribbles through
RawDataBlock block =
new RawDataBlock(new SlowInputStream(data, k));
assertFalse(block.eof());
}

// But if there wasn't enough data available, will
// complain
for (int k = 1; k < 512; k++) {
byte[] data = new byte[ 511 ];
for (int j = 0; j < data.length; j++) {
data[j] = (byte) j;
}

logger.reset();
assertEquals(0, logger.logged.size());

// Should complain, as there isn't enough data
RawDataBlock block =
new RawDataBlock(new SlowInputStream(data, k));
assertNotNull(block);
assertEquals(
"Warning on " + k + " byte short block",
1, logger.logged.size()
);
}
POILogger oldLogger = RawDataBlock.log;
DummyPOILogger logger = new DummyPOILogger();
try {
RawDataBlock.log = logger;
assertEquals(0, logger.logged.size());
// Test for various ok data sizes
for (int k = 1; k < 512; k++) {
byte[] data = new byte[ 512 ];
for (int j = 0; j < data.length; j++) {
data[j] = (byte) j;
}
// Shouldn't complain, as there is enough data,
// even if it dribbles through
RawDataBlock block =
new RawDataBlock(new SlowInputStream(data, k));
assertFalse(block.eof());
}
// But if there wasn't enough data available, will
// complain
for (int k = 1; k < 512; k++) {
byte[] data = new byte[ 511 ];
for (int j = 0; j < data.length; j++) {
data[j] = (byte) j;
}
logger.reset();
assertEquals(0, logger.logged.size());
// Should complain, as there isn't enough data
RawDataBlock block =
new RawDataBlock(new SlowInputStream(data, k));
assertNotNull(block);
assertEquals(
"Warning on " + k + " byte short block",
1, logger.logged.size()
);
}
} finally {
RawDataBlock.log = oldLogger;
}
}

/**

+ 21
- 19
src/testcases/org/apache/poi/poifs/storage/TestRawDataBlockList.java View File

@@ -19,12 +19,11 @@ package org.apache.poi.poifs.storage;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.reflect.Field;

import junit.framework.TestCase;

import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.util.DummyPOILogger;
import org.apache.poi.util.POILogger;

/**
* Class to test RawDataBlockList functionality
@@ -57,26 +56,29 @@ public final class TestRawDataBlockList extends TestCase {
*/
public void testShortConstructor() throws Exception {
// Get the logger to be used
POILogger oldLogger = RawDataBlock.log;
DummyPOILogger logger = new DummyPOILogger();
Field fld = RawDataBlock.class.getDeclaredField("log");
fld.setAccessible(true);
fld.set(null, logger);
assertEquals(0, logger.logged.size());

// Test for various short sizes
for (int k = 2049; k < 2560; k++)
{
byte[] data = new byte[ k ];

for (int j = 0; j < k; j++)
try {
RawDataBlock.log = logger;
assertEquals(0, logger.logged.size());
// Test for various short sizes
for (int k = 2049; k < 2560; k++)
{
data[ j ] = ( byte ) j;
byte[] data = new byte[ k ];
for (int j = 0; j < k; j++)
{
data[ j ] = ( byte ) j;
}
// Check we logged the error
logger.reset();
new RawDataBlockList(new ByteArrayInputStream(data), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);
assertEquals(1, logger.logged.size());
}

// Check we logged the error
logger.reset();
new RawDataBlockList(new ByteArrayInputStream(data), POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS);
assertEquals(1, logger.logged.size());
} finally {
RawDataBlock.log = oldLogger;
}
}
}

+ 0
- 11
src/testcases/org/apache/poi/ss/formula/functions/TestMathX.java View File

@@ -947,15 +947,4 @@ public class TestMathX extends AbstractNumericTestCase {
d = 2d/3; s = 3.33;
assertEquals("floor ", 0, MathX.floor(d, s));
}

public void testCoverage() throws Exception {
// get the default constructor
final Constructor<MathX> c = MathX.class.getDeclaredConstructor(new Class[] {});

// make it callable from the outside
c.setAccessible(true);

// call it
c.newInstance((Object[]) null);
}
}

+ 0
- 13
src/testcases/org/apache/poi/util/TestHexDump.java View File

@@ -240,19 +240,6 @@ public class TestHexDump {
byteOut.close();
}

@Test
public void testConstruct() throws Exception {
// to cover private constructor
// get the default constructor
final Constructor<HexDump> c = HexDump.class.getDeclaredConstructor(new Class[] {});

// make it callable from the outside
c.setAccessible(true);

// call it
assertNotNull(c.newInstance((Object[]) null));
}

@Test
public void testMain() throws Exception {
File file = TempFile.createTempFile("HexDump", ".dat");

+ 3
- 7
src/testcases/org/apache/poi/util/TestPOILogger.java View File

@@ -22,8 +22,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.lang.reflect.Field;

import org.junit.Test;

/**
@@ -42,11 +40,9 @@ public final class TestPOILogger extends POILogger {
*/
@Test
public void testVariousLogTypes() throws Exception {
Field f = POILogFactory.class.getDeclaredField("_loggerClassName");
f.setAccessible(true);
String oldLCN = (String)f.get(null);
String oldLCN = POILogFactory._loggerClassName;
try {
f.set(null, TestPOILogger.class.getName());
POILogFactory._loggerClassName = TestPOILogger.class.getName();
POILogger log = POILogFactory.getLogger( "foo" );
assertTrue(log instanceof TestPOILogger);
@@ -71,7 +67,7 @@ public final class TestPOILogger extends POILogger {
log.log(POILogger.ERROR, "log\nforging", "\nevil","\nlog");
assertEquals("log forging evil log", tlog.lastLog);
} finally {
f.set(null, oldLCN);
POILogFactory._loggerClassName = oldLCN;
}
}


Loading…
Cancel
Save