/** * Copyright (C) 2009-2013 FoundationDB, LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.foundationdb.server; import org.junit.Test; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.nio.ByteBuffer; import static org.junit.Assert.*; public final class AkServerUtilTest { @Test public void decodeUTF8() throws Exception { testDecoding("hello snowman: ☃", "UTF-8"); } @Test public void decodeACII() throws Exception { testDecoding("hello ascii", "US-ASCII"); } @Test public void decodeLatin1() throws Exception { testDecoding("360 °, plus or minus ±... hopefully better than ½ at least", "latin1"); } @Test public void decodeUTF16() throws Exception { testDecoding("utf 16 says this is broken: ☃", "UTF-16"); } @Test public void decodeNullByteBuffer() { String shouldBeNull = AkServerUtil.decodeString(null, null); assertNull("null byte buffer", shouldBeNull); } @Test(expected=IllegalArgumentException.class) public void decodeNullCharset() { final byte[] someBytes; someBytes = "some bytes".getBytes(); assertTrue("someBytes was empty!", someBytes.length > 0); AkServerUtil.decodeString(ByteBuffer.wrap(someBytes), null); } private static void testDecoding(String testString, String charset) { final ByteBuffer buffer; try { byte[] bytes = testString.getBytes(charset); buffer = ByteBuffer.wrap(bytes); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } String decoded = AkServerUtil.decodeString(buffer, charset); assertEquals("test string", testString, decoded); } private static byte[] byteArray(int... values) { byte[] bytes = new byte[values.length]; for(int i = 0; i < values.length; ++i) { bytes[i] = (byte)values[i]; } return bytes; } @Test public void getSignedByte() { assertEquals( 0, AkServerUtil.getByte(byteArray(0x00), 0)); assertEquals( 1, AkServerUtil.getByte(byteArray(0x01), 0)); assertEquals( 127, AkServerUtil.getByte(byteArray(0x7F), 0)); assertEquals(-128, AkServerUtil.getByte(byteArray(0x80), 0)); assertEquals( -2, AkServerUtil.getByte(byteArray(0xFE), 0)); assertEquals( -1, AkServerUtil.getByte(byteArray(0xFF), 0)); } @Test public void getUnsignedByte() { assertEquals( 0, AkServerUtil.getUByte(byteArray(0x00), 0)); assertEquals( 1, AkServerUtil.getUByte(byteArray(0x01), 0)); assertEquals(127, AkServerUtil.getUByte(byteArray(0x7F), 0)); assertEquals(128, AkServerUtil.getUByte(byteArray(0x80), 0)); assertEquals(254, AkServerUtil.getUByte(byteArray(0xFE), 0)); assertEquals(255, AkServerUtil.getUByte(byteArray(0xFF), 0)); } @Test public void getSignedShort() { assertEquals( 0, AkServerUtil.getShort(byteArray(0x00, 0x00), 0)); assertEquals( 1, AkServerUtil.getShort(byteArray(0x01, 0x00), 0)); assertEquals( 32767, AkServerUtil.getShort(byteArray(0xFF, 0x7F), 0)); assertEquals(-32768, AkServerUtil.getShort(byteArray(0x00, 0x80), 0)); assertEquals( -2, AkServerUtil.getShort(byteArray(0xFE, 0xFF), 0)); assertEquals( -1, AkServerUtil.getShort(byteArray(0xFF, 0xFF), 0)); } @Test public void getUnsignedShort() { assertEquals( 0, AkServerUtil.getUShort(byteArray(0x00, 0x00), 0)); assertEquals( 1, AkServerUtil.getUShort(byteArray(0x01, 0x00), 0)); assertEquals(32767, AkServerUtil.getUShort(byteArray(0xFF, 0x7F), 0)); assertEquals(32768, AkServerUtil.getUShort(byteArray(0x00, 0x80), 0)); assertEquals(65534, AkServerUtil.getUShort(byteArray(0xFE, 0xFF), 0)); assertEquals(65535, AkServerUtil.getUShort(byteArray(0xFF, 0xFF), 0)); } @Test public void getSignedMedium() { assertEquals( 0, AkServerUtil.getMediumInt(byteArray(0x00, 0x00, 0x00), 0)); assertEquals( 1, AkServerUtil.getMediumInt(byteArray(0x01, 0x00, 0x00), 0)); assertEquals( 8388607, AkServerUtil.getMediumInt(byteArray(0xFF, 0xFF, 0x7F), 0)); assertEquals(-8388608, AkServerUtil.getMediumInt(byteArray(0x00, 0x00, 0x80), 0)); assertEquals( -2, AkServerUtil.getMediumInt(byteArray(0xFE, 0xFF, 0xFF), 0)); assertEquals( -1, AkServerUtil.getMediumInt(byteArray(0xFF, 0xFF, 0xFF), 0)); } @Test public void getUnsignedMedium() { assertEquals( 0, AkServerUtil.getUMediumInt(byteArray(0x00, 0x00, 0x00), 0)); assertEquals( 1, AkServerUtil.getUMediumInt(byteArray(0x01, 0x00, 0x00), 0)); assertEquals( 8388607, AkServerUtil.getUMediumInt(byteArray(0xFF, 0xFF, 0x7F), 0)); assertEquals( 8388608, AkServerUtil.getUMediumInt(byteArray(0x00, 0x00, 0x80), 0)); assertEquals(16777214, AkServerUtil.getUMediumInt(byteArray(0xFE, 0xFF, 0xFF), 0)); assertEquals(16777215, AkServerUtil.getUMediumInt(byteArray(0xFF, 0xFF, 0xFF), 0)); } @Test public void getSignedInt() { assertEquals( 0, AkServerUtil.getInt(byteArray(0x00, 0x00, 0x00, 0x00), 0)); assertEquals( 1, AkServerUtil.getInt(byteArray(0x01, 0x00, 0x00, 0x00), 0)); assertEquals( 2147483647, AkServerUtil.getInt(byteArray(0xFF, 0xFF, 0xFF, 0x7F), 0)); assertEquals(-2147483648, AkServerUtil.getInt(byteArray(0x00, 0x00, 0x00, 0x80), 0)); assertEquals( -2, AkServerUtil.getInt(byteArray(0xFE, 0xFF, 0xFF, 0xFF), 0)); assertEquals( -1, AkServerUtil.getInt(byteArray(0xFF, 0xFF, 0xFF, 0xFF), 0)); } @Test public void getUnsignedInt() { assertEquals( 0L, AkServerUtil.getUInt(byteArray(0x00, 0x00, 0x00, 0x00), 0)); assertEquals( 1L, AkServerUtil.getUInt(byteArray(0x01, 0x00, 0x00, 0x00), 0)); assertEquals(2147483647L, AkServerUtil.getUInt(byteArray(0xFF, 0xFF, 0xFF, 0x7F), 0)); assertEquals(2147483648L, AkServerUtil.getUInt(byteArray(0x00, 0x00, 0x00, 0x80), 0)); assertEquals(4294967294L, AkServerUtil.getUInt(byteArray(0xFE, 0xFF, 0xFF, 0xFF), 0)); assertEquals(4294967295L, AkServerUtil.getUInt(byteArray(0xFF, 0xFF, 0xFF, 0xFF), 0)); } @Test public void getSignedLong() { assertEquals( 0, AkServerUtil.getLong(byteArray(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), 0)); assertEquals( 1, AkServerUtil.getLong(byteArray(0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), 0)); assertEquals( 9223372036854775807L, AkServerUtil.getLong(byteArray(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F), 0)); assertEquals(-9223372036854775808L, AkServerUtil.getLong(byteArray(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80), 0)); assertEquals( -2, AkServerUtil.getLong(byteArray(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), 0)); assertEquals( -1, AkServerUtil.getLong(byteArray(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), 0)); } @Test public void getUnsignedLong() { assertEquals(new BigInteger("0"), AkServerUtil.getULong(byteArray(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), 0)); assertEquals(new BigInteger("1"), AkServerUtil.getULong(byteArray(0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), 0)); assertEquals(new BigInteger("9223372036854775807"), AkServerUtil.getULong(byteArray(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F), 0)); assertEquals(new BigInteger("9223372036854775808"), AkServerUtil.getULong(byteArray(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80), 0)); assertEquals(new BigInteger("18446744073709551614"), AkServerUtil.getULong(byteArray(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), 0)); assertEquals(new BigInteger("18446744073709551615"), AkServerUtil.getULong(byteArray(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF), 0)); } }