| | |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Collection; |
| | | import java.util.Iterator; |
| | | import java.util.zip.DataFormatException; |
| | | |
| | | import org.opends.server.DirectoryServerTestCase; |
| | | import org.opends.server.TestCaseUtils; |
| | | import org.opends.server.replication.common.CSN; |
| | | import org.opends.server.replication.common.ServerState; |
| | | import org.opends.server.types.ByteStringBuilder; |
| | | import org.testng.Assert; |
| | | import org.opends.server.types.DN; |
| | | import org.testng.annotations.AfterClass; |
| | | import org.testng.annotations.BeforeClass; |
| | | import org.testng.annotations.DataProvider; |
| | | import org.testng.annotations.Test; |
| | | |
| | | import static org.testng.Assert.*; |
| | | |
| | | /** |
| | | * Test for {@link ByteStringBuilder} and {@link ByteArrayScanner} classes. |
| | | */ |
| | |
| | | public class ByteArrayTest extends DirectoryServerTestCase |
| | | { |
| | | |
| | | private static final class IntegerRange implements Iterator<Object[]> |
| | | { |
| | | private int next; |
| | | private final int endInclusive; |
| | | |
| | | public IntegerRange(int startInclusive, int endInclusive) |
| | | { |
| | | this.next = startInclusive; |
| | | this.endInclusive = endInclusive; |
| | | } |
| | | |
| | | @Override |
| | | public boolean hasNext() |
| | | { |
| | | return next <= this.endInclusive; |
| | | } |
| | | |
| | | @Override |
| | | public Object[] next() |
| | | { |
| | | return new Object[] { next++ }; |
| | | } |
| | | |
| | | @Override |
| | | public void remove() { /* unused */ } |
| | | } |
| | | |
| | | @BeforeClass |
| | | public void setup() throws Exception |
| | | { |
| | | TestCaseUtils.startFakeServer(); |
| | | } |
| | | |
| | | @AfterClass |
| | | public void teardown() throws Exception |
| | | { |
| | | TestCaseUtils.shutdownFakeServer(); |
| | | } |
| | | |
| | | private final byte[] byteArray = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; |
| | | |
| | | @Test |
| | | public void testBuilderAppendMethodsAndScannerNextMethods() throws Exception |
| | | { |
| | | final boolean bo = true; |
| | | final boolean boFalse = false; |
| | | final boolean boTrue = true; |
| | | final byte by = 80; |
| | | final short sh = 42; |
| | | final int i = sh + 1; |
| | | final long l = i + 1; |
| | | final String st = "Yay!"; |
| | | final String nullStr = null; |
| | | final String str = "Yay!"; |
| | | final Collection<String> col = Arrays.asList("foo", "bar", "baz"); |
| | | final CSN csn = new CSN(42424242, 13, 42); |
| | | final DN dn = DN.decode("dc=example,dc=com"); |
| | | final ServerState ss = new ServerState(); |
| | | ss.update(csn); |
| | | |
| | | byte[] bytes = new ByteArrayBuilder() |
| | | .append(bo) |
| | | .append(boTrue) |
| | | .append(boFalse) |
| | | .append(by) |
| | | .append(sh) |
| | | .append(i) |
| | | .append(l) |
| | | .append(st) |
| | | .append(nullStr) |
| | | .append(str) |
| | | .appendStrings(col) |
| | | .appendUTF8(i) |
| | | .appendUTF8(l) |
| | | .append(csn) |
| | | .appendUTF8(csn) |
| | | .append(dn) |
| | | .appendZeroTerminated(byteArray) |
| | | .append(byteArray) |
| | | .append(ss) |
| | | .toByteArray(); |
| | | |
| | | final ByteArrayScanner scanner = new ByteArrayScanner(bytes); |
| | | Assert.assertEquals(scanner.nextBoolean(), bo); |
| | | Assert.assertEquals(scanner.nextByte(), by); |
| | | Assert.assertEquals(scanner.nextShort(), sh); |
| | | Assert.assertEquals(scanner.nextInt(), i); |
| | | Assert.assertEquals(scanner.nextLong(), l); |
| | | Assert.assertEquals(scanner.nextString(), st); |
| | | Assert.assertEquals(scanner.nextStrings(new ArrayList<String>()), col); |
| | | Assert.assertEquals(scanner.nextIntUTF8(), i); |
| | | Assert.assertEquals(scanner.nextLongUTF8(), l); |
| | | Assert.assertEquals(scanner.nextCSN(), csn); |
| | | Assert.assertEquals(scanner.nextCSNUTF8(), csn); |
| | | Assert.assertTrue(scanner.isEmpty()); |
| | | assertFalse(scanner.isEmpty()); |
| | | assertEquals(scanner.nextBoolean(), boTrue); |
| | | assertEquals(scanner.nextBoolean(), boFalse); |
| | | assertEquals(scanner.nextByte(), by); |
| | | assertEquals(scanner.nextShort(), sh); |
| | | assertEquals(scanner.nextInt(), i); |
| | | assertEquals(scanner.nextLong(), l); |
| | | assertEquals(scanner.nextString(), nullStr); |
| | | assertEquals(scanner.nextString(), str); |
| | | assertEquals(scanner.nextStrings(new ArrayList<String>()), col); |
| | | assertEquals(scanner.nextIntUTF8(), i); |
| | | assertEquals(scanner.nextLongUTF8(), l); |
| | | assertEquals(scanner.nextCSN(), csn); |
| | | assertEquals(scanner.nextCSNUTF8(), csn); |
| | | assertEquals(scanner.nextDN(), dn); |
| | | assertEquals(scanner.nextByteArray(byteArray.length), byteArray); |
| | | scanner.skipZeroSeparator(); |
| | | assertEquals(scanner.nextByteArray(byteArray.length), byteArray); |
| | | assertEquals(scanner.nextServerState().toString(), ss.toString()); |
| | | assertTrue(scanner.isEmpty()); |
| | | } |
| | | |
| | | @Test |
| | | public void testByteArrayScanner_remainingBytes() throws Exception |
| | | { |
| | | final byte[] bytes = new ByteArrayBuilder().append(byteArray).toByteArray(); |
| | | |
| | | final ByteArrayScanner scanner = new ByteArrayScanner(bytes); |
| | | assertEquals(scanner.remainingBytes(), byteArray); |
| | | assertTrue(scanner.isEmpty()); |
| | | } |
| | | |
| | | @Test |
| | | public void testByteArrayScanner_remainingBytesZeroTerminated() throws Exception |
| | | { |
| | | final byte[] bytes = |
| | | new ByteArrayBuilder().appendZeroTerminated(byteArray).toByteArray(); |
| | | |
| | | final ByteArrayScanner scanner = new ByteArrayScanner(bytes); |
| | | assertEquals(scanner.remainingBytesZeroTerminated(), byteArray); |
| | | assertTrue(scanner.isEmpty()); |
| | | } |
| | | |
| | | @DataProvider |
| | | public Iterator<Object[]> testCasesForNextMethodsWithEmptyByteArray() |
| | | { |
| | | return new IntegerRange(0, 7); |
| | | } |
| | | |
| | | @Test(dataProvider = "testCasesForNextMethodsWithEmptyByteArray", |
| | | expectedExceptions = DataFormatException.class) |
| | | public void testByteArrayScanner_nextMethods_throwsExceptionWhenNoData(int testNumber) throws Exception |
| | | { |
| | | delegate(testNumber); |
| | | } |
| | | |
| | | /** |
| | | * TestNG does not like test methods with a return type other than void, |
| | | * so used a delegate to simplify the code down below. |
| | | */ |
| | | private Object delegate(int testNumber) throws DataFormatException |
| | | { |
| | | final ByteArrayScanner scanner = new ByteArrayScanner(new byte[0]); |
| | | switch (testNumber) |
| | | { |
| | | case 0: |
| | | return scanner.nextByte(); |
| | | case 1: |
| | | return scanner.nextBoolean(); |
| | | case 2: |
| | | return scanner.nextShort(); |
| | | case 3: |
| | | return scanner.nextInt(); |
| | | case 4: |
| | | return scanner.nextIntUTF8(); |
| | | case 5: |
| | | return scanner.nextLong(); |
| | | case 6: |
| | | return scanner.nextLongUTF8(); |
| | | case 7: |
| | | return scanner.nextCSN(); |
| | | default: |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | @Test(expectedExceptions = IndexOutOfBoundsException.class) |
| | | public void testByteArrayScanner_skipZeroSeparator_throwsExceptionWhenNoData() throws Exception |
| | | { |
| | | new ByteArrayScanner(new byte[0]).skipZeroSeparator(); |
| | | } |
| | | |
| | | @Test(expectedExceptions = DataFormatException.class) |
| | | public void testByteArrayScanner_skipZeroSeparator_throwsExceptionWhenNoZeroSeparator() throws Exception |
| | | { |
| | | new ByteArrayScanner(new byte[] { 1 }).skipZeroSeparator(); |
| | | } |
| | | |
| | | @Test(expectedExceptions = DataFormatException.class) |
| | | public void testByteArrayScanner_nextCSNUTF8_throwsExceptionWhenInvalidCSN() throws Exception |
| | | { |
| | | new ByteArrayScanner(new byte[] { 1, 0 }).nextCSNUTF8(); |
| | | } |
| | | |
| | | @Test(expectedExceptions = DataFormatException.class) |
| | | public void testByteArrayScanner_nextDN_throwsExceptionWhenInvalidDN() throws Exception |
| | | { |
| | | final byte[] bytes = new ByteArrayBuilder().append("this is not a valid DN").toByteArray(); |
| | | new ByteArrayScanner(bytes).nextDN(); |
| | | } |
| | | |
| | | } |