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