From f73b655466092169abac34833fb628fce1fcdebe Mon Sep 17 00:00:00 2001
From: jcduff <jcduff@localhost>
Date: Thu, 23 Oct 2008 14:04:24 +0000
Subject: [PATCH] The commit will bring the following features :     - An updated version of the underlying database. BDB JE 3.3 is now used.     - Attribute API refactoring providing a better abstraction and offering improved performances.     - A new GUI called the Control-Panel to replace the Status-Panel: the specifications for this       GUI are available on OpenDS Wiki and contains a link to a mockup.        See <https://www.opends.org/wiki/page/ControlPanelUISpecification>.     - Some changes in the replication protocol to implement "Assured Replication Mode". The        specifications are on OpenDS Wiki at <https://www.opends.org/wiki/page/AssuredMode> and section 7       described some of the replication changes required to support this. Assured Replication is not finished,       but the main replication protocol changes to support it are done. As explained by Gilles on an email on       the Dev mailing list (http://markmail.org/message/46rgo3meq3vriy4a), with these changes the newer versions       of OpenDS may not be able to replicate with OpenDS 1.0 instances.     - Support for Service Tags on the platforms where the functionality is available and enabled. Specifications       are published at <https://www.opends.org/wiki/page/OpenDSServiceTagEnabled>. For more information on       Service Tags see <http://wikis.sun.com/display/ServiceTag/Sun+Service+Tag+FAQ>.     - The Admin Connector service. In order to provide agentry of the OpenDS server at any time, a new service       has been added, dedicated to the administration, configuration and monitoring of the server.       An overview of the Admin Connector service and it's use is available on the       OpenDS wiki <https://www.opends.org/wiki/page/ManagingAdministrationTrafficToTheServer>     - Updates to the various command line tools to support the Admin Connector service.     - Some internal re-architecting of the server to put the foundation of future developments such as virtual       directory services. The new NetworkGroups and WorkFlow internal services which have been specified in       <https://www.opends.org/wiki/page/BasicOperationRoutingThroughNetworkGroup> are now implemented.     - Many bug fixes...

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java |  914 ++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 550 insertions(+), 364 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
index b40fcb5..db46c73 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
@@ -40,7 +40,6 @@
 import java.net.SocketException;
 import java.net.SocketTimeoutException;
 import java.util.ArrayList;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
@@ -50,36 +49,40 @@
 import org.opends.messages.Message;
 import org.opends.messages.Severity;
 import org.opends.server.TestCaseUtils;
+import org.opends.server.backends.MemoryBackend;
 import org.opends.server.backends.task.TaskState;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.replication.common.ChangeNumberGenerator;
+import org.opends.server.replication.common.ServerStatus;
 import org.opends.server.replication.plugin.ReplicationBroker;
 import org.opends.server.replication.plugin.ReplicationDomain;
 import org.opends.server.replication.protocol.AddMsg;
-import org.opends.server.replication.protocol.DoneMessage;
-import org.opends.server.replication.protocol.EntryMessage;
-import org.opends.server.replication.protocol.ErrorMessage;
-import org.opends.server.replication.protocol.InitializeTargetMessage;
-import org.opends.server.replication.protocol.ReplicationMessage;
+import org.opends.server.replication.protocol.ChangeStatusMsg;
+import org.opends.server.replication.protocol.DoneMsg;
+import org.opends.server.replication.protocol.EntryMsg;
+import org.opends.server.replication.protocol.ErrorMsg;
+import org.opends.server.replication.protocol.InitializeTargetMsg;
+import org.opends.server.replication.protocol.ReplicationMsg;
 import org.opends.server.replication.protocol.SocketSession;
+import org.opends.server.replication.protocol.TopologyMsg;
 import org.opends.server.replication.server.ReplServerFakeConfiguration;
 import org.opends.server.replication.server.ReplicationBackend;
 import org.opends.server.replication.server.ReplicationServer;
 import org.opends.server.tasks.LdifFileWriter;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
+import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.types.SearchResultEntry;
 import org.opends.server.types.SearchScope;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
+import static org.opends.server.TestCaseUtils.*;
 
 /**
  * Tests contained here:
@@ -87,7 +90,7 @@
  * - testSingleRS : test generation ID setting with different servers and one
  *   Replication server.
  *
- * - testMultiRS : tests generation ID propagatoion with more than one
+ * - testMultiRS : tests generation ID propagation with more than one
  *   Replication server.
  *
  */
@@ -97,11 +100,10 @@
   // The tracer object for the debug logger
   private static final DebugTracer TRACER = getTracer();
 
-  private static final String baseDnStr = "dc=example,dc=com";
-  private static final String baseSnStr = "genidcom";
+  private static final String baseDnStr = TEST_ROOT_DN_STRING;
+  private static final String testName = "generationIdTest";
 
   private static final int   WINDOW_SIZE = 10;
-  private static final int   CHANGELOG_QUEUE_SIZE = 100;
   private static final short server1ID = 1;
   private static final short server2ID = 2;
   private static final short server3ID = 3;
@@ -120,7 +122,7 @@
   private Entry taskInitRemoteS2;
   SocketSession ssSession = null;
   boolean ssShutdownRequested = false;
-  protected String[] updatedEntries;
+  private String[] updatedEntries;
 
   private static int[] replServerPort = new int[20];
 
@@ -130,11 +132,6 @@
   private File ldifFile;
 
   /**
-   * A temporary file to contain rejected entries.
-   */
-  private File rejectFile;
-
-  /**
    * A makeldif template used to create some test entries.
    */
   private static String diff = "";
@@ -198,35 +195,15 @@
   @BeforeClass
   public void setUp() throws Exception
   {
-    //log("Starting generationIdTest setup: debugEnabled:" + debugEnabled());
-
-    // This test suite depends on having the schema available.
-    TestCaseUtils.startServer();
+    super.setUp();
 
     baseDn = DN.decode(baseDnStr);
 
     updatedEntries = newLDIFEntries();
 
-    // Create an internal connection in order to provide operations
-    // to DS to populate the db -
-    connection = InternalClientConnection.getRootConnection();
-
-    // Synchro provider
-    String synchroStringDN = "cn=Synchronization Providers,cn=config";
-
-    // Synchro multi-master
-    synchroPluginStringDN = "cn=Multimaster Synchronization, "
-      + synchroStringDN;
-
     // Synchro suffix
     synchroServerEntry = null;
 
-    // Add config entries to the current DS server based on :
-    // Add the replication plugin: synchroPluginEntry & synchroPluginStringDN
-    // Add synchroServerEntry
-    // Add replServerEntry
-    configureReplication();
-
     taskInitRemoteS2 = TestCaseUtils.makeEntry(
         "dn: ds-task-id=" + UUID.randomUUID() +
         ",cn=Scheduled Tasks,cn=Tasks",
@@ -236,19 +213,6 @@
         "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask",
         "ds-task-initialize-domain-dn: " + baseDn,
         "ds-task-initialize-replica-server-id: " + server2ID);
-
-    // Change log
-    String changeLogStringDN = "cn=Changelog Server, " + synchroPluginStringDN;
-    String changeLogLdif = "dn: " + changeLogStringDN + "\n"
-    + "objectClass: top\n"
-    + "objectClass: ds-cfg-synchronization-changelog-server-config\n"
-    + "cn: Changelog Server\n" + "ds-cfg-changelog-port: 8990\n"
-    + "ds-cfg-changelog-server-id: 1\n"
-    + "ds-cfg-window-size: " + WINDOW_SIZE + "\n"
-    + "ds-cfg-changelog-max-queue-size: " + CHANGELOG_QUEUE_SIZE;
-    replServerEntry = TestCaseUtils.entryFromLdifString(changeLogLdif);
-    replServerEntry = null;
-
   }
 
   // Tests that entries have been written in the db
@@ -261,8 +225,9 @@
     {
 
       int dns = entry.indexOf("dn: ");
-      int dne = entry.indexOf("dc=com");
-      String dn = entry.substring(dns+4,dne+6);
+      int dne = entry.indexOf(TestCaseUtils.TEST_ROOT_DN_STRING);
+      String dn = entry.substring(dns + 4,
+        dne + TestCaseUtils.TEST_ROOT_DN_STRING.length());
 
       debugInfo("Search Entry: " + dn);
 
@@ -306,7 +271,7 @@
     {
         "dn: " + baseDn + "\n"
         + "objectClass: top\n"
-        + "objectClass: domain\n"
+        + "objectClass: organization\n"
         + "entryUUID: 21111111-1111-1111-1111-111111111111\n"
         + "\n",
         "dn: ou=People," + baseDn + "\n"
@@ -345,8 +310,8 @@
       String[] updatedEntries)
   {
     // Expect the broker to receive the entries
-    ReplicationMessage msg;
-    short entriesReceived = 0;
+    ReplicationMsg msg;
+    short entriesReceived = -100;
     while (true)
     {
       try
@@ -357,26 +322,26 @@
         if (msg == null)
           break;
 
-        if (msg instanceof InitializeTargetMessage)
+        if (msg instanceof InitializeTargetMsg)
         {
           debugInfo("Broker " + serverID + " receives InitializeTargetMessage ");
           entriesReceived = 0;
         }
-        else if (msg instanceof EntryMessage)
+        else if (msg instanceof EntryMsg)
         {
-          EntryMessage em = (EntryMessage)msg;
+          EntryMsg em = (EntryMsg)msg;
           debugInfo("Broker " + serverID + " receives entry " + new String(em.getEntryBytes()));
           entriesReceived++;
         }
-        else if (msg instanceof DoneMessage)
+        else if (msg instanceof DoneMsg)
         {
-          debugInfo("Broker " + serverID + "  receives done ");
+          debugInfo("Broker " + serverID + " receives done ");
           break;
         }
-        else if (msg instanceof ErrorMessage)
+        else if (msg instanceof ErrorMsg)
         {
-          ErrorMessage em = (ErrorMessage)msg;
-          debugInfo("Broker " + serverID + "  receives ERROR "
+          ErrorMsg em = (ErrorMsg)msg;
+          debugInfo("Broker " + serverID + " receives ERROR "
               + em.toString());
           break;
         }
@@ -404,40 +369,28 @@
   /**
    * Creates a new replicationServer.
    * @param changelogId The serverID of the replicationServer to create.
-   * @param all         Specifies whether to coonect the created replication
+   * @param all         Specifies whether to connect the created replication
    *                    server to the other replication servers in the test.
    * @return The new created replication server.
    */
   private ReplicationServer createReplicationServer(short changelogId,
-      boolean all, String suffix)
+      boolean all, String testCase)
   {
     SortedSet<String> servers = null;
     servers = new TreeSet<String>();
     try
     {
-      if (changelogId==changelog1ID)
-      {
-        if (replServer1!=null)
-          return replServer1;
-      }
-      else if (changelogId==changelog2ID)
-      {
-        if (replServer2!=null)
-          return replServer2;
-      }
-      else if (changelogId==changelog3ID)
-      {
-        if (replServer3!=null)
-          return replServer3;
-      }
       if (all)
       {
-        servers.add("localhost:" + getChangelogPort(changelog1ID));
-        servers.add("localhost:" + getChangelogPort(changelog2ID));
-        servers.add("localhost:" + getChangelogPort(changelog3ID));
+        if (changelogId != changelog1ID)
+          servers.add("localhost:" + getChangelogPort(changelog1ID));
+        if (changelogId != changelog2ID)
+          servers.add("localhost:" + getChangelogPort(changelog2ID));
+        if (changelogId != changelog3ID)
+          servers.add("localhost:" + getChangelogPort(changelog3ID));
       }
       int chPort = getChangelogPort(changelogId);
-      String chDir = "genid"+changelogId+suffix+"Db";
+      String chDir = "generationIdTest"+changelogId+testCase+"Db";
       ReplServerFakeConfiguration conf =
         new ReplServerFakeConfiguration(chPort, chDir, 0, changelogId, 0, 100,
             servers);
@@ -465,12 +418,11 @@
     try
     {
       // suffix synchronized
-      String synchroServerStringDN = synchroPluginStringDN;
       String synchroServerLdif =
-        "dn: cn=" + baseSnStr + ", cn=domains," + synchroServerStringDN + "\n"
+        "dn: cn=" + testName + ", cn=domains," + SYNCHRO_PLUGIN_DN + "\n"
         + "objectClass: top\n"
         + "objectClass: ds-cfg-replication-domain\n"
-        + "cn: " + baseSnStr + "\n"
+        + "cn: " + testName + "\n"
         + "ds-cfg-base-dn: " + baseDnStr + "\n"
         + "ds-cfg-replication-server: localhost:"
         + getChangelogPort(changelogID)+"\n"
@@ -478,17 +430,19 @@
         + "ds-cfg-receive-status: true\n"
         + "ds-cfg-window-size: " + WINDOW_SIZE;
 
-      if (synchroServerEntry == null)
-      {
-        synchroServerEntry = TestCaseUtils.entryFromLdifString(synchroServerLdif);
-        DirectoryServer.getConfigHandler().addEntry(synchroServerEntry, null);
-        assertNotNull(DirectoryServer.getConfigEntry(synchroServerEntry.getDN()),
+      // Must be no connection already done or disconnectFromReplServer should
+      // have been called
+      assertTrue(synchroServerEntry == null);
+
+      synchroServerEntry = TestCaseUtils.entryFromLdifString(synchroServerLdif);
+      DirectoryServer.getConfigHandler().addEntry(synchroServerEntry, null);
+      assertNotNull(DirectoryServer.getConfigEntry(synchroServerEntry.getDN()),
         "Unable to add the synchronized server");
-        configEntryList.add(synchroServerEntry.getDN());
+      configEntryList.add(synchroServerEntry.getDN());
 
-        replDomain = ReplicationDomain.retrievesReplicationDomain(baseDn);
+      replDomain = ReplicationDomain.retrievesReplicationDomain(baseDn);
 
-      }
+
       if (replDomain != null)
       {
         debugInfo("ReplicationDomain: Import/Export is running ? " + replDomain.ieRunning());
@@ -509,18 +463,20 @@
     try
     {
       // suffix synchronized
-      String synchroServerStringDN = "cn=" + baseSnStr + ", cn=domains," +
-      synchroPluginStringDN;
-      if (synchroServerEntry != null)
-      {
-        DN synchroServerDN = DN.decode(synchroServerStringDN);
-        DirectoryServer.getConfigHandler().deleteEntry(synchroServerDN,null);
-        assertTrue(DirectoryServer.getConfigEntry(synchroServerEntry.getDN())==null,
-        "Unable to delete the synchronized domain");
-        synchroServerEntry = null;
+      String synchroServerStringDN = "cn=" + testName + ", cn=domains," +
+      SYNCHRO_PLUGIN_DN;
+      // Must have called connectServer1ToChangelog previously
+      assertTrue(synchroServerEntry != null);
 
-        configEntryList.remove(configEntryList.indexOf(synchroServerDN));
-      }
+      DN synchroServerDN = DN.decode(synchroServerStringDN);
+      DirectoryServer.getConfigHandler().deleteEntry(synchroServerDN, null);
+      assertTrue(DirectoryServer.getConfigEntry(synchroServerEntry.getDN()) ==
+        null,
+        "Unable to delete the synchronized domain");
+      synchroServerEntry = null;
+
+      configEntryList.remove(configEntryList.indexOf(synchroServerDN));
+
     }
     catch(Exception e)
     {
@@ -572,10 +528,9 @@
         if (attrs != null)
         {
           Attribute attr = attrs.get(0);
-          LinkedHashSet<AttributeValue> values = attr.getValues();
-          if (values.size() == 1)
+          if (attr.size() == 1)
           {
-            genId = Long.decode(values.iterator().next().getStringValue());
+            genId = Long.decode(attr.iterator().next().getStringValue());
           }
         }
 
@@ -588,10 +543,8 @@
     return genId;
   }
 
-  private Entry getTaskImport()
+  private void performLdifImport()
   {
-    Entry task = null;
-
     try
     {
       // Create a temporary test LDIF file.
@@ -599,27 +552,25 @@
       String resourcePath = DirectoryServer.getInstanceRoot() + File.separator +
       "config" + File.separator + "MakeLDIF";
       LdifFileWriter.makeLdif(ldifFile.getPath(), resourcePath, template);
-      // Create a temporary rejects file.
-      rejectFile = File.createTempFile("import-test-rejects", ".ldif");
 
-      task = TestCaseUtils.makeEntry(
-          "dn: ds-task-id=" + UUID.randomUUID() +
-          ",cn=Scheduled Tasks,cn=Tasks",
-          "objectclass: top",
-          "objectclass: ds-task",
-          "objectclass: ds-task-import",
-          "ds-task-class-name: org.opends.server.tasks.ImportTask",
-          "ds-task-import-backend-id: userRoot",
-          "ds-task-import-ldif-file: " + ldifFile.getPath(),
-          "ds-task-import-reject-file: " + rejectFile.getPath(),
-          "ds-task-import-overwrite-rejects: TRUE",
-          "ds-task-import-exclude-attribute: description"
-      );
+      // Launch import of the Ldif file on the memory test backend
+      // Note: we do not use a task here as import task does not work on memory
+      // backend: it disables then re-enables backend which leads to backend
+      // object instance lost and this is not accepttable for a backend with
+      // non persistent data
+      LDIFImportConfig importConfig =
+        new LDIFImportConfig(ldifFile.getAbsolutePath());
+
+      MemoryBackend memoryBackend =
+        (MemoryBackend) DirectoryServer.getBackend(TEST_BACKEND_ID);
+      memoryBackend.importLDIF(importConfig);
+
     }
     catch(Exception e)
     {
+     fail("Could not perform ldif import on memory test backend: "
+       + e.getMessage());
     }
-    return task;
   }
 
   private String createEntry(UUID uid)
@@ -642,7 +593,7 @@
         + "userPassword: password\n" + "initials: AA\n");
   }
 
-  static protected ReplicationMessage createAddMsg()
+  static protected ReplicationMsg createAddMsg()
   {
     Entry personWithUUIDEntry = null;
     String user1entryUUID;
@@ -738,9 +689,9 @@
     debugInfo("Starting "+ testCase + " debugEnabled:" + debugEnabled());
 
     debugInfo(testCase + " Clearing DS1 backend");
-    ReplicationDomain.clearJEBackend(false,
-        "userRoot",
-        baseDn.toNormalizedString());
+    // Special test were we want to test with an empty backend. So free it
+    // for this special test.
+    TestCaseUtils.initializeTestBackend(false);
 
     try
     {
@@ -748,7 +699,7 @@
       long genId;
 
       replServer1 = createReplicationServer(changelog1ID, false, testCase);
-      
+
       // To search the replication server db later in these tests, we need
       // to attach the search backend to the replication server just created.
       Thread.sleep(500);
@@ -762,14 +713,14 @@
       debugInfo(testCase + " Configuring DS1 to replicate to RS1(" + changelog1ID + ") on an empty backend");
       connectServer1ToChangelog(changelog1ID);
 
-      debugInfo(testCase + " Expect genId to be not retrievable frm suffix root entry");
+      debugInfo(testCase + " Expect genId to be not retrievable from suffix root entry");
       genId = readGenIdFromSuffixRootEntry();
       assertEquals(genId,-1);
 
       debugInfo(testCase + " Expect genId to be set in memory on the replication " +
       " server side (not wrote on disk/db since no change occurred).");
       rgenId = replServer1.getGenerationId(baseDn);
-      assertEquals(rgenId, 3211313L);
+      assertEquals(rgenId, EMPTY_DN_GENID);
 
       // Clean for next test
       debugInfo(testCase + " Unconfiguring DS1 to replicate to RS1(" + changelog1ID + ")");
@@ -788,7 +739,7 @@
       debugInfo(testCase + " Test that the generationId is written in the DB in the root entry on DS1");
       genId = readGenIdFromSuffixRootEntry();
       assertTrue(genId != -1);
-      assertTrue(genId != 3211313L);
+      assertTrue(genId != EMPTY_DN_GENID);
 
       debugInfo(testCase + " Test that the generationId is set on RS1");
       rgenId = replServer1.getGenerationId(baseDn);
@@ -807,21 +758,6 @@
       {
         fail("DS2 with bad genID failed to connect to RS1.");
       }
-      try
-      {
-        ReplicationMessage msg = broker2.receive();
-        if (!(msg instanceof ErrorMessage))
-        {
-          fail("Broker connection is expected to receive an ErrorMessage."
-              + msg);
-        }
-        ErrorMessage emsg = (ErrorMessage)msg;
-        debugInfo(testCase + " " + emsg.getMsgID() + " " + emsg.getDetails());
-      }
-      catch(SocketTimeoutException se)
-      {
-        fail("Broker is expected to receive an ErrorMessage.");
-      }
 
       //===========================================================
       debugInfo(testCase + " ** TEST ** DS3 connection to RS1 with good genID");
@@ -835,6 +771,22 @@
         fail("Broker connection is expected to be accepted.");
       }
 
+      // Broker 2 should receive an update topo message to signal broker 3
+      // arrival in topology
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive a TopologyMsg."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive a TopologyMsg.");
+      }
+
       //===========================================================
       debugInfo(testCase + " ** TEST ** DS2 (bad genID) changes must be ignored.");
 
@@ -863,7 +815,7 @@
       // Verify that DS3 receives this change
       try
       {
-        ReplicationMessage msg = broker3.receive();
+        ReplicationMsg msg = broker3.receive();
         debugInfo("Broker 3 received expected update msg" + msg);
       }
       catch(SocketTimeoutException e)
@@ -873,7 +825,7 @@
 
       //===========================================================
       debugInfo(testCase + " ** TEST ** Persistence of the generation ID in RS1");
-      
+
       long genIdBeforeShut = replServer1.getGenerationId(baseDn);
 
       debugInfo("Shutdown replServer1");
@@ -881,7 +833,7 @@
       broker2 = null;
       broker3.stop();
       broker3 = null;
-      replServer1.shutdown();
+      replServer1.remove();
       replServer1 = null;
 
       debugInfo("Create again replServer1");
@@ -903,7 +855,7 @@
         " after replServer1 restart. Before : " + genIdBeforeShut +
         " after : " + genIdAfterRestart);
 
-      // By the way also verify that no change occured on the replication server db
+      // By the way also verify that no change occurred on the replication server db
       // and still contain the ADD submitted initially.
       Thread.sleep(500);
       checkChangelogSize(1);
@@ -927,12 +879,92 @@
       {
         fail("Broker connection is expected to be accepted.");
       }
+
+      // Broker 2 should receive an update topo message to signal broker 3
+      // arrival in topology
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive a TopologyMsg."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive a TopologyMsg.");
+      }
+
       debugInfo("Launch on-line import on DS1");
+      long oldGenId = genId;
       genId=-1;
-      Entry importTask = getTaskImport();
-      addTask(importTask, ResultCode.SUCCESS, null);
-      waitTaskState(importTask, TaskState.COMPLETED_SUCCESSFULLY, null);
-      Thread.sleep(500);
+      disconnectFromReplServer(changelog1ID);
+      performLdifImport();
+      connectServer1ToChangelog(changelog1ID);
+
+      // Broker 2 and 3 should receive 2 update topo messages to signal broker 1
+      // has disconnected from topology then reconnected
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive a first TopologyMsg" +
+            " for Broker 1 import + reconnect."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive a first TopologyMsg for DS1 import + " +
+          "reconnect.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker3.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 3 connection is expected to receive a first TopologyMsg" +
+            " for Broker 1 import + reconnect."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS3 is expected to receive a first TopologyMsg for DS1 import + " +
+          "reconnect.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive a second TopologyMsg" +
+            " for Broker 1 import + reconnect."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive a second TopologyMsg for DS1 import + " +
+          "reconnect.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker3.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 3 connection is expected to receive a second TopologyMsg" +
+            " for Broker 1 import + reconnect."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS3 is expected to receive a second TopologyMsg for DS1 import + " +
+          "reconnect.");
+      }
 
       debugInfo("Create Reset task on DS1 to propagate the new gen ID as the reference");
       Entry taskReset = TestCaseUtils.makeEntry(
@@ -944,13 +976,121 @@
           "ds-task-class-name: org.opends.server.tasks.SetGenerationIdTask",
           "ds-task-reset-generation-id-domain-base-dn: " + baseDnStr);
       addTask(taskReset, ResultCode.SUCCESS, null);
-      waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);
-      Thread.sleep(200);
+      waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);      
+
+      // Broker 2 and 3 should receive 1 change status message to order them
+      // to enter the bad gen id status
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof ChangeStatusMsg))
+        {
+          fail("Broker 2 connection is expected to receive 1 ChangeStatusMsg" +
+            " to enter the bad gen id status"
+              + msg);
+        }
+        ChangeStatusMsg csMsg = (ChangeStatusMsg)msg;
+        if (csMsg.getRequestedStatus() != ServerStatus.BAD_GEN_ID_STATUS)
+        {
+          fail("Broker 2 connection is expected to receive 1 ChangeStatusMsg" +
+            " to enter the bad gen id status"
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive 1 ChangeStatusMsg to enter the " +
+          "bad gen id status.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker3.receive();
+        if (!(msg instanceof ChangeStatusMsg))
+        {
+          fail("Broker 3 connection is expected to receive 1 ChangeStatusMsg" +
+            " to enter the bad gen id status"
+              + msg);
+        }
+        ChangeStatusMsg csMsg = (ChangeStatusMsg)msg;
+        if (csMsg.getRequestedStatus() != ServerStatus.BAD_GEN_ID_STATUS)
+        {
+          fail("Broker 3 connection is expected to receive 1 ChangeStatusMsg" +
+            " to enter the bad gen id status"
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS3 is expected to receive 1 ChangeStatusMsg to enter the " +
+          "bad gen id status.");
+      }
+
+      // Broker 2 and 3 should receive 1 update topo message to signal other broker gen id
+      // has been resetted, and 2 topo messages to signal DS1 has been disconnected
+      // then reconnected
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive 1 TopologyMsg" +
+            " for gen id reset of broker 3."
+              + msg);
+        }
+        msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive 1 TopologyMsg" +
+            " for DS1 disconnected."
+              + msg);
+        }
+        msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive 1 TopologyMsg" +
+            " for DS1 reconnected."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive 3 TopologyMsg for gen id reset.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker3.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 3 connection is expected to receive 1 TopologyMsg" +
+            " for gen id reset of broker 2."
+              + msg);
+        }
+        msg = broker3.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 3 connection is expected to receive 1 TopologyMsg" +
+            " for DS1 disconnected."
+              + msg);
+        }
+        msg = broker3.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 3 connection is expected to receive 1 TopologyMsg" +
+            " for DS1 reconnected"
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS3 is expected to receive 3 TopologyMsg for gen id reset.");
+      }
 
       debugInfo("DS1 root entry must contain the new gen ID");
       genId = readGenIdFromSuffixRootEntry();
       assertTrue(genId != -1, "DS is expected to have a new genID computed " +
           " after on-line import but genId=" + genId);
+      assertTrue(genId != oldGenId, "The new genID after import and reset of genID "
+        + "is expected to be diffrent from previous one");
 
       debugInfo("RS1 must have the new gen ID");
       rgenId = replServer1.getGenerationId(baseDn);
@@ -961,7 +1101,7 @@
 
       assertTrue(!replServer1.getReplicationServerDomain(baseDn, false).
           isDegradedDueToGenerationId(server1ID),
-      "Expecting that DS1 status in RS1 is : not degraded.");
+      "Expecting that DS1 status in RS1 is : not in bad gen id.");
 
       //===============================================================
       debugInfo(testCase + " ** TEST ** Previous test set a new gen ID on the "+
@@ -969,12 +1109,12 @@
 
       assertTrue(replServer1.getReplicationServerDomain(baseDn, false).
           isDegradedDueToGenerationId(server2ID),
-      "Expecting that DS2 with old gen ID is degraded from RS1");
+      "Expecting that DS2 with old gen ID is in bad gen id from RS1");
       assertTrue(replServer1.getReplicationServerDomain(baseDn, false).
           isDegradedDueToGenerationId(server3ID),
-      "Expecting that DS3 with old gen ID is degraded from RS1");
+      "Expecting that DS3 with old gen ID is in bad gen id from RS1");
 
-      debugInfo("Add entries to DS1, update should not be sent to DS2 and DS3 that are degraded");
+      debugInfo("Add entries to DS1, update should not be sent to DS2 and DS3 that are in bad gen id");
       String[] ent3 = { createEntry(UUID.randomUUID()) };
       this.addTestEntriesToDB(ent3);
 
@@ -984,45 +1124,14 @@
 
       try
       {
-        ReplicationMessage msg = broker2.receive();
-        if (!(msg instanceof ErrorMessage))
-        {
-          fail("Broker 2 connection is expected to receive an ErrorMessage."
-              + msg);
-        }
-        ErrorMessage emsg = (ErrorMessage)msg;
-        debugInfo(testCase + " " + emsg.getMsgID() + " " + emsg.getDetails());
-      }
-      catch(SocketTimeoutException se)
-      {
-        fail("DS2 is expected to receive an ErrorMessage.");
-      }
-      try
-      {
-        ReplicationMessage msg = broker3.receive();
-        if (!(msg instanceof ErrorMessage))
-        {
-          fail("DS3 connection is expected to receive an ErrorMessage."
-              + msg);
-        }
-        ErrorMessage emsg = (ErrorMessage)msg;
-        debugInfo(testCase + " " + emsg.getMsgID() + " " + emsg.getDetails());
-      }
-      catch(SocketTimeoutException se)
-      {
-        fail("DS3 is expected to receive an ErrorMessage.");
-      }
-
-      try
-      {
-        ReplicationMessage msg = broker2.receive();
-        fail("No update message is supposed to be received by degraded broker2" + msg);
+        ReplicationMsg msg = broker2.receive();
+        fail("No update message is supposed to be received by broker2 in bad gen id. " + msg);
       } catch(SocketTimeoutException e) { /* expected */ }
 
       try
       {
-        ReplicationMessage msg = broker3.receive();
-        fail("No update message is supposed to be received by degraded broker3"+ msg);
+        ReplicationMsg msg = broker3.receive();
+        fail("No update message is supposed to be received by broker3 in bad gen id. " + msg);
       } catch(SocketTimeoutException e) { /* expected */ }
 
 
@@ -1035,13 +1144,13 @@
 
       try
       {
-        ReplicationMessage msg = broker3.receive();
-        fail("No update message is supposed to be received by degraded broker3"+ msg);
+        ReplicationMsg msg = broker3.receive();
+        fail("No update message is supposed to be received by broker3 in bad gen id. "+ msg);
       } catch(SocketTimeoutException e) { /* expected */ }
 
-      
+
       //===============================================================
-      debugInfo(testCase + " ** TEST ** Previous test degraded DS2 and DS3, "+
+      debugInfo(testCase + " ** TEST ** Previous test put DS2 and DS3 in bad gen id, "+
           " now simulates \"dsreplication initialize \"by doing a TU+reset " +
           " from DS1 to DS2 and DS3, verify NON degradation of DS2 and DS3");
 
@@ -1053,17 +1162,46 @@
       debugInfo("broker2 has been initialized from DS with #entries=" + receivedEntriesNb);
 
       broker2.stop();
-      
+
       // Simulates the broker restart at the end of the import
       broker2 = openReplicationSession(baseDn,
           server2ID, 100, getChangelogPort(changelog1ID), 1000, emptyOldChanges, genId);
 
       broker3.stop();
-      
+
       // Simulates the broker restart at the end of the import
       broker3 = openReplicationSession(baseDn,
           server3ID, 100, getChangelogPort(changelog1ID), 1000, emptyOldChanges, genId);
 
+      // Broker 2 should receive 2 update topo messages to signal broker 3
+      // stopped and restarted
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive a first TopologyMsg."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive a first TopologyMsg.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive a second TopologyMsg."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive a second TopologyMsg.");
+      }
+
       debugInfo("Adding reset task to DS1");
       taskReset = TestCaseUtils.makeEntry(
           "dn: ds-task-id=resetgenid"+ UUID.randomUUID() +
@@ -1078,6 +1216,38 @@
       waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);
       Thread.sleep(200);
 
+      // Broker 2 and 3 should not receive a change status as they are connected with
+      // the right genid, but should anyway receive a topo message to update them with potential
+      // updates.
+      try
+      {
+        ReplicationMsg msg = broker2.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 2 connection is expected to receive 1 TopologyMsg" +
+            " for topo update on reset gen id."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS2 is expected to receive 1 TopologyMsg for topo update on reset gen id.");
+      }
+      try
+      {
+        ReplicationMsg msg = broker3.receive();
+        if (!(msg instanceof TopologyMsg))
+        {
+          fail("Broker 3 connection is expected to receive 1 TopologyMsg" +
+            " for topo update on reset gen id."
+              + msg);
+        }
+      }
+      catch(SocketTimeoutException se)
+      {
+        fail("DS3 is expected to receive 1 TopologyMsg for topo update on reset gen id.");
+      }
+
       debugInfo("Verify that RS1 has still the right genID");
       assertEquals(replServer1.getGenerationId(baseDn), rgenId);
 
@@ -1085,11 +1255,17 @@
       Thread.sleep(500);
       checkChangelogSize(1);
 
-      debugInfo("Verifying that DS2 is not degraded any more");
+      debugInfo("Verifying that DS2 is not in bad gen id any more");
 
       assertTrue(!replServer1.getReplicationServerDomain(baseDn, false).
           isDegradedDueToGenerationId(server2ID),
-      "Expecting that DS2 is not degraded from RS1");
+      "Expecting that DS2 is not in bad gen id from RS1");
+
+      debugInfo("Verifying that DS3 is not in bad gen id any more");
+
+      assertTrue(!replServer1.getReplicationServerDomain(baseDn, false).
+          isDegradedDueToGenerationId(server3ID),
+      "Expecting that DS3 is not in bad gen id from RS1");
 
       debugInfo("DS2 is publishing a change and RS1 must store this change, DS3 must receive it.");
       AddMsg emsg = (AddMsg)createAddMsg();
@@ -1100,15 +1276,15 @@
 
       try
       {
-        ReplicationMessage msg = broker3.receive();
+        ReplicationMsg msg = broker3.receive();
 
-        /* expected */ 
+        /* expected */
         AddMsg rcvmsg = (AddMsg)msg;
         assertEquals(rcvmsg.getChangeNumber(), emsg.getChangeNumber());
       } 
-      catch(SocketTimeoutException e) 
-      { 
-        fail("The msg send by DS2 is expected to be received by DS3);");
+      catch(SocketTimeoutException e)
+      {
+        fail("The msg send by DS2 is expected to be received by DS3)");
       }
 
       //===============================================================
@@ -1117,25 +1293,15 @@
       debugInfo("Disconnect DS from replServer1 (required in order to DEL entries).");
       disconnectFromReplServer(changelog1ID);
 
-      postTest();
-
-      debugInfo(testCase + " Clearing DS backend");
-      ReplicationDomain.clearJEBackend(false,
-          replDomain.getBackend().getBackendID(),
-          baseDn.toNormalizedString());
-
-      // At this moment, root entry of the domain has been removed so
-      // genId is no more in the database ... but it has still the old
-      // value in memory.
-      testEntriesInDb();
-      replDomain.loadGenerationId();
-
       debugInfo("Successfully ending " + testCase);
     }
     catch(Exception e)
     {
       fail(testCase + " Exception:"+ e.getMessage() + " " +
           stackTraceToSingleLineString(e));
+    } finally
+    {
+      postTest();
     }
   }
 
@@ -1144,7 +1310,7 @@
    * testMultiRS tests basic features of generationID
    * with more than one Replication Server.
    * The following test focus on:
-   * - genId checking accross multiple starting RS (replication servers)
+   * - genId checking across multiple starting RS (replication servers)
    * - genId setting propagation from one RS to the others
    * - genId reset   propagation from one RS to the others
    */
@@ -1156,118 +1322,131 @@
 
     debugInfo("Starting " + testCase);
 
-    ReplicationDomain.clearJEBackend(false,
-        "userRoot",
-        baseDn.toNormalizedString());
-
-    debugInfo ("Creating 3 RS");
-    replServer1 = createReplicationServer(changelog1ID, true, testCase);
-    replServer2 = createReplicationServer(changelog2ID, true, testCase);
-    replServer3 = createReplicationServer(changelog3ID, true, testCase);
-    Thread.sleep(500);
-
-    debugInfo("Connecting DS to replServer1");
-    connectServer1ToChangelog(changelog1ID);
-    Thread.sleep(1500);
-
-    debugInfo("Expect genId are set in all replServers.");
-    assertEquals(replServer1.getGenerationId(baseDn), 3211313L, " in replServer1");
-    assertEquals(replServer2.getGenerationId(baseDn), 3211313L, " in replServer2");
-    assertEquals(replServer3.getGenerationId(baseDn), 3211313L, " in replServer3");
-
-    debugInfo("Disconnect DS from replServer1.");
-    disconnectFromReplServer(changelog1ID);
-    Thread.sleep(1000);
-
-    debugInfo("Add entries to DS");
-    this.addTestEntriesToDB(updatedEntries);
-
-    debugInfo("Connecting DS to replServer2");
-    connectServer1ToChangelog(changelog2ID);
-    Thread.sleep(1000);
-
-    debugInfo("Expect genIds to be set in all servers based on the added entries.");
-    genId = readGenIdFromSuffixRootEntry();
-    assertTrue(genId != -1);
-    assertEquals(replServer1.getGenerationId(baseDn), genId);
-    assertEquals(replServer2.getGenerationId(baseDn), genId);
-    assertEquals(replServer3.getGenerationId(baseDn), genId);
-
-    debugInfo("Connecting broker2 to replServer3 with a good genId");
     try
     {
-      broker2 = openReplicationSession(baseDn,
+      // Special test were we want to test with an empty backend. So free it
+      // for this special test.
+      TestCaseUtils.initializeTestBackend(false);
+
+      debugInfo("Creating 3 RS");
+      replServer1 = createReplicationServer(changelog1ID, true, testCase);
+      replServer2 = createReplicationServer(changelog2ID, true, testCase);
+      replServer3 = createReplicationServer(changelog3ID, true, testCase);
+      Thread.sleep(500);
+
+      debugInfo("Connecting DS to replServer1");
+      connectServer1ToChangelog(changelog1ID);
+      Thread.sleep(1500);
+
+      debugInfo("Expect genId are set in all replServers.");
+      assertEquals(replServer1.getGenerationId(baseDn), EMPTY_DN_GENID,
+        " in replServer1");
+      assertEquals(replServer2.getGenerationId(baseDn), EMPTY_DN_GENID,
+        " in replServer2");
+      assertEquals(replServer3.getGenerationId(baseDn), EMPTY_DN_GENID,
+        " in replServer3");
+
+      debugInfo("Disconnect DS from replServer1.");
+      disconnectFromReplServer(changelog1ID);
+      Thread.sleep(3000);
+
+      debugInfo(
+        "Expect genIds to be resetted in all servers to -1 as no more DS in topo");
+      assertEquals(replServer1.getGenerationId(baseDn), -1);
+      assertEquals(replServer2.getGenerationId(baseDn), -1);
+      assertEquals(replServer3.getGenerationId(baseDn), -1);
+
+      debugInfo("Add entries to DS");
+      this.addTestEntriesToDB(updatedEntries);
+
+      debugInfo("Connecting DS to replServer2");
+      connectServer1ToChangelog(changelog2ID);
+      Thread.sleep(3000);
+
+      debugInfo(
+        "Expect genIds to be set in all servers based on the added entries.");
+      genId = readGenIdFromSuffixRootEntry();
+      assertTrue(genId != -1);
+      assertEquals(replServer1.getGenerationId(baseDn), genId);
+      assertEquals(replServer2.getGenerationId(baseDn), genId);
+      assertEquals(replServer3.getGenerationId(baseDn), genId);
+
+      debugInfo("Connecting broker2 to replServer3 with a good genId");
+      try
+      {
+        broker2 = openReplicationSession(baseDn,
           server2ID, 100, getChangelogPort(changelog3ID),
           1000, !emptyOldChanges, genId);
-      Thread.sleep(1000);
-    }
-    catch(SocketException se)
-    {
-      fail("Broker connection is expected to be accepted.");
-    }
+        Thread.sleep(1000);
+      } catch (SocketException se)
+      {
+        fail("Broker connection is expected to be accepted.");
+      }
 
-    debugInfo("Expecting that broker2 is not degraded since it has a correct genId");
-    assertTrue(!replServer1.getReplicationServerDomain(baseDn, false).
+      debugInfo(
+        "Expecting that broker2 is not in bad gen id since it has a correct genId");
+      assertTrue(!replServer1.getReplicationServerDomain(baseDn, false).
         isDegradedDueToGenerationId(server2ID));
 
-    debugInfo("Disconnecting DS from replServer1");
-    disconnectFromReplServer(changelog1ID);
+      debugInfo("Disconnecting DS from replServer1");
+      disconnectFromReplServer(changelog1ID);
 
-    debugInfo("Expect all genIds to keep their value since broker2 is still connected.");
-    assertEquals(replServer1.getGenerationId(baseDn), genId);
-    assertEquals(replServer2.getGenerationId(baseDn), genId);
-    assertEquals(replServer3.getGenerationId(baseDn), genId);
+      debugInfo(
+        "Expect all genIds to keep their value since broker2 is still connected.");
+      assertEquals(replServer1.getGenerationId(baseDn), genId);
+      assertEquals(replServer2.getGenerationId(baseDn), genId);
+      assertEquals(replServer3.getGenerationId(baseDn), genId);
 
-    debugInfo("Connecting broker2 to replServer1 with a bad genId");
-    try
-    {
-      long badgenId=1;
-      broker3 = openReplicationSession(baseDn,
+      debugInfo("Connecting broker2 to replServer1 with a bad genId");
+      try
+      {
+        long badgenId = 1;
+        broker3 = openReplicationSession(baseDn,
           server3ID, 100, getChangelogPort(changelog1ID),
           1000, !emptyOldChanges, badgenId);
-      Thread.sleep(1000);
-    }
-    catch(SocketException se)
-    {
-      fail("Broker connection is expected to be accepted.");
-    }
+        Thread.sleep(1000);
+      } catch (SocketException se)
+      {
+        fail("Broker connection is expected to be accepted.");
+      }
 
-    debugInfo("Expecting that broker3 is degraded since it has a bad genId");
-    assertTrue(replServer1.getReplicationServerDomain(baseDn, false).
+      debugInfo(
+        "Expecting that broker3 is in bad gen id since it has a bad genId");
+      assertTrue(replServer1.getReplicationServerDomain(baseDn, false).
         isDegradedDueToGenerationId(server3ID));
 
-    int found = testEntriesInDb();
-    assertEquals(found, updatedEntries.length,
+      int found = testEntriesInDb();
+      assertEquals(found, updatedEntries.length,
         " Entries present in DB :" + found +
         " Expected entries :" + updatedEntries.length);
 
-    debugInfo("Connecting DS to replServer1.");
-    connectServer1ToChangelog(changelog1ID);
-    Thread.sleep(1000);
+      debugInfo("Connecting DS to replServer1.");
+      connectServer1ToChangelog(changelog1ID);
+      Thread.sleep(1000);
 
 
-    debugInfo("Adding reset task to DS.");
-    Entry taskReset = TestCaseUtils.makeEntry(
-        "dn: ds-task-id=resetgenid"+ UUID.randomUUID() +
+      debugInfo("Adding reset task to DS.");
+      Entry taskReset = TestCaseUtils.makeEntry(
+        "dn: ds-task-id=resetgenid" + UUID.randomUUID() +
         ",cn=Scheduled Tasks,cn=Tasks",
         "objectclass: top",
         "objectclass: ds-task",
         "objectclass: ds-task-reset-generation-id",
         "ds-task-class-name: org.opends.server.tasks.SetGenerationIdTask",
         "ds-task-reset-generation-id-domain-base-dn: " + baseDnStr);
-    addTask(taskReset, ResultCode.SUCCESS, null);
-    waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);
-    Thread.sleep(500);
+      addTask(taskReset, ResultCode.SUCCESS, null);
+      waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);
+      Thread.sleep(500);
 
-    debugInfo("Verifying that all replservers genIds have been reset.");
-    genId = readGenIdFromSuffixRootEntry();
-    assertEquals(replServer1.getGenerationId(baseDn), genId);
-    assertEquals(replServer2.getGenerationId(baseDn), genId);
-    assertEquals(replServer3.getGenerationId(baseDn), genId);
+      debugInfo("Verifying that all replservers genIds have been reset.");
+      genId = readGenIdFromSuffixRootEntry();
+      assertEquals(replServer1.getGenerationId(baseDn), genId);
+      assertEquals(replServer2.getGenerationId(baseDn), genId);
+      assertEquals(replServer3.getGenerationId(baseDn), genId);
 
-    debugInfo("Adding reset task to DS.");
-    taskReset = TestCaseUtils.makeEntry(
-        "dn: ds-task-id=resetgenid"+ UUID.randomUUID() +
+      debugInfo("Adding reset task to DS.");
+      taskReset = TestCaseUtils.makeEntry(
+        "dn: ds-task-id=resetgenid" + UUID.randomUUID() +
         ",cn=Scheduled Tasks,cn=Tasks",
         "objectclass: top",
         "objectclass: ds-task",
@@ -1275,23 +1454,25 @@
         "ds-task-class-name: org.opends.server.tasks.SetGenerationIdTask",
         "ds-task-reset-generation-id-domain-base-dn: " + baseDnStr,
         "ds-task-reset-generation-id-new-value: -1");
-    addTask(taskReset, ResultCode.SUCCESS, null);
-    waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);
-    Thread.sleep(500);
+      addTask(taskReset, ResultCode.SUCCESS, null);
+      waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null);
+      Thread.sleep(500);
 
-    debugInfo("Verifying that all replservers genIds have been reset.");
-    genId = readGenIdFromSuffixRootEntry();
-    assertEquals(replServer1.getGenerationId(baseDn), -1);
-    assertEquals(replServer2.getGenerationId(baseDn), -1);
-    assertEquals(replServer3.getGenerationId(baseDn), -1);
+      debugInfo("Verifying that all replservers genIds have been reset.");
+      genId = readGenIdFromSuffixRootEntry();
+      assertEquals(replServer1.getGenerationId(baseDn), -1);
+      assertEquals(replServer2.getGenerationId(baseDn), -1);
+      assertEquals(replServer3.getGenerationId(baseDn), -1);
 
-    debugInfo("Disconnect DS from replServer1 (required in order to DEL entries).");
-    disconnectFromReplServer(changelog1ID);
+      debugInfo(
+        "Disconnect DS from replServer1 (required in order to DEL entries).");
+      disconnectFromReplServer(changelog1ID);
 
-    debugInfo("Cleaning entries");
-    postTest();
-
-    debugInfo("Successfully ending " + testCase);
+      debugInfo("Successfully ending " + testCase);
+    } finally
+    {
+      postTest();
+    }
   }
 
   /**
@@ -1311,35 +1492,43 @@
     broker3 = null;
 
     if (replServer1 != null)
+    {
+      replServer1.clearDb();
       replServer1.remove();
+      replServer1 = null;
+    }
     if (replServer2 != null)
+    {
+      replServer2.clearDb();
       replServer2.remove();
+      replServer2 = null;
+    }
     if (replServer3 != null)
+    {
+      replServer3.clearDb();
       replServer3.remove();
-    replServer1 = null;
-    replServer2 = null;
-    replServer3 = null;
+      replServer3 = null;
+    }
 
     super.cleanRealEntries();
 
+    // Clean replication server ports
+    for (int i = 0; i < replServerPort.length; i++)
+    {
+      replServerPort[i] = 0;
+    }
+
+    debugInfo("Clearing DS backend");
     try
     {
-      ReplicationDomain.clearJEBackend(false,
-        replDomain.getBackend().getBackendID(),
-        baseDn.toNormalizedString());
-
-      // At this moment, root entry of the domain has been removed so
-      // genId is no more in the database ... but it has still the old
-      // value in memory.
-      testEntriesInDb();
-      replDomain.loadGenerationId();
-    }
-    catch (Exception e) {}
+      TestCaseUtils.initializeTestBackend(false);
+    } catch (Exception ex)
+    {debugInfo("postTest(): error cleaning memory backend: " + ex);}
   }
-  
+
   /**
    * Test generationID saving when the root entry does not exist
-   * at the moement when the replication is enabled.
+   * at the moment when the replication is enabled.
    * @throws Exception
    */
   @Test(enabled=false, groups="slow")
@@ -1349,9 +1538,9 @@
     debugInfo("Starting "+ testCase + " debugEnabled:" + debugEnabled());
 
     debugInfo(testCase + " Clearing DS1 backend");
-    ReplicationDomain.clearJEBackend(false,
-        "userRoot",
-        baseDn.toNormalizedString());
+    // Special test were we want to test with an empty backend. So free it
+    // for this special test.
+    TestCaseUtils.initializeTestBackend(false);
 
     try
     {
@@ -1378,8 +1567,8 @@
 
       debugInfo(testCase + " Expect genId attribute to be retrievable");
       genId = readGenIdFromSuffixRootEntry();
-      assertEquals(genId, 3211313L);
-      
+      assertEquals(genId, EMPTY_DN_GENID);
+
       disconnectFromReplServer(changelog1ID);
     }
     finally
@@ -1388,7 +1577,7 @@
       debugInfo("Successfully ending " + testCase);
     }
   }
-  
+
   /**
    * Loop opening sessions to the Replication Server 
    * to check that it handle correctly deconnection and reconnection. 
@@ -1399,39 +1588,36 @@
     String testCase = "testLoop";
     debugInfo("Starting "+ testCase + " debugEnabled:" + debugEnabled());
     long rgenId;
-    
-    ReplicationDomain.clearJEBackend(false,
-        "userRoot",
-        baseDn.toNormalizedString());
+
+    // Special test were we want to test with an empty backend. So free it
+    // for this special test.
+    TestCaseUtils.initializeTestBackend(false);
 
     replServer1 = createReplicationServer(changelog1ID, false, testCase);
     replServer1.clearDb();
 
     ReplicationBroker broker = null;
-    try 
+    try
     {
-      for (int i=0; i< 100; i++)
+      for (int i=0; i< 5; i++)
       {
         long generationId = 1000+i;
         broker = openReplicationSession(baseDn,
             server2ID, 100, getChangelogPort(changelog1ID),
-            1000, !emptyOldChanges, generationId);
-
+            1000, !emptyOldChanges, generationId);        
         debugInfo(testCase + " Expect genId to be set in memory on the replication " +
-        " server side even if not wrote on disk/db since no change occurred.");
+        " server side even if not wrote on disk/db since no change occurred.");                
         rgenId = replServer1.getGenerationId(baseDn);
-        if (rgenId != generationId)
-        {
-          fail("replication server failed to set generation ID");
-          replServer1.getGenerationId(baseDn);
-        }
+        assertEquals(rgenId, generationId);
         broker.stop();
         broker = null;
+        Thread.sleep(2000); // Let time to RS to clear info about previous connection
       }
     } finally
     {
       if (broker != null)
         broker.stop();
+      postTest();
     }
   }
   

--
Gitblit v1.10.0