Author: mduerig
Date: Fri Feb 24 15:46:30 2017
New Revision: 1784288
URL: http://svn.apache.org/viewvc?rev=1784288&view=rev
Log:
OAK-5357: StringUtils conversion functions can throw NullPointerException
Make the NPE explicit and add test coverage
Modified:
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/StringUtils.java
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/StringUtilsTest.java
Modified:
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/StringUtils.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/StringUtils.java?rev=1784288&r1=1784287&r2=1784288&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/StringUtils.java
(original)
+++
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/StringUtils.java
Fri Feb 24 15:46:30 2017
@@ -16,6 +16,11 @@
*/
package org.apache.jackrabbit.oak.commons;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Nonnull;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,13 +33,17 @@ public class StringUtils {
private static final char[] HEX = "0123456789abcdef".toCharArray();
+ private StringUtils() {}
+
/**
* Convert a byte array to a hex encoded string.
*
* @param value the byte array
* @return the hex encoded string
*/
- public static String convertBytesToHex(byte[] value) {
+ @Nonnull
+ public static String convertBytesToHex(@Nonnull byte[] value) {
+ checkNotNull(value);
int len = value.length;
char[] buff = new char[len + len];
char[] hex = HEX;
@@ -52,11 +61,12 @@ public class StringUtils {
* @param s the hex encoded string
* @return the byte array
*/
- public static byte[] convertHexToBytes(String s) {
+ @Nonnull
+ public static byte[] convertHexToBytes(@Nonnull String s) {
+ checkNotNull(s);
int len = s.length();
- if (len % 2 != 0) {
- throw new IllegalArgumentException(s);
- }
+ checkArgument(len % 2 == 0);
+
len /= 2;
byte[] buff = new byte[len];
for (int i = 0; i < len; i++) {
Modified:
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/StringUtilsTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/StringUtilsTest.java?rev=1784288&r1=1784287&r2=1784288&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/StringUtilsTest.java
(original)
+++
jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/StringUtilsTest.java
Fri Feb 24 15:46:30 2017
@@ -16,34 +16,57 @@
*/
package org.apache.jackrabbit.oak.commons;
-import com.google.common.collect.Maps;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.util.Map;
+import com.google.common.collect.Maps;
+import org.junit.Test;
+
/**
* Test the string utilities.
*/
-public class StringUtilsTest extends TestCase {
+public class StringUtilsTest {
- public void testHex() {
- assertEquals("0123", StringUtils.convertBytesToHex(new byte[]{(byte)
0x01, (byte) 0x23}));
- assertEquals("89bd", StringUtils.convertBytesToHex(new byte[]{(byte)
0x89, (byte) 0xbd}));
- assertEquals("face", StringUtils.convertBytesToHex(new byte[]{(byte)
0xfa, (byte) 0xce}));
- IOUtilsTest.assertEquals(new byte[]{(byte) 0xfa, (byte) 0xce},
StringUtils.convertHexToBytes("face"));
- IOUtilsTest.assertEquals(new byte[]{(byte) 0xfa, (byte) 0xce},
StringUtils.convertHexToBytes("fAcE"));
- IOUtilsTest.assertEquals(new byte[]{(byte) 0xfa, (byte) 0xce},
StringUtils.convertHexToBytes("FaCe"));
- IOUtilsTest.assertEquals(new byte[]{(byte) 0x09, (byte) 0xaf},
StringUtils.convertHexToBytes("09af"));
+ @Test
+ public void testBytesToHex() {
+ assertEquals("0123", StringUtils.convertBytesToHex(new byte[] {(byte)
0x01, (byte) 0x23}));
+ assertEquals("89bd", StringUtils.convertBytesToHex(new byte[] {(byte)
0x89, (byte) 0xbd}));
+ assertEquals("face", StringUtils.convertBytesToHex(new byte[] {(byte)
0xfa, (byte) 0xce}));
+ assertEquals("", StringUtils.convertBytesToHex(new byte[] {}));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testNullToHex() {
+ StringUtils.convertBytesToHex(null);
+ }
+
+ @Test
+ public void testHexToBytes() {
+ IOUtilsTest.assertEquals(new byte[] {(byte) 0xfa, (byte) 0xce},
StringUtils.convertHexToBytes("face"));
+ IOUtilsTest.assertEquals(new byte[] {(byte) 0xfa, (byte) 0xce},
StringUtils.convertHexToBytes("fAcE"));
+ IOUtilsTest.assertEquals(new byte[] {(byte) 0xfa, (byte) 0xce},
StringUtils.convertHexToBytes("FaCe"));
+ IOUtilsTest.assertEquals(new byte[] {(byte) 0x09, (byte) 0xaf},
StringUtils.convertHexToBytes("09af"));
+ IOUtilsTest.assertEquals(new byte[] {},
StringUtils.convertHexToBytes(""));
+ }
+
+ @Test
+ public void testInvalidHexToBytes() {
for (String s : new String[]{"120", "1/", "9:", "fast", "a`", "ag",
"0@", "aG"}) {
try {
StringUtils.convertHexToBytes(s);
fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
+ } catch (IllegalArgumentException expected) { }
}
}
+ @Test(expected = NullPointerException.class)
+ public void testNullToBytes() {
+ StringUtils.convertHexToBytes(null);
+ }
+
+ @Test
public void testEstimateMemoryUsage() {
final Map<String, Integer> testStrings = Maps.newHashMap();
testStrings.put(null, 0);