From ff1493a5266895521add7ccc8e987369ee10b907 Mon Sep 17 00:00:00 2001
From: coulbeck <coulbeck@localhost>
Date: Fri, 08 Dec 2006 23:47:17 +0000
Subject: [PATCH] Fix for issues 593, 1045 and 1060.

---
 opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java                         |  153 +++++--
 opends/src/server/org/opends/server/backends/jeb/Index.java                                   |   12 
 opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java | 1062 +++++++++++++++++++++++++++++++------------------
 3 files changed, 781 insertions(+), 446 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java b/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
index e01051b..6388ced 100644
--- a/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
@@ -43,6 +43,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.ArrayList;
 
 /**
  * An implementation of an Indexer for attribute equality.
@@ -112,7 +113,7 @@
    * @throws DatabaseException If an error occurs in the JE database.
    */
   public void indexEntry(Transaction txn, Entry entry,
-                       Set<ASN1OctetString> keys) throws DatabaseException
+                         Set<ASN1OctetString> keys) throws DatabaseException
   {
     List<Attribute> attrList =
          entry.getAttribute(indexConfig.getAttributeType());
@@ -188,76 +189,142 @@
                           Set<ASN1OctetString> delKeys)
        throws DatabaseException
   {
+    // Optimize for the case where there are no attribute options
+    // involved and only simple addition and deletion of individual values.
+    // An issue with attribute options is that the values can not be assumed
+    // to be unique.
+
     List<Attribute> beforeList;
+    List<Attribute> afterList;
     beforeList = oldEntry.getAttribute(indexConfig.getAttributeType());
+    afterList = newEntry.getAttribute(indexConfig.getAttributeType());
 
-    // Pick out the modifications that apply to this indexed attribute
+    boolean hasOptions = false;
 
-    /**
-     * FIXME unusual modifications can insert spurious index values
-     * The following sequence of modifications will insert A into the
-     * index, yet A is not a resulting value for the attribute.
-     *
-     * add: cn
-     * cn: A
-     * -
-     * replace: cn
-     * cn: B
-     * -
-     *
-     */
+    if (beforeList != null)
+    {
+      for (Attribute a : beforeList)
+      {
+        if (a.hasOptions())
+        {
+          hasOptions = true;
+          break;
+        }
+      }
+    }
 
+    if (afterList != null)
+    {
+      for (Attribute a : afterList)
+      {
+        if (a.hasOptions())
+        {
+          hasOptions = true;
+          break;
+        }
+      }
+    }
+
+    boolean hasOnlySimpleMods = true;
+    List<Modification> simpleMods = new ArrayList<Modification>();
     for (Modification mod : mods)
     {
       Attribute modAttr = mod.getAttribute();
       AttributeType modAttrType = modAttr.getAttributeType();
       if (modAttrType.equals(indexConfig.getAttributeType()))
       {
+        if (modAttr.hasOptions())
+        {
+          hasOptions = true;
+        }
         switch (mod.getModificationType())
         {
-          case REPLACE:
-          case INCREMENT:
-            if (beforeList != null)
-            {
-              for (Attribute attr : beforeList)
-              {
-                if (attr.hasOptions(modAttr.getOptions()))
-                {
-                  indexValues(attr.getValues(), delKeys);
-                }
-              }
-            }
-            indexValues(modAttr.getValues(), addKeys);
-            break;
-
           case ADD:
-            indexValues(modAttr.getValues(), addKeys);
+            simpleMods.add(mod);
             break;
 
           case DELETE:
             if (!modAttr.hasValue())
             {
-              if (beforeList != null)
-              {
-                for (Attribute attr : beforeList)
-                {
-                  if (attr.hasOptions(modAttr.getOptions()))
-                  {
-                    indexValues(attr.getValues(), delKeys);
-                  }
-                }
-              }
+              hasOnlySimpleMods = false;
             }
             else
             {
-              indexValues(modAttr.getValues(), delKeys);
+              simpleMods.add(mod);
+            }
+            break;
+
+          default:
+            hasOnlySimpleMods = false;
+            break;
+        }
+      }
+    }
+
+    if (hasOnlySimpleMods && !hasOptions)
+    {
+      // This is the optimized case where there are no attribute options
+      // involved and only simple addition and deletion of individual values.
+      // It should be efficient for adding and/or deleting a few values of an
+      // attribute with lots of values.
+      for (Modification mod : simpleMods)
+      {
+        Set<AttributeValue> values = mod.getAttribute().getValues();
+        Set<ASN1OctetString> keys =
+             new HashSet<ASN1OctetString>(values.size());
+        indexValues(values, keys);
+
+        switch (mod.getModificationType())
+        {
+          case ADD:
+            for (ASN1OctetString key : keys)
+            {
+              if (delKeys.contains(key))
+              {
+                delKeys.remove(key);
+              }
+              else
+              {
+                addKeys.add(key);
+              }
+            }
+            break;
+
+          case DELETE:
+            for (ASN1OctetString key : keys)
+            {
+              if (addKeys.contains(key))
+              {
+                addKeys.remove(key);
+              }
+              else
+              {
+                delKeys.add(key);
+              }
             }
             break;
         }
       }
     }
-  }
+    else
+    {
+      // This is the non-optimized case that should be correct in all cases.
 
+      Set<ASN1OctetString> oldSet = new HashSet<ASN1OctetString>();
+      indexAttribute(beforeList, oldSet);
+
+      Set<ASN1OctetString> newSet = new HashSet<ASN1OctetString>();
+      indexAttribute(afterList, newSet);
+
+      HashSet<ASN1OctetString> removeSet = new HashSet<ASN1OctetString>(oldSet);
+      removeSet.removeAll(newSet);
+      delKeys.addAll(removeSet);
+
+      HashSet<ASN1OctetString> addSet = new HashSet<ASN1OctetString>(newSet);
+      addSet.removeAll(oldSet);
+      addKeys.addAll(addSet);
+    }
+  }
 
   /**
    * Generate the set of index keys for a set of attribute values.
diff --git a/opends/src/server/org/opends/server/backends/jeb/Index.java b/opends/src/server/org/opends/server/backends/jeb/Index.java
index ec11b0f..2dda8e8 100644
--- a/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -596,17 +596,17 @@
     indexer.modifyEntry(txn, oldEntry, newEntry, mods, addKeys, delKeys);
 
     DatabaseEntry key = new DatabaseEntry();
-    for (ASN1OctetString keyBytes : addKeys)
-    {
-      key.setData(keyBytes.value());
-      insertID(txn, key, entryID);
-    }
-
     for (ASN1OctetString keyBytes : delKeys)
     {
       key.setData(keyBytes.value());
       removeID(txn, key, entryID);
     }
+
+    for (ASN1OctetString keyBytes : addKeys)
+    {
+      key.setData(keyBytes.value());
+      insertID(txn, key, entryID);
+    }
   }
 
 }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
index fe55d07..4650f5f 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/core/ModifyOperationTestCase.java
@@ -43,9 +43,9 @@
 import org.opends.server.protocols.asn1.ASN1Element;
 import org.opends.server.protocols.asn1.ASN1OctetString;
 import org.opends.server.protocols.asn1.ASN1Reader;
-import org.opends.server.protocols.asn1.ASN1Sequence;
 import org.opends.server.protocols.asn1.ASN1Writer;
 import org.opends.server.protocols.internal.InternalClientConnection;
+import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.protocols.ldap.BindRequestProtocolOp;
 import org.opends.server.protocols.ldap.BindResponseProtocolOp;
 import org.opends.server.protocols.ldap.ModifyRequestProtocolOp;
@@ -53,25 +53,13 @@
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.protocols.ldap.LDAPModification;
-import org.opends.server.types.Attribute;
-import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
-import org.opends.server.types.ByteString;
-import org.opends.server.types.CancelRequest;
-import org.opends.server.types.Control;
-import org.opends.server.types.DN;
-import org.opends.server.types.Entry;
-import org.opends.server.types.LockManager;
-import org.opends.server.types.Modification;
-import org.opends.server.types.ModificationType;
-import org.opends.server.types.ObjectClass;
-import org.opends.server.types.ResultCode;
-import org.opends.server.types.WritabilityMode;
+import org.opends.server.protocols.ldap.LDAPFilter;
+import org.opends.server.types.*;
 
 import static org.testng.Assert.*;
+import static org.testng.Assert.assertEquals;
 
 import static org.opends.server.protocols.ldap.LDAPConstants.*;
-import static org.opends.server.util.ServerConstants.*;
 
 
 
@@ -289,6 +277,20 @@
 
 
 
+  @DataProvider(name = "baseDNs")
+  public Object[][] getBaseDNs()
+         throws Exception
+  {
+    return new Object[][] {
+         { "dc=example,dc=com"},
+// FIXME Waiting on issue 1080.
+//         { "o=test"},
+    };
+  }
+
+
+
+
   /**
    * {@inheritDoc}
    */
@@ -312,7 +314,7 @@
    * Tests the <CODE>getRawEntryDN</CODE> and <CODE>setRawEntryDN</CODE>
    * methods.
    *
-   * @param  addOperation  The add operation to be tested.
+   * @param  modifyOperation  The modify operation to be tested.
    */
   @Test(dataProvider = "modifyOperations")
   public void testGetAndSetRawEntryDN(ModifyOperation modifyOperation)
@@ -446,7 +448,7 @@
    * Invokes methods to retrieve members of a modify operation after it has
    * completed successfully.
    *
-   * @param  addOperation  The modify operation to examine.  It should have
+   * @param  modifyOperation  The modify operation to examine.  It should have
    *                       completed successfully.
    */
   private void retrieveSuccessfulOperationElements(
@@ -473,7 +475,7 @@
    * Invokes methods to retrieve members of a modify operation after it has
    * completed unsuccessfully.
    *
-   * @param  addOperation  The modify operation to examine.  It should have
+   * @param  modifyOperation  The modify operation to examine.  It should have
    *                       completed failed.
    */
   private void retrieveFailedOperationElements(
@@ -541,8 +543,6 @@
 
   /**
    * Tests to ensure that a modify attempt fails if an invalid DN is provided.
-   *
-   * @throws  Exception  If an unexpected problem occurs.
    */
   @Test()
   public void testFailInvalidDN()
@@ -568,8 +568,6 @@
   /**
    * Tests to ensure that a modify attempt fails if the target DN is a suffix
    * that doesn't exist.
-   *
-   * @throws  Exception  If an unexpected problem occurs.
    */
   @Test()
   public void testFailNoSuchSuffix()
@@ -598,25 +596,25 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailNoSuchParent()
+  @Test(dataProvider = "baseDNs")
+  public void testFailNoSuchParent(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
          conn.processModify(
-              new ASN1OctetString("cn=test,ou=nosuchparent,o=test"), mods);
+              new ASN1OctetString("cn=test,ou=nosuchparent," + baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -629,24 +627,25 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailNoSuchEntry()
+  @Test(dataProvider = "baseDNs")
+  public void testFailNoSuchEntry(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("cn=nosuchentry,o=test"), mods);
+         conn.processModify(new ASN1OctetString("cn=nosuchentry," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -659,11 +658,11 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailNoModifications()
+  @Test(dataProvider = "baseDNs")
+  public void testFailNoModifications(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -671,7 +670,7 @@
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("o=test"), mods);
+         conn.processModify(new ASN1OctetString(baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -772,17 +771,17 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessAddAttributeWithOptions()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessAddAttributeWithOptions(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
-    Entry e = DirectoryServer.getEntry(DN.decode("o=test"));
+    Entry e = DirectoryServer.getEntry(DN.decode(baseDN));
 
     int numValues = 0;
     List<Attribute> attrList =
-         e.getAttribute(DirectoryServer.getAttributeType("o", true));
+         e.getAttribute(DirectoryServer.getAttributeType("dc", true));
     for (Attribute a : attrList)
     {
       numValues += a.getValues().size();
@@ -794,19 +793,19 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("test"));
-    LDAPAttribute attr = new LDAPAttribute("o;lang-en-us", values);
+    LDAPAttribute attr = new LDAPAttribute("dc;lang-en-us", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("o=test"), mods);
+         conn.processModify(new ASN1OctetString(baseDN), mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
-    e = DirectoryServer.getEntry(DN.decode("o=test"));
+    e = DirectoryServer.getEntry(DN.decode(baseDN));
     numValues = 0;
-    attrList = e.getAttribute(DirectoryServer.getAttributeType("o", true));
+    attrList = e.getAttribute(DirectoryServer.getAttributeType("dc", true));
     for (Attribute a : attrList)
     {
       numValues += a.getValues().size();
@@ -822,14 +821,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddToSingleValuedAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddToSingleValuedAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -859,7 +858,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -872,14 +872,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddToSingleValuedOperationalAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddToSingleValuedOperationalAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -910,7 +910,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -923,14 +924,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceSingleValuedWithMultipleValues()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceSingleValuedWithMultipleValues(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -961,7 +962,8 @@
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -974,14 +976,15 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceSingleValuedOperationalAttrWithMultipleValues()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceSingleValuedOperationalAttrWithMultipleValues(
+       String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1012,7 +1015,8 @@
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1025,14 +1029,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddDuplicateValue()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddDuplicateValue(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1062,7 +1066,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1075,14 +1080,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceWithDuplicates()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceWithDuplicates(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1107,13 +1112,14 @@
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("Foo"));
     values.add(new ASN1OctetString("Foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1126,14 +1132,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceWithSyntaxViolation()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceWithSyntaxViolation(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1144,7 +1150,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "manager: cn=boss,o=test");
+         "manager: cn=boss," + baseDN);
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -1164,7 +1170,8 @@
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1177,14 +1184,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddSyntaxViolation()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddSyntaxViolation(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1214,7 +1221,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1227,14 +1235,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddDisallowedAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddDisallowedAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1264,7 +1272,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1278,14 +1287,15 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessAddDisallowedAttributeWithExtensibleObject()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessAddDisallowedAttributeWithExtensibleObject(
+       String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1320,7 +1330,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1333,14 +1344,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceRDNAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceRDNAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1370,7 +1381,8 @@
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1383,14 +1395,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveRDNAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveRDNAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1417,7 +1429,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1430,14 +1443,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveRDNValue()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveRDNValue(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1467,7 +1480,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1480,14 +1494,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceOneOfMultipleRDNAttributes()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceOneOfMultipleRDNAttributes(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: givenName=Test+sn=User,o=test",
+         "dn: givenName=Test+sn=User," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1518,7 +1532,7 @@
 
     ModifyOperation modifyOperation =
          conn.processModify(
-              new ASN1OctetString("givenName=Test,sn=User,o=test"), mods);
+              new ASN1OctetString("givenName=Test,sn=User," + baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1531,14 +1545,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveOneOfMultipleRDNValues()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveOneOfMultipleRDNValues(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: givenName=Test+sn=User,o=test",
+         "dn: givenName=Test+sn=User," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1566,7 +1580,7 @@
 
     ModifyOperation modifyOperation =
          conn.processModify(
-              new ASN1OctetString("givenName=Test,sn=User,o=test"), mods);
+              new ASN1OctetString("givenName=Test,sn=User," + baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1579,14 +1593,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveCompleteAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveCompleteAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1613,7 +1627,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1626,14 +1641,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveOneOfManyValues()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveOneOfManyValues(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1644,8 +1659,8 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
-         "description: bar");
+         "mail: foo",
+         "mail: bar");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -1659,13 +1674,14 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1678,14 +1694,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveOnlyValue()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveOnlyValue(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1696,7 +1712,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo");
+         "mail: foo");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -1710,13 +1726,14 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1729,14 +1746,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveAllOfManyValues()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveAllOfManyValues(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1747,8 +1764,8 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
-         "description: bar");
+         "mail: foo",
+         "mail: bar");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -1763,13 +1780,14 @@
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
     values.add(new ASN1OctetString("bar"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1782,14 +1800,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveRequiredAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveRequiredAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1816,7 +1834,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1829,14 +1848,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveRequiredAttributeValue()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveRequiredAttributeValue(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1866,7 +1885,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -1879,14 +1899,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessReplaceExistingWithNew()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessReplaceExistingWithNew(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1897,7 +1917,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo");
+         "mail: foo");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -1911,13 +1931,14 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("bar"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1926,18 +1947,18 @@
 
   /**
    * Tests the ability to perform a modification that replaces an existing
-   * attribute with nothing.
+   * attribute with the same value.
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessReplaceExistingWithNothing()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessReplaceExistingWithSame(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -1948,7 +1969,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo");
+         "mail: foo");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -1960,12 +1981,233 @@
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
 
 
-    LDAPAttribute attr = new LDAPAttribute("description");
+    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
+    values.add(new ASN1OctetString("test.user"));
+    LDAPAttribute attr = new LDAPAttribute("uid", values);
+
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
+    assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
+    retrieveSuccessfulOperationElements(modifyOperation);
+
+    InternalSearchOperation searchOperation =
+         new InternalSearchOperation(
+              conn,
+              InternalClientConnection.nextOperationID(),
+              InternalClientConnection.nextMessageID(),
+              new ArrayList<Control>(),
+              new ASN1OctetString(baseDN),
+              SearchScope.WHOLE_SUBTREE,
+              DereferencePolicy.NEVER_DEREF_ALIASES,
+              Integer.MAX_VALUE,
+              Integer.MAX_VALUE,
+              false,
+              LDAPFilter.decode("(uid=test.user)"),
+              null, null);
+
+    searchOperation.run();
+    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+    assertEquals(searchOperation.getEntriesSent(), 1);
+    assertEquals(searchOperation.getErrorMessage().length(), 0);
+  }
+
+
+
+  /**
+   * Tests the ability to perform a modification that deletes a value then
+   * adds the same value in a single operation.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessDeleteAndAddSameValue(String baseDN)
+         throws Exception
+  {
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
+
+    Entry entry = TestCaseUtils.makeEntry(
+         "dn: uid=test.user," + baseDN,
+         "objectClass: top",
+         "objectClass: person",
+         "objectClass: organizationalPerson",
+         "objectClass: inetOrgPerson",
+         "uid: test.user",
+         "givenName: Test",
+         "sn: User",
+         "cn: Test User",
+         "displayName: Test User",
+         "userPassword: password",
+         "mail: foo");
+
+    InternalClientConnection conn =
+         InternalClientConnection.getRootConnection();
+
+    AddOperation addOperation =
+         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
+                         entry.getUserAttributes(),
+                         entry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+
+
+    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
+    values.add(new ASN1OctetString("Test User"));
+    LDAPAttribute attr = new LDAPAttribute("cn", values);
+
+    ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
+    mods.add(new LDAPModification(ModificationType.DELETE, attr));
+    mods.add(new LDAPModification(ModificationType.ADD, attr));
+
+    ModifyOperation modifyOperation =
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
+    assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
+    retrieveSuccessfulOperationElements(modifyOperation);
+
+    InternalSearchOperation searchOperation =
+         new InternalSearchOperation(
+              conn,
+              InternalClientConnection.nextOperationID(),
+              InternalClientConnection.nextMessageID(),
+              new ArrayList<Control>(),
+              new ASN1OctetString(baseDN),
+              SearchScope.WHOLE_SUBTREE,
+              DereferencePolicy.NEVER_DEREF_ALIASES,
+              Integer.MAX_VALUE,
+              Integer.MAX_VALUE,
+              false,
+              LDAPFilter.decode("(cn=Test User)"),
+              null, null);
+
+    searchOperation.run();
+    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+    assertEquals(searchOperation.getEntriesSent(), 1);
+    assertEquals(searchOperation.getErrorMessage().length(), 0);
+  }
+
+
+
+  /**
+   * Tests the ability to perform a modification that deletes one value of an
+   * attribute containing two values, the values are the same but the attribute
+   * options differ.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessDeleteAttributeWithOption(String baseDN)
+         throws Exception
+  {
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
+
+    Entry entry = TestCaseUtils.makeEntry(
+         "dn: uid=test.user," + baseDN,
+         "objectClass: top",
+         "objectClass: person",
+         "objectClass: organizationalPerson",
+         "objectClass: inetOrgPerson",
+         "uid: test.user",
+         "givenName: Test",
+         "sn: User",
+         "cn: Test User",
+         "givenName;lang-de: X",
+         "givenName;lang-fr: X",
+         "displayName: Test User",
+         "userPassword: password",
+         "mail: foo");
+
+    InternalClientConnection conn =
+         InternalClientConnection.getRootConnection();
+
+    AddOperation addOperation =
+         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
+                         entry.getUserAttributes(),
+                         entry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+
+
+    ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
+    values.add(new ASN1OctetString("X"));
+    LDAPAttribute attr = new LDAPAttribute("givenName;lang-fr", values);
+
+    ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
+    mods.add(new LDAPModification(ModificationType.DELETE, attr));
+
+    ModifyOperation modifyOperation =
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
+    assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
+    retrieveSuccessfulOperationElements(modifyOperation);
+
+    InternalSearchOperation searchOperation =
+         new InternalSearchOperation(
+              conn,
+              InternalClientConnection.nextOperationID(),
+              InternalClientConnection.nextMessageID(),
+              new ArrayList<Control>(),
+              new ASN1OctetString(baseDN),
+              SearchScope.WHOLE_SUBTREE,
+              DereferencePolicy.NEVER_DEREF_ALIASES,
+              Integer.MAX_VALUE,
+              Integer.MAX_VALUE,
+              false,
+              LDAPFilter.decode("(givenName;lang-de=X)"),
+              null, null);
+
+    searchOperation.run();
+    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+    assertEquals(searchOperation.getEntriesSent(), 1);
+    assertEquals(searchOperation.getErrorMessage().length(), 0);
+  }
+
+
+
+  /**
+   * Tests the ability to perform a modification that replaces an existing
+   * attribute with nothing.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessReplaceExistingWithNothing(String baseDN)
+         throws Exception
+  {
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
+
+    Entry entry = TestCaseUtils.makeEntry(
+         "dn: uid=test.user," + baseDN,
+         "objectClass: top",
+         "objectClass: person",
+         "objectClass: organizationalPerson",
+         "objectClass: inetOrgPerson",
+         "uid: test.user",
+         "givenName: Test",
+         "sn: User",
+         "cn: Test User",
+         "displayName: Test User",
+         "userPassword: password",
+         "mail: foo");
+
+    InternalClientConnection conn =
+         InternalClientConnection.getRootConnection();
+
+    AddOperation addOperation =
+         conn.processAdd(entry.getDN(), entry.getObjectClasses(),
+                         entry.getUserAttributes(),
+                         entry.getOperationalAttributes());
+    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
+
+
+    LDAPAttribute attr = new LDAPAttribute("mail");
+    ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
+    mods.add(new LDAPModification(ModificationType.REPLACE, attr));
+
+    ModifyOperation modifyOperation =
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -1978,14 +2220,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessReplaceNonExistingWithNothing()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessReplaceNonExistingWithNothing(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2007,12 +2249,13 @@
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
 
 
-    LDAPAttribute attr = new LDAPAttribute("description");
+    LDAPAttribute attr = new LDAPAttribute("mail");
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -2025,14 +2268,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessReplaceNonExistingWithNew()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessReplaceNonExistingWithNew(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2056,13 +2299,14 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -2075,14 +2319,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveOnlyExistingAndAddNew()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveOnlyExistingAndAddNew(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2093,7 +2337,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo");
+         "mail: foo");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -2107,17 +2351,18 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("bar"));
-    attr = new LDAPAttribute("description", values);
+    attr = new LDAPAttribute("mail", values);
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -2130,14 +2375,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveOneExistingAndAddNew()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveOneExistingAndAddNew(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2148,8 +2393,8 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
-         "description: bar");
+         "mail: foo",
+         "mail: bar");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -2163,17 +2408,18 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("baz"));
-    attr = new LDAPAttribute("description", values);
+    attr = new LDAPAttribute("mail", values);
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -2186,14 +2432,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveOneExistingAndAddMultipleNew()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveOneExistingAndAddMultipleNew(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2204,7 +2450,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo");
+         "mail: foo");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -2218,18 +2464,19 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("bar"));
     values.add(new ASN1OctetString("baz"));
-    attr = new LDAPAttribute("description", values);
+    attr = new LDAPAttribute("mail", values);
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -2242,14 +2489,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveNonExistentAttribute()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveNonExistentAttribute(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2275,7 +2522,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2288,14 +2536,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveNonExistentValue()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveNonExistentValue(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2325,7 +2573,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2338,14 +2587,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveAllObjectClasses()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveAllObjectClasses(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2372,7 +2621,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2385,14 +2635,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceObjectClassesWithNothing()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceObjectClassesWithNothing(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2419,7 +2669,8 @@
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2432,14 +2683,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveStructuralObjectclass()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveStructuralObjectclass(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: ou=People,o=test",
+         "dn: ou=People," + baseDN,
          "objectClass: top",
          "objectClass: organizationalUnit",
          "objectClass: extensibleObject",
@@ -2463,7 +2714,7 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("ou=People,o=test"), mods);
+         conn.processModify(new ASN1OctetString("ou=People," + baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2476,14 +2727,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddSecondStructuralObjectClass()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddSecondStructuralObjectClass(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: ou=People,o=test",
+         "dn: ou=People," + baseDN,
          "objectClass: top",
          "objectClass: organizationalUnit",
          "objectClass: extensibleObject",
@@ -2507,7 +2758,7 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("ou=People,o=test"), mods);
+         conn.processModify(new ASN1OctetString("ou=People," + baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2520,14 +2771,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessIncrementByOne()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessIncrementByOne(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2538,7 +2789,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -2558,11 +2809,12 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
-    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user,o=test"));
+    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user," + baseDN));
     List<Attribute> attrList =
          e.getAttribute(DirectoryServer.getAttributeType("employeenumber",
                                                          true));
@@ -2588,14 +2840,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessIncrementByTen()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessIncrementByTen(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2606,7 +2858,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -2626,11 +2878,12 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
-    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user,o=test"));
+    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user," + baseDN));
     List<Attribute> attrList =
          e.getAttribute(DirectoryServer.getAttributeType("employeenumber",
                                                          true));
@@ -2656,14 +2909,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessIncrementByNegativeOne()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessIncrementByNegativeOne(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2674,7 +2927,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -2694,11 +2947,12 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
-    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user,o=test"));
+    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user," + baseDN));
     List<Attribute> attrList =
          e.getAttribute(DirectoryServer.getAttributeType("employeenumber",
                                                          true));
@@ -2724,14 +2978,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailIncrementNonNumeric()
+  @Test(dataProvider = "baseDNs")
+  public void testFailIncrementNonNumeric(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2760,7 +3014,8 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2773,14 +3028,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailIncrementValueNonNumeric()
+  @Test(dataProvider = "baseDNs")
+  public void testFailIncrementValueNonNumeric(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2791,7 +3046,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: 1");
+         "mail: 1");
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
@@ -2805,12 +3060,13 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("notnumeric"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2823,14 +3079,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessIncrementMultiValued()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessIncrementMultiValued(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2861,7 +3117,8 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
   }
@@ -2874,14 +3131,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailIncrementNoIncrementValues()
+  @Test(dataProvider = "baseDNs")
+  public void testFailIncrementNoIncrementValues(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2909,7 +3166,8 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2922,14 +3180,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailIncrementMultipleIncrementValues()
+  @Test(dataProvider = "baseDNs")
+  public void testFailIncrementMultipleIncrementValues(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -2960,7 +3218,8 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -2973,14 +3232,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailIncrementNonExisting()
+  @Test(dataProvider = "baseDNs")
+  public void testFailIncrementNonExisting(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3009,7 +3268,8 @@
     mods.add(new LDAPModification(ModificationType.INCREMENT, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -3022,14 +3282,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessRemoveUnneededAuxiliaryObjectClass()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessRemoveUnneededAuxiliaryObjectClass(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3041,7 +3301,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3061,11 +3321,12 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
-    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user,o=test"));
+    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user," + baseDN));
     assertFalse(e.hasObjectClass(
          DirectoryServer.getObjectClass("extensibleobject", true)));
   }
@@ -3078,14 +3339,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSuccessAddAuxiliaryObjectClass()
+  @Test(dataProvider = "baseDNs")
+  public void testSuccessAddAuxiliaryObjectClass(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3096,7 +3357,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3116,11 +3377,12 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
-    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user,o=test"));
+    Entry e = DirectoryServer.getEntry(DN.decode("uid=test.user," + baseDN));
     assertTrue(e.hasObjectClass(
          DirectoryServer.getObjectClass("extensibleobject", true)));
   }
@@ -3132,14 +3394,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailAddDuplicateObjectClass()
+  @Test(dataProvider = "baseDNs")
+  public void testFailAddDuplicateObjectClass(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3150,7 +3412,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3170,7 +3432,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -3183,14 +3446,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailRemoveNonExistingObjectClass()
+  @Test(dataProvider = "baseDNs")
+  public void testFailRemoveNonExistingObjectClass(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3201,7 +3464,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3221,7 +3484,8 @@
     mods.add(new LDAPModification(ModificationType.DELETE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
   }
@@ -3234,14 +3498,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailReplaceNoUserModification()
+  @Test(dataProvider = "baseDNs")
+  public void testFailReplaceNoUserModification(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3287,7 +3551,7 @@
 
     ModifyRequestProtocolOp modifyRequest =
          new ModifyRequestProtocolOp(
-                  new ASN1OctetString("uid=test.user,o=test"), mods);
+                  new ASN1OctetString("uid=test.user," + baseDN), mods);
     message = new LDAPMessage(2, modifyRequest);
     w.writeElement(message.encode());
 
@@ -3305,14 +3569,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailServerCompletelyReadOnly()
+  @Test(dataProvider = "baseDNs")
+  public void testFailServerCompletelyReadOnly(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3323,7 +3587,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3345,7 +3609,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
 
@@ -3360,14 +3625,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSucceedServerInternalOnlyWritability()
+  @Test(dataProvider = "baseDNs")
+  public void testSucceedServerInternalOnlyWritability(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3378,7 +3643,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3400,7 +3665,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
@@ -3415,14 +3681,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailServerInternalOnlyWritability()
+  @Test(dataProvider = "baseDNs")
+  public void testFailServerInternalOnlyWritability(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3433,7 +3699,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3473,7 +3739,7 @@
 
     ModifyRequestProtocolOp modifyRequest =
          new ModifyRequestProtocolOp(
-                  new ASN1OctetString("uid=test.user,o=test"), mods);
+                  new ASN1OctetString("uid=test.user," + baseDN), mods);
     message = new LDAPMessage(2, modifyRequest);
     w.writeElement(message.encode());
 
@@ -3493,14 +3759,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailBackendCompletelyReadOnly()
+  @Test(dataProvider = "baseDNs")
+  public void testFailBackendCompletelyReadOnly(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3511,7 +3777,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3524,7 +3790,7 @@
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
 
 
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend b = DirectoryServer.getBackend(DN.decode(baseDN));
     b.setWritabilityMode(WritabilityMode.DISABLED);
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
@@ -3534,7 +3800,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
 
@@ -3549,14 +3816,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testSucceedBackendInternalOnlyWritability()
+  @Test(dataProvider = "baseDNs")
+  public void testSucceedBackendInternalOnlyWritability(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3567,7 +3834,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3580,7 +3847,7 @@
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
 
 
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend b = DirectoryServer.getBackend(DN.decode(baseDN));
     b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
@@ -3590,7 +3857,8 @@
     mods.add(new LDAPModification(ModificationType.ADD, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("uid=test.user,o=test"), mods);
+         conn.processModify(new ASN1OctetString("uid=test.user," + baseDN),
+                            mods);
     assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
     retrieveSuccessfulOperationElements(modifyOperation);
 
@@ -3605,14 +3873,14 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailBackendInternalOnlyWritability()
+  @Test(dataProvider = "baseDNs")
+  public void testFailBackendInternalOnlyWritability(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Entry entry = TestCaseUtils.makeEntry(
-         "dn: uid=test.user,o=test",
+         "dn: uid=test.user," + baseDN,
          "objectClass: top",
          "objectClass: person",
          "objectClass: organizationalPerson",
@@ -3623,7 +3891,7 @@
          "cn: Test User",
          "displayName: Test User",
          "userPassword: password",
-         "description: foo",
+         "mail: foo",
          "employeeNumber: 1");
 
     InternalClientConnection conn =
@@ -3636,7 +3904,7 @@
     assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
 
 
-    Backend b = DirectoryServer.getBackend(DN.decode("o=test"));
+    Backend b = DirectoryServer.getBackend(DN.decode(baseDN));
     b.setWritabilityMode(WritabilityMode.INTERNAL_ONLY);
 
 
@@ -3664,7 +3932,7 @@
 
     ModifyRequestProtocolOp modifyRequest =
          new ModifyRequestProtocolOp(
-                  new ASN1OctetString("uid=test.user,o=test"), mods);
+                  new ASN1OctetString("uid=test.user," + baseDN), mods);
     message = new LDAPMessage(2, modifyRequest);
     w.writeElement(message.encode());
 
@@ -3722,11 +3990,11 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testFailDoNotNotifyChangeListeners()
+  @Test(dataProvider = "baseDNs")
+  public void testFailDoNotNotifyChangeListeners(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     TestChangeNotificationListener changeListener =
          new TestChangeNotificationListener();
@@ -3744,7 +4012,7 @@
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
-         conn.processModify(new ASN1OctetString("o=test"), mods);
+         conn.processModify(new ASN1OctetString(baseDN), mods);
     assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     retrieveFailedOperationElements(modifyOperation);
 
@@ -3759,25 +4027,25 @@
    *
    * @throws  Exception  If an unexpected probem occurs.
    */
-  @Test()
-  public void testCancelBeforeStartup()
+  @Test(dataProvider = "baseDNs")
+  public void testCancelBeforeStartup(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyOperation modifyOperation =
          new ModifyOperation(conn, conn.nextOperationID(), conn.nextMessageID(),
-                             null, new ASN1OctetString("o=test"), mods);
+                             null, new ASN1OctetString(baseDN), mods);
 
     CancelRequest cancelRequest = new CancelRequest(false,
                                                     "testCancelBeforeStartup");
@@ -3794,13 +4062,13 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test(groups = { "slow" })
-  public void testCannotLockEntry()
+  @Test(dataProvider = "baseDNs", groups = { "slow" })
+  public void testCannotLockEntry(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
-    Lock entryLock = LockManager.lockRead(DN.decode("o=test"));
+    Lock entryLock = LockManager.lockRead(DN.decode(baseDN));
 
     try
     {
@@ -3809,18 +4077,18 @@
 
       ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
       values.add(new ASN1OctetString("foo"));
-      LDAPAttribute attr = new LDAPAttribute("description", values);
+      LDAPAttribute attr = new LDAPAttribute("mail", values);
 
       ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
       mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
       ModifyOperation modifyOperation =
-           conn.processModify(new ASN1OctetString("o=test"), mods);
+           conn.processModify(new ASN1OctetString(baseDN), mods);
       assertFalse(modifyOperation.getResultCode() == ResultCode.SUCCESS);
     }
     finally
     {
-      LockManager.unlock(DN.decode("o=test"), entryLock);
+      LockManager.unlock(DN.decode(baseDN), entryLock);
     }
   }
 
@@ -3831,11 +4099,11 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testDisconnectInPreParseModify()
+  @Test(dataProvider = "baseDNs")
+  public void testDisconnectInPreParseModify(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
@@ -3856,13 +4124,13 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyRequestProtocolOp modifyRequest =
-         new ModifyRequestProtocolOp(new ASN1OctetString("o=test"), mods);
+         new ModifyRequestProtocolOp(new ASN1OctetString(baseDN), mods);
     message = new LDAPMessage(2, modifyRequest,
          DisconnectClientPlugin.createDisconnectLDAPControlList("PreParse"));
     w.writeElement(message.encode());
@@ -3950,11 +4218,11 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testDisconnectInPostOperationModify()
+  @Test(dataProvider = "baseDNs")
+  public void testDisconnectInPostOperationModify(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
@@ -3975,13 +4243,13 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyRequestProtocolOp modifyRequest =
-         new ModifyRequestProtocolOp(new ASN1OctetString("o=test"), mods);
+         new ModifyRequestProtocolOp(new ASN1OctetString(baseDN), mods);
     message = new LDAPMessage(2, modifyRequest,
          DisconnectClientPlugin.createDisconnectLDAPControlList(
               "PostOperation"));
@@ -4010,11 +4278,11 @@
    *
    * @throws  Exception  If an unexpected problem occurs.
    */
-  @Test()
-  public void testDisconnectInPostResponseModify()
+  @Test(dataProvider = "baseDNs")
+  public void testDisconnectInPostResponseModify(String baseDN)
          throws Exception
   {
-    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearJEBackend(true,"userRoot",baseDN);
 
     Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort());
     ASN1Reader r = new ASN1Reader(s);
@@ -4035,13 +4303,13 @@
 
     ArrayList<ASN1OctetString> values = new ArrayList<ASN1OctetString>();
     values.add(new ASN1OctetString("foo"));
-    LDAPAttribute attr = new LDAPAttribute("description", values);
+    LDAPAttribute attr = new LDAPAttribute("mail", values);
 
     ArrayList<LDAPModification> mods = new ArrayList<LDAPModification>();
     mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
     ModifyRequestProtocolOp modifyRequest =
-         new ModifyRequestProtocolOp(new ASN1OctetString("o=test"), mods);
+         new ModifyRequestProtocolOp(new ASN1OctetString(baseDN), mods);
     message = new LDAPMessage(2, modifyRequest,
          DisconnectClientPlugin.createDisconnectLDAPControlList(
               "PostResponse"));

--
Gitblit v1.10.0