/* * Copyright 2008-2013 LinkedIn, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package voldemort.utils; import java.security.MessageDigest; import java.util.Arrays; import junit.framework.TestCase; import org.apache.commons.codec.DecoderException; public class ByteUtilsTest extends TestCase { public void testCat() { assertTrue("Concatenation of empty arrays is not empty", Arrays.equals(new byte[0], ByteUtils.cat(new byte[0], new byte[0]))); assertTrue("Concatenation of no arrays is not empty", Arrays.equals(new byte[0], ByteUtils.cat())); assertTrue("Concatenation of arrays incorrect.", Arrays.equals("abcdefg".getBytes(), ByteUtils.cat("ab".getBytes(), "".getBytes(), "cdef".getBytes(), "g".getBytes()))); } public void testCopy() { assertTrue("Copy of no bytes is not empty array.", Arrays.equals(new byte[0], ByteUtils.copy("hello".getBytes(), 0, 0))); assertTrue("Copy of negetive bytes is not empty array.", Arrays.equals(new byte[0], ByteUtils.copy("hello".getBytes(), 2, 0))); assertTrue("Bytes copy incorrectly", Arrays.equals("hell".getBytes(), ByteUtils.copy("hello".getBytes(), 0, 4))); } public void testReadWriteShort() { byte[] bytes = new byte[4]; ByteUtils.writeShort(bytes, (short) 5, 0); assertEquals("Read value not equal to written value.", (short) 5, ByteUtils.readShort(bytes, 0)); ByteUtils.writeShort(bytes, (short) 500, 2); assertEquals("Read value not equal to written value.", (short) 500, ByteUtils.readShort(bytes, 2)); } public void testReadWriteLong() { byte[] bytes = new byte[8]; ByteUtils.writeLong(bytes, 5, 0); assertEquals("Read value not equal to written value.", 5, ByteUtils.readLong(bytes, 0)); long value = System.currentTimeMillis(); ByteUtils.writeLong(bytes, value, 0); assertEquals("Read value not equal to written value.", value, ByteUtils.readLong(bytes, 0)); } public void testReadWriteInt() { byte[] bytes = new byte[8]; ByteUtils.writeInt(bytes, 5, 0); assertEquals("Read value not equal to written value.", 5, ByteUtils.readInt(bytes, 0)); int value = (int) System.currentTimeMillis(); ByteUtils.writeInt(bytes, value, 0); assertEquals("Read value not equal to written value.", value, ByteUtils.readInt(bytes, 0)); } public void testReadUnsignedInt() { byte[] bytes = new byte[4]; bytes[0] = (byte) 0xFF; bytes[1] = (byte) 0xFF; bytes[2] = (byte) 0xFF; bytes[3] = (byte) 0xFF; assertEquals(0xFFFFFFFF, ByteUtils.readInt(bytes, 0)); bytes[0] = (byte) 0x01; bytes[1] = (byte) 0x23; bytes[2] = (byte) 0x45; bytes[3] = (byte) 0x67; assertEquals(0x01234567, ByteUtils.readInt(bytes, 0)); } public void testReadWriteBytes() { byte[] bytes = new byte[8]; ByteUtils.writeBytes(bytes, 5, 0, 8); assertEquals("Read value not equal to written value.", 5, ByteUtils.readBytes(bytes, 0, 8)); long value = System.currentTimeMillis(); ByteUtils.writeBytes(bytes, value, 0, 8); assertEquals("Read value not equal to written value.", value, ByteUtils.readBytes(bytes, 0, 8)); bytes = new byte[24]; ByteUtils.writeBytes(bytes, value, 8, 8); assertEquals("Read value not equal to written value.", value, ByteUtils.readBytes(bytes, 8, 8)); } public void testGetNumberOfRequiredBytes() { assertEquals(1, ByteUtils.numberOfBytesRequired(0)); assertEquals(1, ByteUtils.numberOfBytesRequired(1)); assertEquals(2, ByteUtils.numberOfBytesRequired(257)); assertEquals(3, ByteUtils.numberOfBytesRequired(3 * Short.MAX_VALUE)); } public void testToString() { assertEquals("00", ByteUtils.toHexString(new byte[] { 0 })); assertEquals("010203", ByteUtils.toHexString(new byte[] { 1, 2, 3 })); assertEquals("afadae", ByteUtils.toHexString(new byte[] { (byte) 0xaf, (byte) 0xad, (byte) 0xae })); assertEquals("afadae", ByteUtils.toHexString(new byte[] { (byte) 0xaf, (byte) 0xad, (byte) 0xae })); assertEquals("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", ByteUtils.toHexString(new byte[] { (byte) 0, (byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 9, (byte) 10, (byte) 11, (byte) 12, (byte) 13, (byte) 14, (byte) 15, (byte) 16, (byte) 17, (byte) 18, (byte) 19, (byte) 20, (byte) 21, (byte) 22, (byte) 23, (byte) 24, (byte) 25, (byte) 26, (byte) 27, (byte) 28, (byte) 29, (byte) 30, (byte) 31, (byte) 32, (byte) 33, (byte) 34, (byte) 35, (byte) 36, (byte) 37, (byte) 38, (byte) 39, (byte) 40, (byte) 41, (byte) 42, (byte) 43, (byte) 44, (byte) 45, (byte) 46, (byte) 47, (byte) 48, (byte) 49, (byte) 50, (byte) 51, (byte) 52, (byte) 53, (byte) 54, (byte) 55, (byte) 56, (byte) 57, (byte) 58, (byte) 59, (byte) 60, (byte) 61, (byte) 62, (byte) 63, (byte) 64, (byte) 65, (byte) 66, (byte) 67, (byte) 68, (byte) 69, (byte) 70, (byte) 71, (byte) 72, (byte) 73, (byte) 74, (byte) 75, (byte) 76, (byte) 77, (byte) 78, (byte) 79, (byte) 80, (byte) 81, (byte) 82, (byte) 83, (byte) 84, (byte) 85, (byte) 86, (byte) 87, (byte) 88, (byte) 89, (byte) 90, (byte) 91, (byte) 92, (byte) 93, (byte) 94, (byte) 95, (byte) 96, (byte) 97, (byte) 98, (byte) 99, (byte) 100, (byte) 101, (byte) 102, (byte) 103, (byte) 104, (byte) 105, (byte) 106, (byte) 107, (byte) 108, (byte) 109, (byte) 110, (byte) 111, (byte) 112, (byte) 113, (byte) 114, (byte) 115, (byte) 116, (byte) 117, (byte) 118, (byte) 119, (byte) 120, (byte) 121, (byte) 122, (byte) 123, (byte) 124, (byte) 125, (byte) 126, (byte) 127, (byte) 128, (byte) 129, (byte) 130, (byte) 131, (byte) 132, (byte) 133, (byte) 134, (byte) 135, (byte) 136, (byte) 137, (byte) 138, (byte) 139, (byte) 140, (byte) 141, (byte) 142, (byte) 143, (byte) 144, (byte) 145, (byte) 146, (byte) 147, (byte) 148, (byte) 149, (byte) 150, (byte) 151, (byte) 152, (byte) 153, (byte) 154, (byte) 155, (byte) 156, (byte) 157, (byte) 158, (byte) 159, (byte) 160, (byte) 161, (byte) 162, (byte) 163, (byte) 164, (byte) 165, (byte) 166, (byte) 167, (byte) 168, (byte) 169, (byte) 170, (byte) 171, (byte) 172, (byte) 173, (byte) 174, (byte) 175, (byte) 176, (byte) 177, (byte) 178, (byte) 179, (byte) 180, (byte) 181, (byte) 182, (byte) 183, (byte) 184, (byte) 185, (byte) 186, (byte) 187, (byte) 188, (byte) 189, (byte) 190, (byte) 191, (byte) 192, (byte) 193, (byte) 194, (byte) 195, (byte) 196, (byte) 197, (byte) 198, (byte) 199, (byte) 200, (byte) 201, (byte) 202, (byte) 203, (byte) 204, (byte) 205, (byte) 206, (byte) 207, (byte) 208, (byte) 209, (byte) 210, (byte) 211, (byte) 212, (byte) 213, (byte) 214, (byte) 215, (byte) 216, (byte) 217, (byte) 218, (byte) 219, (byte) 220, (byte) 221, (byte) 222, (byte) 223, (byte) 224, (byte) 225, (byte) 226, (byte) 227, (byte) 228, (byte) 229, (byte) 230, (byte) 231, (byte) 232, (byte) 233, (byte) 234, (byte) 235, (byte) 236, (byte) 237, (byte) 238, (byte) 239, (byte) 240, (byte) 241, (byte) 242, (byte) 243, (byte) 244, (byte) 245, (byte) 246, (byte) 247, (byte) 248, (byte) 249, (byte) 250, (byte) 251, (byte) 252, (byte) 253, (byte) 254, (byte) 255 })); assertEquals("00000000", ByteUtils.toBinaryString(new byte[] { 0 })); assertEquals("00000001" + "00000010" + "00000011", ByteUtils.toBinaryString(new byte[] { 1, 2, 3 })); assertEquals("10101111" + "10101101" + "10101110", ByteUtils.toBinaryString(new byte[] { (byte) 0xaf, (byte) 0xad, (byte) 0xae })); } public void specificFromHexStringTest(byte[] lhsBytes, String rhsString) { try { byte[] rhsBytes = ByteUtils.fromHexString(rhsString); int offset = 0; for(byte b: lhsBytes) { assertEquals(b, rhsBytes[offset]); ++offset; } offset = 0; for(byte b: rhsBytes) { assertEquals(b, lhsBytes[offset]); ++offset; } } catch(DecoderException de) { // DecoderException not expected... assertTrue(false); } } public void testFromHexString() { specificFromHexStringTest(new byte[] { 0 }, "00"); specificFromHexStringTest(new byte[] { 1, 2, 3 }, "010203"); specificFromHexStringTest(new byte[] { (byte) 0xaf, (byte) 0xad, (byte) 0xae }, "afadae"); // Use following commands to determine test input: // $ seq -s ", " -f "(byte) %g" 0 255 // $ printf '%02x' $(seq 0 255) specificFromHexStringTest(new byte[] { (byte) 0, (byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 9, (byte) 10, (byte) 11, (byte) 12, (byte) 13, (byte) 14, (byte) 15, (byte) 16, (byte) 17, (byte) 18, (byte) 19, (byte) 20, (byte) 21, (byte) 22, (byte) 23, (byte) 24, (byte) 25, (byte) 26, (byte) 27, (byte) 28, (byte) 29, (byte) 30, (byte) 31, (byte) 32, (byte) 33, (byte) 34, (byte) 35, (byte) 36, (byte) 37, (byte) 38, (byte) 39, (byte) 40, (byte) 41, (byte) 42, (byte) 43, (byte) 44, (byte) 45, (byte) 46, (byte) 47, (byte) 48, (byte) 49, (byte) 50, (byte) 51, (byte) 52, (byte) 53, (byte) 54, (byte) 55, (byte) 56, (byte) 57, (byte) 58, (byte) 59, (byte) 60, (byte) 61, (byte) 62, (byte) 63, (byte) 64, (byte) 65, (byte) 66, (byte) 67, (byte) 68, (byte) 69, (byte) 70, (byte) 71, (byte) 72, (byte) 73, (byte) 74, (byte) 75, (byte) 76, (byte) 77, (byte) 78, (byte) 79, (byte) 80, (byte) 81, (byte) 82, (byte) 83, (byte) 84, (byte) 85, (byte) 86, (byte) 87, (byte) 88, (byte) 89, (byte) 90, (byte) 91, (byte) 92, (byte) 93, (byte) 94, (byte) 95, (byte) 96, (byte) 97, (byte) 98, (byte) 99, (byte) 100, (byte) 101, (byte) 102, (byte) 103, (byte) 104, (byte) 105, (byte) 106, (byte) 107, (byte) 108, (byte) 109, (byte) 110, (byte) 111, (byte) 112, (byte) 113, (byte) 114, (byte) 115, (byte) 116, (byte) 117, (byte) 118, (byte) 119, (byte) 120, (byte) 121, (byte) 122, (byte) 123, (byte) 124, (byte) 125, (byte) 126, (byte) 127, (byte) 128, (byte) 129, (byte) 130, (byte) 131, (byte) 132, (byte) 133, (byte) 134, (byte) 135, (byte) 136, (byte) 137, (byte) 138, (byte) 139, (byte) 140, (byte) 141, (byte) 142, (byte) 143, (byte) 144, (byte) 145, (byte) 146, (byte) 147, (byte) 148, (byte) 149, (byte) 150, (byte) 151, (byte) 152, (byte) 153, (byte) 154, (byte) 155, (byte) 156, (byte) 157, (byte) 158, (byte) 159, (byte) 160, (byte) 161, (byte) 162, (byte) 163, (byte) 164, (byte) 165, (byte) 166, (byte) 167, (byte) 168, (byte) 169, (byte) 170, (byte) 171, (byte) 172, (byte) 173, (byte) 174, (byte) 175, (byte) 176, (byte) 177, (byte) 178, (byte) 179, (byte) 180, (byte) 181, (byte) 182, (byte) 183, (byte) 184, (byte) 185, (byte) 186, (byte) 187, (byte) 188, (byte) 189, (byte) 190, (byte) 191, (byte) 192, (byte) 193, (byte) 194, (byte) 195, (byte) 196, (byte) 197, (byte) 198, (byte) 199, (byte) 200, (byte) 201, (byte) 202, (byte) 203, (byte) 204, (byte) 205, (byte) 206, (byte) 207, (byte) 208, (byte) 209, (byte) 210, (byte) 211, (byte) 212, (byte) 213, (byte) 214, (byte) 215, (byte) 216, (byte) 217, (byte) 218, (byte) 219, (byte) 220, (byte) 221, (byte) 222, (byte) 223, (byte) 224, (byte) 225, (byte) 226, (byte) 227, (byte) 228, (byte) 229, (byte) 230, (byte) 231, (byte) 232, (byte) 233, (byte) 234, (byte) 235, (byte) 236, (byte) 237, (byte) 238, (byte) 239, (byte) 240, (byte) 241, (byte) 242, (byte) 243, (byte) 244, (byte) 245, (byte) 246, (byte) 247, (byte) 248, (byte) 249, (byte) 250, (byte) 251, (byte) 252, (byte) 253, (byte) 254, (byte) 255 }, "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); } public void testNthByte() { assertEquals((byte) 0xFF, ByteUtils.readNthByte(Long.MAX_VALUE, 0)); assertEquals((byte) 0xFF, ByteUtils.readNthByte(Long.MAX_VALUE, 1)); testNthByteRead("aa", "bbaa", 0); testNthByteRead("bb", "bbaa", 1); testNthByteRead("bb", "bbaa", 1); testNthByteRead("cc", "aabbccddeeff", 3); } public void testNthByteRead(String theByte, String theLong, int nth) { assertEquals(2, theByte.length()); assertTrue(theByte.length() <= theLong.length()); long asLong = Long.parseLong(theLong, 16); byte asByte = (byte) Short.parseShort(theByte, 16); assertEquals(asByte, ByteUtils.readNthByte(asLong, nth)); } public void testMd5() { String test = "alskdjflsajflksdjldfsdf"; MessageDigest digest = ByteUtils.getDigest("MD5"); assertEquals(0, ByteUtils.compare(ByteUtils.md5(test.getBytes()), digest.digest(test.getBytes()))); } public void testSha1() { ByteUtils.sha1("hello".getBytes()); } public void testByteComparison() { assertEquals(0, ByteUtils.compare(new byte[] {}, new byte[] {})); assertEquals(1, ByteUtils.compare(new byte[] { 1 }, new byte[] {})); assertEquals(-1, ByteUtils.compare(new byte[] {}, new byte[] { 1 })); assertEquals(0, ByteUtils.compare(new byte[] { 0, 1, 2 }, new byte[] { 0, 1, 2 })); assertEquals(-1, ByteUtils.compare(new byte[] { 0, 1, 1 }, new byte[] { 0, 1, 2 })); assertEquals(-1, ByteUtils.compare(new byte[] { 0, 1, 1 }, new byte[] { 0, 1, 1, 2 })); assertEquals(1, ByteUtils.compare(new byte[] { 0, 1, 2 }, new byte[] { 0, 1, 1, 1 })); assertEquals(-1, ByteUtils.compare(new byte[] { 0, 1, 2 }, new byte[] { 4, 1, 1, 1 })); assertEquals(1, ByteUtils.compare(new byte[] { 0, 1, 4 }, new byte[] { 0, 1, 1, 1 })); assertEquals(-1, ByteUtils.compare(new byte[] { 1 }, new byte[] { -1 })); assertEquals(0, ByteUtils.compare(new byte[] { -1 }, new byte[] { -1 })); assertEquals(1, ByteUtils.compare(new byte[] { -1 }, new byte[] { -4 })); assertEquals(-1, ByteUtils.compare(new byte[] { -4 }, new byte[] { -1 })); // Tests byte comparison with sub-sequence assertEquals(1, ByteUtils.compare(new byte[] { 0 }, new byte[] { 0 }, 0, 0)); assertEquals(0, ByteUtils.compare(new byte[] { 0 }, new byte[] { 0 }, 0, 1)); try { assertEquals(0, ByteUtils.compare(new byte[] { 0 }, new byte[] { 0 }, 0, 2)); fail("Should have thrown an exception"); } catch(IllegalArgumentException e) {} assertEquals(-1, ByteUtils.compare(new byte[] { 2 }, new byte[] { 0, 1, 2, 3 }, 3, 4)); assertEquals(0, ByteUtils.compare(new byte[] { 3 }, new byte[] { 0, 1, 2, 3 }, 3, 4)); assertEquals(1, ByteUtils.compare(new byte[] { 5 }, new byte[] { 0, 1, 2, 3 }, 3, 4)); assertEquals(0, ByteUtils.compare(new byte[] { 2, 3 }, new byte[] { 0, 1, 2, 3 }, 2, 4)); try { assertEquals(0, ByteUtils.compare(new byte[] { 2, 3 }, new byte[] { 0, 1, 2, 3 }, 2, 5)); fail("Should have thrown an exception"); } catch(IllegalArgumentException e) {} assertEquals(1, ByteUtils.compare(new byte[] { 5 }, new byte[] { 0, 1, 2, 3 }, 2, 4)); } }