From 88cfe5045d77d433ce02b0ef10ee84c9d4fb15e2 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 23 May 2014 15:17:15 +0000
Subject: [PATCH] (CR-3599) Convert all protocols message to use ByteArrayBuilder + ByteArrayScanner
---
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/protocol/ByteArrayTest.java | 193 ++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 176 insertions(+), 17 deletions(-)
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/protocol/ByteArrayTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/protocol/ByteArrayTest.java
index 21133fc..bce3eb3 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/protocol/ByteArrayTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/protocol/ByteArrayTest.java
@@ -27,13 +27,22 @@
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.
*/
@@ -41,44 +50,194 @@
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();
+ }
+
}
--
Gitblit v1.10.0