From 515111a8d8cc1c1137f422f0bf4daaf5ee0e6484 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 20 Aug 2014 14:16:56 +0000
Subject: [PATCH] Aligned (JE|File)ReplicaDB and their tests for easier comparison with each other.

---
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBTest.java           |  245 ++++++++++++++++++++--------------------
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDB.java                                       |   80 ++++++------
 3 files changed, 163 insertions(+), 166 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDB.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDB.java
index 3fd1878..13cdf02 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDB.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDB.java
@@ -51,18 +51,17 @@
 import static org.opends.messages.ReplicationMessages.*;
 
 /**
- * This class is used for managing the replicationServer database for each
- * server in the topology.
+ * Represents a replication server database for one server in the topology.
  * <p>
  * It is responsible for efficiently saving the updates that is received from
  * each master server into stable storage.
  * <p>
- * This class is also able to generate a {@link DBCursor} that can be used to
+ * It is also able to generate a {@link DBCursor} that can be used to
  * read all changes from a given {@link CSN}.
  * <p>
- * This class publish some monitoring information below cn=monitor.
+ * It publishes some monitoring information below cn=monitor.
  */
-public class JEReplicaDB
+class JEReplicaDB
 {
 
   /**
@@ -81,41 +80,44 @@
       this.oldestCSN = oldestCSN;
       this.newestCSN = newestCSN;
     }
-
   }
 
   private final AtomicBoolean shutdown = new AtomicBoolean(false);
-  private ReplicationDB db;
   /**
    * Holds the oldest and newest CSNs for this replicaDB for fast retrieval.
    *
    * @NonNull
    */
   private volatile CSNLimits csnLimits;
-  private int serverId;
-  private DN baseDN;
-  private DbMonitorProvider dbMonitor = new DbMonitorProvider();
-  private ReplicationServer replicationServer;
+  private final int serverId;
+  private final DN baseDN;
+  private final DbMonitorProvider dbMonitor = new DbMonitorProvider();
+  private final ReplicationServer replicationServer;
+  private final ReplicationDB db;
 
   /**
    * Creates a new ReplicaDB associated to a given LDAP server.
    *
-   * @param serverId The serverId for which changes will be stored in the DB.
-   * @param baseDN the baseDN for which this DB was created.
-   * @param replicationServer The ReplicationServer that creates this ReplicaDB.
-   * @param dbenv the Database Env to use to create the ReplicationServer DB.
-   * server for this domain.
-   * @throws ChangelogException If a database problem happened
+   * @param serverId
+   *          Id of this server.
+   * @param baseDN
+   *          the replication domain baseDN.
+   * @param replicationServer
+   *          The ReplicationServer that creates this ReplicaDB.
+   * @param replicationEnv
+   *          the Database Env to use to create the ReplicationServer DB. server
+   *          for this domain.
+   * @throws ChangelogException
+   *           If a database problem happened
    */
-  public JEReplicaDB(int serverId, DN baseDN,
-      ReplicationServer replicationServer, ReplicationDbEnv dbenv)
-      throws ChangelogException
+  JEReplicaDB(final int serverId, final DN baseDN, final ReplicationServer replicationServer,
+      final ReplicationDbEnv replicationEnv) throws ChangelogException
   {
-    this.replicationServer = replicationServer;
     this.serverId = serverId;
     this.baseDN = baseDN;
-    db = new ReplicationDB(serverId, baseDN, replicationServer, dbenv);
-    csnLimits = new CSNLimits(db.readOldestCSN(), db.readNewestCSN());
+    this.replicationServer = replicationServer;
+    this.db = new ReplicationDB(serverId, baseDN, replicationServer, replicationEnv);
+    this.csnLimits = new CSNLimits(db.readOldestCSN(), db.readNewestCSN());
 
     DirectoryServer.deregisterMonitorProvider(dbMonitor);
     DirectoryServer.registerMonitorProvider(dbMonitor);
@@ -143,8 +145,7 @@
     db.addEntry(updateMsg);
 
     final CSNLimits limits = csnLimits;
-    final boolean updateNew = limits.newestCSN == null
-        || limits.newestCSN.isOlderThan(updateMsg.getCSN());
+    final boolean updateNew = limits.newestCSN == null || limits.newestCSN.isOlderThan(updateMsg.getCSN());
     final boolean updateOld = limits.oldestCSN == null;
     if (updateOld || updateNew)
     {
@@ -159,7 +160,7 @@
    *
    * @return the oldest CSN that has not been purged yet.
    */
-  public CSN getOldestCSN()
+  CSN getOldestCSN()
   {
     return csnLimits.oldestCSN;
   }
@@ -169,7 +170,7 @@
    *
    * @return the newest CSN that has not been purged yet.
    */
-  public CSN getNewestCSN()
+  CSN getNewestCSN()
   {
     return csnLimits.newestCSN;
   }
@@ -188,7 +189,7 @@
    * @throws ChangelogException
    *           if a database problem happened
    */
-  public DBCursor<UpdateMsg> generateCursorFrom(CSN startCSN, PositionStrategy positionStrategy)
+  DBCursor<UpdateMsg> generateCursorFrom(final CSN startCSN, final PositionStrategy positionStrategy)
       throws ChangelogException
   {
     return new JEReplicaDBCursor(db, startCSN, positionStrategy, this);
@@ -197,7 +198,7 @@
   /**
    * Shutdown this ReplicaDB.
    */
-  public void shutdown()
+  void shutdown()
   {
     if (shutdown.compareAndSet(false, true))
     {
@@ -211,7 +212,7 @@
    *
    * @param purgeCSN
    *          The CSN up to which changes can be purged. No purging happens when
-   *          it is null.
+   *          it is {@code null}.
    * @throws ChangelogException
    *           In case of database problem.
    */
@@ -279,8 +280,7 @@
   }
 
   /**
-   * This internal class is used to implement the Monitoring capabilities of the
-   * ReplicaDB.
+   * Implements monitoring capabilities of the ReplicaDB.
    */
   private class DbMonitorProvider extends MonitorProvider<MonitorProviderCfg>
   {
@@ -288,7 +288,7 @@
     @Override
     public List<Attribute> getMonitorData()
     {
-      List<Attribute> attributes = new ArrayList<Attribute>();
+      final List<Attribute> attributes = new ArrayList<Attribute>();
       create(attributes, "replicationServer-database",String.valueOf(serverId));
       create(attributes, "domain-name", baseDN.toNormalizedString());
       final CSNLimits limits = csnLimits;
@@ -303,12 +303,12 @@
       return attributes;
     }
 
-    private void create(List<Attribute> attributes, String name, String value)
+    private void create(final List<Attribute> attributes, final String name, final String value)
     {
       attributes.add(Attributes.create(name, value));
     }
 
-    private String encode(CSN csn)
+    private String encode(final CSN csn)
     {
       return csn + " " + new Date(csn.getTime());
     }
@@ -317,16 +317,14 @@
     @Override
     public String getMonitorInstanceName()
     {
-      ReplicationServerDomain domain = replicationServer
-          .getReplicationServerDomain(baseDN);
-      return "Changelog for DS(" + serverId + "),cn="
-          + domain.getMonitorInstanceName();
+      ReplicationServerDomain domain = replicationServer.getReplicationServerDomain(baseDN);
+      return "Changelog for DS(" + serverId + "),cn=" + domain.getMonitorInstanceName();
     }
 
     /** {@inheritDoc} */
     @Override
     public void initializeMonitorProvider(MonitorProviderCfg configuration)
-                            throws ConfigException,InitializationException
+        throws ConfigException,InitializationException
     {
       // Nothing to do for now
     }
@@ -346,7 +344,7 @@
    * @throws ChangelogException When an exception occurs while removing the
    * changes from the DB.
    */
-  public void clear() throws ChangelogException
+  void clear() throws ChangelogException
   {
     db.clear();
     csnLimits = new CSNLimits(null, null);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
index 812746d..a6bee4c 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
@@ -90,7 +90,7 @@
       DN baseDN2 = DN.valueOf("o=baseDN2");
       DN baseDN3 = DN.valueOf("o=baseDN3");
 
-      CSN[] csns = newCSNs(1, 0, 3);
+      CSN[] csns = generateCSNs(1, 0, 3);
 
       // Add records
       final JEChangeNumberIndexDB cnIndexDB = getCNIndexDB(replicationServer);
@@ -187,7 +187,7 @@
       DN baseDN2 = DN.valueOf("o=baseDN2");
       DN baseDN3 = DN.valueOf("o=baseDN3");
 
-      CSN[] csns = newCSNs(1, 0, 3);
+      CSN[] csns = generateCSNs(1, 0, 3);
 
       // Add records
       final JEChangeNumberIndexDB cnIndexDB = getCNIndexDB(replicationServer);
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBTest.java
index cc1be60..0993999 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBTest.java
@@ -83,7 +83,46 @@
     TEST_ROOT_DN = DN.valueOf(TEST_ROOT_DN_STRING);
   }
 
-  @Test(enabled=true)
+  @Test
+  public void testGenerateCursorFrom() throws Exception
+  {
+    ReplicationServer replicationServer = null;
+    JEReplicaDB replicaDB = null;
+    try
+    {
+      TestCaseUtils.startServer();
+      replicationServer = configureReplicationServer(100000, 10);
+      replicaDB = newReplicaDB(replicationServer);
+
+      final CSN[] csns = generateCSNs(1, System.currentTimeMillis(), 5);
+      final ArrayList<CSN> csns2 = new ArrayList<CSN>(Arrays.asList(csns));
+      csns2.remove(csns[3]);
+
+      for (CSN csn : csns2)
+      {
+        replicaDB.add(new DeleteMsg(TEST_ROOT_DN, csn, "uid"));
+      }
+
+      for (CSN csn : csns2)
+      {
+        assertNextCSN(replicaDB, csn, ON_MATCHING_KEY, csn);
+      }
+      assertNextCSN(replicaDB, csns[3], ON_MATCHING_KEY, csns[4]);
+
+      for (int i = 0; i < csns2.size() - 1; i++)
+      {
+        assertNextCSN(replicaDB, csns2.get(i), AFTER_MATCHING_KEY, csns2.get(i + 1));
+      }
+      assertNotFound(replicaDB, csns[4], AFTER_MATCHING_KEY);
+    }
+    finally
+    {
+      shutdown(replicaDB);
+      remove(replicationServer);
+    }
+  }
+
+  @Test
   void testTrim() throws Exception
   {
     ReplicationServer replicationServer = null;
@@ -94,7 +133,7 @@
       replicationServer = configureReplicationServer(100, 5000);
       replicaDB = newReplicaDB(replicationServer);
 
-      CSN[] csns = newCSNs(1, 0, 5);
+      CSN[] csns = generateCSNs(1, 0, 5);
 
       replicaDB.add(new DeleteMsg(TEST_ROOT_DN, csns[0], "uid"));
       replicaDB.add(new DeleteMsg(TEST_ROOT_DN, csns[1], "uid"));
@@ -145,89 +184,13 @@
     }
   }
 
-  static CSN[] newCSNs(int serverId, long timestamp, int number)
-  {
-    CSNGenerator gen = new CSNGenerator(serverId, timestamp);
-    CSN[] csns = new CSN[number];
-    for (int i = 0; i < csns.length; i++)
-    {
-      csns[i] = gen.newCSN();
-    }
-    return csns;
-  }
-
-  private ReplicationServer configureReplicationServer(int windowSize, int queueSize)
-      throws IOException, ConfigException
-  {
-    final int changelogPort = findFreePort();
-    final ReplicationServerCfg conf =
-        new ReplServerFakeConfiguration(changelogPort, null, 0, 2, queueSize, windowSize, null);
-    return new ReplicationServer(conf);
-  }
-
-  private JEReplicaDB newReplicaDB(ReplicationServer rs) throws Exception
-  {
-    final JEChangelogDB changelogDB = (JEChangelogDB) rs.getChangelogDB();
-    return changelogDB.getOrCreateReplicaDB(TEST_ROOT_DN, 1, rs).getFirst();
-  }
-
-  private File createCleanDir() throws IOException
-  {
-    String buildRoot = System.getProperty(TestCaseUtils.PROPERTY_BUILD_ROOT);
-    String path = System.getProperty(TestCaseUtils.PROPERTY_BUILD_DIR, buildRoot
-            + File.separator + "build");
-    path = path + File.separator + "unit-tests" + File.separator + "JEReplicaDB";
-    final File testRoot = new File(path);
-    TestCaseUtils.deleteDirectory(testRoot);
-    testRoot.mkdirs();
-    return testRoot;
-  }
-
-  private void assertFoundInOrder(JEReplicaDB replicaDB, CSN... csns) throws Exception
-  {
-    if (csns.length == 0)
-    {
-      return;
-    }
-
-    assertFoundInOrder(replicaDB, AFTER_MATCHING_KEY, csns);
-    assertFoundInOrder(replicaDB, ON_MATCHING_KEY, csns);
-  }
-
-  private void assertFoundInOrder(JEReplicaDB replicaDB,
-      final PositionStrategy positionStrategy, CSN... csns) throws ChangelogException
-  {
-    DBCursor<UpdateMsg> cursor = replicaDB.generateCursorFrom(csns[0], positionStrategy);
-    try
-    {
-      assertNull(cursor.getRecord(), "Cursor should point to a null record initially");
-
-      for (int i = positionStrategy == ON_MATCHING_KEY ? 0 : 1; i < csns.length; i++)
-      {
-        final String msg = "i=" + i + ", csns[i]=" + csns[i].toStringUI();
-        final SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(cursor.next()).as(msg).isTrue();
-        softly.assertThat(cursor.getRecord().getCSN()).as(msg).isEqualTo(csns[i]);
-        softly.assertAll();
-      }
-      final SoftAssertions softly = new SoftAssertions();
-      softly.assertThat(cursor.next()).isFalse();
-      softly.assertThat(cursor.getRecord()).isNull();
-      softly.assertAll();
-    }
-    finally
-    {
-      close(cursor);
-    }
-  }
-
   /**
    * Test the feature of clearing a JEReplicaDB used by a replication server.
    * The clear feature is used when a replication server receives a request to
    * reset the generationId of a given domain.
    */
-  @Test(enabled=true)
-  void testClear() throws Exception
+  @Test
+  public void testClear() throws Exception
   {
     ReplicationServer replicationServer = null;
     JEReplicaDB replicaDB = null;
@@ -237,7 +200,7 @@
       replicationServer = configureReplicationServer(100, 5000);
       replicaDB = newReplicaDB(replicationServer);
 
-      CSN[] csns = newCSNs(1, 0, 3);
+      CSN[] csns = generateCSNs(1, 0, 3);
 
       // Add the changes and check they are here
       replicaDB.add(new DeleteMsg(TEST_ROOT_DN, csns[0], "uid"));
@@ -260,45 +223,6 @@
     }
   }
 
-  @Test
-  public void testGenerateCursorFrom() throws Exception
-  {
-    ReplicationServer replicationServer = null;
-    JEReplicaDB replicaDB = null;
-    try
-    {
-      TestCaseUtils.startServer();
-      replicationServer = configureReplicationServer(100000, 10);
-      replicaDB = newReplicaDB(replicationServer);
-
-      final CSN[] csns = newCSNs(1, System.currentTimeMillis(), 5);
-      final ArrayList<CSN> csns2 = new ArrayList<CSN>(Arrays.asList(csns));
-      csns2.remove(csns[3]);
-
-      for (CSN csn : csns2)
-      {
-        replicaDB.add(new DeleteMsg(TEST_ROOT_DN, csn, "uid"));
-      }
-
-      for (CSN csn : csns2)
-      {
-        assertNextCSN(replicaDB, csn, ON_MATCHING_KEY, csn);
-      }
-      assertNextCSN(replicaDB, csns[3], ON_MATCHING_KEY, csns[4]);
-
-      for (int i = 0; i < csns2.size() - 1; i++)
-      {
-        assertNextCSN(replicaDB, csns2.get(i), AFTER_MATCHING_KEY, csns2.get(i + 1));
-      }
-      assertNotFound(replicaDB, csns[4], AFTER_MATCHING_KEY);
-    }
-    finally
-    {
-      shutdown(replicaDB);
-      remove(replicationServer);
-    }
-  }
-
   private void assertNextCSN(JEReplicaDB replicaDB, final CSN startCSN,
       final PositionStrategy positionStrategy, final CSN expectedCSN)
       throws ChangelogException
@@ -338,7 +262,7 @@
    * Test the logic that manages counter records in the JEReplicaDB in order to
    * optimize the oldest and newest records in the replication changelog db.
    */
-  @Test(enabled=true, groups = { "opendj-256" })
+  @Test(groups = { "opendj-256" })
   void testGetOldestNewestCSNs() throws Exception
   {
     // It's worth testing with 2 different setting for counterRecord
@@ -403,7 +327,7 @@
       assertEquals(replicaDB.getNewestCSN(), csns[max], "Wrong newest CSN");
 
       // Populate the db with 'max' msg
-      for (int i=max+1; i<=(2*max); i++)
+      for (int i=max+1; i<=2 * max; i++)
       {
         csns[i] = new CSN(now + i, mySeqnum, 1);
         replicaDB.add(new DeleteMsg(TEST_ROOT_DN, csns[i], "uid"));
@@ -413,7 +337,6 @@
       assertEquals(replicaDB.getOldestCSN(), csns[1], "Wrong oldest CSN");
       assertEquals(replicaDB.getNewestCSN(), csns[2 * max], "Wrong newest CSN");
 
-      //
       replicaDB.purgeUpTo(new CSN(Long.MAX_VALUE, 0, 0));
 
       String testcase = "AFTER PURGE (oldest, newest)=";
@@ -449,4 +372,80 @@
     }
   }
 
+  static CSN[] generateCSNs(int serverId, long timestamp, int number)
+  {
+    CSNGenerator gen = new CSNGenerator(serverId, timestamp);
+    CSN[] csns = new CSN[number];
+    for (int i = 0; i < csns.length; i++)
+    {
+      csns[i] = gen.newCSN();
+    }
+    return csns;
+  }
+
+  private ReplicationServer configureReplicationServer(int windowSize, int queueSize)
+      throws IOException, ConfigException
+  {
+    final int changelogPort = findFreePort();
+    final ReplicationServerCfg conf = new ReplServerFakeConfiguration(
+        changelogPort, null, 0, 2, queueSize, windowSize, null);
+    return new ReplicationServer(conf);
+  }
+
+  private JEReplicaDB newReplicaDB(ReplicationServer rs) throws Exception
+  {
+    final JEChangelogDB changelogDB = (JEChangelogDB) rs.getChangelogDB();
+    return changelogDB.getOrCreateReplicaDB(TEST_ROOT_DN, 1, rs).getFirst();
+  }
+
+  private File createCleanDir() throws IOException
+  {
+    String buildRoot = System.getProperty(TestCaseUtils.PROPERTY_BUILD_ROOT);
+    String path = System.getProperty(TestCaseUtils.PROPERTY_BUILD_DIR, buildRoot
+            + File.separator + "build");
+    path = path + File.separator + "unit-tests" + File.separator + "JEReplicaDB";
+    final File testRoot = new File(path);
+    TestCaseUtils.deleteDirectory(testRoot);
+    testRoot.mkdirs();
+    return testRoot;
+  }
+
+  private void assertFoundInOrder(JEReplicaDB replicaDB, CSN... csns) throws Exception
+  {
+    if (csns.length == 0)
+    {
+      return;
+    }
+
+    assertFoundInOrder(replicaDB, AFTER_MATCHING_KEY, csns);
+    assertFoundInOrder(replicaDB, ON_MATCHING_KEY, csns);
+  }
+
+  private void assertFoundInOrder(JEReplicaDB replicaDB,
+      final PositionStrategy positionStrategy, CSN... csns) throws ChangelogException
+  {
+    DBCursor<UpdateMsg> cursor = replicaDB.generateCursorFrom(csns[0], positionStrategy);
+    try
+    {
+      assertNull(cursor.getRecord(), "Cursor should point to a null record initially");
+
+      for (int i = positionStrategy == ON_MATCHING_KEY ? 0 : 1; i < csns.length; i++)
+      {
+        final String msg = "i=" + i + ", csns[i]=" + csns[i].toStringUI();
+        final SoftAssertions softly = new SoftAssertions();
+        softly.assertThat(cursor.next()).as(msg).isTrue();
+        softly.assertThat(cursor.getRecord().getCSN()).as(msg).isEqualTo(csns[i]);
+        softly.assertAll();
+      }
+      final SoftAssertions softly = new SoftAssertions();
+      softly.assertThat(cursor.next()).isFalse();
+      softly.assertThat(cursor.getRecord()).isNull();
+      softly.assertAll();
+    }
+    finally
+    {
+      close(cursor);
+    }
+  }
+
 }

--
Gitblit v1.10.0