From a11a0561f324860f1381a3b57212e20ede1ad05f Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 03 Sep 2015 14:06:47 +0000
Subject: [PATCH] Fix randomness in ChangelogBackendTestCase

---
 opendj-server-legacy/src/main/java/org/opends/server/controls/ExternalChangelogRequestControl.java      |    7 ++-
 opendj-server-legacy/src/test/java/org/opends/server/replication/common/MultiDomainServerStateTest.java |   43 ++++++++++++++++-----
 opendj-server-legacy/src/main/java/org/opends/server/replication/common/MultiDomainServerState.java     |   24 ++++++++++-
 opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java             |   16 +++++---
 4 files changed, 68 insertions(+), 22 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/controls/ExternalChangelogRequestControl.java b/opendj-server-legacy/src/main/java/org/opends/server/controls/ExternalChangelogRequestControl.java
index 56c8985..f15db47 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/controls/ExternalChangelogRequestControl.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/controls/ExternalChangelogRequestControl.java
@@ -110,12 +110,13 @@
   }
 
   /**
-   * Returns the cookie value.
-   * @return The cookie value.
+   * Returns a copy of the cookie value.
+   *
+   * @return a copy of the cookie value
    */
   public MultiDomainServerState getCookie()
   {
-    return this.cookie;
+    return new MultiDomainServerState(cookie);
   }
 
   @Override
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/common/MultiDomainServerState.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/common/MultiDomainServerState.java
index 0de1556..2edf41b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/common/MultiDomainServerState.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/common/MultiDomainServerState.java
@@ -64,13 +64,31 @@
   }
 
   /**
+   * Copy constructor.
+   *
+   * @param cookie
+   *          the cookie to copy
+   */
+  public MultiDomainServerState(MultiDomainServerState cookie)
+  {
+    list = new ConcurrentSkipListMap<>();
+
+    for (Map.Entry<DN, ServerState> mapEntry : cookie.list.entrySet())
+    {
+      DN dn = mapEntry.getKey();
+      ServerState state = mapEntry.getValue();
+      list.put(dn, state.duplicate());
+    }
+  }
+
+  /**
    * Create an object from a string representation.
-   * @param mdss The provided string representation of the state.
+   * @param cookie The provided string representation of the state.
    * @throws DirectoryException when the string has an invalid format
    */
-  public MultiDomainServerState(String mdss) throws DirectoryException
+  public MultiDomainServerState(String cookie) throws DirectoryException
   {
-    list = new ConcurrentSkipListMap<>(splitGenStateToServerStates(mdss));
+    list = new ConcurrentSkipListMap<>(splitGenStateToServerStates(cookie));
   }
 
   /**
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java
index 6768755..1581ded 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java
@@ -52,6 +52,7 @@
 import java.util.SortedSet;
 import java.util.concurrent.Callable;
 
+import org.assertj.core.api.SoftAssertions;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ModificationType;
@@ -1119,7 +1120,7 @@
   }
 
   private InternalSearchOperation searchChangelog(final SearchRequest request, final int expectedNbEntries,
-      ResultCode expectedResultCode, String testName) throws Exception
+      final ResultCode expectedResultCode, String testName) throws Exception
   {
     TestTimer timer = new TestTimer.Builder()
       .maxSleep(5, SECONDS)
@@ -1131,15 +1132,18 @@
       public InternalSearchOperation call() throws Exception
       {
         InternalSearchOperation searchOp = connection.processSearch(request);
-        assertThat(searchOp.getSearchEntries()).hasSize(expectedNbEntries);
+
+        final SoftAssertions softly = new SoftAssertions();
+        softly.assertThat(searchOp.getResultCode()).as(searchOp.getErrorMessage().toString())
+            .isEqualTo(expectedResultCode);
+        softly.assertThat(searchOp.getSearchEntries()).hasSize(expectedNbEntries);
+        softly.assertAll();
+
         return searchOp;
       }
     });
 
-    final List<SearchResultEntry> entries = searchOp.getSearchEntries();
-    assertThat(entries).hasSize(expectedNbEntries);
-    debugAndWriteEntries(getLDIFWriter(), entries, testName);
-    waitForSearchOpResult(searchOp, expectedResultCode);
+    debugAndWriteEntries(getLDIFWriter(), searchOp.getSearchEntries(), testName);
     return searchOp;
   }
 
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/common/MultiDomainServerStateTest.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/common/MultiDomainServerStateTest.java
index 781dd5e..4f3323a 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/common/MultiDomainServerStateTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/common/MultiDomainServerStateTest.java
@@ -33,6 +33,7 @@
 import org.opends.server.replication.ReplicationTestCase;
 import org.opends.server.types.DN;
 import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 @SuppressWarnings("javadoc")
@@ -55,21 +56,43 @@
     dn3 = DN.valueOf("o=test3");
   }
 
-  @Test
-  public void testDecodeAndEncode1() throws Exception
+  @DataProvider
+  public Object[][] decodeAndEncodeData()
   {
-    final String cookie = "o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:";
-    final MultiDomainServerState state = new MultiDomainServerState(cookie);
-    assertEquals(state.toString(), cookie + ";");
+    String cookie = "o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:";
+    return new Object[][] {
+      { "", "" },
+      { "o=test1:", "o=test1:;" },
+      { ";;o=test1:;;", ":;o=test1:;" },
+      { cookie, cookie + ";" },
+      { "o=test1:" + csn1 + ";o=test2:" + csn2 + ";;o=test6:", ":;o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:;" },
+    };
   }
 
-  @Test
-  public void testDecodeAndEncode2() throws Exception
+  @Test(dataProvider = "decodeAndEncodeData")
+  public void decodeAndEncode(String cookie, String expectedCookie) throws Exception
   {
-    final String cookie = "o=test1:" + csn1 + ";o=test2:" + csn2 + ";;o=test6:";
     final MultiDomainServerState state = new MultiDomainServerState(cookie);
-    final String expected = ":;o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:;";
-    assertEquals(state.toString(), expected);
+    assertEquals(state.toString(), expectedCookie);
+  }
+
+  @DataProvider
+  public Object[][] copyCtorData()
+  {
+    return new Object[][] {
+      { "" },
+      { "o=test1:" + csn1 + ";" },
+      { "o=test1:" + csn1 + ";o=test2:" + csn2 + ";" },
+      { "o=test1:" + csn1 + ";o=test2:" + csn2 + ";o=test6:;" },
+    };
+  }
+
+  @Test(dataProvider = "copyCtorData")
+  public void copyCtor(String cookie) throws Exception
+  {
+    final MultiDomainServerState state = new MultiDomainServerState(cookie);
+    final MultiDomainServerState copy = new MultiDomainServerState(state);
+    assertEquals(copy.toString(), cookie);
   }
 
   @Test

--
Gitblit v1.10.0