/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2010 Sun Microsystems, Inc. * Portions copyright 2011-2012 ForgeRock AS */ package org.forgerock.opendj.ldap; import java.util.Arrays; import javax.xml.bind.DatatypeConverter; import org.forgerock.i18n.LocalizedIllegalArgumentException; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * This class defines a set of tests for the ByteString class. */ @SuppressWarnings("javadoc") public class ByteStringTestCase extends ByteSequenceTestCase { /** * ByteString data provider. * * @return The array of ByteStrings and the bytes it should contain. */ @DataProvider(name = "byteSequenceProvider") public Object[][] byteSequenceProvider() throws Exception { byte[] testBytes = new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 }; return new Object[][] { { ByteString.empty(), new byte[0] }, { ByteString.valueOfBase64("AAA="), new byte[] { 0x00, 0x00 }}, { ByteString.valueOfBase64("AAAA"), new byte[] { 0x00, 0x00, 0x00 }}, { ByteString.valueOfBase64("AAAAAA=="), new byte[] { 0x00, 0x00, 0x00, 0x00 }}, { ByteString.valueOf(1), new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 } }, { ByteString.valueOf(Integer.MAX_VALUE), new byte[] { (byte) 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF } }, { ByteString.valueOf(Integer.MIN_VALUE), new byte[] { (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00 } }, { ByteString.valueOf(Long.MAX_VALUE), new byte[] { (byte) 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF } }, { ByteString.valueOf(Long.MIN_VALUE), new byte[] { (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 } }, { ByteString.valueOf("cn=testvalue"), "cn=testvalue".getBytes("UTF-8") }, { ByteString.valueOf((Object) "cn=testvalue"), "cn=testvalue".getBytes("UTF-8") }, { ByteString.valueOf("cn=testvalue".toCharArray()), "cn=testvalue".getBytes("UTF-8") }, { ByteString.valueOf((Object) "cn=testvalue".toCharArray()), "cn=testvalue".getBytes("UTF-8") }, { ByteString.valueOf(testBytes), testBytes }, { ByteString.valueOf((Object) testBytes), testBytes }, { ByteString.valueOf(ByteString.valueOf("cn=testvalue")), "cn=testvalue".getBytes("UTF-8") }, { ByteString.wrap(new byte[0]), new byte[0] }, { ByteString.wrap(new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 }), new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 } }, { ByteString.wrap(new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09, (byte) 0x10 }, 0, 8), new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 } }, { ByteString.wrap(new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09, (byte) 0x10 }, 1, 8), new byte[] { (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09 } }, { ByteString.wrap(new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09, (byte) 0x10 }, 2, 8), new byte[] { (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09, (byte) 0x10 } }, { ByteString.wrap(new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08 }, 3, 0), new byte[0] }, }; } @DataProvider(name = "byteStringIntegerProvider") public Object[][] byteStringIntegerProvider() { return new Object[][] { { ByteString.valueOf(0), 0 }, { ByteString.valueOf(1), 1 }, { ByteString.valueOf(Integer.MAX_VALUE), Integer.MAX_VALUE }, { ByteString.valueOf(Integer.MIN_VALUE), Integer.MIN_VALUE }, }; } @DataProvider(name = "byteStringLongProvider") public Object[][] byteStringLongProvider() { return new Object[][] { { ByteString.valueOf(0L), 0L }, { ByteString.valueOf(1L), 1L }, { ByteString.valueOf(Long.MAX_VALUE), Long.MAX_VALUE }, { ByteString.valueOf(Long.MIN_VALUE), Long.MIN_VALUE } }; } @DataProvider(name = "byteStringCharArrayProvider") public Object[][] byteStringCharArrayProvider() { return new Object[][] { { "" }, { "1" }, { "1234567890" } }; } @Test(expectedExceptions = IndexOutOfBoundsException.class) public void testInvalidWrapLength() { ByteString.wrap(new byte[] { (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03 }, 2, 8); } @Test(dataProvider = "byteStringIntegerProvider") public void testToInteger(final ByteString bs, final int i) { Assert.assertEquals(bs.toInt(), i); } @Test(dataProvider = "byteStringLongProvider") public void testToLong(final ByteString bs, final long l) { Assert.assertEquals(bs.toLong(), l); } @Test(dataProvider = "byteStringCharArrayProvider") public void testFromStringToCharArray(final String s) { ByteString bs = ByteString.valueOf(s); Assert.assertTrue(Arrays.equals(bs.toCharArray(), s.toCharArray())); } @Test(dataProvider = "byteStringCharArrayProvider") public void testFromCharArrayToCharArray(final String s) { final char[] chars = s.toCharArray(); ByteString bs = ByteString.valueOf(chars); Assert.assertTrue(Arrays.equals(bs.toCharArray(), chars)); } @Test(dataProvider = "byteStringCharArrayProvider") public void testValueOfCharArray(final String s) { ByteString bs = ByteString.valueOf(s.toCharArray()); Assert.assertEquals(bs.toString(), s); } @Test(expectedExceptions = IndexOutOfBoundsException.class) public void testUndersizedToInteger() { ByteString.wrap(new byte[] { (byte) 0x00, (byte) 0x01 }).toInt(); } @Test(expectedExceptions = IndexOutOfBoundsException.class) public void testUndersizedToLong() { ByteString.wrap(new byte[] { (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03 }).toLong(); } /** * Base 64 invalid test data provider. * * @return Returns an array of invalid encoded base64 data. */ @DataProvider(name = "invalidBase64Data") public Object[][] createInvalidBase64Data() { // FIXME: fix cases ==== and ==x= return new Object[][] { { "=" }, { "==" }, { "===" }, { "A" }, { "AA" }, { "AAA" }, { "AA`=" }, { "AA~=" }, { "AA!=" }, { "AA@=" }, { "AA#=" }, { "AA$=" }, { "AA%=" }, { "AA^=" }, { "AA*=" }, { "AA(=" }, { "AA)=" }, { "AA_=" }, { "AA-=" }, { "AA{=" }, { "AA}=" }, { "AA|=" }, { "AA[=" }, { "AA]=" }, { "AA\\=" }, { "AA;=" }, { "AA'=" }, { "AA\"=" }, { "AA:=" }, { "AA,=" }, { "AA.=" }, { "AA<=" }, { "AA>=" }, { "AA?=" }, { "AA;=" } }; } /** * Base 64 valid test data provider. * * @return Returns an array of decoded and valid encoded base64 data. */ @DataProvider(name = "validBase64Data") public Object[][] createValidBase64Data() { return new Object[][] { { "", "" }, { "00", "AA==" }, { "01", "AQ==" }, { "02", "Ag==" }, { "03", "Aw==" }, { "04", "BA==" }, { "05", "BQ==" }, { "06", "Bg==" }, { "07", "Bw==" }, { "0000", "AAA=" }, { "000000", "AAAA" }, { "00000000", "AAAAAA==" }, { "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f" + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v" + "MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f" + "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P" + "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/" + "wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v" + "8PHy8/T19vf4+fr7/P3+/w==" }, }; } @Test(dataProvider = "invalidBase64Data", expectedExceptions = { LocalizedIllegalArgumentException.class }) public void testValueOfBase64ThrowsLIAE(final String invalidBase64) throws Exception { Assert.fail("Expected exception but got result: " + Arrays.toString(new ByteString[] { ByteString.valueOfBase64(invalidBase64) })); } @Test(dataProvider = "validBase64Data") public void testValueOfBase64(final String hexData, final String encodedData) throws Exception { final byte[] data = DatatypeConverter.parseHexBinary(hexData); final byte[] decodedData = ByteString.valueOfBase64(encodedData).toByteArray(); Assert.assertEquals(decodedData, data); } }