From dfac8cca1302c8542a17a932282d93f2dae99b7a Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 14 Nov 2013 10:03:36 +0000
Subject: [PATCH] CompositeDBCursorTest.java: ADDED
---
opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursorTest.java | 181 +++++++++++++++++++++++++++++++++++++++++++++
opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursor.java | 19 ++--
2 files changed, 192 insertions(+), 8 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursor.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursor.java
index f531745..7f8e3c3 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursor.java
@@ -79,15 +79,18 @@
@Override
public boolean next() throws ChangelogException
{
- // try to recycle empty cursors in case the underlying ReplicaDBs received
- // new changes. Copy the List to avoid ConcurrentModificationExceptions.
- DBCursor<UpdateMsg>[] copy =
- exhaustedCursors.toArray(new DBCursor[exhaustedCursors.size()]);
- exhaustedCursors.clear();
- for (DBCursor<UpdateMsg> cursor : copy)
+ if (!exhaustedCursors.isEmpty())
{
- cursor.next();
- add(cursor);
+ // try to recycle empty cursors in case the underlying ReplicaDBs received
+ // new changes. Copy the List to avoid ConcurrentModificationExceptions.
+ final DBCursor<UpdateMsg>[] copy =
+ exhaustedCursors.toArray(new DBCursor[exhaustedCursors.size()]);
+ exhaustedCursors.clear();
+ for (DBCursor<UpdateMsg> cursor : copy)
+ {
+ cursor.next();
+ add(cursor);
+ }
}
if (cursors.isEmpty())
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursorTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursorTest.java
new file mode 100644
index 0000000..ee93393
--- /dev/null
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/CompositeDBCursorTest.java
@@ -0,0 +1,181 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 2013 ForgeRock AS
+ */
+package org.opends.server.replication.server.changelog.je;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.opends.server.replication.common.CSN;
+import org.opends.server.replication.protocol.UpdateMsg;
+import org.opends.server.replication.server.changelog.api.ChangelogException;
+import org.opends.server.replication.server.changelog.api.DBCursor;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+@SuppressWarnings("javadoc")
+public class CompositeDBCursorTest
+{
+
+ private static class MyDBCursor implements DBCursor<UpdateMsg>
+ {
+
+ private final List<UpdateMsg> msgs;
+ private UpdateMsg current;
+
+ public MyDBCursor(UpdateMsg... msgs)
+ {
+ this.msgs = new ArrayList<UpdateMsg>(Arrays.asList(msgs));
+ next();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public UpdateMsg getRecord()
+ {
+ return this.current;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean next()
+ {
+ if (!this.msgs.isEmpty())
+ {
+ this.current = this.msgs.remove(0);
+ return true;
+ }
+ this.current = null;
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void close()
+ {
+ // nothing to do
+ }
+
+ }
+
+ private UpdateMsg msg1;
+ private UpdateMsg msg2;
+ private UpdateMsg msg3;
+ private UpdateMsg msg4;
+
+ @BeforeClass
+ public void setupMsgs()
+ {
+ msg1 = newUpdateMsg(1);
+ msg2 = newUpdateMsg(2);
+ msg3 = newUpdateMsg(3);
+ msg4 = newUpdateMsg(4);
+ }
+
+ @Test
+ public void emptyCursor() throws Exception
+ {
+ final CompositeDBCursor compCursor = newCompositeDBCursor(new MyDBCursor());
+ assertInOrder(compCursor);
+ }
+
+ @Test
+ public void oneElementCursor() throws Exception
+ {
+ final CompositeDBCursor compCursor =
+ newCompositeDBCursor(new MyDBCursor(msg1));
+ assertInOrder(compCursor, msg1);
+ }
+
+ @Test
+ public void twoElementsCursor() throws Exception
+ {
+ final CompositeDBCursor compCursor =
+ newCompositeDBCursor(new MyDBCursor(msg1, msg2));
+ assertInOrder(compCursor, msg1, msg2);
+ }
+
+ @Test
+ public void twoEmptyCursors() throws Exception
+ {
+ final CompositeDBCursor compCursor = newCompositeDBCursor(
+ new MyDBCursor(),
+ new MyDBCursor());
+ assertInOrder(compCursor);
+ }
+
+ @Test
+ public void twoOneElementCursors() throws Exception
+ {
+ final CompositeDBCursor compCursor = newCompositeDBCursor(
+ new MyDBCursor(msg2),
+ new MyDBCursor(msg1));
+ assertInOrder(compCursor, msg1, msg2);
+ }
+
+ @Test
+ public void twoTwoElementCursors() throws Exception
+ {
+ final CompositeDBCursor compCursor = newCompositeDBCursor(
+ new MyDBCursor(msg2, msg3),
+ new MyDBCursor(msg1, msg4));
+ assertInOrder(compCursor, msg1, msg2, msg3, msg4);
+ }
+
+ @Test
+ public void recycleTwoElementCursors() throws Exception
+ {
+ final CompositeDBCursor compCursor = newCompositeDBCursor(
+ new MyDBCursor(msg2, null, msg3),
+ new MyDBCursor(null, msg1, msg4));
+ assertInOrder(compCursor, msg1, msg2, msg3, msg4);
+ }
+
+ private UpdateMsg newUpdateMsg(int t)
+ {
+ return new UpdateMsg(new CSN(t, t, t), new byte[t]);
+ }
+
+ private CompositeDBCursor newCompositeDBCursor(DBCursor<UpdateMsg>... cursors)
+ {
+ return new CompositeDBCursor(Arrays.asList(cursors));
+ }
+
+ private void assertInOrder(final CompositeDBCursor compCursor,
+ UpdateMsg... msgs) throws ChangelogException
+ {
+ for (UpdateMsg msg : msgs)
+ {
+ assertTrue(compCursor.next());
+ assertSame(compCursor.getRecord(), msg);
+ }
+ assertFalse(compCursor.next());
+ compCursor.close();
+ }
+}
--
Gitblit v1.10.0