From a9ef51ce0ecc2f38368f9999debb71ea6b47df90 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 21 Aug 2015 15:39:46 +0000
Subject: [PATCH] Test code cleanup
---
opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/NamingConflictTest.java | 624 +++++++++++++++++----------------------------------
opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java | 80 +++---
2 files changed, 248 insertions(+), 456 deletions(-)
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java
index 01b65c5..f3dc51c 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/ModifyConflictTest.java
@@ -594,7 +594,7 @@
EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry);
// simulate a REPLACE of the attribute with values : value1, value2, value3 at time t1.
- Modification mod = new Modification(REPLACE, Attributes.create(DESCRIPTION, "value1", "value2", "value3"));
+ Modification mod = newModification(REPLACE, DESCRIPTION, "value1", "value2", "value3");
testModify(entry, hist, 1, true, mod);
Attribute attr = buildSyncHist(DESCRIPTION,
@@ -604,9 +604,8 @@
assertEquals(hist.encodeAndPurge(), attr);
// simulate a DELETE of the attribute values : value3 and value4 at time t2.
- mod = new Modification(DELETE, Attributes.create(DESCRIPTION, "value3", "value4"));
-
- List<Modification> mods = replayModify(entry, hist, mod, 2);
+ mod = newModification(DELETE, DESCRIPTION, "value3", "value4");
+ List<Modification> mods = replayModify(entry, hist, 2, mod);
mod = mods.get(0);
assertEquals(mod.getAttribute(), Attributes.create(DESCRIPTION, "value3"));
assertEquals(mod.getModificationType(), DELETE);
@@ -636,9 +635,11 @@
Attribute values3and4 = Attributes.create(DESCRIPTION, "value3", "value4");
Attribute values1and2 = Attributes.create(DESCRIPTION, "value1", "value2");
+ Modification mod;
+ List<Modification> mods;
// simulate a DELETE of the attribute values : value3 and value4 at time t2.
- Modification mod = new Modification(DELETE, values3and4);
- List<Modification> mods = replayModify(entry, hist, mod, 2);
+ mod = new Modification(DELETE, values3and4);
+ mods = replayModify(entry, hist, 2, mod);
entry.applyModifications(mods);
// check that the MOD is not altered by the replay mechanism.
mod = mods.get(0);
@@ -646,8 +647,7 @@
assertEquals(mod.getAttribute(), values3and4);
// check that the entry now contains value1 and value2 and no other values.
- AttributeType descriptionAttrType = getAttributeType(DESCRIPTION);
- Attribute resultEntryAttr = entry.getAttribute(descriptionAttrType).get(0);
+ Attribute resultEntryAttr = entry.getAttribute(DESCRIPTION).get(0);
assertEquals(resultEntryAttr, values1and2);
Attribute attr = buildSyncHist(DESCRIPTION,
@@ -657,8 +657,8 @@
// simulate a REPLACE of the attribute with values : value1, value2, value3
// at time t1.
- mod = new Modification(REPLACE, Attributes.create(DESCRIPTION, "value1", "value2", "value3"));
- mods = replayModify(entry, hist, mod, 1);
+ mod = newModification(REPLACE, DESCRIPTION, "value1", "value2", "value3");
+ mods = replayModify(entry, hist, 1, mod);
entry.applyModifications(mods);
mod = mods.get(0);
// check that value3 has been removed from the MOD-REPLACE because
@@ -774,7 +774,7 @@
Modification mod2 = newModification(ADD, DESCRIPTION, "Init Value");
List<Modification> mods = newLinkedList(mod1, mod2);
- replayModifies(entry, hist, mods, 11);
+ replayModifies(entry, hist, 11, mods);
assertThat(mods).as("DEL and ADD of the same attribute same value was not correct").containsExactly(mod1, mod2);
attr = buildSyncHist(DESCRIPTION,
":000000000000000b000000000000:add:Init Value");
@@ -821,12 +821,12 @@
List<Modification> mods = newLinkedList(mod1, mod2);
List<Modification> mods2 = new LinkedList<>(mods);
- replayModifies(entry, hist, mods, 12);
+ replayModifies(entry, hist, 12, mods);
assertEquals(hist.encodeAndPurge(), attrDel);
assertThat(mods).as("DEL one value, del by Replace of the same attribute was not correct").containsExactly(mod1, mod2);
// Replay the same modifs again
- replayModifies(entry, hist, mods2, 12);
+ replayModifies(entry, hist, 12, mods2);
assertEquals(hist.encodeAndPurge(), attrDel);
assertEquals(mods2.size(), 2,
"DEL one value, del by Replace of the same attribute was not correct");
@@ -850,7 +850,7 @@
Modification mod2 = newModification(DELETE, DESCRIPTION, "Init Value");
List<Modification> mods = newLinkedList(mod1, mod2);
- replayModifies(entry, hist, mods, 11);
+ replayModifies(entry, hist, 11, mods);
Attribute attr = buildSyncHist(DESCRIPTION,
":000000000000000b000000000000:del:Init Value");
assertEquals(hist.encodeAndPurge(), attr);
@@ -935,21 +935,23 @@
":000000000000000a000000000000:add:init value");
assertEquals(hist.encodeAndPurge(), attr);
+ Modification mod;
+ List<Modification> mods;
/*
* Now simulate an add at an earlier date that the previous add. The
* conflict resolution should detect that this add must be kept.
* and that the previous value must be discarded, and therefore
* turn the add into a replace.
*/
- Modification mod = newModification(ADD, DISPLAYNAME, "older value");
- List<Modification> mods = replayModify(entry, hist, mod, 1);
+ mod = newModification(ADD, DISPLAYNAME, "older value");
+ mods = replayModify(entry, hist, 1, mod);
assertEquals(hist.encodeAndPurge(), olderValue);
/*
* After replay the mods should contain only one mod,
* the mod should now be a replace with the older value.
*/
- testMods(mods, 1, REPLACE, "older value");
+ assertUniqueMod(mods, REPLACE, "older value");
/*
* Now simulate a new value at a later date.
@@ -957,7 +959,7 @@
* and skip this change.
*/
mod = newModification(ADD, DISPLAYNAME, "new value");
- mods = replayModify(entry, hist, mod, 2);
+ mods = replayModify(entry, hist, 2, mod);
assertEquals(hist.encodeAndPurge(), olderValue);
assertTrue(mods.isEmpty());
}
@@ -1020,9 +1022,8 @@
assertEquals(hist.encodeAndPurge(), firstValue);
/*
- * simulate a add of the displayName attribute done at time t2
- * with a second value. This should not work because there is already
- * a value
+ * simulate a add of the displayName attribute done at time t2 with a second value.
+ * This should not work because there is already a value
*/
testModify(entry, hist, 2, false, newModification(ADD, DISPLAYNAME, "second value"));
assertEquals(hist.encodeAndPurge(), firstValue);
@@ -1040,19 +1041,17 @@
* Check that the mods given as first parameter match the next parameters.
*
* @param mods The mods that must be tested.
- * @param size the size that the mods must have.
* @param modType the type of Modification that the first mod of the
* mods should have.
* @param value the value that the first mod of the mods should have.
*/
- private void testMods(
- List<Modification> mods, int size, ModificationType modType, String value)
+ private void assertUniqueMod(List<Modification> mods, ModificationType modType, String value)
{
- assertEquals(size, mods.size());
- Modification newMod = mods.get(0);
- assertEquals(newMod.getModificationType(), modType);
- ByteString val = newMod.getAttribute().iterator().next();
- assertEquals(val.toString(), value);
+ assertThat(mods).hasSize(1);
+ Modification mod = mods.get(0);
+ assertEquals(mod.getModificationType(), modType);
+ String firstVal = mod.getAttribute().iterator().next().toString();
+ assertEquals(firstVal, value);
}
/** Create an initialize an entry that can be used for modify conflict resolution tests. */
@@ -1117,7 +1116,7 @@
private void testModify(Entry entry, EntryHistorical hist, int date,
boolean keepChangeResult, Modification mod) throws DirectoryException
{
- List<Modification> mods = replayModify(entry, hist, mod, date);
+ List<Modification> mods = replayModify(entry, hist, date, mod);
if (keepChangeResult)
{
@@ -1140,22 +1139,16 @@
entry.applyModifications(mods);
}
- private void replayModifies(Entry entry, EntryHistorical hist, List<Modification> mods, int date)
+ private void replayModifies(Entry entry, EntryHistorical hist, int date, List<Modification> mods)
{
- CSN t = new CSN(date, 0, 0);
-
- LocalBackendModifyOperation modOp = modifyOperation(entry, t, mods);
+ LocalBackendModifyOperation modOp = modifyOperation(entry, date, mods);
hist.replayOperation(modOp, entry);
}
- private List<Modification> replayModify(
- Entry entry, EntryHistorical hist, Modification mod, int date)
+ private List<Modification> replayModify(Entry entry, EntryHistorical hist, int date, Modification mod)
{
- CSN t = new CSN(date, 0, 0);
-
List<Modification> mods = newArrayList(mod);
-
- LocalBackendModifyOperation modOp = modifyOperation(entry, t, mods);
+ LocalBackendModifyOperation modOp = modifyOperation(entry, date, mods);
hist.replayOperation(modOp, entry);
if (mod.getModificationType() == ADD)
@@ -1192,12 +1185,12 @@
return new LocalBackendAddOperation(addOpBasis);
}
- private LocalBackendModifyOperation modifyOperation(Entry entry, CSN t, List<Modification> mods)
+ private LocalBackendModifyOperation modifyOperation(Entry entry, int date, List<Modification> mods)
{
ModifyOperationBasis modOpBasis = new ModifyOperationBasis(getRootConnection(), 1, 1,
null, entry.getName(), mods);
LocalBackendModifyOperation modOp = new LocalBackendModifyOperation(modOpBasis);
- modOp.setAttachment(SYNCHROCONTEXT, new ModifyContext(t, "uniqueId"));
+ modOp.setAttachment(SYNCHROCONTEXT, new ModifyContext(new CSN(date, 0, 0), "uniqueId"));
return modOp;
}
@@ -1216,8 +1209,7 @@
return builder.toAttribute();
}
- private void assertContainsOnlyValues(Entry entry, String attrName,
- String... expectedValues)
+ private void assertContainsOnlyValues(Entry entry, String attrName, String... expectedValues)
{
List<Attribute> attrs = entry.getAttribute(attrName);
Attribute attr = attrs.get(0);
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/NamingConflictTest.java b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/NamingConflictTest.java
index 2351eb6..b614b9a 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/NamingConflictTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/replication/plugin/NamingConflictTest.java
@@ -35,31 +35,61 @@
import org.opends.server.admin.std.meta.ReplicationDomainCfgDefn.IsolationPolicy;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.CSN;
import org.opends.server.replication.common.CSNGenerator;
import org.opends.server.replication.protocol.AddMsg;
import org.opends.server.replication.protocol.DeleteMsg;
import org.opends.server.replication.protocol.ModifyDNMsg;
+import org.opends.server.replication.protocol.UpdateMsg;
import org.opends.server.types.Attribute;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.RDN;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
+import static org.opends.server.core.DirectoryServer.*;
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
import static org.testng.Assert.*;
-/**
- * Test the naming conflict resolution code.
- */
+/** Test the naming conflict resolution code. */
@SuppressWarnings("javadoc")
public class NamingConflictTest extends ReplicationTestCase
{
-
private static final AtomicBoolean SHUTDOWN = new AtomicBoolean(false);
+ private DN baseDN;
+ private LDAPReplicationDomain domain;
+ private CSNGenerator gen;
+
+ private TestSynchronousReplayQueue queue;
+
+ @BeforeMethod
+ public void setUpLocal() throws Exception
+ {
+ baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+
+ TestCaseUtils.initializeTestBackend(true);
+
+ queue = new TestSynchronousReplayQueue();
+
+ final DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
+ conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ domain = MultimasterReplication.createNewDomain(conf, queue);
+ domain.start();
+
+ gen = new CSNGenerator(201, 0);
+ }
+
+ @AfterMethod
+ public void tearDown() throws Exception
+ {
+ MultimasterReplication.deleteDomain(baseDN);
+ }
+
/**
* Test for issue 3402 : test, that a modrdn that is older than an other
* modrdn but that is applied later is ignored.
@@ -72,258 +102,131 @@
* It then uses this session to simulate conflicts and therefore
* test the naming conflict resolution code.
*/
- @Test(enabled=true)
+ @Test
public void simultaneousModrdnConflict() throws Exception
{
- TestCaseUtils.initializeTestBackend(true);
+ String parentUUID = getEntryUUID(baseDN);
- final DN baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+ Entry entry = createAndAddEntry("simultaneousModrdnConflict");
+ String entryUUID = getEntryUUID(entry.getName());
- TestSynchronousReplayQueue queue = new TestSynchronousReplayQueue();
- DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
- conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ // generate two consecutive CSN that will be used in backward order
+ CSN csn1 = gen.newCSN();
+ CSN csn2 = gen.newCSN();
- LDAPReplicationDomain domain =
- MultimasterReplication.createNewDomain(conf, queue);
- domain.start();
+ replayMsg(modDnMsg(entry, entryUUID, parentUUID, csn2, "uid=simultaneous2"));
- try
- {
- /*
- * Create a CSN generator to generate new CSNs
- * when we need to send operations messages to the replicationServer.
- */
- CSNGenerator gen = new CSNGenerator(201, 0);
+ // This MODIFY DN uses an older DN and should therefore be cancelled at replay time.
+ replayMsg(modDnMsg(entry, entryUUID, parentUUID, csn1, "uid=simulatneouswrong"));
- String parentUUID = getEntryUUID(DN.valueOf(TEST_ROOT_DN_STRING));
+ // Expect the conflict resolution
+ assertFalse(entryExists(entry.getName()), "The modDN conflict was not resolved as expected.");
+ }
- Entry entry = TestCaseUtils.entryFromLdifString(
- "dn: cn=simultaneousModrdnConflict, "+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n" + "objectClass: person\n"
- + "objectClass: organizationalPerson\n"
- + "objectClass: inetOrgPerson\n" + "uid: user.1\n"
- + "description: This is the description for Aaccf Amar.\n" + "st: NC\n"
- + "postalAddress: Aaccf Amar$17984 Thirteenth Street"
- + "$Rockford, NC 85762\n" + "mail: user.1@example.com\n"
- + "cn: Aaccf Amar\n" + "l: Rockford\n"
- + "street: 17984 Thirteenth Street\n"
- + "employeeNumber: 1\n"
- + "sn: Amar\n" + "givenName: Aaccf\n" + "postalCode: 85762\n"
- + "userPassword: password\n" + "initials: AA\n");
-
- TestCaseUtils.addEntry(entry);
- String entryUUID = getEntryUUID(entry.getName());
-
- // generate two consecutive CSN that will be used in backward order
- CSN csn1 = gen.newCSN();
- CSN csn2 = gen.newCSN();
-
- ModifyDNMsg modDnMsg = new ModifyDNMsg(
- entry.getName(), csn2,
- entryUUID, parentUUID, false,
- TEST_ROOT_DN_STRING,
- "uid=simultaneous2");
-
- // Put the message in the replay queue
- domain.processUpdate(modDnMsg);
-
- // Make the domain replay the change from the replay queue
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // This MODIFY DN uses an older DN and should therefore be cancelled
- // at replay time.
- modDnMsg = new ModifyDNMsg(
- entry.getName(), csn1,
- entryUUID, parentUUID, false,
- TEST_ROOT_DN_STRING,
- "uid=simulatneouswrong");
-
- // Put the message in the replay queue
- domain.processUpdate(modDnMsg);
-
- // Make the domain replay the change from the replay queue
- // and resolve conflict
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // Expect the conflict resolution
- assertFalse(DirectoryServer.entryExists(entry.getName()),
- "The modDN conflict was not resolved as expected.");
- }
- finally
- {
- MultimasterReplication.deleteDomain(baseDN);
- }
+ private ModifyDNMsg modDnMsg(Entry entry, String entryUUID, String parentUUID, CSN csn, String newRDN)
+ throws Exception
+ {
+ return new ModifyDNMsg(entry.getName(), csn, entryUUID, parentUUID, false, TEST_ROOT_DN_STRING, newRDN);
}
/**
* Test that when a previous conflict is resolved because
* a delete operation has removed one of the conflicting entries
- * the other conflicting entry is correctly renamed to its
- * original name.
+ * the other conflicting entry is correctly renamed to its original name.
*/
- @Test(enabled=true)
+ @Test
public void conflictCleaningDelete() throws Exception
{
- TestCaseUtils.initializeTestBackend(true);
+ Entry entry = createAndAddEntry("conflictCleaningDelete");
- final DN baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+ // Add the first entry
+ String parentUUID = getEntryUUID(baseDN);
- TestSynchronousReplayQueue queue = new TestSynchronousReplayQueue();
- DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
- conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ CSN csn1 = gen.newCSN();
- LDAPReplicationDomain domain =
- MultimasterReplication.createNewDomain(conf, queue);
- domain.start();
+ // Now try to add the same entry with same DN but a different
+ // unique ID though the replication
+ replayMsg(addMsg(entry, csn1, parentUUID, "c9cb8c3c-615a-4122-865d-50323aaaed48"));
- try
- {
- /*
- * Create a CSN generator to generate new CSNs
- * when we need to send operations messages to the replicationServer.
- */
- CSNGenerator gen = new CSNGenerator(201, 0);
+ // Now delete the first entry that was added at the beginning
+ TestCaseUtils.deleteEntry(entry.getName());
- String entryldif =
- "dn: cn=conflictCleaningDelete, "+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n" + "objectClass: person\n"
- + "objectClass: organizationalPerson\n"
- + "objectClass: inetOrgPerson\n" + "uid: user.1\n"
- + "description: This is the description for Aaccf Amar.\n" + "st: NC\n"
- + "postalAddress: Aaccf Amar$17984 Thirteenth Street"
- + "$Rockford, NC 85762\n" + "mail: user.1@example.com\n"
- + "cn: Aaccf Amar\n" + "l: Rockford\n"
- + "street: 17984 Thirteenth Street\n"
- + "employeeNumber: 1\n"
- + "sn: Amar\n" + "givenName: Aaccf\n" + "postalCode: 85762\n"
- + "userPassword: password\n" + "initials: AA\n";
- Entry entry = TestCaseUtils.entryFromLdifString(entryldif);
+ // Expect the conflict resolution : the second entry should now
+ // have been renamed with the original DN.
+ Entry resultEntry = DirectoryServer.getEntry(entry.getName());
+ assertNotNull(resultEntry, "The conflict was not cleared");
+ assertEquals(getEntryUUID(resultEntry.getName()),
+ "c9cb8c3c-615a-4122-865d-50323aaaed48",
+ "The wrong entry has been renamed");
+ assertNull(resultEntry.getAttribute(LDAPReplicationDomain.DS_SYNC_CONFLICT));
+ }
- // Add the first entry
- TestCaseUtils.addEntry(entry);
- String parentUUID = getEntryUUID(DN.valueOf(TEST_ROOT_DN_STRING));
-
- CSN csn1 = gen.newCSN();
-
- // Now try to add the same entry with same DN but a different
- // unique ID though the replication
- AddMsg addMsg = new AddMsg(csn1,
- entry.getName(),
- "c9cb8c3c-615a-4122-865d-50323aaaed48", parentUUID,
- entry.getObjectClasses(), entry.getUserAttributes(),
- null);
-
- // Put the message in the replay queue
- domain.processUpdate(addMsg);
-
- // Make the domain replay the change from the replay queue
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // Now delete the first entry that was added at the beginning
- TestCaseUtils.deleteEntry(entry.getName());
-
- // Expect the conflict resolution : the second entry should now
- // have been renamed with the original DN.
- Entry resultEntry = DirectoryServer.getEntry(entry.getName());
- assertNotNull(resultEntry, "The conflict was not cleared");
- assertEquals(getEntryUUID(resultEntry.getName()),
- "c9cb8c3c-615a-4122-865d-50323aaaed48",
- "The wrong entry has been renamed");
- assertNull(resultEntry.getAttribute(LDAPReplicationDomain.DS_SYNC_CONFLICT));
- }
- finally
- {
- MultimasterReplication.deleteDomain(baseDN);
- }
+ private AddMsg addMsg(Entry entry, CSN csn, String parentUUID, String childUUID)
+ {
+ return new AddMsg(csn,
+ entry.getName(),
+ childUUID, parentUUID,
+ entry.getObjectClasses(), entry.getUserAttributes(),
+ null);
}
/**
* Test that when a previous conflict is resolved because
* a MODDN operation has removed one of the conflicting entries
- * the other conflicting entry is correctly renamed to its
- * original name.
- *
- * @throws Exception if the test fails.
+ * the other conflicting entry is correctly renamed to its original name.
*/
- @Test(enabled=true)
+ @Test
public void conflictCleaningMODDN() throws Exception
{
- TestCaseUtils.initializeTestBackend(true);
+ Entry entry = createAndAddEntry("conflictCleaningDelete");
+ String parentUUID = getEntryUUID(baseDN);
- final DN baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+ CSN csn1 = gen.newCSN();
- TestSynchronousReplayQueue queue = new TestSynchronousReplayQueue();
- DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
- conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ // Now try to add the same entry with same DN but a different
+ // unique ID though the replication
+ replayMsg(addMsg(entry, csn1, parentUUID, "c9cb8c3c-615a-4122-865d-50323aaaed48"));
- LDAPReplicationDomain domain =
- MultimasterReplication.createNewDomain(conf, queue);
- domain.start();
+ // Now delete the first entry that was added at the beginning
+ ModifyDNOperation modDNOperation =
+ getRootConnection().processModifyDN(entry.getName(), RDN.decode("cn=foo"), false);
+ assertEquals(modDNOperation.getResultCode(), ResultCode.SUCCESS);
- try
- {
- /*
- * Create a CSN generator to generate new CSNs when we need to send
- * operations messages to the replicationServer.
- */
- CSNGenerator gen = new CSNGenerator(201, 0);
+ // Expect the conflict resolution : the second entry should now
+ // have been renamed with the original DN.
+ Entry resultEntry = DirectoryServer.getEntry(entry.getName());
+ assertNotNull(resultEntry, "The conflict was not cleared");
+ assertEquals(getEntryUUID(resultEntry.getName()),
+ "c9cb8c3c-615a-4122-865d-50323aaaed48",
+ "The wrong entry has been renamed");
+ assertNull(resultEntry.getAttribute(LDAPReplicationDomain.DS_SYNC_CONFLICT));
+ }
- String entryldif =
- "dn: cn=conflictCleaningDelete, "+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n" + "objectClass: person\n"
+ private Entry createAndAddEntry(String commonName) throws Exception
+ {
+ Entry entry = TestCaseUtils.entryFromLdifString(
+ "dn: cn=" + commonName + ", " + TEST_ROOT_DN_STRING + "\n"
+ + "objectClass: top\n"
+ + "objectClass: person\n"
+ "objectClass: organizationalPerson\n"
- + "objectClass: inetOrgPerson\n" + "uid: user.1\n"
- + "description: This is the description for Aaccf Amar.\n" + "st: NC\n"
+ + "objectClass: inetOrgPerson\n"
+ + "uid: user.1\n"
+ + "description: This is the description for Aaccf Amar.\n"
+ + "st: NC\n"
+ "postalAddress: Aaccf Amar$17984 Thirteenth Street"
- + "$Rockford, NC 85762\n" + "mail: user.1@example.com\n"
- + "cn: Aaccf Amar\n" + "l: Rockford\n"
+ + "$Rockford, NC 85762\n"
+ + "mail: user.1@example.com\n"
+ + "cn: Aaccf Amar\n"
+ + "l: Rockford\n"
+ "street: 17984 Thirteenth Street\n"
+ "employeeNumber: 1\n"
- + "sn: Amar\n" + "givenName: Aaccf\n" + "postalCode: 85762\n"
- + "userPassword: password\n" + "initials: AA\n";
- Entry entry = TestCaseUtils.entryFromLdifString(entryldif);
-
- // Add the first entry
- TestCaseUtils.addEntry(entry);
- String parentUUID = getEntryUUID(DN.valueOf(TEST_ROOT_DN_STRING));
-
- CSN csn1 = gen.newCSN();
-
- // Now try to add the same entry with same DN but a different
- // unique ID though the replication
- AddMsg addMsg = new AddMsg(csn1,
- entry.getName(),
- "c9cb8c3c-615a-4122-865d-50323aaaed48", parentUUID,
- entry.getObjectClasses(), entry.getUserAttributes(),
- null);
-
- // Put the message in the replay queue
- domain.processUpdate(addMsg);
-
- // Make the domain replay the change from the replay queue
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // Now delete the first entry that was added at the beginning
- InternalClientConnection conn =
- InternalClientConnection.getRootConnection();
-
- ModifyDNOperation modDNOperation =
- conn.processModifyDN(entry.getName(), RDN.decode("cn=foo"), false);
- assertEquals(modDNOperation.getResultCode(), ResultCode.SUCCESS);
-
- // Expect the conflict resolution : the second entry should now
- // have been renamed with the original DN.
- Entry resultEntry = DirectoryServer.getEntry(entry.getName());
- assertNotNull(resultEntry, "The conflict was not cleared");
- assertEquals(getEntryUUID(resultEntry.getName()),
- "c9cb8c3c-615a-4122-865d-50323aaaed48",
- "The wrong entry has been renamed");
- assertNull(resultEntry.getAttribute(LDAPReplicationDomain.DS_SYNC_CONFLICT));
- }
- finally
- {
- MultimasterReplication.deleteDomain(baseDN);
- }
+ + "sn: Amar\n"
+ + "givenName: Aaccf\n"
+ + "postalCode: 85762\n"
+ + "userPassword: password\n"
+ + "initials: AA\n");
+ TestCaseUtils.addEntry(entry);
+ return entry;
}
/**
@@ -350,229 +253,126 @@
* - the child entry to be renamed under root entry
*
*/
- @Test(enabled=true)
+ @Test
public void removeParentConflict1() throws Exception
{
- TestCaseUtils.initializeTestBackend(true);
+ Entry parentEntry = createParentEntry();
+ Entry childEntry = createChildEntry();
- final DN baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+ TestCaseUtils.addEntry(parentEntry);
+ TestCaseUtils.addEntry(childEntry);
- TestSynchronousReplayQueue queue = new TestSynchronousReplayQueue();
- DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
- conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ String parentUUID = getEntryUUID(parentEntry.getName());
- LDAPReplicationDomain domain =
- MultimasterReplication.createNewDomain(conf, queue);
- domain.start();
+ CSN csn2 = gen.newCSN();
+ DeleteMsg delMsg = new DeleteMsg(parentEntry.getName(), csn2, parentUUID);
+ delMsg.setSubtreeDelete(true);
- try
- {
- /*
- * Create a CSN generator to generate new CSNs
- * when we need to send operations messages to the replicationServer.
- */
- CSNGenerator gen = new CSNGenerator(201, 0);
+ replayMsg(delMsg);
- Entry parentEntry = TestCaseUtils.entryFromLdifString(
- "dn: ou=rpConflict, "+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n"
- + "objectClass: organizationalUnit\n");
-
- Entry childEntry = TestCaseUtils.entryFromLdifString(
- "dn: cn=child, ou=rpConflict,"+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n"
- + "objectClass: person\n"
- + "objectClass: organizationalPerson\n"
- + "objectClass: inetOrgPerson\n" + "uid: user.1\n"
- + "description: This is the description for Aaccf Amar.\n" + "st: NC\n"
- + "postalAddress: Aaccf Amar$17984 Thirteenth Street"
- + "$Rockford, NC 85762\n" + "mail: user.1@example.com\n"
- + "cn: Aaccf Amar\n" + "l: Rockford\n"
- + "street: 17984 Thirteenth Street\n"
- + "employeeNumber: 1\n"
- + "sn: Amar\n" + "givenName: Aaccf\n" + "postalCode: 85762\n"
- + "userPassword: password\n" + "initials: AA\n");
-
- TestCaseUtils.addEntry(parentEntry);
- TestCaseUtils.addEntry(childEntry);
-
- String parentUUID = getEntryUUID(parentEntry.getName());
-
- CSN csn2 = gen.newCSN();
- DeleteMsg delMsg = new DeleteMsg(parentEntry.getName(), csn2, parentUUID);
- delMsg.setSubtreeDelete(true);
-
- // Put the message in the replay queue
- domain.processUpdate(delMsg);
- // Make the domain replay the change from the replay queue
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // Expect the subtree to be deleted and no conflict entry created
- assertFalse(DirectoryServer.entryExists(parentEntry.getName()),
- "DEL subtree on parent was not processed as expected.");
- assertFalse(DirectoryServer.entryExists(parentEntry.getName()),
- "DEL subtree on parent was not processed as expected.");
- }
- finally
- {
- MultimasterReplication.deleteDomain(baseDN);
- }
+ // Expect the subtree to be deleted and no conflict entry created
+ assertFalse(entryExists(parentEntry.getName()), "DEL subtree on parent was not processed as expected.");
+ assertFalse(entryExists(parentEntry.getName()), "DEL subtree on parent was not processed as expected.");
}
- @Test(enabled=true)
+ @Test
public void removeParentConflict2() throws Exception
{
- TestCaseUtils.initializeTestBackend(true);
+ Entry parentEntry = createParentEntry();
+ Entry childEntry = createChildEntry();
- final DN baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+ TestCaseUtils.addEntry(parentEntry);
+ TestCaseUtils.addEntry(childEntry);
- TestSynchronousReplayQueue queue = new TestSynchronousReplayQueue();
- DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
- conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ String parentUUID = getEntryUUID(parentEntry.getName());
+ String childUUID = getEntryUUID(childEntry.getName());
- LDAPReplicationDomain domain =
- MultimasterReplication.createNewDomain(conf, queue);
- domain.start();
+ CSN csn2 = gen.newCSN();
+ DeleteMsg delMsg = new DeleteMsg(parentEntry.getName(), csn2, parentUUID);
+ // NOT SUBTREE
- try
- {
- /*
- * Create a CSN generator to generate new CSNs
- * when we need to send operations messages to the replicationServer.
- */
- CSNGenerator gen = new CSNGenerator(201, 0);
+ replayMsg(delMsg);
- Entry parentEntry = TestCaseUtils.entryFromLdifString(
- "dn: ou=rpConflict, "+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n"
- + "objectClass: organizationalUnit\n");
+ // Expect the parent entry to be deleted
+ assertFalse(entryExists(parentEntry.getName()), "Parent entry expected to be deleted : " + parentEntry.getName());
- Entry childEntry = TestCaseUtils.entryFromLdifString(
- "dn: cn=child, ou=rpConflict,"+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n"
- + "objectClass: person\n"
- + "objectClass: organizationalPerson\n"
- + "objectClass: inetOrgPerson\n" + "uid: user.1\n"
- + "description: This is the description for Aaccf Amar.\n" + "st: NC\n"
- + "postalAddress: Aaccf Amar$17984 Thirteenth Street"
- + "$Rockford, NC 85762\n" + "mail: user.1@example.com\n"
- + "cn: Aaccf Amar\n" + "l: Rockford\n"
- + "street: 17984 Thirteenth Street\n"
- + "employeeNumber: 1\n"
- + "sn: Amar\n" + "givenName: Aaccf\n" + "postalCode: 85762\n"
- + "userPassword: password\n" + "initials: AA\n");
-
- TestCaseUtils.addEntry(parentEntry);
- TestCaseUtils.addEntry(childEntry);
-
- String parentUUID = getEntryUUID(parentEntry.getName());
- String childUUID = getEntryUUID(childEntry.getName());
-
- CSN csn2 = gen.newCSN();
- DeleteMsg delMsg = new DeleteMsg(parentEntry.getName(), csn2, parentUUID);
- // NOT SUBTREE
-
- // Put the message in the replay queue
- domain.processUpdate(delMsg);
- // Make the domain replay the change from the replay queue
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // Expect the parent entry to be deleted
- assertFalse(DirectoryServer.entryExists(parentEntry.getName()), "Parent entry expected to be deleted : " + parentEntry.getName());
-
- // Expect the child entry to be moved as conflict entry under the root
- // entry of the suffix
- DN childDN = DN.valueOf("entryuuid="+childUUID+
- "+cn=child,o=test");
- assertTrue(DirectoryServer.entryExists(childDN),
- "Child entry conflict exist with DN="+childDN);
- }
- finally
- {
- MultimasterReplication.deleteDomain(baseDN);
- }
+ // Expect the child entry to be moved as conflict entry under the root
+ // entry of the suffix
+ DN childDN = DN.valueOf("entryuuid=" + childUUID + "+cn=child,o=test");
+ assertTrue(entryExists(childDN), "Child entry conflict exist with DN=" + childDN);
}
- @Test(enabled=true)
+ @Test
public void removeParentConflict3() throws Exception
{
- TestCaseUtils.initializeTestBackend(true);
+ Entry parentEntry = createParentEntry();
+ Entry childEntry = createChildEntry();
- final DN baseDN = DN.valueOf(TEST_ROOT_DN_STRING);
+ TestCaseUtils.addEntry(parentEntry);
+ String parentUUID = getEntryUUID(parentEntry.getName());
+ TestCaseUtils.deleteEntry(parentEntry);
- TestSynchronousReplayQueue queue = new TestSynchronousReplayQueue();
- DomainFakeCfg conf = new DomainFakeCfg(baseDN, 1, new TreeSet<String>());
- conf.setIsolationPolicy(IsolationPolicy.ACCEPT_ALL_UPDATES);
+ CSN csn1 = gen.newCSN();
- LDAPReplicationDomain domain =
- MultimasterReplication.createNewDomain(conf, queue);
- domain.start();
+ // Create and publish an update message to add the child entry.
+ String childUUID = "44444444-4444-4444-4444-444444444444";
+ AddMsg addMsg = new AddMsg(
+ csn1,
+ childEntry.getName(),
+ childUUID,
+ parentUUID,
+ childEntry.getObjectClassAttribute(),
+ childEntry.getAttributes(),
+ new ArrayList<Attribute>());
- try
- {
- /*
- * Create a CSN generator to generate new CSNs
- * when we need to send operations messages to the replicationServer.
- */
- CSNGenerator gen = new CSNGenerator(201, 0);
+ // Put the message in the replay queue
+ replayMsg(addMsg);
- Entry parentEntry = TestCaseUtils.entryFromLdifString(
- "dn: ou=rpConflict, "+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n"
- + "objectClass: organizationalUnit\n");
+ // Expect the parent entry to be deleted
+ assertFalse(entryExists(parentEntry.getName()), "Parent entry exists ");
- Entry childEntry = TestCaseUtils.entryFromLdifString(
- "dn: cn=child, ou=rpConflict,"+ TEST_ROOT_DN_STRING + "\n"
- + "objectClass: top\n"
- + "objectClass: person\n"
- + "objectClass: organizationalPerson\n"
- + "objectClass: inetOrgPerson\n" + "uid: user.1\n"
- + "description: This is the description for Aaccf Amar.\n" + "st: NC\n"
- + "postalAddress: Aaccf Amar$17984 Thirteenth Street"
- + "$Rockford, NC 85762\n" + "mail: user.1@example.com\n"
- + "cn: Aaccf Amar\n" + "l: Rockford\n"
- + "street: 17984 Thirteenth Street\n"
- + "employeeNumber: 1\n"
- + "sn: Amar\n" + "givenName: Aaccf\n" + "postalCode: 85762\n"
- + "userPassword: password\n" + "initials: AA\n");
+ // Expect the child entry to be moved as conflict entry under the root
+ // entry of the suffix
+ DN childDN = DN.valueOf("entryuuid=" + childUUID + "+cn=child,o=test");
+ assertTrue(entryExists(childDN), "Child entry conflict exist with DN=" + childDN);
+ }
+ private Entry createParentEntry() throws Exception
+ {
+ return TestCaseUtils.entryFromLdifString(
+ "dn: ou=rpConflict, "+ TEST_ROOT_DN_STRING + "\n"
+ + "objectClass: top\n"
+ + "objectClass: organizationalUnit\n");
+ }
- TestCaseUtils.addEntry(parentEntry);
- String parentUUID = getEntryUUID(parentEntry.getName());
- TestCaseUtils.deleteEntry(parentEntry);
+ private Entry createChildEntry() throws Exception
+ {
+ return TestCaseUtils.entryFromLdifString(
+ "dn: cn=child, ou=rpConflict,"+ TEST_ROOT_DN_STRING + "\n"
+ + "objectClass: top\n"
+ + "objectClass: person\n"
+ + "objectClass: organizationalPerson\n"
+ + "objectClass: inetOrgPerson\n"
+ + "uid: user.1\n"
+ + "description: This is the description for Aaccf Amar.\n"
+ + "st: NC\n"
+ + "postalAddress: Aaccf Amar$17984 Thirteenth Street"
+ + "$Rockford, NC 85762\n"
+ + "mail: user.1@example.com\n"
+ + "cn: Aaccf Amar\n"
+ + "l: Rockford\n"
+ + "street: 17984 Thirteenth Street\n"
+ + "employeeNumber: 1\n"
+ + "sn: Amar\n"
+ + "givenName: Aaccf\n"
+ + "postalCode: 85762\n"
+ + "userPassword: password\n"
+ + "initials: AA\n");
+ }
- CSN csn1 = gen.newCSN();
-
- // Create and publish an update message to add the child entry.
- String childUUID = "44444444-4444-4444-4444-444444444444";
- AddMsg addMsg = new AddMsg(
- csn1,
- childEntry.getName(),
- childUUID,
- parentUUID,
- childEntry.getObjectClassAttribute(),
- childEntry.getAttributes(),
- new ArrayList<Attribute>());
-
- // Put the message in the replay queue
- domain.processUpdate(addMsg);
- // Make the domain replay the change from the replay queue
- domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
-
- // Expect the parent entry to be deleted
- assertFalse(DirectoryServer.entryExists(parentEntry.getName()),
- "Parent entry exists ");
-
- // Expect the child entry to be moved as conflict entry under the root
- // entry of the suffix
- DN childDN = DN.valueOf("entryuuid="+childUUID+
- "+cn=child,o=test");
- assertTrue(DirectoryServer.entryExists(childDN),
- "Child entry conflict exist with DN="+childDN);
- }
- finally
- {
- MultimasterReplication.deleteDomain(baseDN);
- }
+ private void replayMsg(UpdateMsg updateMsg) throws InterruptedException
+ {
+ domain.processUpdate(updateMsg);
+ domain.replay(queue.take().getUpdateMessage(), SHUTDOWN);
}
}
--
Gitblit v1.10.0