mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noel Rouvignac
24.01.2013 d03a4043575eb981cae4124cf1dd6af74be498bd
Replication tests cleanup and consolidation.


ReplicationTestCase.java
Added remove(ReplicationServer...) and stop(ReplicationBroker...).

*Test.java:
Used the new methods from ReplicationTestCase.
Used Arrays.fill().
Removed various redundant methods that had been extracted in the past:
- GroupIdHandshakeTest.clear()
- ReplicationServerFailoverTest.clear()
- ExternalChangeLogTest.stop()
- ReplicationServerTest.stop()
- ReplicationServerTest.removeRsAndChangeLog()
- ReplicationDomainTest.remove())

AssuredReplicationServerTest.java:
Removed all the rs*Port fields, replaced by rsPorts.
Removed all the fakeRd* fields, replaced by fakeRDs.
Extracted methods disableService(), shutdown(), assertFakeDSReceivedAndAcked(), assertFakeRDNbReceivedUpdates(), assertFakeRSNbReceivedUpdates(), checkDSNothingReceivedOrSent(), assertContainsOnly().
Used more the checkDSSentAndAcked(), checkDSReceivedAndAcked().
Inlined on createFakeReplicationDomain().
Removed all sorts of assertNotNull() where the code could never be null.
16 files modified
1201 ■■■■ changed files
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java 35 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java 54 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java 61 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java 28 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/FractionalReplicationTest.java 12 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/GroupIdHandshakeTest.java 26 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingTest.java 6 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java 33 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerLoadBalancingTest.java 18 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/StateMachineTest.java 28 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/TopologyViewTest.java 36 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java 746 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java 18 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/MonitorTest.java 58 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java 26 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/service/ReplicationDomainTest.java 16 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java
@@ -27,10 +27,6 @@
 */
package org.opends.server.replication;
import static org.opends.server.TestCaseUtils.*;
import static org.testng.Assert.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedList;
@@ -52,9 +48,11 @@
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.replication.service.ReplicationBroker;
import org.opends.server.types.*;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
import static org.testng.Assert.*;
/**
 * Test that the dependencies are computed correctly when replaying
 * sequences of operations that requires to follow a given order
@@ -225,11 +223,7 @@
    }
    finally
    {
      if (replServer != null) {
        replServer.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replServer.getDbDirName()));
      }
      remove(replServer);
      if (domain != null)
        MultimasterReplication.deleteDomain(baseDn);
    }
@@ -342,12 +336,7 @@
    }
    finally
    {
      if (replServer != null) {
        replServer.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replServer.getDbDirName()));
      }
      remove(replServer);
      if (domain != null)
        MultimasterReplication.deleteDomain(baseDn);
    }
@@ -501,12 +490,7 @@
    }
    finally
    {
      if (replServer != null) {
        replServer.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replServer.getDbDirName()));
      }
      remove(replServer);
      if (domain != null)
        MultimasterReplication.deleteDomain(baseDn);
    }
@@ -609,12 +593,7 @@
    }
    finally
    {
      if (replServer != null) {
        replServer.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replServer.getDbDirName()));
      }
      remove(replServer);
      if (domain != null)
        MultimasterReplication.deleteDomain(baseDn);
    }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
@@ -51,7 +51,6 @@
import org.opends.server.replication.service.ReplicationBroker;
import org.opends.server.tasks.LdifFileWriter;
import org.opends.server.types.*;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -735,11 +734,9 @@
      long genIdBeforeShut = replServer1.getGenerationId(baseDN);
      debugInfo("Shutdown replServer1");
      broker2.stop();
      broker2 = null;
      broker3.stop();
      broker3 = null;
      replServer1.remove();
      stop(broker2, broker3);
      broker2 = broker3 = null;
      remove(replServer1);
      replServer1 = null;
      debugInfo("Create again replServer1");
@@ -1176,46 +1173,14 @@
  {
    debugInfo("Post test cleaning.");
    // Clean brokers
    if (broker2 != null)
      broker2.stop();
    broker2 = null;
    if (broker3 != null)
      broker3.stop();
    broker3 = null;
    if (replServer1 != null)
    {
      replServer1.clearDb();
      replServer1.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
               replServer1.getDbDirName()));
      replServer1 = null;
    }
    if (replServer2 != null)
    {
      replServer2.clearDb();
      replServer2.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replServer2.getDbDirName()));
      replServer2 = null;
    }
    if (replServer3 != null)
    {
      replServer3.clearDb();
      replServer3.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
             replServer3.getDbDirName()));
      replServer3 = null;
    }
    stop(broker2, broker3);
    broker2 = broker3 = null;
    remove(replServer1, replServer2, replServer3);
    replServer1 = replServer2 = replServer3 = null;
    super.cleanRealEntries();
    // Clean replication server ports
    for (int i = 0; i < replServerPort.length; i++)
    {
      replServerPort[i] = 0;
    }
    Arrays.fill(replServerPort, 0);
    debugInfo("Clearing DS backend");
    try
@@ -1312,8 +1277,7 @@
      }
    } finally
    {
      if (broker != null)
        broker.stop();
      stop(broker);
      postTest();
    }
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication;
import java.io.File;
import java.net.SocketTimeoutException;
import java.util.*;
@@ -53,7 +52,6 @@
import org.opends.server.schema.DirectoryStringSyntax;
import org.opends.server.types.*;
import org.opends.server.util.Base64;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -1091,10 +1089,7 @@
    } finally
    {
      if (broker2 != null)
        broker2.stop();
      if (broker3 != null)
        broker3.stop();
      stop(broker2, broker3);
      afterTest(testCase);
    }
  }
@@ -1452,7 +1447,6 @@
   */
  private void afterTest(String testCase)
  {
    // Check that the domain has completed the import/export task.
    if (replDomain != null)
    {
@@ -1474,55 +1468,16 @@
    super.cleanConfigEntries();
    replDomain = null;
    // Clean brokers
    if (server2 != null)
    {
      server2.stop();
      sleep(100); // give some time to the broker to disconnect
      // from the replicationServer.
      server2 = null;
    }
    if (server3 != null)
    {
      server3.stop();
      sleep(100); // give some time to the broker to disconnect
      // from the replicationServer.
      server3 = null;
    }
    stop(server2, server3);
    sleep(100); // give some time to the brokers to disconnect from the replicationServer.
    server2 = server3 = null;
    super.cleanRealEntries();
    if (changelog1 != null)
    {
        changelog1.clearDb();
        changelog1.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
             changelog1.getDbDirName()));
        changelog1 = null;
    }
    remove(changelog1, changelog2, changelog3);
    changelog1 = changelog2 = changelog3 = null;
    if (changelog2 != null)
    {
        changelog2.clearDb();
        changelog2.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
             changelog2.getDbDirName()));
        changelog2 = null;
    }
    if (changelog3 != null)
    {
        changelog3.clearDb();
        changelog3.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
             changelog3.getDbDirName()));
        changelog3 = null;
    }
    // Clean replication server ports
    for (int i = 0; i < replServerPort.length; i++)
    {
      replServerPort[i] = 0;
    }
    Arrays.fill(replServerPort, 0);
    log("Successfully cleaned " + testCase);
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java
@@ -64,7 +64,6 @@
import org.opends.server.schema.DirectoryStringSyntax;
import org.opends.server.schema.IntegerSyntax;
import org.opends.server.types.*;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -510,8 +509,31 @@
   */
  protected void removeReplicationServerDB() {
    for (ReplicationServer rs : ReplicationServer.getAllInstances()) {
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
               rs.getDbDirName()));
      recursiveDelete(new File(DirectoryServer.getInstanceRoot(), rs.getDbDirName()));
    }
  }
  protected void remove(ReplicationServer... replicationServers)
  {
    for (ReplicationServer rs : replicationServers)
    {
      if (rs != null)
      {
        rs.clearDb();
        rs.remove();
        recursiveDelete(new File(DirectoryServer.getInstanceRoot(), rs.getDbDirName()));
      }
    }
  }
  protected void stop(ReplicationBroker... brokers)
  {
    for (ReplicationBroker broker : brokers)
    {
      if (broker != null)
      {
        broker.stop();
      }
    }
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/FractionalReplicationTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -56,7 +55,6 @@
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.replication.service.ReplicationDomain;
import org.opends.server.types.*;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -418,14 +416,8 @@
      fractionalDomainCfgEntry = null;
    }
    if (replicationServer != null)
    {
      replicationServer.clearDb();
      replicationServer.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 replicationServer.getDbDirName()));
      replicationServer = null;
    }
    remove(replicationServer);
    replicationServer = null;
  }
  /**
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/GroupIdHandshakeTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.io.IOException;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -36,14 +35,12 @@
import org.opends.messages.Message;
import org.opends.messages.Severity;
import org.opends.server.TestCaseUtils;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.server.ReplServerFakeConfiguration;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.DN;
import org.opends.server.types.HostPort;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
@@ -112,28 +109,11 @@
    // Clear any reference to a domain in synchro plugin
    MultimasterReplication.deleteDomain(DN.decode(TEST_ROOT_DN_STRING));
    rs1 = clear(rs1);
    rs2 = clear(rs2);
    rs3 = clear(rs3);
    rs1Port = -1;
    rs2Port = -1;
    rs3Port = -1;
    remove(rs1, rs2, rs3);
    rs1 = rs2 = rs3 = null;
    rs1Port = rs2Port = rs3Port = -1;
  }
  private ReplicationServer clear(ReplicationServer rs)
  {
    if (rs != null)
    {
      rs.clearDb();
      rs.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
          rs.getDbDirName()));
    }
    return null;
  }
  /**
   * Check connection of the provided replication domain to the provided
   * replication server. Waits for connection to be ok up to secTimeout seconds
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.SortedSet;
@@ -47,7 +46,6 @@
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.replication.service.ReplicationBroker;
import org.opends.server.types.*;
import org.opends.server.util.StaticUtils;
import org.opends.server.util.TimeThread;
import org.testng.annotations.Test;
@@ -217,9 +215,7 @@
    finally
    {
      MultimasterReplication.deleteDomain(baseDn);
      rs.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 rs.getDbDirName()));
      remove(rs);
    }
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.io.IOException;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -37,14 +36,12 @@
import org.opends.messages.Severity;
import org.opends.server.TestCaseUtils;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.server.ReplServerFakeConfiguration;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.DN;
import org.opends.server.types.HostPort;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
@@ -84,12 +81,9 @@
  private void initTest() throws IOException
  {
    rs1Port = -1;
    rs2Port = -1;
    rd1 = null;
    rd2 = null;
    rs1 = null;
    rs2 = null;
    rs1Port = rs2Port = -1;
    rd1 = rd2 = null;
    rs1 = rs2 = null;
    findFreePorts();
  }
@@ -109,24 +103,9 @@
    // Clear any reference to a domain in synchro plugin
    MultimasterReplication.deleteDomain(DN.decode(TEST_ROOT_DN_STRING));
    rs1 = clear(rs1);
    rs2 = clear(rs2);
    rs1Port = -1;
    rs2Port = -1;
  }
  private ReplicationServer clear(ReplicationServer rs)
  {
    if (rs != null)
    {
      rs.clearDb();
      rs.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
          rs.getDbDirName()));
    }
    return null;
    remove(rs1, rs2);
    rs1 = rs2 = null;
    rs1Port = rs2Port = -1;
  }
  /**
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerLoadBalancingTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.util.*;
import org.opends.messages.Category;
@@ -35,14 +34,12 @@
import org.opends.messages.Severity;
import org.opends.server.TestCaseUtils;
import org.opends.server.admin.std.server.ReplicationServerCfg;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.server.ReplServerFakeConfiguration;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.replication.server.ReplicationServerDomain;
import org.opends.server.types.DN;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
@@ -103,18 +100,9 @@
    // Clear any reference to a domain in synchro plugin
    MultimasterReplication.deleteDomain(DN.decode(TEST_ROOT_DN_STRING));
    for (int i = 0; i < NRS; i++)
    {
      if (rs[i] != null)
      {
        stopRs(i);
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 rs[i].getDbDirName()));
        rs[i] = null;
      }
      rsPort[i] = -1;
    }
    remove(rs);
    Arrays.fill(rs, null);
    Arrays.fill(rsPort, -1);
    debugInfo("endTest done");
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/StateMachineTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
@@ -57,7 +56,6 @@
import org.opends.server.types.Attribute;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
@@ -119,28 +117,10 @@
    // Clear any reference to a domain in synchro plugin
    MultimasterReplication.deleteDomain(EXAMPLE_DN_);
    if (ds2 != null)
    {
      ds2.stop();
      ds2 = null;
    }
     if (ds3 != null)
    {
      ds3.stop();
      ds3 = null;
    }
    if (rs1 != null)
    {
      rs1.clearDb();
      rs1.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 rs1.getDbDirName()));
      rs1 = null;
    }
    stop(ds2, ds3);
    ds2 = ds3 = null;
    remove(rs1);
    rs1 = null;
    rs1Port = -1;
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/TopologyViewTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.plugin;
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
@@ -38,7 +37,6 @@
import org.opends.server.TestCaseUtils;
import org.opends.server.admin.std.meta.ReplicationDomainCfgDefn.AssuredType;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.AssuredMode;
@@ -50,7 +48,6 @@
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.DN;
import org.opends.server.types.HostPort;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
@@ -213,36 +210,9 @@
    // Clear any reference to a domain in synchro plugin
    MultimasterReplication.deleteDomain(DN.decode(TEST_ROOT_DN_STRING));
    if (rs1 != null)
    {
      rs1.clearDb();
      rs1.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            rs1.getDbDirName()));
      rs1 = null;
    }
    if (rs2 != null)
    {
      rs2.clearDb();
      rs2.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            rs2.getDbDirName()));
      rs2 = null;
    }
    if (rs3 != null)
    {
      rs3.clearDb();
      rs3.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            rs3.getDbDirName()));
      rs3 = null;
    }
    rs1Port = -1;
    rs2Port = -1;
    rs3Port = -1;
    remove(rs1, rs2, rs3);
    rs1 = rs2 = rs3 = null;
    rs1Port = rs2Port = rs3Port = -1;
  }
  /**
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java
@@ -27,7 +27,6 @@
 */
package org.opends.server.replication.server;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
@@ -42,7 +41,6 @@
import org.opends.messages.Severity;
import org.opends.server.TestCaseUtils;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.*;
@@ -52,11 +50,12 @@
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.HostPort;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static java.util.Arrays.*;
import static org.opends.server.TestCaseUtils.*;
import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -74,10 +73,7 @@
  private String testName = this.getClass().getSimpleName();
  /** The tracer object for the debug logger */
  private static final DebugTracer TRACER = getTracer();
  private int rs1Port = -1;
  private int rs2Port = -1;
  private int rs3Port = -1;
  private int rs4Port = -1;
  private int[] rsPorts;
  private static final int FDS1_ID = 1;
  private static final int FDS2_ID = 2;
  private static final int FDS3_ID = 3;
@@ -98,18 +94,11 @@
  private static final int RS2_ID = 102;
  private static final int RS3_ID = 103;
  private static final int RS4_ID = 104;
  private FakeReplicationDomain fakeRd1 = null;
  private FakeReplicationDomain fakeRd2 = null;
  private FakeReplicationDomain fakeRd3 = null;
  private FakeReplicationDomain fakeRd4 = null;
  private FakeReplicationDomain fakeRd5 = null;
  private FakeReplicationDomain fakeRd6 = null;
  private FakeReplicationDomain fakeRd7 = null;
  private FakeReplicationDomain fakeRd8 = null;
  private FakeReplicationDomain fakeRd9 = null;
  private FakeReplicationDomain fakeRd10 = null;
  private FakeReplicationDomain fakeRd11 = null;
  private FakeReplicationDomain fakeRd12 = null;
  /**
   * We don't use index 0 to stay consistent with what old code was doing
   * <code>fakeRd1 == fakeRDs[1]</code>, etc.
   */
  private FakeReplicationDomain[] fakeRDs;
  private FakeReplicationServer fakeRs1 = null;
  private FakeReplicationServer fakeRs2 = null;
  private FakeReplicationServer fakeRs3 = null;
@@ -202,169 +191,48 @@
  {
    super.setUp();
    int[] ports = TestCaseUtils.findFreePorts(4);
    int i = 0;
    rs1Port = ports[i++];
    rs2Port = ports[i++];
    rs3Port = ports[i++];
    rs4Port = ports[i++];
    rsPorts = TestCaseUtils.findFreePorts(4);
  }
  private void initTest()
  {
    fakeRd1 = null;
    fakeRd2 = null;
    fakeRd3 = null;
    fakeRd4 = null;
    fakeRd5 = null;
    fakeRd6 = null;
    fakeRd7 = null;
    fakeRd8 = null;
    fakeRd9 = null;
    fakeRd10 = null;
    fakeRd11 = null;
    fakeRd12 = null;
    fakeRs1 = null;
    fakeRs2 = null;
    fakeRs3 = null;
    rs1 = null;
    rs2 = null;
    rs3 = null;
    rs4 = null;
    fakeRDs = new FakeReplicationDomain[13];
    fakeRs1 = fakeRs2 = fakeRs3 = null;
    rs1 = rs2 = rs3 = rs4 = null;
  }
  private void endTest()
  {
    // Shutdown fake DSs
    disableService(fakeRDs);
    Arrays.fill(fakeRDs, null);
    shutdown(fakeRs1, fakeRs2, fakeRs3);
    fakeRs1 = fakeRs2 = fakeRs3 = null;
    remove(rs1, rs2, rs3, rs4);
    rs1 = rs2 = rs3 = rs4 = null;
  }
    if (fakeRd1 != null)
  private void disableService(FakeReplicationDomain... fakeRDs)
  {
    for (FakeReplicationDomain fakeRd : fakeRDs)
    {
      fakeRd1.disableService();
      fakeRd1 = null;
    }
    if (fakeRd2 != null)
    {
      fakeRd2.disableService();
      fakeRd2 = null;
    }
    if (fakeRd3 != null)
    {
      fakeRd3.disableService();
      fakeRd3 = null;
    }
    if (fakeRd4 != null)
    {
      fakeRd4.disableService();
      fakeRd4 = null;
    }
    if (fakeRd5 != null)
    {
      fakeRd5.disableService();
      fakeRd5 = null;
    }
    if (fakeRd6 != null)
    {
      fakeRd6.disableService();
      fakeRd6 = null;
    }
    if (fakeRd7 != null)
    {
      fakeRd7.disableService();
      fakeRd7 = null;
    }
    if (fakeRd8 != null)
    {
      fakeRd8.disableService();
      fakeRd8 = null;
    }
    if (fakeRd9 != null)
    {
      fakeRd9.disableService();
      fakeRd9 = null;
    }
    if (fakeRd10 != null)
    {
      fakeRd10.disableService();
      fakeRd10 = null;
    }
    if (fakeRd11 != null)
    {
      fakeRd11.disableService();
      fakeRd11 = null;
    }
    if (fakeRd12 != null)
    {
      fakeRd12.disableService();
      fakeRd12 = null;
    }
    // Shutdown fake RSs
    if (fakeRs1 != null)
    {
      fakeRs1.shutdown();
      fakeRs1 = null;
    }
    if (fakeRs2 != null)
    {
      fakeRs2.shutdown();
      fakeRs2 = null;
    }
    if (fakeRs3 != null)
    {
      fakeRs3.shutdown();
      fakeRs3 = null;
    }
    // Shutdown RSs
    if (rs1 != null)
    {
      rs1.clearDb();
      rs1.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
               rs1.getDbDirName()));
      rs1 = null;
    }
    if (rs2 != null)
    {
      rs2.clearDb();
      rs2.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
               rs2.getDbDirName()));
      rs2 = null;
    }
    if (rs3 != null)
    {
      rs3.clearDb();
      rs3.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
               rs3.getDbDirName()));
      rs3 = null;
    }
    if (rs4 != null)
    {
      rs4.clearDb();
      rs4.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
               rs4.getDbDirName()));
      rs4 = null;
      if (fakeRd != null)
      {
        fakeRd.disableService();
      }
    }
  }
  private void shutdown(FakeReplicationServer... fakeRSs)
  {
    for (FakeReplicationServer fakeRs : fakeRSs)
    {
      if (fakeRs != null)
      {
        fakeRs.shutdown();
      }
    }
  }
  /**
   * Creates and connects a new fake replication domain, using the passed scenario
   * (no server state constructor version)
@@ -379,40 +247,9 @@
      assuredMode, safeDataLevel, assuredTimeout, scenario, new ServerState(), true, 100);
  }
  /**
   * Creates and connects a new fake replication domain, using the passed scenario.
   */
  private FakeReplicationDomain createFakeReplicationDomain(int serverId,
    int groupId, int rsId, long generationId, boolean assured,
    AssuredMode assuredMode, int safeDataLevel, long assuredTimeout,
    int scenario, ServerState serverState)
      throws Exception
  {
   return createFakeReplicationDomain(serverId, groupId, rsId, generationId, assured,
    assuredMode, safeDataLevel, assuredTimeout, scenario, serverState, true, 100);
  }
  private int getRsPort(int rsId)
  {
    int rsPort = -1;
    switch (rsId)
    {
      case RS1_ID:
        rsPort = rs1Port;
        break;
      case RS2_ID:
        rsPort = rs2Port;
        break;
      case RS3_ID:
        rsPort = rs3Port;
        break;
      case RS4_ID:
        rsPort = rs4Port;
        break;
      default:
        fail("Unknown RS id: " + rsId);
    }
    return rsPort;
    return rsPorts[rsId - 101];
  }
  /**
@@ -540,14 +377,14 @@
    SortedSet<String> replServers = new TreeSet<String>();
    if (totalNbRS >= 2)
    {
      addIfNotSame(replServers, rs1Port, excludedRsPort);
      addIfNotSame(replServers, rs2Port, excludedRsPort);
      addIfNotSame(replServers, rsPorts[0], excludedRsPort);
      addIfNotSame(replServers, rsPorts[1], excludedRsPort);
      if (totalNbRS >= 3)
      {
        addIfNotSame(replServers, rs3Port, excludedRsPort);
        addIfNotSame(replServers, rsPorts[2], excludedRsPort);
        if (totalNbRS >= 4)
        {
          addIfNotSame(replServers, rs4Port, excludedRsPort);
          addIfNotSame(replServers, rsPorts[3], excludedRsPort);
        }
      }
    }
@@ -1209,10 +1046,9 @@
      // Create and connect fake domain 1 to RS 1
      // Assured mode: SD, level 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, mainDsGid, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, mainDsGid, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_DATA_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      /*
       * Start one other fake DS
@@ -1226,10 +1062,9 @@
        // by mistake sends an assured error and expects an ack from this DS:
        // this would timeout. If main DS group id is not the same as the real RS one,
        // the update will even not come to real RS as assured
        fakeRd2 = createFakeReplicationDomain(FDS2_ID, otherFakeDsGid, RS1_ID,
        fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, otherFakeDsGid, RS1_ID,
          DEFAULT_GENID, false, AssuredMode.SAFE_DATA_MODE, 1, LONG_TIMEOUT,
          TIMEOUT_DS_SCENARIO);
        assertNotNull(fakeRd2);
      }
      /*
@@ -1246,10 +1081,10 @@
        // the update will even not come to real RS as assured
        fakeRs1 = createFakeReplicationServer(FRS1_ID, fakeRsGid, RS1_ID,
          DEFAULT_GENID, false, AssuredMode.SAFE_DATA_MODE, 1, new ServerState(), TIMEOUT_RS_SCENARIO);
        assertNotNull(fakeRs1);
      }
      // Send update from DS 1
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      long startTime = System.currentTimeMillis();
      fakeRd1.sendNewFakeUpdate();
@@ -1283,6 +1118,7 @@
      assertTrue(fakeRd1.receivedUpdatesOk());
      if (otherFakeDS)
      {
        final FakeReplicationDomain fakeRd2 = fakeRDs[2];
        assertEquals(fakeRd2.getReceivedUpdates(), 1);
        assertTrue(fakeRd2.receivedUpdatesOk());
      }
@@ -1558,10 +1394,9 @@
       */
      // Create and connect fake domain 1 to RS 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_DATA_MODE, sdLevel, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      /*
       * Start one other fake DS
@@ -1570,10 +1405,9 @@
      // Put another fake domain connected to real RS ?
      if (otherFakeDS)
      {
        fakeRd2 = createFakeReplicationDomain(FDS2_ID, otherFakeDsGid, RS1_ID,
        fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, otherFakeDsGid, RS1_ID,
          otherFakeDsGenId, false, AssuredMode.SAFE_DATA_MODE, sdLevel, LONG_TIMEOUT,
          TIMEOUT_DS_SCENARIO);
        assertNotNull(fakeRd2);
      }
      /*
@@ -1584,22 +1418,20 @@
      fakeRs1 = createFakeReplicationServer(FRS1_ID, fakeRs1Gid, RS1_ID,
        fakeRs1GenId, fakeRs1Gid == DEFAULT_GID, AssuredMode.SAFE_DATA_MODE, sdLevel,
        new ServerState(), fakeRs1Scen);
      assertNotNull(fakeRs1);
      // Put a fake RS 2 connected to real RS
      fakeRs2 = createFakeReplicationServer(FRS2_ID, fakeRs2Gid, RS1_ID,
        fakeRs2GenId, fakeRs2Gid == DEFAULT_GID, AssuredMode.SAFE_DATA_MODE, sdLevel,
        new ServerState(), fakeRs2Scen);
      assertNotNull(fakeRs2);
      // Put a fake RS 3 connected to real RS
      fakeRs3 = createFakeReplicationServer(FRS3_ID, fakeRs3Gid, RS1_ID,
        fakeRs3GenId, fakeRs3Gid == DEFAULT_GID, AssuredMode.SAFE_DATA_MODE, sdLevel,
        new ServerState(), fakeRs3Scen);
      assertNotNull(fakeRs3);
      // Wait for connections to be finished
      // DS must see expected numbers of fake DSs and RSs
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      waitForStableTopo(fakeRd1, (otherFakeDS ? 1 : 0), 4);
      /***********************************************************************
@@ -1730,6 +1562,9 @@
   */
  private void checkWhatHasBeenReceivedSafeData(int nSentUpdates, boolean otherFakeDS, long otherFakeDsGenId, long fakeRs1GenId, long fakeRs2GenId, long fakeRs3GenId, List<Integer> expectedServers)
  {
    final FakeReplicationDomain fakeRd1 = fakeRDs[1];
    final FakeReplicationDomain fakeRd2 = fakeRDs[2];
    // We should not receive our own update
    assertEquals(fakeRd1.getReceivedUpdates(), 0);
    assertTrue(fakeRd1.receivedUpdatesOk());
@@ -1780,10 +1615,7 @@
    else
      assertEquals(fakeRs.getReceivedUpdates(), nSentUpdates);
    assertTrue(fakeRs.receivedUpdatesOk());
    if (expectedServers.contains(fakeRsId))
      assertTrue(fakeRs.ackReplied());
    else
      assertFalse(fakeRs.ackReplied());
    assertEquals(fakeRs.ackReplied(), expectedServers.contains(fakeRsId));
  }
  /**
@@ -1793,6 +1625,7 @@
  private void checkTimeAndMonitoringSafeData(int nSentUpdates, int prevNAckUpdates, int prevNTimeoutUpdates, Map<Integer,Integer> prevNServerErrors, long sendUpdateTime,
    int nWishedServers, List<Integer> eligibleServers, List<Integer> expectedServers)
  {
    final FakeReplicationDomain fakeRd1 = fakeRDs[1];
    assertEquals(fakeRd1.getAssuredSdSentUpdates(), nSentUpdates);
    if (eligibleServers.size() >= nWishedServers) // Enough eligible servers
    {
@@ -2074,7 +1907,6 @@
      fakeRs2 = createFakeReplicationServer(FRS2_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_DATA_MODE, 10,
        new ServerState(), TIMEOUT_RS_SCENARIO);
      assertNotNull(fakeRs2);
      /*
       * Start fake RS to send updates
@@ -2084,7 +1916,6 @@
      fakeRs1 = createFakeReplicationServer(FRS1_ID, fakeRsGid, RS1_ID,
        fakeRsGenId, sendInAssured, AssuredMode.SAFE_DATA_MODE, sdLevel,
        new ServerState(), SENDER_RS_SCENARIO);
      assertNotNull(fakeRs1);
      /*
       * Send an assured update using configured assured parameters
@@ -2188,13 +2019,13 @@
      // Wait for RSs to connect together
      // Create and connect fake domain 1 to RS 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_DATA_MODE, sdLevel, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      // Wait for RSs connections to be finished
      // DS must see expected numbers of RSs
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      waitForStableTopo(fakeRd1, 0, 3);
      /*
@@ -2250,14 +2081,14 @@
      // Create and connect DS 1 to RS 1
      // Assured mode: SR
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      /*
       * Send a first assured safe read update
       */
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      long startTime = System.currentTimeMillis();
      fakeRd1.sendNewFakeUpdate();
      long sendUpdateTime = System.currentTimeMillis() - startTime;
@@ -2267,16 +2098,7 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      assertEquals(fakeRd1.getAssuredSrSentUpdates(), 1);
      assertEquals(fakeRd1.getAssuredSrAcknowledgedUpdates(), 1);
      assertEquals(fakeRd1.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      checkDSSentAndAcked(fakeRd1, 1);
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
@@ -2289,10 +2111,9 @@
      // Create and connect DS 2 to RS 1
      // Assured mode: SR
      ServerState serverState = fakeRd1.getServerState();
      fakeRd2 = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO, serverState);
      assertNotNull(fakeRd2);
        REPLY_OK_DS_SCENARIO, serverState, true, 100);
      // Wait for connections to be established
      waitForStableTopo(fakeRd1, 1, 1);
@@ -2309,27 +2130,10 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      assertEquals(fakeRd1.getAssuredSrSentUpdates(), 2);
      assertEquals(fakeRd1.getAssuredSrAcknowledgedUpdates(), 2);
      assertEquals(fakeRd1.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      checkDSSentAndAcked(fakeRd1, 2);
      assertEquals(fakeRd2.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdates(), 1);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesAcked(), 1);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesNotAcked(), 0);
      final FakeReplicationDomain fakeRd2 = fakeRDs[2];
      checkDSReceivedAndAcked(fakeRd2, 1);
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
@@ -2345,7 +2149,6 @@
      fakeRs1 = createFakeReplicationServer(FRS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1,
        fakeRd1.getServerState(), REPLY_OK_RS_SCENARIO);
      assertNotNull(fakeRs1);
      // Wait for connections to be established
      waitForStableTopo(fakeRd1, 1, 2);
@@ -2362,27 +2165,8 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      assertEquals(fakeRd1.getAssuredSrSentUpdates(), 3);
      assertEquals(fakeRd1.getAssuredSrAcknowledgedUpdates(), 3);
      assertEquals(fakeRd1.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      assertEquals(fakeRd2.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdates(), 2);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesAcked(), 2);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesNotAcked(), 0);
      checkDSSentAndAcked(fakeRd1, 3);
      checkDSReceivedAndAcked(fakeRd2, 2);
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
@@ -2400,7 +2184,6 @@
      // Shutdown fake DS 2
      fakeRd2.disableService();
      fakeRd2 = null;
      // Wait for disconnection to be finished
      waitForStableTopo(fakeRd1, 0, 2);
@@ -2417,16 +2200,7 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      assertEquals(fakeRd1.getAssuredSrSentUpdates(), 4);
      assertEquals(fakeRd1.getAssuredSrAcknowledgedUpdates(), 4);
      assertEquals(fakeRd1.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      checkDSSentAndAcked(fakeRd1, 4);
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
@@ -2458,16 +2232,7 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      assertEquals(fakeRd1.getAssuredSrSentUpdates(), 5);
      assertEquals(fakeRd1.getAssuredSrAcknowledgedUpdates(), 5);
      assertEquals(fakeRd1.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      checkDSSentAndAcked(fakeRd1, 5);
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
@@ -2576,50 +2341,41 @@
      /*
       * Start main DS 1 (the one which sends updates)
       */
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      /*
       * Start another fake DS 2 connected to RS
       */
      fakeRd2 = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd2);
      /*
       * Start another fake DS 3 connected to RS
       */
      fakeRd3 = createFakeReplicationDomain(FDS3_ID, otherFakeDsGid, RS1_ID,
      fakeRDs[3] = createFakeReplicationDomain(FDS3_ID, otherFakeDsGid, RS1_ID,
        otherFakeDsGenId, (otherFakeDsGid == DEFAULT_GID),
        AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        otherFakeDsScen);
      assertNotNull(fakeRd3);
      /*
       * Start fake RS (RS 1) connected to RS
       */
      fakeRs1 = createFakeReplicationServer(FRS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1,
        new ServerState(), REPLY_OK_RS_SCENARIO);
      assertNotNull(fakeRs1);
      /*
       * Start another fake RS (RS 2) connected to RS
       */
      fakeRs2 = createFakeReplicationServer(FRS2_ID, otherFakeRsGid, RS1_ID,
        otherFakeRsGenId, (otherFakeRsGid == DEFAULT_GID),
        AssuredMode.SAFE_READ_MODE, 1, new ServerState(), otherFakeRsScen);
      assertNotNull(fakeRs2);
      // Wait for connections to be established
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      waitForStableTopo(fakeRd1, 2, 3);
      /*
@@ -2758,19 +2514,12 @@
      // Check monitoring values in DS 2
      //
      assertEquals(fakeRd2.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdates(), 1);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesAcked(), 1);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesNotAcked(), 0);
      final FakeReplicationDomain fakeRd2 = fakeRDs[2];
      checkDSReceivedAndAcked(fakeRd2, 1);
      // Check monitoring values in DS 3
      //
      final FakeReplicationDomain fakeRd3 = fakeRDs[3];
      assertEquals(fakeRd3.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrNotAcknowledgedUpdates(), 0);
@@ -2917,15 +2666,15 @@
      // Wait for RSs to connect together
      // Create and connect fake domain 1 to RS 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      // Wait for connections to be finished
      // DS must see expected numbers of DSs/RSs
      // -> if everybody is connected we are sure a GENID is set in every RSs and
      // we can connect the fake RS with a different GENID
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      waitForStableTopo(fakeRd1, 0, 4);
      /*
@@ -2936,41 +2685,35 @@
      fakeRs1 = createFakeReplicationServer(FRS1_ID, DEFAULT_GID, RS1_ID,
        OTHER_GENID, false, AssuredMode.SAFE_READ_MODE, 1, new ServerState(),
        TIMEOUT_RS_SCENARIO);
      assertNotNull(fakeRs1);
      // Put a fake RS 2 connected to real RS 3 (different GID 2)
      fakeRs2 = createFakeReplicationServer(FRS2_ID, OTHER_GID_BIS, RS1_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, new ServerState(),
        TIMEOUT_RS_SCENARIO);
      assertNotNull(fakeRs2);
      /*
       * Start DSs that will receive and ack the updates from DS 1
       */
      // DS 2 connected to RS 1
      fakeRd2 = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd2);
      // DS 3 connected to RS 2
      fakeRd3 = createFakeReplicationDomain(FDS3_ID, DEFAULT_GID, RS2_ID,
      fakeRDs[3] = createFakeReplicationDomain(FDS3_ID, DEFAULT_GID, RS2_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd3);
      // DS 4 connected to RS 3
      fakeRd4 = createFakeReplicationDomain(FDS4_ID, DEFAULT_GID, RS3_ID,
      fakeRDs[4] = createFakeReplicationDomain(FDS4_ID, DEFAULT_GID, RS3_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd4);
      // DS 5 connected to RS 3
      fakeRd5 = createFakeReplicationDomain(FDS5_ID, DEFAULT_GID, RS3_ID,
      fakeRDs[5] = createFakeReplicationDomain(FDS5_ID, DEFAULT_GID, RS3_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd5);
      /*
       * Start DSs that will not receive updates from DS 1 as assured because
@@ -2978,28 +2721,24 @@
       */
      // DS 6 connected to RS 1
      fakeRd6 = createFakeReplicationDomain(FDS6_ID, OTHER_GID, RS1_ID,
      fakeRDs[6] = createFakeReplicationDomain(FDS6_ID, OTHER_GID, RS1_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd6);
      // DS 7 connected to RS 2
      fakeRd7 = createFakeReplicationDomain(FDS7_ID, OTHER_GID, RS2_ID,
      fakeRDs[7] = createFakeReplicationDomain(FDS7_ID, OTHER_GID, RS2_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd7);
      // DS 8 connected to RS 3
      fakeRd8 = createFakeReplicationDomain(FDS8_ID, OTHER_GID, RS3_ID,
      fakeRDs[8] = createFakeReplicationDomain(FDS8_ID, OTHER_GID, RS3_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd8);
      // DS 9 (GID 2) connected to RS 4
      fakeRd9 = createFakeReplicationDomain(FDS9_ID, OTHER_GID_BIS, RS4_ID,
      fakeRDs[9] = createFakeReplicationDomain(FDS9_ID, OTHER_GID_BIS, RS4_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd9);
      /*
       * Start DSs that will not receive updates from DS 1 because
@@ -3007,22 +2746,19 @@
       */
      // DS 10 connected to RS 1
      fakeRd10 = createFakeReplicationDomain(FDS10_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[10] = createFakeReplicationDomain(FDS10_ID, DEFAULT_GID, RS1_ID,
        OTHER_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd10);
      // DS 11 connected to RS 2
      fakeRd11 = createFakeReplicationDomain(FDS11_ID, DEFAULT_GID, RS2_ID,
      fakeRDs[11] = createFakeReplicationDomain(FDS11_ID, DEFAULT_GID, RS2_ID,
        OTHER_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd11);
      // DS 12 connected to RS 3
      fakeRd12 = createFakeReplicationDomain(FDS12_ID, DEFAULT_GID, RS3_ID,
      fakeRDs[12] = createFakeReplicationDomain(FDS12_ID, DEFAULT_GID, RS3_ID,
        OTHER_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd12);
      // Wait for connections to be finished
      // DS must see expected numbers of DSs/RSs
@@ -3043,62 +2779,20 @@
      checkDSSentAndAcked(fakeRd1, 1);
      //   normal DSs
      checkDSReceivedAndAcked(fakeRd2, 1);
      checkDSReceivedAndAcked(fakeRd3, 1);
      checkDSReceivedAndAcked(fakeRd4, 1);
      checkDSReceivedAndAcked(fakeRd5, 1);
      //   different GID DSs
      checkDSReceivedAndAcked(fakeRd6, 0);
      checkDSReceivedAndAcked(fakeRd7, 0);
      checkDSReceivedAndAcked(fakeRd8, 0);
      checkDSReceivedAndAcked(fakeRd9, 0);
      //   different GENID DSs
      checkDSReceivedAndAcked(fakeRd10, 0);
      checkDSReceivedAndAcked(fakeRd11, 0);
      checkDSReceivedAndAcked(fakeRd12, 0);
      assertFakeDSReceivedAndAcked(1, asList(2, 3, 4, 5)); // normal DSs
      assertFakeDSReceivedAndAcked(0, asList(6, 7, 8, 9)); // different GID DSs
      assertFakeDSReceivedAndAcked(0, asList(10, 11, 12)); // different GENID DSs
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
      assertTrue(fakeRd1.receivedUpdatesOk());
      //   normal DSs
      assertEquals(fakeRd2.getReceivedUpdates(), 1);
      assertTrue(fakeRd2.receivedUpdatesOk());
      assertEquals(fakeRd3.getReceivedUpdates(), 1);
      assertTrue(fakeRd3.receivedUpdatesOk());
      assertEquals(fakeRd4.getReceivedUpdates(), 1);
      assertTrue(fakeRd4.receivedUpdatesOk());
      assertEquals(fakeRd5.getReceivedUpdates(), 1);
      assertTrue(fakeRd5.receivedUpdatesOk());
      assertFakeRDNbReceivedUpdates(1, asList(2, 3, 4, 5)); // normal DSs
      assertFakeRDNbReceivedUpdates(1, asList(6, 7, 8, 9)); // different GID DSs
      assertFakeRDNbReceivedUpdates(0, asList(10, 11, 12)); // different GENID DSs
      //   different GID DSs
      assertEquals(fakeRd6.getReceivedUpdates(), 1);
      assertTrue(fakeRd6.receivedUpdatesOk());
      assertEquals(fakeRd7.getReceivedUpdates(), 1);
      assertTrue(fakeRd7.receivedUpdatesOk());
      assertEquals(fakeRd8.getReceivedUpdates(), 1);
      assertTrue(fakeRd8.receivedUpdatesOk());
      assertEquals(fakeRd9.getReceivedUpdates(), 1);
      assertTrue(fakeRd9.receivedUpdatesOk());
      //   different GENID DSs
      assertEquals(fakeRd10.getReceivedUpdates(), 0);
      assertTrue(fakeRd10.receivedUpdatesOk());
      assertEquals(fakeRd11.getReceivedUpdates(), 0);
      assertTrue(fakeRd11.receivedUpdatesOk());
      assertEquals(fakeRd12.getReceivedUpdates(), 0);
      assertTrue(fakeRd12.receivedUpdatesOk());
      //   fake RSs
      assertEquals(fakeRs1.getReceivedUpdates(), 0);
      assertTrue(fakeRs1.receivedUpdatesOk());
      assertFalse(fakeRs1.ackReplied());
      assertEquals(fakeRs2.getReceivedUpdates(), 1);
      assertTrue(fakeRs2.receivedUpdatesOk());
      assertFalse(fakeRs2.ackReplied());
      assertFakeRSNbReceivedUpdates(fakeRs1, 0);
      assertFakeRSNbReceivedUpdates(fakeRs2, 1);
      /*
       * Send a second update from DS 1 and check result
@@ -3115,68 +2809,50 @@
      checkDSSentAndAcked(fakeRd1, 2);
      //   normal DSs
      checkDSReceivedAndAcked(fakeRd2, 2);
      checkDSReceivedAndAcked(fakeRd3, 2);
      checkDSReceivedAndAcked(fakeRd4, 2);
      checkDSReceivedAndAcked(fakeRd5, 2);
      //   different GID DSs
      checkDSReceivedAndAcked(fakeRd6, 0);
      checkDSReceivedAndAcked(fakeRd7, 0);
      checkDSReceivedAndAcked(fakeRd8, 0);
      checkDSReceivedAndAcked(fakeRd9, 0);
      //   different GENID DSs
      checkDSReceivedAndAcked(fakeRd10, 0);
      checkDSReceivedAndAcked(fakeRd11, 0);
      checkDSReceivedAndAcked(fakeRd12, 0);
      assertFakeDSReceivedAndAcked(2, asList(2, 3, 4, 5)); // normal DSs
      assertFakeDSReceivedAndAcked(0, asList(6, 7, 8, 9)); // different GID DSs
      assertFakeDSReceivedAndAcked(0, asList(10, 11, 12)); // different GENID DSs
      // Sanity check
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
      assertTrue(fakeRd1.receivedUpdatesOk());
      //   normal DSs
      assertEquals(fakeRd2.getReceivedUpdates(), 2);
      assertTrue(fakeRd2.receivedUpdatesOk());
      assertEquals(fakeRd3.getReceivedUpdates(), 2);
      assertTrue(fakeRd3.receivedUpdatesOk());
      assertEquals(fakeRd4.getReceivedUpdates(), 2);
      assertTrue(fakeRd4.receivedUpdatesOk());
      assertEquals(fakeRd5.getReceivedUpdates(), 2);
      assertTrue(fakeRd5.receivedUpdatesOk());
      assertFakeRDNbReceivedUpdates(2, asList(2, 3, 4, 5)); // normal DSs
      assertFakeRDNbReceivedUpdates(2, asList(6, 7, 8, 9)); // different GID DSs
      assertFakeRDNbReceivedUpdates(0, asList(10, 11, 12)); // different GENID DSs
      //   different GID DSs
      assertEquals(fakeRd6.getReceivedUpdates(), 2);
      assertTrue(fakeRd6.receivedUpdatesOk());
      assertEquals(fakeRd7.getReceivedUpdates(), 2);
      assertTrue(fakeRd7.receivedUpdatesOk());
      assertEquals(fakeRd8.getReceivedUpdates(), 2);
      assertTrue(fakeRd8.receivedUpdatesOk());
      assertEquals(fakeRd9.getReceivedUpdates(), 2);
      assertTrue(fakeRd9.receivedUpdatesOk());
      //   different GENID DSs
      assertEquals(fakeRd10.getReceivedUpdates(), 0);
      assertTrue(fakeRd10.receivedUpdatesOk());
      assertEquals(fakeRd11.getReceivedUpdates(), 0);
      assertTrue(fakeRd11.receivedUpdatesOk());
      assertEquals(fakeRd12.getReceivedUpdates(), 0);
      assertTrue(fakeRd12.receivedUpdatesOk());
      //   fake RSs
      assertEquals(fakeRs1.getReceivedUpdates(), 0);
      assertTrue(fakeRs1.receivedUpdatesOk());
      assertFalse(fakeRs1.ackReplied());
      assertEquals(fakeRs2.getReceivedUpdates(), 2);
      assertTrue(fakeRs2.receivedUpdatesOk());
      assertFalse(fakeRs2.ackReplied());
      assertFakeRSNbReceivedUpdates(fakeRs1, 0);
      assertFakeRSNbReceivedUpdates(fakeRs2, 2);
    } finally
    {
      endTest();
    }
  }
  private void assertFakeDSReceivedAndAcked(int nPacket, List<Integer> fakeDSIndexes)
  {
    for (int i : fakeDSIndexes)
    {
      checkDSReceivedAndAcked(fakeRDs[i], nPacket);
    }
  }
  private void assertFakeRDNbReceivedUpdates(int expectedNbReceived, List<Integer> fakeDSIndexes)
  {
    for (int i : fakeDSIndexes)
    {
      assertEquals(fakeRDs[i].getReceivedUpdates(), expectedNbReceived);
      assertTrue(fakeRDs[i].receivedUpdatesOk());
    }
  }
  private void assertFakeRSNbReceivedUpdates(FakeReplicationServer fakeRs, int expectedNbReceived)
  {
    assertEquals(fakeRs.getReceivedUpdates(), expectedNbReceived);
    assertTrue(fakeRs.receivedUpdatesOk());
    assertFalse(fakeRs.ackReplied());
  }
  /** Helper method for some safe read test methods */
  private void checkDSReceivedAndAcked(FakeReplicationDomain fakeRd, int nPacket)
  {
@@ -3207,6 +2883,20 @@
    assertEquals(fakeRd.getAssuredSrReceivedUpdatesNotAcked(), 0);
  }
  private void checkDSNothingReceivedOrSent(final FakeReplicationDomain fakeRd)
  {
    assertEquals(fakeRd.getAssuredSrSentUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrAcknowledgedUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrNotAcknowledgedUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrTimeoutUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrWrongStatusUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrReplayErrorUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
    assertEquals(fakeRd.getAssuredSrReceivedUpdates(), 0);
    assertEquals(fakeRd.getAssuredSrReceivedUpdatesAcked(), 0);
    assertEquals(fakeRd.getAssuredSrReceivedUpdatesNotAcked(), 0);
  }
  /**
   * Test that a safe read update does not cross different group id topologies
   * in assured mode.
@@ -3245,42 +2935,38 @@
       */
      // DS 1 connected to RS 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      // DS 2 connected to RS 1
      fakeRd2 = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd2);
      /*
       * Start DSs with GID=OTHER_GID, connected to RS2
       */
      // DS 3 connected to RS 2
      fakeRd3 = createFakeReplicationDomain(FDS3_ID, OTHER_GID, RS2_ID,
      fakeRDs[3] = createFakeReplicationDomain(FDS3_ID, OTHER_GID, RS2_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd3);
      // DS 4 connected to RS 3
      fakeRd4 = createFakeReplicationDomain(FDS4_ID, OTHER_GID, RS2_ID,
      fakeRDs[4] = createFakeReplicationDomain(FDS4_ID, OTHER_GID, RS2_ID,
        DEFAULT_GENID, false, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO);
      assertNotNull(fakeRd4);
      // Wait for connections to be finished
      // DS must see expected numbers of DSs/RSs
      waitForStableTopo(fakeRd1, 3, 2);
      waitForStableTopo(fakeRDs[1], 3, 2);
      /*
       * Send update from DS 1 and check result
       */
      long startTime = System.currentTimeMillis();
      fakeRd1.sendNewFakeUpdate();
      fakeRDs[1].sendNewFakeUpdate();
      long sendUpdateTime = System.currentTimeMillis() - startTime;
      // Check call time
@@ -3289,41 +2975,21 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      checkDSSentAndAcked(fakeRd1, 1);
      checkDSSentAndAcked(fakeRDs[1], 1);
      checkDSReceivedAndAcked(fakeRDs[2], 1);
      checkDSNothingReceivedOrSent(fakeRDs[3]);
      checkDSNothingReceivedOrSent(fakeRDs[4]);
      checkDSReceivedAndAcked(fakeRd2, 1);
      assertEquals(fakeRd3.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd3.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd3.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd3.getAssuredSrReceivedUpdatesNotAcked(), 0);
      assertEquals(fakeRd4.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd4.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd4.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd4.getAssuredSrReceivedUpdatesNotAcked(), 0);
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
      assertTrue(fakeRd1.receivedUpdatesOk());
      assertEquals(fakeRd2.getReceivedUpdates(), 1);
      assertTrue(fakeRd2.receivedUpdatesOk());
      assertEquals(fakeRd3.getReceivedUpdates(), 1);
      assertTrue(fakeRd3.receivedUpdatesOk());
      assertEquals(fakeRd4.getReceivedUpdates(), 1);
      assertTrue(fakeRd4.receivedUpdatesOk());
      } finally
      assertEquals(fakeRDs[1].getReceivedUpdates(), 0);
      assertTrue(fakeRDs[1].receivedUpdatesOk());
      assertEquals(fakeRDs[2].getReceivedUpdates(), 1);
      assertTrue(fakeRDs[2].receivedUpdatesOk());
      assertEquals(fakeRDs[3].getReceivedUpdates(), 1);
      assertTrue(fakeRDs[3].receivedUpdatesOk());
      assertEquals(fakeRDs[4].getReceivedUpdates(), 1);
      assertTrue(fakeRDs[4].receivedUpdatesOk());
    }
    finally
    {
      endTest();
    }
@@ -3382,19 +3048,18 @@
       */
      // DS 1 connected to RS 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      // DS 2 connected to RS 2
      fakeRd2 = createFakeReplicationDomain(FDS2_ID, fakeDsGid, RS2_ID,
      fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, fakeDsGid, RS2_ID,
        fakeDsGenId, (fakeDsGid == DEFAULT_GID),
        AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT, fakeDsScen);
      assertNotNull(fakeRd2);
      // Wait for connections to be finished
      // DS must see expected numbers of DSs/RSs
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      waitForStableTopo(fakeRd1, 1, 2);
      /*
@@ -3417,6 +3082,7 @@
      // Check monitoring values (check that ack has been correctly received)
      Thread.sleep(500); // Sleep a while as counters are updated just after sending thread is unblocked
      final FakeReplicationDomain fakeRd2 = fakeRDs[2];
      if (fakeDsIsEligible)
      {
        switch (fakeDsScen)
@@ -3432,11 +3098,7 @@
            assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 1);
            assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
            assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
            Map<Integer, Integer> failedServer = fakeRd1.getAssuredSrServerNotAcknowledgedUpdates();
            assertEquals(failedServer.size(), 1);
            Integer nError = failedServer.get(FDS2_ID);
            assertNotNull(nError);
            assertEquals(nError.intValue(), 1);
            assertContainsOnly(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates(), FDS2_ID, 1);
            assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
            assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
            assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
@@ -3459,11 +3121,7 @@
            assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 0);
            assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
            assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 1);
            failedServer = fakeRd1.getAssuredSrServerNotAcknowledgedUpdates();
            assertEquals(failedServer.size(), 1);
            nError = failedServer.get(FDS2_ID);
            assertNotNull(nError);
            assertEquals(nError.intValue(), 1);
            assertContainsOnly(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates(), FDS2_ID, 1);
            assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
            assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
            assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
@@ -3524,7 +3182,7 @@
      // Create real RS
      String dir = testName + RS1_ID + testCase + "Db";
      ReplServerFakeConfiguration conf =
          new ReplServerFakeConfiguration(rs1Port, dir, 0, RS1_ID, 0, 100,
          new ReplServerFakeConfiguration(rsPorts[0], dir, 0, RS1_ID, 0, 100,
              new TreeSet<String>(), DEFAULT_GID, SMALL_TIMEOUT, 1);
      rs1 = new ReplicationServer(conf);
@@ -3533,19 +3191,18 @@
       */
      // DS 1 connected to RS 1
      fakeRd1 = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[1] = createFakeReplicationDomain(FDS1_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        TIMEOUT_DS_SCENARIO);
      assertNotNull(fakeRd1);
      // DS 2 connected to RS 1 with low window to easily put it in DEGRADED status
      fakeRd2 = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
      fakeRDs[2] = createFakeReplicationDomain(FDS2_ID, DEFAULT_GID, RS1_ID,
        DEFAULT_GENID, true, AssuredMode.SAFE_READ_MODE, 1, LONG_TIMEOUT,
        REPLY_OK_DS_SCENARIO, new ServerState(), false, 2);
      assertNotNull(fakeRd2);
      // Wait for connections to be finished
      // DS must see expected numbers of DSs/RSs
      final FakeReplicationDomain fakeRd1 = fakeRDs[1];
      waitForStableTopo(fakeRd1, 1, 1);
      List<DSInfo> dsInfos = fakeRd1.getReplicasList();
      DSInfo dsInfo = dsInfos.get(0);
@@ -3599,25 +3256,13 @@
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 4);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      Map<Integer, Integer> failedServer = fakeRd1.getAssuredSrServerNotAcknowledgedUpdates();
      assertEquals(failedServer.size(), 1);
      Integer nError = failedServer.get(FDS2_ID);
      assertNotNull(nError);
      assertEquals(nError.intValue(), 4);
      assertContainsOnly(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates(), FDS2_ID, 4);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      assertEquals(fakeRd2.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesNotAcked(), 0);
      final FakeReplicationDomain fakeRd2 = fakeRDs[2];
      checkDSNothingReceivedOrSent(fakeRd2);
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
      assertEquals(fakeRd1.getWrongReceivedUpdates(), 0);
@@ -3643,25 +3288,12 @@
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 4);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      failedServer = fakeRd1.getAssuredSrServerNotAcknowledgedUpdates();
      assertEquals(failedServer.size(), 1);
      nError = failedServer.get(FDS2_ID);
      assertNotNull(nError);
      assertEquals(nError.intValue(), 4);
      assertContainsOnly(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates(), FDS2_ID, 4);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
      assertEquals(fakeRd2.getAssuredSrSentUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrNotAcknowledgedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrTimeoutUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReplayErrorUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrServerNotAcknowledgedUpdates().size(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd2.getAssuredSrReceivedUpdatesNotAcked(), 0);
      checkDSNothingReceivedOrSent(fakeRd2);
      assertEquals(fakeRd1.getReceivedUpdates(), 0);
      assertEquals(fakeRd1.getWrongReceivedUpdates(), 0);
@@ -3706,11 +3338,7 @@
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 4);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      failedServer = fakeRd1.getAssuredSrServerNotAcknowledgedUpdates();
      assertEquals(failedServer.size(), 1);
      nError = failedServer.get(FDS2_ID);
      assertNotNull(nError);
      assertEquals(nError.intValue(), 4);
      assertContainsOnly(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates(), FDS2_ID, 4);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
@@ -3750,11 +3378,7 @@
      assertEquals(fakeRd1.getAssuredSrTimeoutUpdates(), 4);
      assertEquals(fakeRd1.getAssuredSrWrongStatusUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReplayErrorUpdates(), 0);
      failedServer = fakeRd1.getAssuredSrServerNotAcknowledgedUpdates();
      assertEquals(failedServer.size(), 1);
      nError = failedServer.get(FDS2_ID);
      assertNotNull(nError);
      assertEquals(nError.intValue(), 4);
      assertContainsOnly(fakeRd1.getAssuredSrServerNotAcknowledgedUpdates(), FDS2_ID, 4);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdates(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesAcked(), 0);
      assertEquals(fakeRd1.getAssuredSrReceivedUpdatesNotAcked(), 0);
@@ -3781,5 +3405,13 @@
      endTest();
    }
  }
}
  private void assertContainsOnly(Map<Integer, Integer> map, int key,
      int expectedValue)
  {
    assertEquals(map.size(), 1);
    final Integer nError = map.get(key);
    assertNotNull(nError);
    assertEquals(nError.intValue(), expectedValue);
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java
@@ -62,7 +62,6 @@
import org.opends.server.types.*;
import org.opends.server.util.LDIFWriter;
import org.opends.server.util.ServerConstants;
import org.opends.server.util.StaticUtils;
import org.opends.server.util.TimeThread;
import org.opends.server.workflowelement.externalchangelog.ECLSearchOperation;
import org.opends.server.workflowelement.externalchangelog.ECLWorkflowElement;
@@ -539,17 +538,6 @@
    }
  }
  private void stop(ReplicationBroker... brokers)
  {
    for (ReplicationBroker broker : brokers)
    {
      if (broker != null)
      {
        broker.stop();
      }
    }
  }
  /**
   * From embedded ECL (no remote session)
   * With empty RS, simple search should return only root entry.
@@ -2090,11 +2078,7 @@
   */
  private void shutdown() throws Exception
  {
    if (replicationServer != null) {
      replicationServer.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replicationServer.getDbDirName()));
    }
    remove(replicationServer);
    replicationServer = null;
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/MonitorTest.java
@@ -27,6 +27,10 @@
 */
package org.opends.server.replication.server;
import java.io.ByteArrayOutputStream;
import java.net.SocketException;
import java.util.*;
import org.opends.messages.Category;
import org.opends.messages.Message;
import org.opends.messages.Severity;
@@ -44,18 +48,9 @@
import org.opends.server.types.Attribute;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
import static org.opends.server.TestCaseUtils.*;
import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -436,49 +431,14 @@
  {
    debugInfo("Post test cleaning.");
    // Clean brokers
    if (broker2 != null)
      broker2.stop();
    broker2 = null;
    if (broker3 != null)
      broker3.stop();
    broker3 = null;
    if (broker4 != null)
      broker4.stop();
    broker4 = null;
    if (replServer1 != null)
    {
      replServer1.clearDb();
      replServer1.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 replServer1.getDbDirName()));
      replServer1 = null;
    }
    if (replServer2 != null)
    {
      replServer2.clearDb();
      replServer2.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 replServer2.getDbDirName()));
      replServer2 = null;
    }
    if (replServer3 != null)
    {
      replServer3.clearDb();
      replServer3.remove();
      StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
                 replServer3.getDbDirName()));
     replServer3 = null;
    }
    stop(broker2, broker3, broker4);
    broker2 = broker3 = broker4 = null;
    remove(replServer1, replServer2, replServer3);
    replServer1 = replServer2 = replServer3 = null;
    super.cleanRealEntries();
    // Clean replication server ports
    for (int i = 0; i < replServerPort.length; i++)
    {
      replServerPort[i] = 0;
    }
    Arrays.fill(replServerPort, 0);
    try
    {
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java
@@ -862,7 +862,7 @@
      }
      finally
      {
        removeRsAndChangeLog(changelogs);
        remove(changelogs);
        stop(broker1, broker2);
      }
    }
@@ -1751,31 +1751,9 @@
       }
       finally
       {
      removeRsAndChangeLog(changelogs);
      remove(changelogs);
      stop(broker1, broker2);
       }
  }
  private void stop(ReplicationBroker... brokers)
  {
    for (ReplicationBroker broker : brokers)
    {
      if (broker != null)
        broker.stop();
    }
  }
  private void removeRsAndChangeLog(ReplicationServer... replicationServers)
  {
    for (ReplicationServer rs : replicationServers)
    {
      if (rs != null)
      {
        rs.remove();
        recursiveDelete(new File(DirectoryServer.getInstanceRoot(), rs
            .getDbDirName()));
      }
    }
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/service/ReplicationDomainTest.java
@@ -27,14 +27,12 @@
 */
package org.opends.server.replication.service;
import java.io.File;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import org.opends.server.TestCaseUtils;
import org.opends.server.core.DirectoryServer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.DSInfo;
import org.opends.server.replication.common.RSInfo;
@@ -44,7 +42,6 @@
import org.opends.server.replication.server.ReplServerFakeConfiguration;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.types.DN;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -295,19 +292,6 @@
    }
  }
  private void remove(ReplicationServer... replServers)
  {
    for (ReplicationServer replServer : replServers)
    {
      if (replServer != null)
      {
        replServer.remove();
        StaticUtils.recursiveDelete(new File(DirectoryServer.getInstanceRoot(),
            replServer.getDbDirName()));
      }
    }
  }
  @DataProvider(name = "exportAndImportData")
  public Object[][] createExportAndimportData()
  {