diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2015-08-29 14:41:12 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2015-08-29 14:41:12 +0000 |
commit | ebdbe8b97ab92fd16bbd687b2b3662d252ef57d6 (patch) | |
tree | 90f352484ed4d1bdff0755c8c33f6bcce9d46ec2 /src/testcases/org/apache/poi/util/TestHexDump.java | |
parent | 7b5bd4a7f67ce324620153ead02d7bfc90348806 (diff) | |
download | poi-ebdbe8b97ab92fd16bbd687b2b3662d252ef57d6.tar.gz poi-ebdbe8b97ab92fd16bbd687b2b3662d252ef57d6.zip |
- reworked HexDump class - unified array dumps and usage of standard java calls for hex format
- fixed a few findbugs DM_DEFAULT_ENCODING issues
- removed a few System.out/.err calls - instead the poilogger is used
- closed a few left open resource instances
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1700040 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/testcases/org/apache/poi/util/TestHexDump.java')
-rw-r--r-- | src/testcases/org/apache/poi/util/TestHexDump.java | 341 |
1 files changed, 104 insertions, 237 deletions
diff --git a/src/testcases/org/apache/poi/util/TestHexDump.java b/src/testcases/org/apache/poi/util/TestHexDump.java index 883cedd91e..11cd4cb9a7 100644 --- a/src/testcases/org/apache/poi/util/TestHexDump.java +++ b/src/testcases/org/apache/poi/util/TestHexDump.java @@ -17,6 +17,12 @@ package org.apache.poi.util; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -26,243 +32,116 @@ import java.io.InputStream; import java.io.PrintStream; import java.lang.reflect.Constructor; -import junit.framework.TestCase; - -/** - * @author Glen Stampoultzis (glens at apache.org) - * @author Marc Johnson (mjohnson at apache dot org) - */ -public final class TestHexDump extends TestCase { - - - private static char toHex(int n) { - return Character.toUpperCase(Character.forDigit(n & 0x0F, 16)); - } +import org.junit.Test; +public final class TestHexDump { + @Test public void testDump() throws IOException { byte[] testArray = new byte[ 256 ]; - for (int j = 0; j < 256; j++) - { + for (int j = 0; j < 256; j++) { testArray[ j ] = ( byte ) j; } - ByteArrayOutputStream stream = new ByteArrayOutputStream(); + ByteArrayOutputStream streamAct = new ByteArrayOutputStream(); + HexDump.dump(testArray, 0, streamAct, 0); + byte bytesAct[] = streamAct.toByteArray(); + byte bytesExp[] = toHexDump(0,0); - HexDump.dump(testArray, 0, stream, 0); - byte[] outputArray = new byte[ 16 * (73 + HexDump.EOL.length()) ]; - - for (int j = 0; j < 16; j++) - { - int offset = (73 + HexDump.EOL.length()) * j; - - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) toHex(j); - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) ' '; - for (int k = 0; k < 16; k++) - { - outputArray[ offset++ ] = ( byte ) toHex(j); - outputArray[ offset++ ] = ( byte ) toHex(k); - outputArray[ offset++ ] = ( byte ) ' '; - } - for (int k = 0; k < 16; k++) - { - outputArray[ offset++ ] = ( byte ) toAscii((j * 16) + k); - } - System.arraycopy(HexDump.EOL.getBytes(), 0, outputArray, offset, - HexDump.EOL.getBytes().length); - } - byte[] actualOutput = stream.toByteArray(); - - assertEquals("array size mismatch", outputArray.length, - actualOutput.length); - for (int j = 0; j < outputArray.length; j++) - { - assertEquals("array[ " + j + "] mismatch", outputArray[ j ], - actualOutput[ j ]); - } + assertEquals("array size mismatch", bytesExp.length, bytesAct.length); + assertArrayEquals("array mismatch", bytesExp, bytesAct); // verify proper behavior with non-zero offset - stream = new ByteArrayOutputStream(); - HexDump.dump(testArray, 0x10000000, stream, 0); - outputArray = new byte[ 16 * (73 + HexDump.EOL.length()) ]; - for (int j = 0; j < 16; j++) - { - int offset = (73 + HexDump.EOL.length()) * j; - - outputArray[ offset++ ] = ( byte ) '1'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) toHex(j); - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) ' '; - for (int k = 0; k < 16; k++) - { - outputArray[ offset++ ] = ( byte ) toHex(j); - outputArray[ offset++ ] = ( byte ) toHex(k); - outputArray[ offset++ ] = ( byte ) ' '; - } - for (int k = 0; k < 16; k++) - { - outputArray[ offset++ ] = ( byte ) toAscii((j * 16) + k); - } - System.arraycopy(HexDump.EOL.getBytes(), 0, outputArray, offset, - HexDump.EOL.getBytes().length); - } - actualOutput = stream.toByteArray(); - assertEquals("array size mismatch", outputArray.length, - actualOutput.length); - for (int j = 0; j < outputArray.length; j++) - { - assertEquals("array[ " + j + "] mismatch", outputArray[ j ], - actualOutput[ j ]); - } + streamAct.reset(); + HexDump.dump(testArray, 0x10000000L, streamAct, 0); + bytesAct = streamAct.toByteArray(); + bytesExp = toHexDump(0x10000000L,0); + + assertEquals("array size mismatch", bytesExp.length, bytesAct.length); + assertArrayEquals("array mismatch", bytesExp, bytesAct); // verify proper behavior with negative offset - stream = new ByteArrayOutputStream(); - HexDump.dump(testArray, 0xFF000000, stream, 0); - outputArray = new byte[ 16 * (73 + HexDump.EOL.length()) ]; - for (int j = 0; j < 16; j++) - { - int offset = (73 + HexDump.EOL.length()) * j; - - outputArray[ offset++ ] = ( byte ) 'F'; - outputArray[ offset++ ] = ( byte ) 'F'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) toHex(j); - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) ' '; - for (int k = 0; k < 16; k++) - { - outputArray[ offset++ ] = ( byte ) toHex(j); - outputArray[ offset++ ] = ( byte ) toHex(k); - outputArray[ offset++ ] = ( byte ) ' '; - } - for (int k = 0; k < 16; k++) - { - outputArray[ offset++ ] = ( byte ) toAscii((j * 16) + k); - } - System.arraycopy(HexDump.EOL.getBytes(), 0, outputArray, offset, - HexDump.EOL.getBytes().length); - } - actualOutput = stream.toByteArray(); - assertEquals("array size mismatch", outputArray.length, - actualOutput.length); - for (int j = 0; j < outputArray.length; j++) - { - assertEquals("array[ " + j + "] mismatch", outputArray[ j ], - actualOutput[ j ]); - } + streamAct.reset(); + HexDump.dump(testArray, 0xFF000000L, streamAct, 0); + bytesAct = streamAct.toByteArray(); + bytesExp = toHexDump(0xFF000000L,0); + + assertEquals("array size mismatch", bytesExp.length, bytesAct.length); + assertArrayEquals("array mismatch", bytesExp, bytesAct); // verify proper behavior with non-zero index - stream = new ByteArrayOutputStream(); - HexDump.dump(testArray, 0x10000000, stream, 0x81); - outputArray = new byte[ (8 * (73 + HexDump.EOL.length())) - 1 ]; - for (int j = 0; j < 8; j++) - { - int offset = (73 + HexDump.EOL.length()) * j; - - outputArray[ offset++ ] = ( byte ) '1'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) '0'; - outputArray[ offset++ ] = ( byte ) toHex(j + 8); - outputArray[ offset++ ] = ( byte ) '1'; - outputArray[ offset++ ] = ( byte ) ' '; - for (int k = 0; k < 16; k++) - { - int index = 0x81 + (j * 16) + k; - - if (index < 0x100) - { - outputArray[ offset++ ] = ( byte ) toHex(index / 16); - outputArray[ offset++ ] = ( byte ) toHex(index); - } - else - { - outputArray[ offset++ ] = ( byte ) ' '; - outputArray[ offset++ ] = ( byte ) ' '; - } - outputArray[ offset++ ] = ( byte ) ' '; - } - for (int k = 0; k < 16; k++) - { - int index = 0x81 + (j * 16) + k; + streamAct.reset(); + HexDump.dump(testArray, 0xFF000000L, streamAct, 0x81); + bytesAct = streamAct.toByteArray(); + bytesExp = toHexDump(0xFF000000L,0x81); + + assertEquals("array size mismatch", bytesExp.length, bytesAct.length); + assertArrayEquals("array mismatch", bytesExp, bytesAct); - if (index < 0x100) - { - outputArray[ offset++ ] = ( byte ) toAscii(index); - } - } - System.arraycopy(HexDump.EOL.getBytes(), 0, outputArray, offset, - HexDump.EOL.getBytes().length); - } - actualOutput = stream.toByteArray(); - assertEquals("array size mismatch", outputArray.length, - actualOutput.length); - for (int j = 0; j < outputArray.length; j++) - { - assertEquals("array[ " + j + "] mismatch", outputArray[ j ], - actualOutput[ j ]); - } // verify proper behavior with negative index - try - { - HexDump.dump(testArray, 0x10000000, new ByteArrayOutputStream(), -1); + try { + streamAct.reset(); + HexDump.dump(testArray, 0x10000000L, streamAct, -1); fail("should have caught ArrayIndexOutOfBoundsException on negative index"); - } - catch (ArrayIndexOutOfBoundsException ignored_exception) - { - + } catch (ArrayIndexOutOfBoundsException ignored_exception) { // as expected } // verify proper behavior with index that is too large - try - { - HexDump.dump(testArray, 0x10000000, new ByteArrayOutputStream(), - testArray.length); + try { + streamAct.reset(); + HexDump.dump(testArray, 0x10000000L, streamAct, testArray.length); fail("should have caught ArrayIndexOutOfBoundsException on large index"); - } - catch (ArrayIndexOutOfBoundsException ignored_exception) - { - + } catch (ArrayIndexOutOfBoundsException ignored_exception) { // as expected } // verify proper behavior with null stream - try - { - HexDump.dump(testArray, 0x10000000, null, 0); + try { + HexDump.dump(testArray, 0x10000000L, null, 0); fail("should have caught IllegalArgumentException on negative index"); - } - catch (IllegalArgumentException ignored_exception) - { + } catch (IllegalArgumentException ignored_exception) { // as expected } // verify proper behaviour with empty byte array - ByteArrayOutputStream os = new ByteArrayOutputStream( ); - HexDump.dump( new byte[0], 0, os, 0 ); - assertEquals( "No Data" + System.getProperty( "line.separator"), os.toString() ); + streamAct.reset(); + HexDump.dump( new byte[0], 0, streamAct, 0 ); + assertEquals( "No Data" + System.getProperty( "line.separator"), streamAct.toString() ); } + + private byte[] toHexDump(long offset, int index) { + StringBuilder strExp = new StringBuilder(), chrs = new StringBuilder(); + Object obj[] = new Object[33]; + StringBuilder format = new StringBuilder(); + + for (int j = 0; j < 16 && (index + j*16) < 256; j++) { + obj[0] = offset+index+j*16; + chrs.setLength(0); + format.setLength(0); + format.append("%08X "); + for (int k = 0; k < 16; k++) { + if (index+j*16+k < 256){ + obj[k+1] = index+j*16+k; + chrs.append(HexDump.toAscii(index+j*16+k)); + format.append("%02X "); + } else { + format.append(" "); + } + } + obj[17] = chrs.toString(); + format.append("%18$s"+HexDump.EOL); + + String str = String.format(format.toString(), obj); + strExp.append(str); + } + byte bytesExp[] = strExp.toString().getBytes(HexDump.UTF8); + return bytesExp; + } + @Test public void testToHex() { assertEquals("000A", HexDump.toHex((short)0xA)); @@ -287,29 +166,17 @@ public final class TestHexDump extends TestCase { assertEquals("00000000000004D2", HexDump.toHex(1234l)); - confirmStr("0xFE", HexDump.byteToHex(-2)); - confirmStr("0x25", HexDump.byteToHex(37)); - confirmStr("0xFFFE", HexDump.shortToHex(-2)); - confirmStr("0x0005", HexDump.shortToHex(5)); - confirmStr("0xFFFFFF9C", HexDump.intToHex(-100)); - confirmStr("0x00001001", HexDump.intToHex(4097)); - confirmStr("0xFFFFFFFFFFFF0006", HexDump.longToHex(-65530)); - confirmStr("0x0000000000003FCD", HexDump.longToHex(16333)); + assertEquals("0xFE", HexDump.byteToHex(-2)); + assertEquals("0x25", HexDump.byteToHex(37)); + assertEquals("0xFFFE", HexDump.shortToHex(-2)); + assertEquals("0x0005", HexDump.shortToHex(5)); + assertEquals("0xFFFFFF9C", HexDump.intToHex(-100)); + assertEquals("0x00001001", HexDump.intToHex(4097)); + assertEquals("0xFFFFFFFFFFFF0006", HexDump.longToHex(-65530)); + assertEquals("0x0000000000003FCD", HexDump.longToHex(16333)); } - private static void confirmStr(String expected, char[] actualChars) { - assertEquals(expected, new String(actualChars)); - } - - private static char toAscii(int c) { - char rval = '.'; - - if (c >= 32 && c <= 126) { - rval = ( char ) c; - } - return rval; - } - + @Test public void testDumpToString() throws Exception { byte[] testArray = new byte[ 256 ]; @@ -328,24 +195,22 @@ public final class TestHexDump extends TestCase { dump.contains("123456789:;<=>?@")); } - public void testDumpToStringOutOfIndex() throws Exception { - byte[] testArray = new byte[ 0 ]; + @Test(expected=ArrayIndexOutOfBoundsException.class) + public void testDumpToStringOutOfIndex1() throws Exception { + HexDump.dump(new byte[ 1 ], 0, -1); + } - try { - HexDump.dump(testArray, 0, -1); - fail("Should throw an exception with invalid input"); - } catch (ArrayIndexOutOfBoundsException e) { - // expected - } + @Test(expected=ArrayIndexOutOfBoundsException.class) + public void testDumpToStringOutOfIndex2() throws Exception { + HexDump.dump(new byte[ 1 ], 0, 2); + } - try { - HexDump.dump(testArray, 0, 1); - fail("Should throw an exception with invalid input"); - } catch (ArrayIndexOutOfBoundsException e) { - // expected - } + public void testDumpToStringOutOfIndex3() throws Exception { + HexDump.dump(new byte[ 1 ], 0, 1); } + + @Test public void testDumpToPrintStream() throws IOException { byte[] testArray = new byte[ 256 ]; @@ -425,6 +290,7 @@ public final class TestHexDump extends TestCase { } } + @Test public void testConstruct() throws Exception { // to cover private constructor // get the default constructor @@ -437,6 +303,7 @@ public final class TestHexDump extends TestCase { assertNotNull(c.newInstance((Object[]) null)); } + @Test public void testMain() throws Exception { File file = TempFile.createTempFile("HexDump", ".dat"); try { |