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);


Reply via email to