mirror of https://github.com/apache/poi.git
Bug 68778: Verify "ignoreMissingFontSystem" for SheetUtil.getDefaultCharWidthAsFloat()
This functionality saw some regressions at times and thus should be verified via unit-tests. We can simulate failures in the low-level font-system by mocking the FontRenderContext and triggering exceptions from there. This hopefully now verifies behavior of SheetUtil.getDefaultCharWidthAsFloat() both with "ignoreMissingFontSystem" enabled and disabled. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1916297 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
08436ddf7f
commit
f4af02bb24
|
@ -96,13 +96,13 @@ public class SheetUtil {
|
|||
/**
|
||||
* drawing context to measure text
|
||||
*/
|
||||
private static final FontRenderContext fontRenderContext = new FontRenderContext(null, true, true);
|
||||
private static FontRenderContext fontRenderContext = new FontRenderContext(null, true, true);
|
||||
|
||||
/**
|
||||
* A system property which can be enabled to not fail when the
|
||||
* font-system is not available on the current machine
|
||||
*/
|
||||
private static final boolean ignoreMissingFontSystem =
|
||||
private static boolean ignoreMissingFontSystem =
|
||||
Boolean.parseBoolean(System.getProperty("org.apache.poi.ss.ignoreMissingFontSystem"));
|
||||
|
||||
/**
|
||||
|
@ -490,4 +490,21 @@ public class SheetUtil {
|
|||
// live within any merged regions
|
||||
return null;
|
||||
}
|
||||
|
||||
// Getters/Setters are available to allow in-depth testing
|
||||
protected static boolean isIgnoreMissingFontSystem() {
|
||||
return ignoreMissingFontSystem;
|
||||
}
|
||||
|
||||
protected static void setIgnoreMissingFontSystem(boolean value) {
|
||||
ignoreMissingFontSystem = value;
|
||||
}
|
||||
|
||||
protected static FontRenderContext getFontRenderContext() {
|
||||
return fontRenderContext;
|
||||
}
|
||||
|
||||
protected static void setFontRenderContext(FontRenderContext fontRenderContext) {
|
||||
SheetUtil.fontRenderContext = fontRenderContext;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,14 @@ package org.apache.poi.ss.util;
|
|||
|
||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
|
@ -31,13 +35,16 @@ import org.apache.poi.ss.usermodel.CellType;
|
|||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.util.ExceptionUtil;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.stubbing.Answer;
|
||||
|
||||
/**
|
||||
* Tests SheetUtil.
|
||||
*
|
||||
* @see org.apache.poi.ss.util.SheetUtil
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
final class TestSheetUtil {
|
||||
@Test
|
||||
void testCellWithMerges() throws Exception {
|
||||
|
@ -220,4 +227,163 @@ final class TestSheetUtil {
|
|||
assertEquals(-1.0, SheetUtil.getColumnWidth(sheet, 0, true, 1, 2), 0.01, "Not having any width for rows with all empty cells");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testIsFatal() {
|
||||
assertFalse(ExceptionUtil.isFatal(new RuntimeException()),
|
||||
"RuntimeException should not be regarded as 'fatal'");
|
||||
assertTrue(ExceptionUtil.isFatal(new LinkageError()),
|
||||
"LinkageError should not be regarded as 'fatal'");
|
||||
assertTrue(ExceptionUtil.isFatal(new UnsatisfiedLinkError()),
|
||||
"UnsatisfiedLinkError should not be regarded as 'fatal'");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithFonts() throws IOException {
|
||||
// verify that normal call returns a useful value
|
||||
// (may fail if font-system is missing, but then many other tests fail as well)
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
final float width = SheetUtil.getDefaultCharWidthAsFloat(wb);
|
||||
assertTrue(width > 0,
|
||||
"Should get some useful char width, but had: " + width);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithInvalidFont() throws IOException {
|
||||
// verify that a call with an unknown font-name returns a useful value
|
||||
// (likely the font-system falls back to a default font here)
|
||||
// (may fail if font-system is missing, but then many other tests fail as well)
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
wb.getFontAt(0).setFontName("invalid font");
|
||||
|
||||
final float width = SheetUtil.getDefaultCharWidthAsFloat(wb);
|
||||
assertTrue(width > 0,
|
||||
"Should get some useful char width, but had: " + width);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithIgnoreEnabled() throws IOException {
|
||||
boolean previous = SheetUtil.isIgnoreMissingFontSystem();
|
||||
SheetUtil.setIgnoreMissingFontSystem(true);
|
||||
|
||||
// just verify that enabling the setting "ignoreMissingFontSystem"
|
||||
// does not cause unexpected results
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
final float width = SheetUtil.getDefaultCharWidthAsFloat(wb);
|
||||
assertTrue(width > 0,
|
||||
"Should get some useful char width, but had: " + width);
|
||||
} finally {
|
||||
// restore value
|
||||
SheetUtil.setIgnoreMissingFontSystem(previous);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithMockedException() throws IOException {
|
||||
FontRenderContext prevCtx = SheetUtil.getFontRenderContext();
|
||||
final FontRenderContext ctx = mock(FontRenderContext.class, (Answer<Object>) invocation -> {
|
||||
// simulate an exception in some of the calls to java.awt packages
|
||||
throw new IllegalArgumentException("Test runtime exception");
|
||||
});
|
||||
SheetUtil.setFontRenderContext(ctx);
|
||||
|
||||
boolean previous = SheetUtil.isIgnoreMissingFontSystem();
|
||||
SheetUtil.setIgnoreMissingFontSystem(false);
|
||||
|
||||
// verify that a RuntimeException in the font-system is
|
||||
// thrown when "ignoreMissingFontSystem" is disabled
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
assertThrows(IllegalArgumentException.class,
|
||||
() -> SheetUtil.getDefaultCharWidthAsFloat(wb),
|
||||
"Should get an exception because ignoreMissingFontSystem = false");
|
||||
} finally {
|
||||
// restore values
|
||||
SheetUtil.setFontRenderContext(prevCtx);
|
||||
SheetUtil.setIgnoreMissingFontSystem(previous);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithMockedUnsatisfiedLinkError() throws IOException {
|
||||
FontRenderContext prevCtx = SheetUtil.getFontRenderContext();
|
||||
final FontRenderContext ctx = mock(FontRenderContext.class, (Answer<Object>) invocation -> {
|
||||
// simulate an exception in some of the calls to java.awt packages
|
||||
throw new UnsatisfiedLinkError("Test runtime exception");
|
||||
});
|
||||
SheetUtil.setFontRenderContext(ctx);
|
||||
|
||||
boolean previous = SheetUtil.isIgnoreMissingFontSystem();
|
||||
SheetUtil.setIgnoreMissingFontSystem(false);
|
||||
|
||||
// verify that a UnsatisfiedLinkError in the font-system is
|
||||
// thrown when "ignoreMissingFontSystem" is disabled
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
assertThrows(UnsatisfiedLinkError.class,
|
||||
() -> SheetUtil.getDefaultCharWidthAsFloat(wb),
|
||||
"Should get an exception because ignoreMissingFontSystem = false");
|
||||
} finally {
|
||||
// restore values
|
||||
SheetUtil.setFontRenderContext(prevCtx);
|
||||
SheetUtil.setIgnoreMissingFontSystem(previous);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithMockedExceptionAndIgnore() throws IOException {
|
||||
FontRenderContext prevCtx = SheetUtil.getFontRenderContext();
|
||||
final FontRenderContext ctx = mock(FontRenderContext.class, (Answer<Object>) invocation -> {
|
||||
// simulate an exception in some of the calls to java.awt packages
|
||||
throw new IllegalArgumentException("Test runtime exception");
|
||||
});
|
||||
SheetUtil.setFontRenderContext(ctx);
|
||||
|
||||
boolean previous = SheetUtil.isIgnoreMissingFontSystem();
|
||||
SheetUtil.setIgnoreMissingFontSystem(true);
|
||||
|
||||
// verify that a RuntimeException in the font-system is
|
||||
// ignored when "ignoreMissingFontSystem" is enabled
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
final float width = SheetUtil.getDefaultCharWidthAsFloat(wb);
|
||||
assertEquals(SheetUtil.DEFAULT_CHAR_WIDTH, width,
|
||||
"Should get default char width because ignoreMissingFontSystem = true, but had: " + width);
|
||||
} finally {
|
||||
// restore values
|
||||
SheetUtil.setFontRenderContext(prevCtx);
|
||||
SheetUtil.setIgnoreMissingFontSystem(previous);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetCharWidthWithMockedUnsatisfiedLinkErrorAndIgnore() throws IOException {
|
||||
FontRenderContext prevCtx = SheetUtil.getFontRenderContext();
|
||||
final FontRenderContext ctx = mock(FontRenderContext.class, (Answer<Object>) invocation -> {
|
||||
// simulate an exception in some of the calls to java.awt packages
|
||||
throw new UnsatisfiedLinkError("Test runtime exception");
|
||||
});
|
||||
SheetUtil.setFontRenderContext(ctx);
|
||||
|
||||
boolean previous = SheetUtil.isIgnoreMissingFontSystem();
|
||||
SheetUtil.setIgnoreMissingFontSystem(true);
|
||||
|
||||
// verify that a UnsatisfiedLinkError in the font-system is
|
||||
// ignored when "ignoreMissingFontSystem" is enabled
|
||||
|
||||
try (Workbook wb = new HSSFWorkbook()) {
|
||||
final float width = SheetUtil.getDefaultCharWidthAsFloat(wb);
|
||||
assertEquals(SheetUtil.DEFAULT_CHAR_WIDTH, width,
|
||||
"Should get default char width because ignoreMissingFontSystem = true, but had: " + width);
|
||||
} finally {
|
||||
// restore values
|
||||
SheetUtil.setFontRenderContext(prevCtx);
|
||||
SheetUtil.setIgnoreMissingFontSystem(previous);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue