diff options
author | jonmv <venstad@gmail.com> | 2022-10-25 11:46:18 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-10-26 12:07:17 +0200 |
commit | 74ab1c364fb11c46811cc12ed92807d06da674ff (patch) | |
tree | 3f33db9f5719bc20beecc81a84ce5da9a6645bbc /vespajlib | |
parent | a845add7c80c437d410a91da28dff6357304e748 (diff) |
Correctly throw on Integer.MIN_VALUE, in IntegerCompressor
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/compress/IntegerCompressor.java | 1 | ||||
-rw-r--r-- | vespajlib/src/test/java/com/yahoo/compress/IntegerCompressorTest.java | 39 |
2 files changed, 15 insertions, 25 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/compress/IntegerCompressor.java b/vespajlib/src/main/java/com/yahoo/compress/IntegerCompressor.java index 982ca309015..fada7243b95 100644 --- a/vespajlib/src/main/java/com/yahoo/compress/IntegerCompressor.java +++ b/vespajlib/src/main/java/com/yahoo/compress/IntegerCompressor.java @@ -14,6 +14,7 @@ public class IntegerCompressor { int negative = n < 0 ? 0x80 : 0x0; if (negative != 0) { n = -n; + if (n == -n) --n; // underflow, caught as "too big" later. } if (n < (0x1 << 5)) { byte b = (byte)(n | negative); diff --git a/vespajlib/src/test/java/com/yahoo/compress/IntegerCompressorTest.java b/vespajlib/src/test/java/com/yahoo/compress/IntegerCompressorTest.java index 5a5cb2745d2..921ae6746be 100644 --- a/vespajlib/src/test/java/com/yahoo/compress/IntegerCompressorTest.java +++ b/vespajlib/src/test/java/com/yahoo/compress/IntegerCompressorTest.java @@ -7,7 +7,7 @@ import java.nio.ByteBuffer; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertThrows; /** * Test that integers compresses correctly. @@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue; * @author baldersheim */ public class IntegerCompressorTest { + private void verifyPositiveNumber(int n, byte [] expected) { ByteBuffer buf = ByteBuffer.allocate(expected.length); IntegerCompressor.putCompressedPositiveNumber(n, buf); @@ -43,18 +44,10 @@ public class IntegerCompressorTest { byte [] x3fffffff = {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}; verifyPositiveNumber(0x3fffffff, x3fffffff); byte [] x40000000 = {0,0,0,0}; - try { - verifyPositiveNumber(0x40000000, x40000000); - assertTrue(false); - } catch (IllegalArgumentException e) { - assertEquals("Number '1073741824' too big, must extend encoding", e.getMessage()); - } - try { - verifyPositiveNumber(-1, x40000000); - assertTrue(false); - } catch (IllegalArgumentException e) { - assertEquals("Number '-1' must be positive", e.getMessage()); - } + assertEquals("Number '1073741824' too big, must extend encoding", + assertThrows(IllegalArgumentException.class, () -> verifyPositiveNumber(0x40000000, x40000000)).getMessage()); + assertEquals("Number '-1' must be positive", + assertThrows(IllegalArgumentException.class, () -> verifyPositiveNumber(-1, x40000000)).getMessage()); } @Test @@ -74,12 +67,8 @@ public class IntegerCompressorTest { byte [] x1fffffff = {0x7f, (byte)0xff, (byte)0xff, (byte)0xff}; verifyNumber(0x1fffffff, x1fffffff); byte [] x20000000 = {0,0,0,0}; - try { - verifyNumber(0x20000000, x20000000); - assertTrue(false); - } catch (IllegalArgumentException e) { - assertEquals("Number '536870912' too big, must extend encoding", e.getMessage()); - } + assertEquals("Number '536870912' too big, must extend encoding", + assertThrows(IllegalArgumentException.class, () -> verifyNumber(0x20000000, x20000000)).getMessage()); byte [] mzero = {(byte)0x81}; verifyNumber(-1, mzero); byte [] mone = {(byte)0x82}; @@ -95,12 +84,12 @@ public class IntegerCompressorTest { byte [] mx1fffffff = {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff}; verifyNumber(-0x1fffffff, mx1fffffff); byte [] mx20000000 = {0,0,0,0}; - try { - verifyNumber(-0x20000000, mx20000000); - assertTrue(false); - } catch (IllegalArgumentException e) { - assertEquals("Number '-536870912' too big, must extend encoding", e.getMessage()); - } + assertEquals("Number '-536870912' too big, must extend encoding", + assertThrows(IllegalArgumentException.class, () -> verifyNumber(-0x20000000, mx20000000)).getMessage()); + byte [] mx80000000 = {0,0,0,0}; + assertEquals("Number '-2147483647' too big, must extend encoding", + assertThrows(IllegalArgumentException.class, () -> verifyNumber(-0x80000000, mx80000000)).getMessage()); + } } |