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

Jean-Noel Rouvignac
03.52.2013 d4deff884919b9b9cc38253c025938a8c4784792
HistoricalTest failure: Code added a task but did not wait for it to complete before proceeding. Adding a wait should solve the problem.


ReplicationTestCase.java
Added executeTask().
Used simpler InternalConnection.process*() APIs.

HistoricalTest.java:
Used ReplicationTestCase.executeTask().
Inlined local variables.
Extracted method getEntryValue().
Changed signature of publishModify().

GenerationIdTest.java:
Used ReplicationTestCase.executeTask().
Renamed assertNoMessageReceivedBadGenId() to assertNoMessageReceived().

ReplicationServerTest.java
Used ReplicationTestCase.executeTask().


TestCaseUtils.java:
Used simpler InternalConnection.process*() APIs.

UpgradeTestCase.java
Renamed isOutputContainsExpectedMessage() to assertContainsMessage().

*Test.java:
Used assertj.
Let the exceptions go up.
7 files modified
465 ■■■■■ changed files
opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java 113 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/authorization/dseecompat/AciBodyTest.java 6 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java 45 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java 45 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalTest.java 115 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java 73 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/tools/UpgradeTestCase.java 68 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -58,7 +58,6 @@
import org.opends.server.protocols.asn1.ASN1;
import org.opends.server.protocols.asn1.ASN1Reader;
import org.opends.server.protocols.asn1.ASN1Writer;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.ldap.BindRequestProtocolOp;
import org.opends.server.protocols.ldap.BindResponseProtocolOp;
import org.opends.server.protocols.ldap.LDAPMessage;
@@ -71,6 +70,7 @@
import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.LDIFReader;
import static org.opends.server.protocols.internal.InternalClientConnection.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
import static org.testng.Assert.*;
@@ -222,27 +222,19 @@
   * @see #shutdownFakeServer() Matching method that must be called in the test
   *      tear down.
   */
  public static void startFakeServer()
  public static void startFakeServer() throws Exception
  {
    schemaBeforeStartingFakeServer = DirectoryServer.getSchema();
    DirectoryServer.setSchema(initializeInMemory(new Schema()));
  }
  private static Schema initializeInMemory(final Schema schema)
  private static Schema initializeInMemory(final Schema schema) throws Exception
  {
    try
    for (AttributeType attributeType : AttributeTypeConstants.ALL)
    {
      for (AttributeType attributeType : AttributeTypeConstants.ALL)
      {
        schema.registerAttributeType(attributeType, true);
      }
      return schema;
      schema.registerAttributeType(attributeType, true);
    }
    catch (DirectoryException e)
    {
      // rethrow this to fail the current test
      throw new RuntimeException(e);
    }
    return schema;
  }
  /**
@@ -251,18 +243,9 @@
   * subsequent attempts to start it will be ignored because it will already be
   * available.
   *
   * @throws  IOException  If a problem occurs while interacting with the
   *                       filesystem to prepare the test package root.
   *
   * @throws  InitializationException  If a problem occurs while starting the
   *                                   server.
   *
   * @throws  ConfigException  If there is a problem with the server
   *                           configuration.
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void startServer()
         throws IOException, InitializationException, ConfigException,
                DirectoryException
  public static void startServer() throws Exception
  {
    try {
      if (SERVER_STARTED)
@@ -513,19 +496,7 @@
      SERVER_STARTED = true;
      initializeTestBackend(true);
    } catch (IOException e) {
      e.printStackTrace(originalSystemErr);
      throw e;
    } catch (NumberFormatException e) {
      e.printStackTrace(originalSystemErr);
      throw e;
    } catch (InitializationException e) {
      e.printStackTrace(originalSystemErr);
      throw e;
    } catch (ConfigException e) {
      e.printStackTrace(originalSystemErr);
      throw e;
    } catch (DirectoryException e) {
    } catch (Exception e) {
      e.printStackTrace(originalSystemErr);
      throw e;
    }
@@ -823,12 +794,9 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void initializeTestBackend(boolean createBaseEntry)
         throws IOException, InitializationException, ConfigException,
                DirectoryException
  public static void initializeTestBackend(boolean createBaseEntry) throws Exception
  {
    initializeMemoryBackend(
        TEST_BACKEND_ID, TEST_ROOT_DN_STRING, createBaseEntry);
    initializeMemoryBackend(TEST_BACKEND_ID, TEST_ROOT_DN_STRING, createBaseEntry);
  }
  /**
@@ -847,8 +815,7 @@
      String backendID,
      String namingContext,
      boolean createBaseEntry
      ) throws IOException, InitializationException, ConfigException,
                DirectoryException
      ) throws Exception
  {
    startServer();
@@ -1293,16 +1260,9 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void addEntry(Entry entry)
         throws Exception
  public static void addEntry(Entry entry) throws Exception
  {
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    AddOperation addOperation = conn.processAdd(entry.getDN(),
                                     entry.getObjectClasses(),
                                     entry.getUserAttributes(),
                                     entry.getOperationalAttributes());
    AddOperation addOperation = getRootConnection().processAdd(entry);
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
@@ -1316,8 +1276,7 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void deleteEntry(Entry entry)
         throws Exception
  public static void deleteEntry(Entry entry) throws Exception
  {
    deleteEntry(entry.getDN());
  }
@@ -1330,13 +1289,9 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void deleteEntry(DN dn)
         throws Exception
  public static void deleteEntry(DN dn) throws Exception
  {
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    DeleteOperation deleteOperation = conn.processDelete(dn);
    DeleteOperation deleteOperation = getRootConnection().processDelete(dn);
    assertEquals(deleteOperation.getResultCode(), ResultCode.SUCCESS);
  }
@@ -1399,20 +1354,12 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void addEntry(String... lines)
         throws Exception
  public static void addEntry(String... lines) throws Exception
  {
    Entry entry = makeEntry(lines);
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    AddOperation addOperation = conn.processAdd(entry.getDN(),
                                     entry.getObjectClasses(),
                                     entry.getUserAttributes(),
                                     entry.getOperationalAttributes());
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS, addOperation
        .getErrorMessage().toString());
    AddOperation addOperation = getRootConnection().processAdd(entry);
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS,
        addOperation.getErrorMessage().toString());
  }
@@ -1427,18 +1374,10 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static ResultCode addEntryOperation(String... lines)
         throws Exception
  public static ResultCode addEntryOperation(String... lines) throws Exception
  {
    Entry entry = makeEntry(lines);
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    AddOperation addOperation = conn.processAdd(entry.getDN(),
                                     entry.getObjectClasses(),
                                     entry.getUserAttributes(),
                                     entry.getOperationalAttributes());
    AddOperation addOperation = getRootConnection().processAdd(entry);
    return addOperation.getResultCode();
  }
@@ -1452,8 +1391,7 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void addEntries(List<Entry> entries)
         throws Exception
  public static void addEntries(List<Entry> entries) throws Exception
  {
    for (Entry entry : entries)
    {
@@ -1473,8 +1411,7 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  public static void addEntries(String... lines)
         throws Exception
  public static void addEntries(String... lines) throws Exception
  {
    for (Entry entry : makeEntries(lines))
    {
opends/tests/unit-tests-testng/src/server/org/opends/server/authorization/dseecompat/AciBodyTest.java
@@ -26,8 +26,6 @@
 */
package org.opends.server.authorization.dseecompat;
import static org.assertj.core.api.Assertions.*;
import org.opends.server.DirectoryServerTestCase;
import org.opends.server.TestCaseUtils;
import org.testng.annotations.AfterClass;
@@ -35,12 +33,14 @@
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.*;
@SuppressWarnings("javadoc")
public class AciBodyTest extends DirectoryServerTestCase
{
  @BeforeClass
  public void setUp()
  public void setUp() throws Exception
  {
    TestCaseUtils.startFakeServer();
  }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
@@ -37,7 +37,6 @@
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.InternalSearchOperation;
@@ -551,11 +550,8 @@
   */
  private void checkChangelogSize(int expectedCount) throws Exception
  {
    SearchFilter filter = SearchFilter.createFilterFromString("(objectclass=*)");
    InternalSearchOperation searchOperation =
      connection.processSearch(DN.decode("dc=replicationchanges"),
          SearchScope.SUBORDINATE_SUBTREE,
          filter);
    InternalSearchOperation searchOperation = connection.processSearch(
        "dc=replicationchanges", SearchScope.SUBORDINATE_SUBTREE, "(objectclass=*)");
    if (debugEnabled())
    {
      if (searchOperation.getSearchEntries().size() != expectedCount)
@@ -652,17 +648,8 @@
      debugInfo(testCase + " ** TEST ** DS2 (bad genID) changes must be ignored.");
      broker2.publish(createAddMsg());
      try
      {
        broker3.receive();
        fail("No update message is supposed to be received here.");
      }
      catch (SocketTimeoutException expected)
      {
        // This is the expected result
        // Note that timeout should be lower than RS monitoring publisher period
        // so that timeout occurs
      }
      assertNoMessageReceived(broker3, "broker3",
          "Note that timeout should be lower than RS monitoring publisher period so that timeout occurs");
      //===========================================================
      debugInfo(testCase + " ** TEST ** The part of the topology with the right gen ID should work well");
@@ -742,8 +729,7 @@
          "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);
      executeTask(taskReset);
      // Broker 2 and 3 should receive 1 change status message to order them
      // to enter the bad gen id status
@@ -789,8 +775,8 @@
      Thread.sleep(500);
      checkChangelogSize(1);
      assertNoMessageReceivedBadGenId(broker2, "broker2");
      assertNoMessageReceivedBadGenId(broker3, "broker3");
      assertNoMessageReceived(broker2, "broker2", "bad gen id");
      assertNoMessageReceived(broker3, "broker3", "bad gen id");
      debugInfo("DS2 is publishing a change and RS1 must ignore this change, DS3 must not receive it.");
      AddMsg emsg = createAddMsg();
@@ -800,7 +786,7 @@
      Thread.sleep(500);
      checkChangelogSize(1);
      assertNoMessageReceivedBadGenId(broker3, "broker3");
      assertNoMessageReceived(broker3, "broker3", "bad gen id");
      //===============================================================
@@ -840,9 +826,7 @@
          "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);
      executeTask(taskReset);
      debugInfo("Verify that RS1 has still the right genID");
      assertEquals(replServer1.getGenerationId(baseDN), rgenId);
@@ -893,13 +877,14 @@
    }
  }
  private void assertNoMessageReceivedBadGenId(ReplicationBroker broker, String brokerName)
  private void assertNoMessageReceived(ReplicationBroker broker,
      String brokerName, String reason)
  {
    try
    {
      ReplicationMsg msg = broker.receive();
      fail("No update message is supposed to be received by " + brokerName
          + " with bad gen id. " + msg);
          + " reason='" + reason + "'. msg=" + msg);
    }
    catch (SocketTimeoutException expected)
    { /* expected */
@@ -999,8 +984,7 @@
        "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);
      executeTask(taskReset);
      Thread.sleep(500);
      debugInfo("Verifying that all replservers genIds have been reset.");
@@ -1019,8 +1003,7 @@
        "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);
      executeTask(taskReset);
      debugInfo("Verifying that all replservers genIds have been reset.");
      int waitRes = 0;
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ReplicationTestCase.java
@@ -39,8 +39,7 @@
import org.opends.server.backends.task.TaskState;
import org.opends.server.config.ConfigException;
import org.opends.server.core.AddOperation;
import org.opends.server.core.AddOperationBasis;
import org.opends.server.core.DeleteOperationBasis;
import org.opends.server.core.DeleteOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.internal.InternalClientConnection;
@@ -314,10 +313,7 @@
    if (dn.getParent().getRDN().toString().equalsIgnoreCase("cn=domains"))
      deleteEntry(DN.decode("cn=external changelog," + dn));
    DeleteOperationBasis op = new DeleteOperationBasis(connection,
        InternalClientConnection.nextOperationID(), InternalClientConnection.nextMessageID(),
        null, dn);
    op.run();
    DeleteOperation op = connection.processDelete(dn);
    assertTrue(op.getResultCode() == SUCCESS || op.getResultCode() == NO_SUCH_OBJECT,
        "Delete entry " + dn + " failed: " + op.getResultCode().getResultCodeName());
  }
@@ -755,6 +751,12 @@
    return new ReplSessionSecurity(null, null, null, true);
  }
  protected void executeTask(Entry taskEntry) throws Exception
  {
    addTask(taskEntry, ResultCode.SUCCESS, null);
    waitTaskState(taskEntry, TaskState.COMPLETED_SUCCESSFULLY, null);
  }
  /**
   * Add a task to the configuration of the current running DS.
   * @param taskEntry The task to add.
@@ -875,17 +877,7 @@
      for (String ldifEntry : ldifEntries)
      {
        Entry entry = TestCaseUtils.entryFromLdifString(ldifEntry);
        AddOperationBasis addOp = new AddOperationBasis(
            connection,
            InternalClientConnection.nextOperationID(),
            InternalClientConnection.nextMessageID(),
            null,
            entry.getDN(),
            entry.getObjectClasses(),
            entry.getUserAttributes(),
            entry.getOperationalAttributes());
        addOp.setInternalOperation(true);
        addOp.run();
        AddOperation addOp = connection.processAdd(entry);
        if (addOp.getResultCode() != ResultCode.SUCCESS)
        {
          TRACER.debugInfo("Failed to add entry " + entry.getDN() +
@@ -985,11 +977,11 @@
    assertTrue(session != null || broker != null, "One of Session or ReplicationBroker parameter must not be null");
    assertTrue(session == null || broker == null, "Only one of Session or ReplicationBroker parameter must not be null");
    int timeOut = 5000; // 5 seconds max to wait for the desired message
    long startTime = System.currentTimeMillis();
    long curTime = startTime;
    int nMsg = 0;
    while ((curTime - startTime) <= timeOut)
    final int timeOut = 5000; // 5 seconds max to wait for the desired message
    final long startTime = System.currentTimeMillis();
    final List<ReplicationMsg> msgs = new ArrayList<ReplicationMsg>();
    boolean timedOut = false;
    while (!timedOut)
    {
      ReplicationMsg replMsg = null;
      try
@@ -1015,13 +1007,12 @@
        return (T) replMsg;
      }
      TRACER.debugInfo("waitForSpecificMsg received : " + replMsg);
      nMsg++;
      curTime = System.currentTimeMillis();
      msgs.add(replMsg);
      timedOut = (System.currentTimeMillis() - startTime) > timeOut;
    }
    // Timeout
    fail("Failed to receive an expected " + msgType
        + " message after 5 seconds : also received " + nMsg
        + " other messages during wait time.");
    fail("Failed to receive an expected " + msgType + " message after 5 seconds."
        + " Also received the following messages during wait time: " + msgs);
    return null;
  }
}
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalTest.java
@@ -28,15 +28,14 @@
package org.opends.server.replication.plugin;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import org.assertj.core.api.Assertions;
import org.opends.server.TestCaseUtils;
import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.ldap.LDAPFilter;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.CSN;
import org.opends.server.replication.protocol.AddMsg;
@@ -176,10 +175,8 @@
    // Check that encoding and decoding preserves the history information.
    EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
    Attribute after = hist.encodeAndPurge();
    assertEquals(hist.getLastPurgedValuesCount(),0);
    assertEquals(after, before);
    assertEquals(hist.encodeAndPurge(), before);
    Thread.sleep(1000);
@@ -198,10 +195,9 @@
    entry = DirectoryServer.getEntry(dn);
    hist = EntryHistorical.newInstanceFromEntry(entry);
    hist.setPurgeDelay(testPurgeDelayInMillisec);
    after = hist.encodeAndPurge();
    // The purge time is not done so the hist attribute should be not empty
    assertTrue(!after.isEmpty());
    assertFalse(hist.encodeAndPurge().isEmpty());
    // Now wait for the purge time to be done
    Thread.sleep(testPurgeDelayInMillisec + 200);
@@ -211,8 +207,7 @@
    entry = DirectoryServer.getEntry(dn);
    hist = EntryHistorical.newInstanceFromEntry(entry);
    hist.setPurgeDelay(testPurgeDelayInMillisec);
    after = hist.encodeAndPurge();
    assertTrue(after.isEmpty());
    assertTrue(hist.encodeAndPurge().isEmpty());
    assertEquals(hist.getLastPurgedValuesCount(),11);
  }
@@ -261,10 +256,7 @@
       );
    // Read the entry back to get its UUID.
    Entry entry = DirectoryServer.getEntry(dn1);
    List<Attribute> attrs = entry.getAttribute(entryuuidType);
    String entryuuid =
         attrs.get(0).iterator().next().getValue().toString();
    String entryuuid = getEntryValue(dn1, entryuuidType);
    // Add the second test entry.
    TestCaseUtils.addEntry(
@@ -279,10 +271,7 @@
       );
    // Read the entry back to get its UUID.
    entry = DirectoryServer.getEntry(dn2);
    attrs = entry.getAttribute(entryuuidType);
    String entryuuid2 =
         attrs.get(0).iterator().next().getValue().toString();
    String entryuuid2 = getEntryValue(dn2, entryuuidType);
    long now = System.currentTimeMillis();
    // A change on a first server.
@@ -295,9 +284,7 @@
    // happen on one server.
    // Replay an add of a value A at time t1 on a first server.
    Attribute attr = Attributes.create(attrType.getNormalizedPrimaryName(), "A");
    Modification mod = new Modification(ModificationType.ADD, attr);
    publishModify(broker, t1, dn1, entryuuid, mod);
    publishModify(broker, t1, dn1, entryuuid, attrType, "A");
    // It would be nice to avoid these sleeps.
    // We need to preserve the replay order but the order could be changed
@@ -307,9 +294,7 @@
    Thread.sleep(2000);
    // Replay an add of a value B at time t2 on a second server.
    attr = Attributes.create(attrType.getNormalizedPrimaryName(), "B");
    mod = new Modification(ModificationType.ADD, attr);
    publishModify(broker, t2, dn1, entryuuid, mod);
    publishModify(broker, t2, dn1, entryuuid, attrType, "B");
    // Simulate the reverse ordering t2:add:B followed by t1:add:A that
    // would happen on the other server.
@@ -317,51 +302,44 @@
    t1 = new CSN(now+3,  0,  3);
    t2 = new CSN(now+4,  0,  4);
    // Replay an add of a value B at time t2 on a second server.
    attr = Attributes.create(attrType.getNormalizedPrimaryName(), "B");
    mod = new Modification(ModificationType.ADD, attr);
    publishModify(broker, t2, dn2, entryuuid2, mod);
    publishModify(broker, t2, dn2, entryuuid2, attrType, "B");
    Thread.sleep(2000);
    // Replay an add of a value A at time t1 on a first server.
    attr = Attributes.create(attrType.getNormalizedPrimaryName(), "A");
    mod = new Modification(ModificationType.ADD, attr);
    publishModify(broker, t1, dn2, entryuuid2, mod);
    publishModify(broker, t1, dn2, entryuuid2, attrType, "A");
    Thread.sleep(2000);
    // Read the first entry to see how the conflict was resolved.
    entry = DirectoryServer.getEntry(dn1);
    attrs = entry.getAttribute(attrType);
    String attrValue1 =
         attrs.get(0).iterator().next().getValue().toString();
    // Read the second entry to see how the conflict was resolved.
    entry = DirectoryServer.getEntry(dn2);
    attrs = entry.getAttribute(attrType);
    String attrValue2 =
         attrs.get(0).iterator().next().getValue().toString();
    // See how the conflicts were resolved.
    // The two values should be the first value added.
    assertEquals(attrValue1, "A");
    assertEquals(attrValue2, "A");
    assertEquals(getEntryValue(dn1, attrType), "A");
    assertEquals(getEntryValue(dn2, attrType), "A");
    TestCaseUtils.deleteEntry(DN.decode("cn=test1," + TEST_ROOT_DN_STRING));
    TestCaseUtils.deleteEntry(DN.decode("cn=test2," + TEST_ROOT_DN_STRING));
}
    TestCaseUtils.deleteEntry(dn1);
    TestCaseUtils.deleteEntry(dn2);
  }
  private static
  void publishModify(ReplicationBroker broker, CSN changeNum,
                     DN dn, String entryuuid, Modification mod)
  private String getEntryValue(final DN dn, final AttributeType attrType)
      throws Exception
  {
    Entry entry = DirectoryServer.getEntry(dn);
    List<Attribute> attrs = entry.getAttribute(attrType);
    return attrs.get(0).iterator().next().getValue().toString();
  }
  private static void publishModify(ReplicationBroker broker, CSN changeNum,
      DN dn, String entryuuid, AttributeType attrType, String newValue)
  {
    Attribute attr = Attributes.create(attrType.getNormalizedPrimaryName(), newValue);
    Modification mod = new Modification(ModificationType.ADD, attr);
    List<Modification> mods = new ArrayList<Modification>(1);
    mods.add(mod);
    broker.publish(new ModifyMsg(changeNum, dn, mods, entryuuid));
  }
  /**
   * Test that historical information is correctly added when performaing ADD,
   * Test that historical information is correctly added when performing ADD,
   * MOD and MODDN operations.
   */
  @Test()
@@ -471,19 +449,20 @@
        // - the dn should be dn1,
        // - the entry id and the parent id should match the ids from the entry
        FakeAddOperation addOp = (FakeAddOperation) op;
        assertTrue(addOp.getCSN() != null);
        assertNotNull(addOp.getCSN());
        AddMsg addmsg = addOp.generateMessage();
        assertEquals(dn1, addmsg.getDN());
        assertEquals(addmsg.getEntryUUID(), EntryHistorical.getEntryUUID(entry));
        String parentId = LDAPReplicationDomain.findEntryUUID(dn1.getParent());
        assertEquals(addmsg.getParentEntryUUID(), parentId);
        addmsg.createOperation(InternalClientConnection.getRootConnection());
      }
      else if (count == 1)
      else
      {
          // The first operation should be an ADD operation.
          fail("FakeAddOperation was not correctly generated"
              + " from historical information");
        // The first operation should be an ADD operation.
        assertTrue(count != 1,
            "FakeAddOperation was not correctly generated from historical information");
      }
    }
@@ -495,8 +474,8 @@
   * entry.
   * Steps :
   * - creates entry containing historical
   * - wait for the pruge delay
   * - lauch the purge task
   * - wait for the purge delay
   * - launch the purge task
   * - verify that all historical has been purged
   *
   * TODO: another test should be written that configures the task no NOT have
@@ -534,21 +513,14 @@
        "ds-task-purge-conflicts-historical-domain-dn: "+TEST_ROOT_DN_STRING,
    "ds-task-purge-conflicts-historical-maximum-duration: 120"); // 120 sec
    addTask(taskInit, ResultCode.SUCCESS, null);
    executeTask(taskInit);
    // every entry should be purged from its hist
      // Search for matching entries in config backend
      InternalSearchOperation op = connection.processSearch(
          ByteString.valueOf(TEST_ROOT_DN_STRING),
          SearchScope.WHOLE_SUBTREE,
          LDAPFilter.decode("(ds-sync-hist=*)"));
      assertEquals(op.getResultCode(), ResultCode.SUCCESS,
          op.getErrorMessage().toString());
      // Check that no entries have been found
      LinkedList<SearchResultEntry> entries = op.getSearchEntries();
      assertTrue(entries != null);
      assertEquals(entries.size(), 0);
    InternalSearchOperation op = connection.processSearch(
        TEST_ROOT_DN_STRING, SearchScope.WHOLE_SUBTREE, "(ds-sync-hist=*)");
    assertEquals(op.getResultCode(), ResultCode.SUCCESS, op.getErrorMessage().toString());
    Assertions.assertThat(op.getSearchEntries()).isEmpty();
  }
  /**
@@ -556,8 +528,7 @@
   * @param dnSuffix A suffix to be added to the dn
   * @param entryCnt The number of entries to create
   */
  private void addEntriesWithHistorical(int dnSuffix, int entryCnt)
  throws Exception
  private void addEntriesWithHistorical(int dnSuffix, int entryCnt) throws Exception
  {
    for (int i=0; i<entryCnt;i++)
    {
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java
@@ -37,7 +37,6 @@
import org.assertj.core.api.Assertions;
import org.opends.server.TestCaseUtils;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.backends.task.TaskState;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ModifyDNOperationBasis;
import org.opends.server.loggers.debug.DebugTracer;
@@ -279,9 +278,7 @@
  private void assertDeleteMsgBodyEquals(DeleteMsg sentMsg, ReplicationMsg receivedMsg)
  {
    assertTrue(receivedMsg instanceof DeleteMsg,
        "ReplicationServer basic : incorrect message type received: "
            + receivedMsg.getClass() + ": content: " + receivedMsg);
    Assertions.assertThat(receivedMsg).isInstanceOf(DeleteMsg.class);
    assertEquals(receivedMsg.toString(), sentMsg.toString(),
        "ReplicationServer basic : incorrect message body received. CSN is same as \""
            + getCSNFieldName(((DeleteMsg) receivedMsg).getCSN()) + "\" field.");
@@ -378,16 +375,10 @@
   */
  private void assertDeleteMsgCSNEquals(ReplicationMsg msg, CSN nextCSN, String msgNumber)
  {
    if (msg instanceof DeleteMsg)
    {
      DeleteMsg del = (DeleteMsg) msg;
      assertEquals(del.getCSN(), nextCSN, "The " + msgNumber
          + " message received by a new client was the wrong one.");
    }
    else
    {
      fail("ReplicationServer basic transmission failed:" + msg);
    }
    Assertions.assertThat(msg).isInstanceOf(DeleteMsg.class);
    DeleteMsg del = (DeleteMsg) msg;
    assertEquals(del.getCSN(), nextCSN, "The " + msgNumber
        + " message received by a new client was the wrong one.");
  }
  /**
@@ -940,7 +931,7 @@
      // Read the TopologyMsg that should come back.
      ReplicationMsg repMsg = session.receive();
      assertTrue(repMsg instanceof TopologyMsg);
      Assertions.assertThat(repMsg).isInstanceOf(TopologyMsg.class);
      // Now comes the real test : check that the Replication Server
      // answers correctly to a WindowProbeMsg Message.
@@ -1115,31 +1106,28 @@
     Entry backupTask = createBackupTask();
     Entry restoreTask = createRestoreTask();
     addTask(backupTask, ResultCode.SUCCESS, null);
     waitTaskState(backupTask, TaskState.COMPLETED_SUCCESSFULLY, null);
     addTask(restoreTask, ResultCode.SUCCESS, null);
     waitTaskState(restoreTask, TaskState.COMPLETED_SUCCESSFULLY, null);
    executeTask(backupTask);
    executeTask(restoreTask);
     debugInfo("Ending backupRestore");
   }
   /*
   /**
    * Test export of the Replication server backend
    * - Creates 2 brokers connecting to the replication for 2 differents baseDN
    * - Creates 2 brokers connecting to the replication for 2 different baseDN
    * - Make these brokers publish changes to the replication server
    * - Launch a full export
    * - Launch a partial export on one of the 2 domains
    */
    private void exportBackend() throws Exception
    {
  private void exportBackend() throws Exception
  {
      debugInfo("Starting exportBackend");
      ReplicationBroker server1 = null;
      ReplicationBroker server2 = null;
      try
      {
    try
    {
        server1 = openReplicationSession(TEST_ROOT_DN,
            1, 100, replicationServerPort, 1000, true);
        server2 = openReplicationSession(DN.decode("dc=domain2,dc=com"),
@@ -1153,30 +1141,25 @@
        publishAll(server2, createChanges("dc=domain2,dc=com",  2));
        debugInfo("Export all");
        Entry exportTask = createExportAllTask();
        addTask(exportTask, ResultCode.SUCCESS, null);
        waitTaskState(exportTask, TaskState.COMPLETED_SUCCESSFULLY, null);
        // Not doing anything with the export file, let's delete it
        File f = new File(DirectoryServer.getInstanceRoot(),exportLDIFAllFile);
        f.delete();
      executeTask(createExportAllTask());
      // Not doing anything with the export file, let's delete it
      new File(DirectoryServer.getInstanceRoot(), exportLDIFAllFile).delete();
        debugInfo("Export domain");
        exportTask = createExportDomainTask("dc=domain2,dc=com");
        addTask(exportTask, ResultCode.SUCCESS, null);
        waitTaskState(exportTask, TaskState.COMPLETED_SUCCESSFULLY, null);
      executeTask(createExportDomainTask("dc=domain2,dc=com"));
      if (exportLDIFDomainFile != null)
      {
        // Not doing anything with the export file, let's delete it
        if (exportLDIFDomainFile != null)
        {
          File aFile = new File(DirectoryServer.getInstanceRoot(),
                  exportLDIFDomainFile);
          aFile.delete();
        }
      } finally {
      stop(server1, server2);
        new File(DirectoryServer.getInstanceRoot(), exportLDIFDomainFile).delete();
      }
      debugInfo("Ending export");
    }
    finally
    {
      stop(server1, server2);
    }
    debugInfo("Ending export");
  }
  private Entry createBackupTask() throws Exception
  {
opends/tests/unit-tests-testng/src/server/org/opends/server/tools/UpgradeTestCase.java
@@ -28,32 +28,29 @@
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.LinkedList;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.opends.messages.Message;
import org.opends.server.TestCaseUtils;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.server.tools.upgrade.UpgradeCli;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.tools.ToolConstants.OPTION_LONG_FORCE_UPGRADE;
import static org.opends.server.tools.ToolConstants.*;
import static org.testng.Assert.*;
/**
 * A set of test cases for the Upgrade tool.
 */
@SuppressWarnings("javadoc")
public class UpgradeTestCase extends ToolsTestCase
{
  private final static String configFilePath = DirectoryServer
      .getInstanceRoot()
  private final static String configFilePath = DirectoryServer.getInstanceRoot()
      + File.separator + "config" + File.separator + "config.ldif";
  /**
@@ -83,7 +80,6 @@
    }
    final String[] mainArgs = new String[argsList.size()];
    argsList.toArray(mainArgs);
    return mainArgs;
  }
@@ -94,13 +90,12 @@
   *          The upgrade's output.
   * @param expectedMessage
   *          The expected message.
   * @return {@code true} if the output contains the expected message.
   */
  private boolean isOutputContainsExpectedMessage(final String output,
      final Message expectedMessage)
  private void assertContainsMessage(String output, Message expectedMessage)
  {
    return (output.replaceAll("\n", " ").replaceAll("%s", " ").indexOf(
        expectedMessage.toString().replaceAll("\n", " ").replaceAll("%s", " ")) != -1);
    String out = output.replaceAll("\n", " ").replaceAll("%s", " ");
    String expected = expectedMessage.toString().replaceAll("\n", " ").replaceAll("%s", " ");
    Assertions.assertThat(out).contains(expected);
  }
  /**
@@ -116,9 +111,7 @@
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("--help"), true, ps, ps), 0);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          INFO_UPGRADE_DESCRIPTION_CLI.get()));
      assertContainsMessage(baos.toString(), INFO_UPGRADE_DESCRIPTION_CLI.get());
    }
    finally
    {
@@ -139,9 +132,7 @@
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("-H"), true, ps, ps), 0);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          INFO_UPGRADE_DESCRIPTION_CLI.get()));
      assertContainsMessage(baos.toString(), INFO_UPGRADE_DESCRIPTION_CLI.get());
    }
    finally
    {
@@ -162,9 +153,7 @@
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("-?"), true, ps, ps), 0);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          INFO_UPGRADE_DESCRIPTION_CLI.get()));
      assertContainsMessage(baos.toString(), INFO_UPGRADE_DESCRIPTION_CLI.get());
    }
    finally
    {
@@ -185,9 +174,7 @@
    {
      // The 'main' should exit with an error code.
      assertEquals(UpgradeCli.main(setArgs("-- wrong"), true, ps, ps), 1);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          ERR_ERROR_PARSING_ARGS.get("")));
      assertContainsMessage(baos.toString(), ERR_ERROR_PARSING_ARGS.get(""));
    }
    finally
    {
@@ -208,9 +195,7 @@
    {
      // The 'main' should exit with an error code.
      assertEquals(UpgradeCli.main(setArgs("--wrong"), true, ps, ps), 1);
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          ERR_ERROR_PARSING_ARGS.get("")));
      assertContainsMessage(baos.toString(), ERR_ERROR_PARSING_ARGS.get(""));
    }
    finally
    {
@@ -233,11 +218,8 @@
      assertEquals(UpgradeCli.main(setArgs("--force"), true, ps, ps), 1);
      // Because interactive mode is not compatible with force upgrade mode.
      final Message message =
          ERR_UPGRADE_INCOMPATIBLE_ARGS.get(OPTION_LONG_FORCE_UPGRADE,
              "interactive mode");
      assertTrue(isOutputContainsExpectedMessage(baos.toString(), message));
      assertContainsMessage(baos.toString(), ERR_UPGRADE_INCOMPATIBLE_ARGS.get(
          OPTION_LONG_FORCE_UPGRADE, "interactive mode"));
    }
    finally
    {
@@ -247,16 +229,9 @@
  /**
   * Upgrade tool allows use of force and no-prompt sub-commands.
   *
   * @throws IOException
   * @throws DirectoryException
   * @throws ConfigException
   * @throws InitializationException
   */
  @Test()
  public void testUpgradeToolAllowsNonInteractiveAndForce()
      throws InitializationException, ConfigException, DirectoryException,
      IOException
  public void testUpgradeToolAllowsNonInteractiveAndForce() throws Exception
  {
    TestCaseUtils.startServer();
@@ -265,20 +240,17 @@
    try
    {
      // The 'main' should exit with success code.
      assertEquals(UpgradeCli.main(setArgs("--force", "--no-prompt"), true, ps,
          ps), 0);
      int rc = UpgradeCli.main(setArgs("--force", "--no-prompt"), true, ps, ps);
      assertEquals(rc, 0);
      // The sub-commands have been checked ok but upgrade must exist on
      // version's verification.
      assertTrue(isOutputContainsExpectedMessage(baos.toString(),
          ERR_UPGRADE_VERSION_UP_TO_DATE.get("")));
      assertContainsMessage(baos.toString(), ERR_UPGRADE_VERSION_UP_TO_DATE.get(""));
    }
    finally
    {
      StaticUtils.close(ps, baos);
      TestCaseUtils
          .shutdownServer("testUpgradeToolAllowsNonInteractiveAndForce");
      TestCaseUtils.shutdownServer("testUpgradeToolAllowsNonInteractiveAndForce");
    }
  }
}