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

Gary Williams
28.02.2012 2aa8aee407d3ba221e1fd24e143b916b2d0be3c0
refactor replication functional tests to be one test per function
11 files added
11 files modified
27191 ■■■■■ changed files
opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml 1063 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci_tests.xml 1162 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml 2088 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic_tests.xml 2482 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml 441 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy_tests.xml 422 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml 1480 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog_tests.xml 1529 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml 3527 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml 3820 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml 953 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption_tests.xml 1088 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml 577 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml 611 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml 457 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml 421 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml 850 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml 897 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml 1067 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml 1131 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml 560 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml 565 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml
@@ -9,65 +9,77 @@
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 !      Copyright 2012 ForgeRock AS.
 ! -->
<stax>
  <defaultcall function="replication_aci"/>
  <function name="replication_aci">
  <function name="replication_aci" scope="local">
    <sequence>
      <block name="'aci'">
      <block name="'replication_aci'">
        <try>
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='aci'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
              CurrentTestPath['group'] = 'replication'
              CurrentTestPath['suite'] = 'aci'
          <call function="'testSuite_Preamble'"/>
              _group=CurrentTestPath['group']
              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
              _label = 'Replication ACI'
            </script>
          <!--- Test Suite information
          #@TestSuiteName       Replication ACI Tests
          #@TestSuitePurpose    Verify that updates on ACIs are replicated all
                                right and are applied accordingly across the
                                topology.
            #@TestSuitePurpose    Verify that the ACI operations are replicated
                                  correctly between two servers.
          #@TestSuiteID         ACI Tests
          #@TestSuiteGroup      ACI
          #@TestGroup           Replication
          #@TestScript          replication_aci.xml
          #@TestHTMLLink        http://opends.dev.java.net/
            #@TestHTMLLink        http://www.forgerock.org/
          -->
            
            <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
                                                                        
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_setup.xml'
                  % (TESTS_DIR)"/>
          <call function="'replication_setup'">
            { 'dataFile' : 'Short_Example.ldif' ,
              'label'    : 'Replication ACI' }
                    'label'    : _label }
          </call>
                                    
                <!-- List of Import of Test Functions -->
          <script>
                  importList=[]
                  importList.append('aci/aci_tests')
                </script>
                <!-- Import the files for this test suite -->
                <iterate var="_import" in="importList">
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/%s.xml' % (_groupdir,_import)"/>
                </iterate>
                <!-- Specific to replication tests -->
                <script>
                  msg1 = 'Replication: ACI:'
            class Entry:
              def __init__(self, rdn, suffix):
                self.userDn = '%s,ou=People,%s' \
@@ -88,998 +100,71 @@
                self.listAttr.append('%s:%s' % (attrType, attrValue))
          </script>
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Add entry with ACI
          #@TestID              Add entry with ACI
          #@TestPurpose         Check ACI replication over an entry add
          #@TestPreamble
          #@TestSteps           Add entry with ACI: deny self description write
          #@TestSteps           Binding as entry, add givenname to entry
                                (expect SUCCESS)
          #@TestSteps           Binding as entry, add description to entry
                                (expect ERROR 50)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Add entry with ACI')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Add entry with ACI. Check ACI replication \
                over an entry add.'
              </message>
                <!-- List of Test Cases -->
              <script>
                myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)"
                myUserpassword = 'entryPwd'
                myEntry = Entry('cn=ACI entry', synchroSuffix)
                myEntry.addAttr('sn', 'ACI repl tests')
                myEntry.addAttr('aci', myAci)
                myEntry.addAttr('userpassword', myUserpassword)
                  testsList=[]
                  testsList.append('replication_aci_001')
                  testsList.append('replication_aci_002')
                  testsList.append('replication_aci_003')
                  testsList.append('replication_aci_004')
                  testsList.append('replication_aci_005')
                  testsList.append('replication_aci_006')
                  testsList.append('replication_aci_007')
              </script>
              
              <!-- Add entry to "master" server with aci:
               !   (targetattr="description")(version 3.0; acl
               !   "Deny Self Description Write"; deny (write)
               !   userdn="ldap:///self";)
              -->
              <message>
                'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci)
              </message>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <message>
                '+++ New ACI +++\nDeny "%s" the access to write its own \
                description attribute.' % myEntry.getDn()
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
                <sequence>
                  <script>
                    serverPath    = '%s/%s' % (server.getDir(), OPENDSNAME)
                    myGivenname   = 'My own GIVENNAME value %s' % i
                    myDescription = 'My own DESCRIPTION value %s' % i
                  </script>
                  <message>
                    'Binding as "%s", add givenname %s to entry %s on server \
                    %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myGivenname, myEntry.getDn(),
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : myEntry.getDn(),
                      'dsInstancePswd'    : myUserpassword,
                      'DNToModify'        : myEntry.getDn(),
                      'attributeName'     : 'givenname',
                      'newAttributeValue' : myGivenname,
                      'changetype'        : 'add'
                    }
                  </call>
                  <message>
                    'Binding as "%s", add description %s to entry %s on \
                    server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
                    Rights)' % \
                    (myEntry.getDn(), myDescription, myEntry.getDn(),
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : myEntry.getDn(),
                      'dsInstancePswd'    : myUserpassword,
                      'DNToModify'        : myEntry.getDn(),
                      'attributeName'     : 'description',
                      'newAttributeValue' : myDescription,
                      'changetype'        : 'add',
                      'expectedRC'        : 50
                    }
                  </call>
                    <call function="'%s' % (__test)" />
                </sequence>
              </iterate>
                
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Modify_add ACI
          #@TestID              Modify_add ACI
          #@TestPurpose         Check ACI replication over a modify_add
          #@TestPreamble        Add a user entry to suffix
          #@TestSteps           Binding as user, add description to child entry
                                (expect ERROR 50)
          #@TestSteps           Add ACI to parent entry: allow user full access
                                to all description attributes
          #@TestSteps           Binding as user, add description to child entry
                                (expect SUCCESS)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Modify_add ACI')">
              <catch exception="'STAFException.TestSuite.SetupException'">
            <sequence>            
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Modify_add ACI. Check ACI replication \
                over a modify_add.'
                  <message log="1" level="'fatal'">
                    'Setup of test suite failed.'
              </message>
                  <rethrow/>
                </sequence>
              </catch>
              
              <script>
                myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
                mySn = 'ACI repl user'
                myUserpassword = 'userPwd'
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
                myEntry = Entry('cn=ACI user', synchroSuffix)
                myEntry.addAttr('sn', mySn)
                myEntry.addAttr('userpassword', myUserpassword)
            </try>
                
                myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
              </script>
          </sequence>
              
              <!-- Add user entry to "master" server -->
              <message>
                'Add user entry %s' % myEntry.getDn()
              </message>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <iterate var="server" in="_topologyServerList" indexvar="i">
          <finally>
                <sequence>
                  <script>
                    serverPath    = '%s/%s' % (server.getDir(), OPENDSNAME)
                    myDescription = 'He was a serious opium adict - %s' % i
                  </script>
                  <message>
                    'Binding as "%s", add description %s to entry %s on \
                    server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
                    Rights)' % \
                    (myEntry.getDn(), myDescription, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : myEntry.getDn(),
                      'dsInstancePswd'    : myUserpassword,
                      'DNToModify'        : myTargetEntryDn,
                      'attributeName'     : 'description',
                      'newAttributeValue' : myDescription,
                      'changetype'        : 'add',
                      'expectedRC'        : 50
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Add aci to entry ou=People,o=example on "master" server:
               !   (targetattr="description")(version 3.0; acl
               !   "Allow ACI-user access to description"; allow (all)
               !   userdn="ldap:///cn=ACI user,ou=People,o=example";)
              -->
              <message>
                'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci)
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                  'attributeName'     : 'aci',
                  'newAttributeValue' : myAci,
                  'changetype'        : 'add'
                }
              </call>
              <message>
                '+++ New ACI +++\nAllow "%s" full access to all description \
                attributes under ou=People,%s.' % \
                (myEntry.getDn(), synchroSuffix)
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
              <!-- Test Suite Cleanup -->
              <message>'Finally: Replication Cleanup.'</message>
              <try>
                <sequence>
                  <script>
                    serverPath    = '%s/%s' % (server.getDir(), OPENDSNAME)
                    myDescription = 'He was a serious opium adict - %s' % i
                  </script>
                  <message>
                    'Binding as "%s", add description %s to entry %s on \
                    server %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myDescription, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : myEntry.getDn(),
                      'dsInstancePswd'    : myUserpassword,
                      'DNToModify'        : myTargetEntryDn,
                      'attributeName'     : 'description',
                      'newAttributeValue' : myDescription,
                      'changetype'        : 'add'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Modify_replace ACI target
          #@TestID              Modify_replace ACI target
          #@TestPurpose         Check ACI replication over a modify_replace of
                                the ACI target
          #@TestPreamble
          #@TestSteps           Binding as user, add telephonenumber to child
                                entry (expect ERROR 50)
          #@TestSteps           Replace ACI on parent entry: allow user full
                                access to all telephonenumber attributes
          #@TestSteps           Binding as user, add telephonenumber to child
                                entry (expect SUCCESS)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Modify_replace ACI target')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Modify_replace ACI target. Check ACI \
                replication over a modify_replace of the ACI target.'
              </message>
              <script>
                myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
                myUserpassword = 'userPwd'
                myEntry = Entry('cn=ACI user', synchroSuffix)
                myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
              </script>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath        = '%s/%s' % (server.getDir(), OPENDSNAME)
                    myTelephonenumber = '221-221-221-%s' % i
                  </script>
                  <message>
                    'Binding as "%s", add telephonenumber %s to entry %s on \
                    server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
                    Rights)' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : myEntry.getDn(),
                      'dsInstancePswd'    : myUserpassword,
                      'DNToModify'        : myTargetEntryDn,
                      'attributeName'     : 'telephonenumber',
                      'newAttributeValue' : myTelephonenumber,
                      'changetype'        : 'add',
                      'expectedRC'        : 50
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Replace aci on entry ou=People,o=example on "master" server:
               !   (targetattr="telephonenumber")(version 3.0; acl
               !   "Allow ACI-user access to telephonenumber"; allow (all)
               !   userdn="ldap:///cn=ACI user,ou=People,o=example";)
              -->
              <message>
                'Replace ACI on entry ou=People,%s: \n%s' % \
                (synchroSuffix, myAci)
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                  'attributeName'     : 'aci',
                  'newAttributeValue' : myAci,
                  'changetype'        : 'replace'
                }
              </call>
              <message>
                '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\
                 attributes under ou=People,%s.' % \
                (myEntry.getDn(), synchroSuffix)
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath        = '%s/%s' % (server.getDir(), OPENDSNAME)
                    myTelephonenumber = '221-221-221-%s' % i
                  </script>
                  <message>
                    'Binding as "%s", add description %s to entry %s on \
                    server %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : myEntry.getDn(),
                      'dsInstancePswd'    : myUserpassword,
                      'DNToModify'        : myTargetEntryDn,
                      'attributeName'     : 'telephonenumber',
                      'newAttributeValue' : myTelephonenumber,
                      'changetype'        : 'add'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Modify_replace ACI permission
          #@TestID              Modify_replace ACI permission
          #@TestPurpose         Check ACI replication over a modify_replace of
                                the ACI permission
          #@TestPreamble
          #@TestSteps           Binding as user, compare telephonenumber value
                                to child entry (expect SUCCESS)
          #@TestSteps           Replace ACI on parent entry: deny user access to
                                telephonenumber attributes
          #@TestSteps           Binding as user, compare telephonenumber value
                                to child entry (expect ERROR 50)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Modify_replace ACI permission')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Modify_replace ACI permission. Check ACI \
                replication over a modify_replace of the ACI permission.'
              </message>
              <script>
                myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
                myUserpassword = 'userPwd'
                myEntry = Entry('cn=ACI user', synchroSuffix)
                myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
                myTelephonenumber = '+1 408 555 6789'
              </script>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 0
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Replace aci on entry ou=People,o=example on "master" server:
               !   (targetattr="telephonenumber")(version 3.0; acl
               !   "Deny ACI-user access to telephonenumber"; deny (all)
               !   userdn="ldap:///cn=ACI user,ou=People,o=example";)
              -->
              <message>
                'Replace ACI on entry ou=People,%s: \n%s' % \
                (synchroSuffix, myAci)
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                  'attributeName'     : 'aci',
                  'newAttributeValue' : myAci,
                  'changetype'        : 'replace'
                }
              </call>
              <message>
                '+++ New ACI +++\nDeny "%s" access to all telephonenumber \
                attributes under ou=People,%s.' % \
                (myEntry.getDn(), synchroSuffix)
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: ERROR 50 \
                    (Insufficient Access Rights)' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 50
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Modify_replace ACI bind rule
          #@TestID              Modify_replace ACI bind rule
          #@TestPurpose         Check ACI replication over a modify_replace of
                                the ACI bind rule
          #@TestPreamble        Add new user entry
          #@TestSteps           Binding as new user, compare telephonenumber
                                value to child entry  (expect SUCCESS)
          #@TestSteps           Replace ACI on parent entry: deny users with
                                a given sn access to telephonenumber attributes
          #@TestSteps           Binding as new user, compare telephonenumber
                                value to child entry  (expect ERROR 50)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Modify_replace ACI bind rule')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Modify_replace ACI bind rule. Check ACI \
                replication over a modify_replace of the ACI bind rule.'
              </message>
              <script>
                mySn  = 'ACI repl user'
                myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
                myUserpassword = 'secondUserPwd'
                myEntry = Entry('cn=Second ACI user', synchroSuffix)
                myEntry.addAttr('sn', mySn)
                myEntry.addAttr('userpassword', myUserpassword)
                myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
                myTelephonenumber = '+1 408 555 6789'
              </script>
              <!-- Add user entry to "master" server -->
              <message>
                'Add user entry %s' % myEntry.getDn()
              </message>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 0
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Replace aci on entry ou=People,o=example on "master" server:
               !   (targetattr="telephonenumber")(version 3.0; acl
               !   "Deny ACI repl users access to telephonenumber"; deny (all)
               !   userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
              -->
              <message>
                'Replace ACI on entry ou=People,%s: \n%s' % \
                (synchroSuffix, myAci)
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                  'attributeName'     : 'aci',
                  'newAttributeValue' : myAci,
                  'changetype'        : 'replace'
                }
              </call>
              <message>
                '+++ New ACI +++\nDeny users with (sn=%s) access to all \
                telephonenumber attributes under ou=People,%s.' % \
                (mySn, synchroSuffix)
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: ERROR 50 \
                    (Insufficient Access Rights)' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 50
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Bypass-acl privilege
          #@TestID              Bypass-acl privilege
          #@TestPurpose         Check the bypass-acl privilege is replicated and
                                successfully applied over the topology
          #@TestPreamble
          #@TestSteps           Binding as new user, compare telephonenumber
                                value to child entry  (expect ERROR 50)
          #@TestSteps           Add ds-privilege-name:bypass-acl to new user
          #@TestSteps           Binding as new user, compare telephonenumber
                                value to child entry  (expect SUCCESS)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Bypass-acl privilege')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \
                privilege is replicated and successfully applied over the \
                topology'
              </message>
              <script>
                myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
                myUserpassword = 'secondUserPwd'
                myPrivilege  = 'bypass-acl'
                myEntry = Entry('cn=Second ACI user', synchroSuffix)
                myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
                myTelephonenumber = '+1 408 555 6789'
              </script>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: ERROR 50 \
                    (Insufficient Access Rights)' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 50
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Add bypass-acl privilege to new user entry -->
              <message>
                'Add %s privilege to entry %s: \n' % \
                (myPrivilege, myEntry.getDn())
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : myEntry.getDn(),
                  'attributeName'     : 'ds-privilege-name',
                  'newAttributeValue' : myPrivilege,
                  'changetype'        : 'add'
                }
              </call>
              <message>
                '+++ Active ACI +++\nDeny users with (sn=%s) access to all \
                telephonenumber attributes under ou=People,%s.' % \
                (mySn, synchroSuffix)
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 0
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication ACI Tests
          #@TestName            Replication: ACI: Modify_delete ACI
          #@TestID              Modify_delete ACI
          #@TestPurpose         Check ACI replication over a modify_delete
          #@TestPreamble
          #@TestSteps           Binding as user, compare telephonenumber value
                                to child entry  (expect ERROR 50)
          #@TestSteps           Delete ACI on parent entry
          #@TestSteps           Binding as user, compare telephonenumber value
                                to child entry  (expect SUCCESS)
          #@TestPostamble
          #@TestResult          Success if the servers synchronised and the aci
                                correctly applied after replication
          -->
          <testcase name="getTestCaseName('Modify_delete ACI')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: ACI: Modify_delete ACI. Check ACI \
                replication over a modify_delete.'
              </message>
              <script>
                myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
                myUserpassword = 'userPwd'
                myEntry = Entry('cn=ACI user', synchroSuffix)
                myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
                myTelephonenumber = '+1 408 555 6789'
              </script>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: ERROR 50 \
                    (Insufficient Access Rights)' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 50
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Delete aci on entry ou=People,o=example on "master" server:
               !   (targetattr="telephonenumber")(version 3.0; acl
               !   "Deny ACI repl users access to telephonenumber"; deny (all)
               !   userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
              -->
              <message>
                'Delete ACI on entry ou=People,%s: \n%s' % \
                (synchroSuffix, myAci)
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                  'attributeName'     : 'aci',
                  'newAttributeValue' : myAci,
                  'changetype'        : 'delete'
                }
              </call>
              <message>
                '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                    'Binding as "%s", compare telephonenumber:%s value to \
                    entry %s on server %s:%s. -- Expect: SUCCESS' % \
                    (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                     server.getHostname(), server.getPort())
                  </message>
                  <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                   !   uid=sholmes,ou=People,o=example -->
                  <call function="'ldapCompareWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : myEntry.getDn(),
                      'dsInstancePswd' : myUserpassword,
                      'dsDn'           : ['telephonenumber:%s' % \
                                          myTelephonenumber, myTargetEntryDn],
                      'expectedRC'     : 0
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_cleanup.xml' 
                  % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" >
            { 'label'    : 'Replication ACI' }
                    { 'label'    : _label }
          </call>
              </sequence>
              <catch exception="'STAFException'">
                <sequence>
                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                </sequence>
              </catch>
              <finally>
          <call function="'testSuite_Postamble'"/>
              </finally>
              </try>
        </sequence>
          </finally>
        </try>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci_tests.xml
New file
@@ -0,0 +1,1162 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 ! -->
<stax>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Add entry with ACI
  #@TestID              Add entry with ACI
  #@TestPurpose         Check ACI replication over an entry add
  #@TestPreamble
  #@TestSteps           Add entry with ACI: deny self description write
  #@TestSteps           Binding as entry, add givenname to entry
                        (expect SUCCESS)
  #@TestSteps           Binding as entry, add description to entry
                        (expect ERROR 50)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_001" scope="local">
    <testcase name="getTestCaseName('Add entry with ACI')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Add entry with ACI. Check ACI replication \
              over an entry add.'
            </message>
            <script>
              myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)"
              myUserpassword = 'entryPwd'
              myEntry = Entry('cn=ACI entry', synchroSuffix)
              myEntry.addAttr('sn', 'ACI repl tests')
              myEntry.addAttr('aci', myAci)
              myEntry.addAttr('userpassword', myUserpassword)
            </script>
            <!-- Add entry to "master" server with aci:
             !   (targetattr="description")(version 3.0; acl
             !   "Deny Self Description Write"; deny (write)
             !   userdn="ldap:///self";)
            -->
            <message>
              'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci)
            </message>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <message>
              '+++ New ACI +++\nDeny "%s" the access to write its own \
              description attribute.' % myEntry.getDn()
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath    = '%s/%s' % (server.getDir(), OPENDSNAME)
                  myGivenname   = 'My own GIVENNAME value %s' % i
                  myDescription = 'My own DESCRIPTION value %s' % i
                </script>
                <message>
                  'Binding as "%s", add givenname %s to entry %s on server \
                  %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myGivenname, myEntry.getDn(),
                   server.getHostname(), server.getPort())
                </message>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : myEntry.getDn(),
                    'dsInstancePswd'    : myUserpassword,
                    'DNToModify'        : myEntry.getDn(),
                    'attributeName'     : 'givenname',
                    'newAttributeValue' : myGivenname,
                    'changetype'        : 'add'
                  }
                </call>
                <message>
                  'Binding as "%s", add description %s to entry %s on \
                  server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
                  Rights)' % \
                  (myEntry.getDn(), myDescription, myEntry.getDn(),
                   server.getHostname(), server.getPort())
                </message>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : myEntry.getDn(),
                    'dsInstancePswd'    : myUserpassword,
                    'DNToModify'        : myEntry.getDn(),
                    'attributeName'     : 'description',
                    'newAttributeValue' : myDescription,
                    'changetype'        : 'add',
                    'expectedRC'        : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Modify_add ACI
  #@TestID              Modify_add ACI
  #@TestPurpose         Check ACI replication over a modify_add
  #@TestPreamble        Add a user entry to suffix
  #@TestSteps           Binding as user, add description to child entry
                        (expect ERROR 50)
  #@TestSteps           Add ACI to parent entry: allow user full access
                        to all description attributes
  #@TestSteps           Binding as user, add description to child entry
                        (expect SUCCESS)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_002" scope="local">
    <testcase name="getTestCaseName('Modify_add ACI')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Modify_add ACI. Check ACI replication \
              over a modify_add.'
            </message>
            <script>
              myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
              mySn = 'ACI repl user'
              myUserpassword = 'userPwd'
              myEntry = Entry('cn=ACI user', synchroSuffix)
              myEntry.addAttr('sn', mySn)
              myEntry.addAttr('userpassword', myUserpassword)
              myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
            </script>
            <!-- Add user entry to "master" server -->
            <message>
              'Add user entry %s' % myEntry.getDn()
            </message>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath    = '%s/%s' % (server.getDir(), OPENDSNAME)
                  myDescription = 'He was a serious opium adict - %s' % i
                </script>
                <message>
                  'Binding as "%s", add description %s to entry %s on \
                  server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
                  Rights)' % \
                  (myEntry.getDn(), myDescription, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : myEntry.getDn(),
                    'dsInstancePswd'    : myUserpassword,
                    'DNToModify'        : myTargetEntryDn,
                    'attributeName'     : 'description',
                    'newAttributeValue' : myDescription,
                    'changetype'        : 'add',
                    'expectedRC'        : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Add aci to entry ou=People,o=example on "master" server:
             !   (targetattr="description")(version 3.0; acl
             !   "Allow ACI-user access to description"; allow (all)
             !   userdn="ldap:///cn=ACI user,ou=People,o=example";)
            -->
            <message>
              'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci)
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                'attributeName'     : 'aci',
                'newAttributeValue' : myAci,
                'changetype'        : 'add'
              }
            </call>
            <message>
              '+++ New ACI +++\nAllow "%s" full access to all description \
              attributes under ou=People,%s.' % \
              (myEntry.getDn(), synchroSuffix)
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath    = '%s/%s' % (server.getDir(), OPENDSNAME)
                  myDescription = 'He was a serious opium adict - %s' % i
                </script>
                <message>
                  'Binding as "%s", add description %s to entry %s on \
                  server %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myDescription, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : myEntry.getDn(),
                    'dsInstancePswd'    : myUserpassword,
                    'DNToModify'        : myTargetEntryDn,
                    'attributeName'     : 'description',
                    'newAttributeValue' : myDescription,
                    'changetype'        : 'add'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Modify_replace ACI target
  #@TestID              Modify_replace ACI target
  #@TestPurpose         Check ACI replication over a modify_replace of
                        the ACI target
  #@TestPreamble
  #@TestSteps           Binding as user, add telephonenumber to child
                        entry (expect ERROR 50)
  #@TestSteps           Replace ACI on parent entry: allow user full
                        access to all telephonenumber attributes
  #@TestSteps           Binding as user, add telephonenumber to child
                        entry (expect SUCCESS)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_003" scope="local">
    <testcase name="getTestCaseName('Modify_replace ACI target')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Modify_replace ACI target. Check ACI \
              replication over a modify_replace of the ACI target.'
            </message>
            <script>
              myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
              myUserpassword = 'userPwd'
              myEntry = Entry('cn=ACI user', synchroSuffix)
              myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
            </script>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath        = '%s/%s' % (server.getDir(), OPENDSNAME)
                  myTelephonenumber = '221-221-221-%s' % i
                </script>
                <message>
                  'Binding as "%s", add telephonenumber %s to entry %s on \
                  server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
                  Rights)' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : myEntry.getDn(),
                    'dsInstancePswd'    : myUserpassword,
                    'DNToModify'        : myTargetEntryDn,
                    'attributeName'     : 'telephonenumber',
                    'newAttributeValue' : myTelephonenumber,
                    'changetype'        : 'add',
                    'expectedRC'        : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Replace aci on entry ou=People,o=example on "master" server:
             !   (targetattr="telephonenumber")(version 3.0; acl
             !   "Allow ACI-user access to telephonenumber"; allow (all)
             !   userdn="ldap:///cn=ACI user,ou=People,o=example";)
            -->
            <message>
              'Replace ACI on entry ou=People,%s: \n%s' % \
              (synchroSuffix, myAci)
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                'attributeName'     : 'aci',
                'newAttributeValue' : myAci,
                'changetype'        : 'replace'
              }
            </call>
            <message>
              '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\
               attributes under ou=People,%s.' % \
              (myEntry.getDn(), synchroSuffix)
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath        = '%s/%s' % (server.getDir(), OPENDSNAME)
                  myTelephonenumber = '221-221-221-%s' % i
                </script>
                <message>
                  'Binding as "%s", add description %s to entry %s on \
                  server %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : myEntry.getDn(),
                    'dsInstancePswd'    : myUserpassword,
                    'DNToModify'        : myTargetEntryDn,
                    'attributeName'     : 'telephonenumber',
                    'newAttributeValue' : myTelephonenumber,
                    'changetype'        : 'add'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Modify_replace ACI permission
  #@TestID              Modify_replace ACI permission
  #@TestPurpose         Check ACI replication over a modify_replace of
                        the ACI permission
  #@TestPreamble
  #@TestSteps           Binding as user, compare telephonenumber value
                        to child entry (expect SUCCESS)
  #@TestSteps           Replace ACI on parent entry: deny user access to
                        telephonenumber attributes
  #@TestSteps           Binding as user, compare telephonenumber value
                        to child entry (expect ERROR 50)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_004" scope="local">
    <testcase name="getTestCaseName('Modify_replace ACI permission')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Modify_replace ACI permission. Check ACI \
              replication over a modify_replace of the ACI permission.'
            </message>
            <script>
              myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
              myUserpassword = 'userPwd'
              myEntry = Entry('cn=ACI user', synchroSuffix)
              myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
              myTelephonenumber = '+1 408 555 6789'
            </script>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 0
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Replace aci on entry ou=People,o=example on "master" server:
             !   (targetattr="telephonenumber")(version 3.0; acl
             !   "Deny ACI-user access to telephonenumber"; deny (all)
             !   userdn="ldap:///cn=ACI user,ou=People,o=example";)
            -->
            <message>
              'Replace ACI on entry ou=People,%s: \n%s' % \
              (synchroSuffix, myAci)
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                'attributeName'     : 'aci',
                'newAttributeValue' : myAci,
                'changetype'        : 'replace'
              }
            </call>
            <message>
              '+++ New ACI +++\nDeny "%s" access to all telephonenumber \
              attributes under ou=People,%s.' % \
              (myEntry.getDn(), synchroSuffix)
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: ERROR 50 \
                  (Insufficient Access Rights)' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Modify_replace ACI bind rule
  #@TestID              Modify_replace ACI bind rule
  #@TestPurpose         Check ACI replication over a modify_replace of
                        the ACI bind rule
  #@TestPreamble        Add new user entry
  #@TestSteps           Binding as new user, compare telephonenumber
                        value to child entry  (expect SUCCESS)
  #@TestSteps           Replace ACI on parent entry: deny users with
                        a given sn access to telephonenumber attributes
  #@TestSteps           Binding as new user, compare telephonenumber
                        value to child entry  (expect ERROR 50)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_005" scope="local">
    <testcase name="getTestCaseName('Modify_replace ACI bind rule')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Modify_replace ACI bind rule. Check ACI \
              replication over a modify_replace of the ACI bind rule.'
            </message>
            <script>
              mySn  = 'ACI repl user'
              myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
              myUserpassword = 'secondUserPwd'
              myEntry = Entry('cn=Second ACI user', synchroSuffix)
              myEntry.addAttr('sn', mySn)
              myEntry.addAttr('userpassword', myUserpassword)
              myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
              myTelephonenumber = '+1 408 555 6789'
            </script>
            <!-- Add user entry to "master" server -->
            <message>
              'Add user entry %s' % myEntry.getDn()
            </message>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 0
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Replace aci on entry ou=People,o=example on "master" server:
             !   (targetattr="telephonenumber")(version 3.0; acl
             !   "Deny ACI repl users access to telephonenumber"; deny (all)
             !   userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
            -->
            <message>
              'Replace ACI on entry ou=People,%s: \n%s' % \
              (synchroSuffix, myAci)
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                'attributeName'     : 'aci',
                'newAttributeValue' : myAci,
                'changetype'        : 'replace'
              }
            </call>
            <message>
              '+++ New ACI +++\nDeny users with (sn=%s) access to all \
              telephonenumber attributes under ou=People,%s.' % \
              (mySn, synchroSuffix)
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: ERROR 50 \
                  (Insufficient Access Rights)' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Bypass-acl privilege
  #@TestID              Bypass-acl privilege
  #@TestPurpose         Check the bypass-acl privilege is replicated and
                        successfully applied over the topology
  #@TestPreamble
  #@TestSteps           Binding as new user, compare telephonenumber
                        value to child entry  (expect ERROR 50)
  #@TestSteps           Add ds-privilege-name:bypass-acl to new user
  #@TestSteps           Binding as new user, compare telephonenumber
                        value to child entry  (expect SUCCESS)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_006" scope="local">
    <testcase name="getTestCaseName('Bypass-acl privilege')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \
              privilege is replicated and successfully applied over the \
              topology'
            </message>
            <script>
              mySn = 'ACI repl user'
              myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
              myUserpassword = 'secondUserPwd'
              myPrivilege  = 'bypass-acl'
              myEntry = Entry('cn=Second ACI user', synchroSuffix)
              myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
              myTelephonenumber = '+1 408 555 6789'
            </script>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: ERROR 50 \
                  (Insufficient Access Rights)' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Add bypass-acl privilege to new user entry -->
            <message>
              'Add %s privilege to entry %s: \n' % \
              (myPrivilege, myEntry.getDn())
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : myEntry.getDn(),
                'attributeName'     : 'ds-privilege-name',
                'newAttributeValue' : myPrivilege,
                'changetype'        : 'add'
              }
            </call>
            <message>
              '+++ Active ACI +++\nDeny users with (sn=%s) access to all \
              telephonenumber attributes under ou=People,%s.' % \
              (mySn, synchroSuffix)
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 0
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication ACI Tests
  #@TestName            Replication: ACI: Modify_delete ACI
  #@TestID              Modify_delete ACI
  #@TestPurpose         Check ACI replication over a modify_delete
  #@TestPreamble
  #@TestSteps           Binding as user, compare telephonenumber value
                        to child entry  (expect ERROR 50)
  #@TestSteps           Delete ACI on parent entry
  #@TestSteps           Binding as user, compare telephonenumber value
                        to child entry  (expect SUCCESS)
  #@TestPostamble
  #@TestResult          Success if the servers synchronised and the aci
                        correctly applied after replication
  -->
  <function name="replication_aci_007" scope="local">
    <testcase name="getTestCaseName('Modify_delete ACI')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: ACI: Modify_delete ACI. Check ACI \
              replication over a modify_delete.'
            </message>
            <script>
              mySn = 'ACI repl user'
              myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
              myUserpassword = 'userPwd'
              myEntry = Entry('cn=ACI user', synchroSuffix)
              myTargetEntryDn   = 'uid=sholmes,ou=People,%s' % synchroSuffix
              myTelephonenumber = '+1 408 555 6789'
            </script>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: ERROR 50 \
                  (Insufficient Access Rights)' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 50
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Delete aci on entry ou=People,o=example on "master" server:
             !   (targetattr="telephonenumber")(version 3.0; acl
             !   "Deny ACI repl users access to telephonenumber"; deny (all)
             !   userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
            -->
            <message>
              'Delete ACI on entry ou=People,%s: \n%s' % \
              (synchroSuffix, myAci)
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'ou=People,%s' % synchroSuffix,
                'attributeName'     : 'aci',
                'newAttributeValue' : myAci,
                'changetype'        : 'delete'
              }
            </call>
            <message>
              '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix
            </message>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Binding as "%s", compare telephonenumber:%s value to \
                  entry %s on server %s:%s. -- Expect: SUCCESS' % \
                  (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
                   server.getHostname(), server.getPort())
                </message>
                <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
                 !   uid=sholmes,ou=People,o=example -->
                <call function="'ldapCompareWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : myEntry.getDn(),
                    'dsInstancePswd' : myUserpassword,
                    'dsDn'           : ['telephonenumber:%s' % \
                                        myTelephonenumber, myTargetEntryDn],
                    'expectedRC'     : 0
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml
@@ -9,42 +9,37 @@
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 !      Copyright 2012 ForgeRock AS.
 ! -->
<stax>
  <defaultcall function="replication_basic"/>
  <function name="replication_basic">
  <function name="replication_basic" scope="local">
    <sequence>
      <block name="'basic'">
      <block name="'replication_basic'">
        <try>
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
              CurrentTestPath['suite'] = 'basic'
    
          <call function="'testSuite_Preamble'"/>
              _group=CurrentTestPath['group']
              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
              _label = 'Replication Basic'
            </script>
          <!--- Test Suite information
          #@TestSuiteName       Replication Basic Tests
@@ -54,9 +49,13 @@
          #@TestSuiteGroup      Basic
          #@TestGroup           Replication
          #@TestScript          replication_basic.xml
          #@TestHTMLLink        http://opends.dev.java.net/
            #@TestHTMLLink        http://www.forgerock.org/
          -->
            
            <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
                                                                        
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_setup.xml' 
@@ -70,1998 +69,103 @@
              % (TESTS_DIR)"/>
          <call function="'replication_basic_setup'" />
                <!-- List of Import of Test Functions -->
                <script>
                  importList=[]
                  importList.append('basic/basic_tests')
                </script>
                                          
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Add Entry
          #@TestID              Add Entry
          #@TestPurpose         Check that an entry add is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add root suffix entry
          #@TestPostamble
          #@TestResult          Success if trees synchronised over the topology
          -->
          <testcase name="getTestCaseName('Add Entry')">
                <!-- Import the files for this test suite -->
                <iterate var="_import" in="importList">
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/%s.xml' % (_groupdir,_import)"/>
                </iterate>
                <!-- Specific to replication tests -->
                <script>
                  msg1 = 'Replication: Basic:'
                </script>
                <!-- List of Test Cases -->
                <script>
                  testsList=[]
                  testsList.append('replication_basic_001')
                  testsList.append('replication_basic_002')
                  testsList.append('replication_basic_003')
                  testsList.append('replication_basic_004')
                  testsList.append('replication_basic_005')
                  testsList.append('replication_basic_006')
                  testsList.append('replication_basic_007')
                  testsList.append('replication_basic_008')
                  testsList.append('replication_basic_009')
                  testsList.append('replication_basic_010')
                  testsList.append('replication_basic_011')
                  testsList.append('replication_basic_012')
                  testsList.append('replication_basic_013')
                  testsList.append('replication_basic_014')
                  testsList.append('replication_basic_015')
                  testsList.append('replication_basic_016')
                  testsList.append('replication_basic_017')
                  testsList.append('replication_basic_018')
                  testsList.append('replication_basic_019')
                  testsList.append('replication_basic_020')
                  testsList.append('replication_basic_021')
                  testsList.append('replication_basic_022')
                </script>
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Add Entry. Check that an added entry is \
                well propagated by replication.'
              </message>
              <!-- Modify "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' \
                                     % client.getTmpDir()
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry
          #@TestID              Modify Entry
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add entry on server
          #@TestSteps           Modify entry
          #@TestSteps           Check modify worked on server
          #@TestPostamble
          #@TestResult          Success if modify worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName('Modify Entry')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry. Check that an entry modify \
                is well propagated by replication.'
              </message>
              <!-- Modify "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication_add_single.ldif' \
                                     % client.getTmpDir()
                }
              </call>
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsFilename'     : '%s/replication_mod.ldif' \
                                     % client.getTmpDir()
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : entryDn,
                  'dsFilter'       : '%s=%s' % (attr_type,attr_value)
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Delete Entry
          #@TestID              Delete Entry
          #@TestPurpose         Check that an entry delete is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Delete entry
          #@TestSteps           Check delete worked on server
          #@TestPostamble
          #@TestResult          Success if delete worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName('Delete Entry')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Delete Entry. Check that an entry delete \
                is well propagated by replication.'
              </message>
              <!-- Modify "master" server -->
              <call function="'DeleteEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : entryDn
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : masterHost,
                  'dsInstancePort'   : master.getPort(),
                  'dsInstanceDn'     : master.getRootDn(),
                  'dsInstancePswd'   : master.getRootPwd(),
                  'dsBaseDN'         : entryDn,
                  'dsFilter'         : 'objectclass=*',
                  'expectedRC'       : 32
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Add Multiple Entries
          #@TestID              Add Multiple Entries
          #@TestPurpose         Check that a multiple-entry add is well
                                propagated by replication.
          #@TestPreamble        Delete root suffix entry
          #@TestSteps           Add multiple entries
          #@TestPostamble
          #@TestResult          Success if trees synchronised over the topology
          -->
          <testcase name="getTestCaseName('Add Multiple Entries')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Add Multiple Entries. Check that a \
                multiple-entry add is well propagated by replication.'
              </message>
              <!-- Delete the root entry, as it is already present in
                Example.ldif file -->
              <call function="'DeleteEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : synchroSuffix
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/Example.ldif' \
                                     % master.getDataDir()
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - add single
                                attribute
          #@TestID              Modify Entry - add single attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add description attribute to entry
          #@TestSteps           Check modify worked
          #@TestPostamble
          #@TestResult          Success if modify worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - add single attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - add single attribute. \
                Check that an entry modify is well propagated by replication.'
              </message>
               <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'uid=tmorris, ou=People,%s' \
                                        % synchroSuffix,
                  'attributeName'     : 'description',
                  'newAttributeValue' : ' ',
                  'changetype'        : 'add'
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=tmorris, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'description=*'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - add single
                                value
          #@TestID              Modify Entry - add single value
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add single-valued attribute to entry
          #@TestSteps           Check modify worked
          #@TestPostamble
          #@TestResult          Success if modify worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName('Modify Entry - add single value')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - add single value. Check \
                that an entry modify is well propagated by replication.'
              </message>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'uid=tmorris, ou=People,%s' \
                                        % synchroSuffix,
                  'attributeName'     : 'departmentnumber',
                  'newAttributeValue' : '5203214400',
                  'changetype'        : 'add'
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=tmorris, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'departmentnumber=5203214400'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - delete single
                                attribute
          #@TestID              Modify Entry - delete single attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Delete attribute in entry
          #@TestSteps           Check delete worked
          #@TestPostamble
          #@TestResult          Success if delete worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - delete single attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - delete single attribute. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                filename = 'replication_mod_delete.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=smason, ou=People,%s' % synchroSuffix
                modif = 'delete'
                attrType = 'roomNumber'
                attrValue = None
                write_replication_mod_ldif_file(filePath, dn, modif, attrType,
                                                attrValue)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=smason, ou=People,%s' % synchroSuffix,
                  'dsFilter'       : 'roomNumber=*'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 0
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - delete single
                                value
          #@TestID              Modify Entry - delete single value
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Delete single attribute value in entry
          #@TestSteps           Check delete worked
          #@TestPostamble
          #@TestResult          Success if delete worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - delete single value')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - delete single value. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : 'uid=jwalker, ou=People,%s' \
                                        % synchroSuffix,
                  'attributeName'     : 'roomNumber',
                  'newAttributeValue' : '3915',
                  'changetype'        : 'delete'
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwalker, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'roomNumber=3915'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 0
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - add multiple
                                values
          #@TestID              Modify Entry - add multiple values
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add multiple-valued attribute to entry
          #@TestSteps           Check add worked
          #@TestPostamble
          #@TestResult          Success if add worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - add multiple values')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - add multiple values. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                valuesToAdd = []
                valuesToAdd.append('postaladdress:Residence Parc Europe')
                valuesToAdd.append('postaladdress:Appartement #6')
                valuesToAdd.append('postaladdress:31 Rue General Mangin')
                valuesToAdd.append('postaladdress:38100 Grenoble')
              </script>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'listAttributes' : valuesToAdd,
                  'changetype'     : 'add'
                }
              </call>
              <script>
                filter1 = '(postaladdress=Residence Parc Europe)'
                filter2 = '(postaladdress=Appartement #6)'
                filter3 = '(postaladdress=31 Rue General Mangin)'
                filter4 = '(postaladdress=38100 Grenoble)'
              </script>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : '&amp;%s%s%s%s' \
                                     % (filter1, filter2, filter3, filter4)
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - delete
                                multiple values
          #@TestID              Modify Entry - delete multiple values
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Delete multiple values in same attribute
          #@TestSteps           Check delete worked
          #@TestPostamble
          #@TestResult          Success if delete worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - delete multiple values')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - delete multiple values. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                valuesToDelete = []
                valuesToDelete.append('postaladdress:Appartement #6')
                valuesToDelete.append('postaladdress:38100 Grenoble')
              </script>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'listAttributes' : valuesToDelete,
                  'changetype'     : 'delete'
                }
              </call>
              <script>
                filter1 = '(postaladdress=Appartement #6)'
                filter2 = '(postaladdress=38100 Grenoble)'
              </script>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : '|%s%s' % (filter1, filter2)
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 0
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - replace
                                multiple values
          #@TestID              Modify Entry - replace multiple values
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Replace multiple values in same attribute
          #@TestSteps           Check replace worked
          #@TestPostamble
          #@TestResult          Success if replace worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - replace multiple values')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - replace multiple values. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                valuesToReplace = []
                valuesToReplace.append('postaladdress: Residence Letilleuil')
                valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier')
              </script>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'listAttributes' : valuesToReplace,
                  'changetype'     : 'replace'
                }
              </call>
              <script>
                filter1 = '(postaladdress=Residence Letilleuil)'
                filter2 = '(postaladdress=18 rue Nicolas Chorier)'
              </script>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : '&amp;%s%s' % (filter1, filter2)
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - add single
                                value to multiple valued attribute
          #@TestID              Modify Entry - add single value to multiple
                                valued attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add single value to multiple-valued attribute
          #@TestSteps           Check value add worked
          #@TestPostamble
          #@TestResult          Success if value add worked and trees
                                synchronised over the topology
          -->
          <testcase name="getTestCaseName
              ('Modify Entry - add single value to multiple valued attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - add single value to \
                multiple valued attribute. Check that an entry modify is well \
                propagated by replication.'
              </message>
              <script>
                valuesToAdd = []
                valuesToAdd.append('postaladdress:38000 Grenoble')
              </script>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'listAttributes' : valuesToAdd,
                  'changetype'     : 'add'
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'postaladdress=38000 Grenoble'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - delete single
                                value from multiple valued attribute
          #@TestID              Modify Entry - delete single value from multiple
                                valued attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Delete single value from multiple-valued
                                attribute
          #@TestSteps           Check value delete worked
          #@TestPostamble
          #@TestResult          Success if value delete worked and trees
                                synchronised over the topology
          -->
          <testcase name="getTestCaseName
           ('Modify Entry - delete single value from multiple valued attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - delete single value from \
                multiple valued attribute. Check that an entry modify is well \
                propagated by replication.'
              </message>
              <script>
                valuesToDelete = []
                valuesToDelete.append('postaladdress: Residence Letilleuil')
              </script>
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'listAttributes' : valuesToDelete,
                  'changetype'     : 'delete'
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'postaladdress=Residence Letilleuil'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 0
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - replace case
                                sensitive attribute
          #@TestID              Modify Entry - replace case sensitive attribute
          #@TestPurpose         Check that case sensitive attribute
                                modifications are replicated.
          #@TestPreamble
          #@TestSteps           Add entry
          #@TestSteps           Replace description attribute in entry
          #@TestSteps           Check replace worked
          #@TestPostamble
          #@TestResult          Success if replace worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - replace case sensitive attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - replace case sensitive \
                attribute. Check that case sensitive attribute modifications \
                are replicated.'
              </message>
              <!-- Modify "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                     % master.getDataDir()
                }
              </call>
              <script>
                value = 'Profession Tap Fitter and Plumber'
                valuesToReplace = []
                valuesToReplace.append('description: %s' % value)
              </script>
              <call function="'modifyAnAttribute'">
                { 'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToModify'     : 'uid=tfitter, ou=People,%s' \
                                     % synchroSuffix,
                  'listAttributes' : valuesToReplace,
                  'changetype'     : 'replace'
                }
              </call>
              <script>
                filter = 'description=%s' % value
              </script>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=tfitter, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : filter
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - replace
                                userpassword
          #@TestID              Modify Entry - replace userpassword
          #@TestPurpose         Check replaced userpasswords are replicated.
          #@TestPreamble
          #@TestSteps           Add user entry on server A
          #@TestSteps           Bind as user with userpassword to server A
          #@TestSteps           Replace user's userpassword
          #@TestSteps           Bind as user with old userpassword to server B
          #@TestSteps           Bind as user with new userpassword to server B
          #@TestPostamble
          #@TestResult          Success if bind with old userpassword fails with
                                LDAP_INVALID_CREDENTIALS error and bind with new
                                user password suceeds and trees are synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - replace userpassword')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - replace userpassword. \
                Check replaced userpasswords are replicated.'
              </message>
              <!-- Add entry to "master" server -->
              <script>
                userDn = 'uid=pmoriarty, ou=People, %s' % synchroSuffix
                oldPassword = 'jajejijoju'
                newPassword = 'JUAJUAJUA'
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Professor')
                listAttr.append('sn:Moriarty')
                listAttr.append('cn:Professor Moriarty')
                listAttr.append('l:London')
                listAttr.append('userpassword:%s' % oldPassword)
              </script>
              <message>
                'replace userpassword: add user entry %s' % userDn
              </message>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDn,
                  'listAttributes' : listAttr
                }
              </call>
              <!-- Check userDn can bind with oldPassword on "master" server -->
              <message>
                'replace userpassword: bind on master using password %s' \
                % oldPassword
              </message>
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : userDn,
                  'dsInstancePswd' : oldPassword,
                  'dsBaseDN'       : synchroSuffix,
                  'dsFilter'       : 'objectclass=*'
                }
              </call>
              <!-- Replace userDn's oldPassword with newPassword on "master"
                server -->
              <message>
                'replace userpassword: replace user password %s with %s' \
                % (oldPassword, newPassword)
              </message>
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : userDn,
                  'attributeName'     : 'userpassword',
                  'newAttributeValue' : 'JUAJUAJUA',
                  'changetype'        : 'replace'
                }
              </call>
              <script>
                consumer = consumerList[0]
              </script>
              <!-- Try binding as userDn with oldPassword on "consumer" server:
                ==> should fail with LDAP_INVALID_CREDENTIALS (49) error -->
              <message>
                'replace userpassword: bind on consumer using old password %s :\
                should fail with error LDAP_INVALID_CREDENTIALS (49)' \
                % oldPassword
              </message>
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : consumer.getHostname(),
                  'dsInstancePort' : consumer.getPort(),
                  'dsInstanceDn'   : userDn,
                  'dsInstancePswd' : oldPassword,
                  'dsBaseDN'       : synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 49
                }
              </call>
              <!-- Check userDn can bind with newPassword on "consumer"
                server -->
              <message>
                'replace userpassword: bind on consumer using new password %s :\
                should pass' % newPassword
              </message>
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : consumer.getHostname(),
                  'dsInstancePort' : consumer.getPort(),
                  'dsInstanceDn'   : userDn,
                  'dsInstancePswd' : newPassword,
                  'dsBaseDN'       : synchroSuffix,
                  'dsFilter'       : 'objectclass=*'
                }
              </call>
              <!-- Delete added entry as clean-up measure -->
              <message>
                'replace userpassword: delete user entry %s on master' \
                % userDn
              </message>
              <call function="'DeleteEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : userDn
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - add binary
                                attribute
          #@TestID              Modify Entry - add binary attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Add jpegPhoto attribute to entry with binary
                                value
          #@TestSteps           Check add worked
          #@TestPostamble
          #@TestResult          Success if add worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - add binary attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - add binary attribute. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                filename = 'replication_mod_add_binary.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                binaryFilePath = '%s/replication/photo1.uu' % source.data
                dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
                modif = 'add'
                attrType = 'jpegPhoto'
                write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                       attrType, binaryFilePath)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'jpegPhoto=*'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - replace
                                binary attribute
          #@TestID              Modify Entry - replace binary attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Replace jpegPhoto (binary) attribute value
          #@TestSteps           Check replace worked
          #@TestPostamble
          #@TestResult          Success if replace worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - replace binary attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - replace binary attribute. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                filename = 'replication_mod_replace_binary.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                binaryFilePath = '%s/replication/photo2.uu' % source.data
                dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
                modif = 'replace'
                attrType = 'jpegPhoto'
                write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                       attrType, binaryFilePath)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'jpegPhoto=*'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Modify Entry - delete binary
                                attribute
          #@TestID              Modify Entry - delete binary attribute
          #@TestPurpose         Check that an entry modify is well propagated by
                                replication.
          #@TestPreamble
          #@TestSteps           Delete binary attribute jpegPhoto
          #@TestSteps           Check delete worked
          #@TestPostamble
          #@TestResult          Success if delete worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - delete binary attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Modify Entry - delete binary attribute. \
                Check that an entry modify is well propagated by replication.'
              </message>
              <script>
                filename = 'replication_mod_delete_binary.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
                modif = 'delete'
                attrType = 'jpegPhoto'
                attrValue = None
                write_replication_mod_ldif_file(filePath, dn, modif, attrType,
                                                attrValue)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'jpegPhoto=*'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 0
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Rename Entry
          #@TestID              Rename Entry
          #@TestPurpose         Check that a rename (modrdn) operation is well
                                propagated by replication.
          #@TestPreamble
          #@TestSteps           Rename entry
          #@TestSteps           Check old dn entry no longer exists
          #@TestSteps           Check new dn entry exists
          #@TestPostamble
          #@TestResult          Success if rename worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName('Rename Entry')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Rename Entry. Check that a rename \
                (modrdn) operation is well propagated by replication.'
              </message>
              <script>
                filename = 'replication_modrdn.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
                newrdn = 'uid=kvaughan2'
                newsuperior = None
                deleteoldrdn = 1
                write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                  newsuperior, deleteoldrdn)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does
                NOT exist anymore -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=kvaughan, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 32
                }
              </call>
              <!-- check that new entry
                "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=kvaughan2, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'objectclass=*'
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Rename Entry (preserving old
                                rdn)
          #@TestID              Rename Entry (preserving old rdn)
          #@TestPurpose         Check that a rename (modrdn) operation is well
                                propagated by replication.
          #@TestPreamble
          #@TestSteps           Rename entry
          #@TestSteps           Check old dn entry no longer exists
          #@TestSteps           Check new dn entry exists and contains old rdn
          #@TestPostamble
          #@TestResult          Success if rename worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName('Rename Entry (preserving old rdn)')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Rename Entry (preserving old rdn). \
                Check that a rename (modrdn) operation is well propagated by \
                replication.'
              </message>
              <script>
                filename = 'replication_modrdn_preserve.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
                newrdn = 'uid=igueye'
                newsuperior = None
                deleteoldrdn = 0
                write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                  newsuperior, deleteoldrdn)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does
                NOT exist anymore -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 32
                }
              </call>
              <!-- check that new entry
                "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=igueye, ou=People,%s' % synchroSuffix,
                  'dsFilter'       : 'uid=jwallace'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength,
                  'result'     : searchResult,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Rename Subtree
          #@TestID              Rename Subtree
          #@TestPurpose         Check that a subtree rename (moddn) operation is
                                well propagated by replication.
          #@TestPreamble
          #@TestSteps           Rename subtree
          #@TestSteps           Check old subtree no longer exists
          #@TestSteps           Check new subree exists
          #@TestPostamble
          #@TestResult          Success if rename worked and trees synchronised
                                over the topology
          -->
          <testcase name="getTestCaseName('Rename Subtree')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Rename Subtree. Check that a subtree \
                rename (moddn) operation is well propagated by replication.'
              </message>
              <script>
                filename = 'replication_moddn.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'ou=People,%s' % synchroSuffix
                newrdn = 'ou=Special People'
                newsuperior = 'ou=Special Users,%s' % synchroSuffix
                deleteoldrdn = 0
                write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                  newsuperior, deleteoldrdn)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' \
                % (filename,local.temp,client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does
                NOT exist anymore -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : 'uid=gfarmer, ou=People,%s' \
                                     % synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 32
                }
              </call>
              <script>
                base = 'uid=gfarmer, ou=Special People, ou=Special Users,%s' \
                       % synchroSuffix
              </script>
              <!-- check that new entry
                "uid=gfarmer, ou=Special People, ou=Special Users,
                ${DIRECTORY_BASE}" exists -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'dsBaseDN'       : base,
                  'dsFilter'       : 'objectclass=*'
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Basic Tests
          #@TestName            Replication: Basic: Add entry after restart
          #@TestID              Add entry after restart
          #@TestPurpose         Check entry add over secured replication after
                                server restart
          #@TestPreamble
          #@TestSteps           Restart servers
          #@TestSteps           Add entry
          #@TestPostamble
          #@TestResult          Success if trees synchronised over the topology
          -->
          <testcase name="getTestCaseName('Add entry after restart')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Basic: Add entry after restart. \
                Check entry add over secured replication after server restart'
              </message>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_splitServerList]
              </call>
              <!-- Start the servers in the topology -->
              <call function="'startServers'">
                [_splitServerList]
              </call>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    userDn = 'uid=RESTART-iabizen-%s, %s' % \
                             (i,synchroSuffix)
                  </script>
                  <!-- Add entry to one of the other servers -->
                  <script>
                    listAttr = []
                    listAttr.append('objectclass:top')
                    listAttr.append('objectclass:organizationalperson')
                    listAttr.append('objectclass:inetorgperson')
                    listAttr.append('objectclass:person')
                    listAttr.append('givenname:Izen-%s' % i)
                    listAttr.append('sn:Abizen-%s' % i)
                    listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
                    listAttr.append('l:ICNC')
                  </script>
                  <call function="'addAnEntry'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToAdd'        : userDn,
                      'listAttributes' : listAttr
                    }
                  </call>
                    <call function="'%s' % (__test)" />
                </sequence>
              </iterate>
                
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
                        
              <catch exception="'STAFException.TestSuite.SetupException'">
                <sequence>
                  <message log="1" level="'fatal'">
                    'Setup of test suite failed.'
                  </message>
                  <rethrow/>
                </sequence>
              </catch>
                
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
            </try>
          </sequence>
          <finally>
            <sequence>
              <!-- Test Suite Cleanup -->
              <message>'Finally: Replication Cleanup.'</message>
              <try>
                <sequence>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_cleanup.xml' 
                  % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'label'    : 'Replication Basic' }
          </call>
              </sequence>
              <catch exception="'STAFException'">
                <sequence>
                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                </sequence>
              </catch>
              <finally>
          <call function="'testSuite_Postamble'"/>
              </finally>
              </try>
        </sequence>
          </finally>
    
        </try>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic_tests.xml
New file
@@ -0,0 +1,2482 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 ! -->
<stax>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Add Entry
  #@TestID              Add Entry
  #@TestPurpose         Check that an entry add is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add root suffix entry
  #@TestPostamble
  #@TestResult          Success if trees synchronised over the topology
  -->
  <function name="replication_basic_001" scope="local">
    <testcase name="getTestCaseName('Add Entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that an add of an entry is replicated.' % msg1 }
            </call>
            <!-- Modify "master" server -->
            <call function="'addEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' \
                                   % client.getTmpDir()
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry
  #@TestID              Modify Entry
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add entry on server
  #@TestSteps           Modify entry
  #@TestSteps           Check modify worked on server
  #@TestPostamble
  #@TestResult          Success if modify worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_002" scope="local">
    <testcase name="getTestCaseName('Modify Entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify of an entry is replicated.' % msg1 }
            </call>
            <!-- Modify "master" server -->
            <call function="'addEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'entryToBeAdded' : '%s/replication_add_single.ldif' \
                                   % client.getTmpDir()
              }
            </call>
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsFilename'     : '%s/replication_mod.ldif' \
                                   % client.getTmpDir()
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : entryDn,
                'dsFilter'       : '%s=%s' % (attr_type,attr_value)
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength ,
                'result'     : searchResult ,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Delete Entry
  #@TestID              Delete Entry
  #@TestPurpose         Check that an entry delete is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Delete entry
  #@TestSteps           Check delete worked on server
  #@TestPostamble
  #@TestResult          Success if delete worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_003" scope="local">
    <testcase name="getTestCaseName('Delete Entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a delete of an entry is replicated.' % msg1 }
            </call>
            <!-- Modify "master" server -->
            <call function="'DeleteEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : entryDn
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'         : clientHost,
                'dsPath'           : clientPath,
                'dsInstanceHost'   : masterHost,
                'dsInstancePort'   : master.getPort(),
                'dsInstanceDn'     : master.getRootDn(),
                'dsInstancePswd'   : master.getRootPwd(),
                'dsBaseDN'         : entryDn,
                'dsFilter'         : 'objectclass=*',
                'expectedRC'       : 32
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Add Multiple Entries
  #@TestID              Add Multiple Entries
  #@TestPurpose         Check that a multiple-entry add is well
                        propagated by replication.
  #@TestPreamble        Delete root suffix entry
  #@TestSteps           Add multiple entries
  #@TestPostamble
  #@TestResult          Success if trees synchronised over the topology
  -->
  <function name="replication_basic_004" scope="local">
    <testcase name="getTestCaseName('Add Multiple Entries')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that multiple adds of an entry are replicated.' % msg1 }
            </call>
            <!-- Delete the root entry, as it is already present in
              Example.ldif file -->
            <call function="'DeleteEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : synchroSuffix
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'addEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'entryToBeAdded' : '%s/replication/Example.ldif' \
                                   % master.getDataDir()
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - add single
                        attribute
  #@TestID              Modify Entry - add single attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add description attribute to entry
  #@TestSteps           Check modify worked
  #@TestPostamble
  #@TestResult          Success if modify worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_005" scope="local">
    <testcase name="getTestCaseName('Modify Entry - add single attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (add single attribute) is replicated.' % msg1 }
            </call>
             <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost ,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'uid=tmorris, ou=People,%s' \
                                      % synchroSuffix,
                'attributeName'     : 'description',
                'newAttributeValue' : ' ',
                'changetype'        : 'add'
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=tmorris, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'description=*'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength ,
                'result'     : searchResult ,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - add single
                        value
  #@TestID              Modify Entry - add single value
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add single-valued attribute to entry
  #@TestSteps           Check modify worked
  #@TestPostamble
  #@TestResult          Success if modify worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_006" scope="local">
    <testcase name="getTestCaseName('Modify Entry - add single value')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (add single value) is replicated.' % msg1 }
            </call>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost ,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'uid=tmorris, ou=People,%s' \
                                      % synchroSuffix,
                'attributeName'     : 'departmentnumber',
                'newAttributeValue' : '5203214400',
                'changetype'        : 'add'
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=tmorris, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'departmentnumber=5203214400'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - delete single
                        attribute
  #@TestID              Modify Entry - delete single attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Delete attribute in entry
  #@TestSteps           Check delete worked
  #@TestPostamble
  #@TestResult          Success if delete worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_007" scope="local">
    <testcase name="getTestCaseName('Modify Entry - delete single attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (delete single attribute) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_delete.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=smason, ou=People,%s' % synchroSuffix
              modif = 'delete'
              attrType = 'roomNumber'
              attrValue = None
              write_replication_mod_ldif_file(filePath, dn, modif, attrType,
                                              attrValue)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=smason, ou=People,%s' % synchroSuffix,
                'dsFilter'       : 'roomNumber=*'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 0
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - delete single
                        value
  #@TestID              Modify Entry - delete single value
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Delete single attribute value in entry
  #@TestSteps           Check delete worked
  #@TestPostamble
  #@TestResult          Success if delete worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_008" scope="local">
    <testcase name="getTestCaseName('Modify Entry - delete single value')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (delete single value) is replicated.' % msg1 }
            </call>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost ,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : 'uid=jwalker, ou=People,%s' \
                                      % synchroSuffix,
                'attributeName'     : 'roomNumber',
                'newAttributeValue' : '3915',
                'changetype'        : 'delete'
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwalker, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'roomNumber=3915'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 0
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - add multiple
                        values
  #@TestID              Modify Entry - add multiple values
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add multiple-valued attribute to entry
  #@TestSteps           Check add worked
  #@TestPostamble
  #@TestResult          Success if add worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_009" scope="local">
    <testcase name="getTestCaseName('Modify Entry - add multiple values')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (add multiple values) is replicated.' % msg1 }
            </call>
            <script>
              valuesToAdd = []
              valuesToAdd.append('postaladdress:Residence Parc Europe')
              valuesToAdd.append('postaladdress:Appartement #6')
              valuesToAdd.append('postaladdress:31 Rue General Mangin')
              valuesToAdd.append('postaladdress:38100 Grenoble')
            </script>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'listAttributes' : valuesToAdd,
                'changetype'     : 'add'
              }
            </call>
            <script>
              filter1 = '(postaladdress=Residence Parc Europe)'
              filter2 = '(postaladdress=Appartement #6)'
              filter3 = '(postaladdress=31 Rue General Mangin)'
              filter4 = '(postaladdress=38100 Grenoble)'
            </script>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : '&amp;%s%s%s%s' \
                                   % (filter1, filter2, filter3, filter4)
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - delete
                        multiple values
  #@TestID              Modify Entry - delete multiple values
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Delete multiple values in same attribute
  #@TestSteps           Check delete worked
  #@TestPostamble
  #@TestResult          Success if delete worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_010" scope="local">
    <testcase name="getTestCaseName('Modify Entry - delete multiple values')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (delete multiple values) is replicated.' % msg1 }
            </call>
            <script>
              valuesToDelete = []
              valuesToDelete.append('postaladdress:Appartement #6')
              valuesToDelete.append('postaladdress:38100 Grenoble')
            </script>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'listAttributes' : valuesToDelete,
                'changetype'     : 'delete'
              }
            </call>
            <script>
              filter1 = '(postaladdress=Appartement #6)'
              filter2 = '(postaladdress=38100 Grenoble)'
            </script>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : '|%s%s' % (filter1, filter2)
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 0
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - replace
                        multiple values
  #@TestID              Modify Entry - replace multiple values
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Replace multiple values in same attribute
  #@TestSteps           Check replace worked
  #@TestPostamble
  #@TestResult          Success if replace worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_011" scope="local">
    <testcase name="getTestCaseName('Modify Entry - replace multiple values')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (replace multiple values) is replicated.' % msg1 }
            </call>
            <script>
              valuesToReplace = []
              valuesToReplace.append('postaladdress: Residence Letilleuil')
              valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier')
            </script>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'listAttributes' : valuesToReplace,
                'changetype'     : 'replace'
              }
            </call>
            <script>
              filter1 = '(postaladdress=Residence Letilleuil)'
              filter2 = '(postaladdress=18 rue Nicolas Chorier)'
            </script>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : '&amp;%s%s' % (filter1, filter2)
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength ,
                'result'     : searchResult ,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - add single
                        value to multiple valued attribute
  #@TestID              Modify Entry - add single value to multiple
                        valued attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add single value to multiple-valued attribute
  #@TestSteps           Check value add worked
  #@TestPostamble
  #@TestResult          Success if value add worked and trees
                        synchronised over the topology
  -->
  <function name="replication_basic_012" scope="local">
    <testcase name="getTestCaseName('Modify Entry - add single value to multiple valued attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (add single value to multiple valued attribute) is replicated.' % msg1 }
            </call>
            <script>
              valuesToAdd = []
              valuesToAdd.append('postaladdress:38000 Grenoble')
            </script>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'listAttributes' : valuesToAdd,
                'changetype'     : 'add'
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'postaladdress=38000 Grenoble'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - delete single
                        value from multiple valued attribute
  #@TestID              Modify Entry - delete single value from multiple
                        valued attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Delete single value from multiple-valued
                        attribute
  #@TestSteps           Check value delete worked
  #@TestPostamble
  #@TestResult          Success if value delete worked and trees
                        synchronised over the topology
  -->
  <function name="replication_basic_013" scope="local">
    <testcase name="getTestCaseName('Modify Entry - delete single value from multiple valued attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (delete single value from multiple valued attribute) is replicated.' % msg1 }
            </call>
            <script>
              valuesToDelete = []
              valuesToDelete.append('postaladdress: Residence Letilleuil')
            </script>
            <!-- Modify "master" server -->
            <call function="'modifyAnAttribute'">
              { 'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToModify'     : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'listAttributes' : valuesToDelete,
                'changetype'     : 'delete'
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'postaladdress=Residence Letilleuil'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 0
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - replace case
                        sensitive attribute
  #@TestID              Modify Entry - replace case sensitive attribute
  #@TestPurpose         Check that case sensitive attribute
                        modifications are replicated.
  #@TestPreamble
  #@TestSteps           Add entry
  #@TestSteps           Replace description attribute in entry
  #@TestSteps           Check replace worked
  #@TestPostamble
  #@TestResult          Success if replace worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_014" scope="local">
    <testcase name="getTestCaseName('Modify Entry - replace case sensitive attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (replace case sensitive attribute) is replicated.' % msg1 }
            </call>
            <!-- Modify "master" server -->
            <call function="'addEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                   % master.getDataDir()
              }
            </call>
            <script>
              value = 'Profession Tap Fitter and Plumber'
              valuesToReplace = []
              valuesToReplace.append('description: %s' % value)
            </script>
            <call function="'modifyAnAttribute'">
              { 'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToModify'     : 'uid=tfitter, ou=People,%s' \
                                   % synchroSuffix,
                'listAttributes' : valuesToReplace,
                'changetype'     : 'replace'
              }
            </call>
            <script>
              filter = 'description=%s' % value
            </script>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=tfitter, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : filter
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - replace
                        userpassword
  #@TestID              Modify Entry - replace userpassword
  #@TestPurpose         Check replaced userpasswords are replicated.
  #@TestPreamble
  #@TestSteps           Add user entry on server A
  #@TestSteps           Bind as user with userpassword to server A
  #@TestSteps           Replace user's userpassword
  #@TestSteps           Bind as user with old userpassword to server B
  #@TestSteps           Bind as user with new userpassword to server B
  #@TestPostamble
  #@TestResult          Success if bind with old userpassword fails with
                        LDAP_INVALID_CREDENTIALS error and bind with new
                        user password suceeds and trees are synchronised
                        over the topology
  -->
  <function name="replication_basic_015" scope="local">
    <testcase name="getTestCaseName('Modify Entry - replace userpassword')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (replace userpassword) is replicated.' % msg1 }
            </call>
            <!-- Add entry to "master" server -->
            <script>
              userDn = 'uid=pmoriarty, ou=People, %s' % synchroSuffix
              oldPassword = 'jajejijoju'
              newPassword = 'JUAJUAJUA'
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Professor')
              listAttr.append('sn:Moriarty')
              listAttr.append('cn:Professor Moriarty')
              listAttr.append('l:London')
              listAttr.append('userpassword:%s' % oldPassword)
            </script>
            <message>
              'replace userpassword: add user entry %s' % userDn
            </message>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDn,
                'listAttributes' : listAttr
              }
            </call>
            <!-- Check userDn can bind with oldPassword on "master" server -->
            <message>
              'replace userpassword: bind on master using password %s' \
              % oldPassword
            </message>
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : userDn,
                'dsInstancePswd' : oldPassword,
                'dsBaseDN'       : synchroSuffix,
                'dsFilter'       : 'objectclass=*'
              }
            </call>
            <!-- Replace userDn's oldPassword with newPassword on "master"
              server -->
            <message>
              'replace userpassword: replace user password %s with %s' \
              % (oldPassword, newPassword)
            </message>
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : userDn,
                'attributeName'     : 'userpassword',
                'newAttributeValue' : 'JUAJUAJUA',
                'changetype'        : 'replace'
              }
            </call>
            <script>
              consumer = consumerList[0]
            </script>
            <!-- Try binding as userDn with oldPassword on "consumer" server:
              ==> should fail with LDAP_INVALID_CREDENTIALS (49) error -->
            <message>
              'replace userpassword: bind on consumer using old password %s :\
              should fail with error LDAP_INVALID_CREDENTIALS (49)' \
              % oldPassword
            </message>
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : consumer.getHostname(),
                'dsInstancePort' : consumer.getPort(),
                'dsInstanceDn'   : userDn,
                'dsInstancePswd' : oldPassword,
                'dsBaseDN'       : synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 49
              }
            </call>
            <!-- Check userDn can bind with newPassword on "consumer"
              server -->
            <message>
              'replace userpassword: bind on consumer using new password %s :\
              should pass' % newPassword
            </message>
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : consumer.getHostname(),
                'dsInstancePort' : consumer.getPort(),
                'dsInstanceDn'   : userDn,
                'dsInstancePswd' : newPassword,
                'dsBaseDN'       : synchroSuffix,
                'dsFilter'       : 'objectclass=*'
              }
            </call>
            <!-- Delete added entry as clean-up measure -->
            <message>
              'replace userpassword: delete user entry %s on master' \
              % userDn
            </message>
            <call function="'DeleteEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : userDn
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - add binary
                        attribute
  #@TestID              Modify Entry - add binary attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Add jpegPhoto attribute to entry with binary
                        value
  #@TestSteps           Check add worked
  #@TestPostamble
  #@TestResult          Success if add worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_016" scope="local">
    <testcase name="getTestCaseName('Modify Entry - add binary attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (add binary attribute) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_add_binary.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              binaryFilePath = '%s/replication/photo1.uu' % source.data
              dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
              modif = 'add'
              attrType = 'jpegPhoto'
              write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                     attrType, binaryFilePath)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'jpegPhoto=*'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - replace
                        binary attribute
  #@TestID              Modify Entry - replace binary attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Replace jpegPhoto (binary) attribute value
  #@TestSteps           Check replace worked
  #@TestPostamble
  #@TestResult          Success if replace worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_017" scope="local">
    <testcase name="getTestCaseName('Modify Entry - replace binary attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (replace binary attribute) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_replace_binary.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              binaryFilePath = '%s/replication/photo2.uu' % source.data
              dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
              modif = 'replace'
              attrType = 'jpegPhoto'
              write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                     attrType, binaryFilePath)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'jpegPhoto=*'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Modify Entry - delete binary
                        attribute
  #@TestID              Modify Entry - delete binary attribute
  #@TestPurpose         Check that an entry modify is well propagated by
                        replication.
  #@TestPreamble
  #@TestSteps           Delete binary attribute jpegPhoto
  #@TestSteps           Check delete worked
  #@TestPostamble
  #@TestResult          Success if delete worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_018" scope="local">
    <testcase name="getTestCaseName('Modify Entry - delete binary attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a modify (delete binary attribute) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_delete_binary.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
              modif = 'delete'
              attrType = 'jpegPhoto'
              attrValue = None
              write_replication_mod_ldif_file(filePath, dn, modif, attrType,
                                              attrValue)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'jpegPhoto=*'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 0
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Rename Entry
  #@TestID              Rename Entry
  #@TestPurpose         Check that a rename (modrdn) operation is well
                        propagated by replication.
  #@TestPreamble
  #@TestSteps           Rename entry
  #@TestSteps           Check old dn entry no longer exists
  #@TestSteps           Check new dn entry exists
  #@TestPostamble
  #@TestResult          Success if rename worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_019" scope="local">
    <testcase name="getTestCaseName('Rename Entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a rename (modrdn) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_modrdn.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
              newrdn = 'uid=kvaughan2'
              newsuperior = None
              deleteoldrdn = 1
              write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                newsuperior, deleteoldrdn)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does
              NOT exist anymore -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=kvaughan, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 32
              }
            </call>
            <!-- check that new entry
              "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=kvaughan2, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'objectclass=*'
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Rename Entry (keep old rdn)
  #@TestID              Rename Entry (keep old rdn)
  #@TestPurpose         Check that a rename (modrdn) operation is well
                        propagated by replication.
  #@TestPreamble
  #@TestSteps           Rename entry
  #@TestSteps           Check old dn entry no longer exists
  #@TestSteps           Check new dn entry exists and contains old rdn
  #@TestPostamble
  #@TestResult          Success if rename worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_020" scope="local">
    <testcase name="getTestCaseName('Rename Entry - keep old rdn')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a rename (keep old rdn) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_modrdn_preserve.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
              newrdn = 'uid=igueye'
              newsuperior = None
              deleteoldrdn = 0
              write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                newsuperior, deleteoldrdn)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does
              NOT exist anymore -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 32
              }
            </call>
            <!-- check that new entry
              "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=igueye, ou=People,%s' % synchroSuffix,
                'dsFilter'       : 'uid=jwallace'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength,
                'result'     : searchResult,
                'expected'   : 1
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Rename Subtree
  #@TestID              Rename Subtree
  #@TestPurpose         Check that a subtree rename (moddn) operation is
                        well propagated by replication.
  #@TestPreamble
  #@TestSteps           Rename subtree
  #@TestSteps           Check old subtree no longer exists
  #@TestSteps           Check new subree exists
  #@TestPostamble
  #@TestResult          Success if rename worked and trees synchronised
                        over the topology
  -->
  <function name="replication_basic_021" scope="local">
    <testcase name="getTestCaseName('Rename Subtree')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a subtree rename (moddn) is replicated.' % msg1 }
            </call>
            <script>
              filename = 'replication_moddn.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'ou=People,%s' % synchroSuffix
              newrdn = 'ou=Special People'
              newsuperior = 'ou=Special Users,%s' % synchroSuffix
              deleteoldrdn = 0
              write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                newsuperior, deleteoldrdn)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' \
              % (filename,local.temp,client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does
              NOT exist anymore -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : 'uid=gfarmer, ou=People,%s' \
                                   % synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 32
              }
            </call>
            <script>
              base = 'uid=gfarmer, ou=Special People, ou=Special Users,%s' \
                     % synchroSuffix
            </script>
            <!-- check that new entry
              "uid=gfarmer, ou=Special People, ou=Special Users,
              ${DIRECTORY_BASE}" exists -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'dsBaseDN'       : base,
                'dsFilter'       : 'objectclass=*'
              }
            </call>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Basic Tests
  #@TestName            Replication: Basic: Add entry after restart
  #@TestID              Add entry after restart
  #@TestPurpose         Check entry add over secured replication after
                        server restart
  #@TestPreamble
  #@TestSteps           Restart servers
  #@TestSteps           Add entry
  #@TestPostamble
  #@TestResult          Success if trees synchronised over the topology
  -->
  <function name="replication_basic_022" scope="local">
    <testcase name="getTestCaseName('Add entry after restart')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check entry add over secured replication after server restart.' % msg1 }
            </call>
            <!-- Stop the servers in the topology -->
            <call function="'stopServers'">
              [_splitServerList]
            </call>
            <!-- Start the servers in the topology -->
            <call function="'startServers'">
              [_splitServerList]
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  userDn = 'uid=RESTART-iabizen-%s, %s' % \
                           (i,synchroSuffix)
                </script>
                <!-- Add entry to one of the other servers -->
                <script>
                  listAttr = []
                  listAttr.append('objectclass:top')
                  listAttr.append('objectclass:organizationalperson')
                  listAttr.append('objectclass:inetorgperson')
                  listAttr.append('objectclass:person')
                  listAttr.append('givenname:Izen-%s' % i)
                  listAttr.append('sn:Abizen-%s' % i)
                  listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
                  listAttr.append('l:ICNC')
                </script>
                <call function="'addAnEntry'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToAdd'        : userDn,
                    'listAttributes' : listAttr
                  }
                </call>
              </sequence>
            </iterate>
            <call function="'testStep'">
              { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml
@@ -9,410 +9,137 @@
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 !      Copyright 2012 ForgeRock AS.
 ! -->
<stax>
  <defaultcall function="replication_binarycopy"/>
  <function name="replication_binarycopy">
  <function name="replication_binarycopy" scope="local">
    <sequence>
      <block name="'binarycopy'">
      <block name="'replication_binarycopy'">
        <try>
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
              CurrentTestPath['suite'] = 'binarycopy'
              _group=CurrentTestPath['group']
              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
              _label = 'Replication BinaryCopy'
          </script>
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication Binary Copy Tests
          #@TestSuitePurpose    Verify that the servers in a replicated topology
                                can be initialised by the means of a binary copy
                                (backup-restore).
            #@TestSuitePurpose    Verify that the total-update operations are replicated
                                  correctly between two servers.
          #@TestSuiteID         Binary Copy Tests
          #@TestSuiteGroup      Binary Copy
          #@TestGroup           Replication
          #@TestScript          replication_binarycopy.xml
          #@TestHTMLLink        http://opends.dev.java.net/
            #@TestHTMLLink        http://www.forgerock.org/
          -->
          
            <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_setup.xml' 
                        % (TESTS_DIR)"/>
          <call function="'replication_setup'" >
            { 'label'    : 'Replication Binarycopy' }
                  { 'label'    : _label }
          </call>
          <!--- Test Case information
          #@TestMarker          Replication Binary Copy Tests
          #@TestName            Replication: Binary Copy: Off-line
                                initialisation
          #@TestID              Off-line initialisation
          #@TestPurpose         Initialise replicated servers using off-line
                                backup/restore
          #@TestPreamble
          #@TestSteps           Call dsreplication pre-external-initialization
          #@TestSteps           Stop servers
          #@TestSteps           Import data on server A
          #@TestSteps           Back-up server A
          #@TestSteps           Restore back-up on other servers
          #@TestSteps           Start servers
          #@TestSteps           Call dsreplication post-external-initialization
          #@TestSteps           Add entry on server A
          #@TestPostamble
          #@TestResult          Success if trees synchronized
          -->
          <testcase name="getTestCaseName('Off-line initialisation')">
            <sequence>
              <call function="'testCase_Preamble'"/>
                <!-- List of Import of Test Functions -->
              <script>
                m = md5_hash()
                m.update(STAXCurrentTestcase)
              </script>
              <message>
                 'Replication: Binary Copy: Off-line initialisation. \
                 Initialise replicated servers using off-line backup/restore'
              </message>
              <!-- Pre-initialise the servers in the topology -->
              <message>
                '+++++ binary copy off-line: prepare servers for external \
                initialization'
              </message>
              <call function="'preInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'localOnly'           : False,
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_topologyServerList]
              </call>
              <!-- Import data into "master" server -->
              <message>
                '+++++ binary copy off-line: import data on %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'ImportLdifWithScript'">
                { 'location'   : masterHost,
                  'dsPath'     : masterPath,
                  'backEnd'    : DIRECTORY_INSTANCE_BE,
                  'ldifFile'   : '%s/replication/Example.ldif' % masterDataDir
                }
              </call>
              <!-- Backup "master" server -->
              <message>
                '+++++ binary copy off-line: back-up server %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'backup'">
                { 'location'  : masterHost,
                  'dsPath'    : masterPath,
                  'backupDir' : '%s/replication/master_backup_%s' \
                                  % (masterBackupDir,m.hexdigest())
                }
              </call>
              <!-- Copy backup to "consumer" servers and restore it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <script>
                    consumerBackupDir = '%s' % consumer.getTmpDir()
                  </script>
                  <call function="'CopyFolderByExtension'">
                    { 'location'   : masterHost,
                      'remotehost' : consumer.getHostname(),
                      'srcfolder'  : '%s/replication/master_backup_%s' \
                                     % (masterBackupDir,m.hexdigest()),
                      'destfolder' : '%s/replication/master_backup_%s' \
                                     % (consumerBackupDir,m.hexdigest()),
                      'extension'  : '*'
                    }
                  </call>
                  <message>
                    '+++++ binary copy off-line: restore back-up on %s:%s' \
                    % (consumer.getHostname(), consumer.getPort())
                  </message>
                  <call function="'restore'">
                    { 'location'  : consumer.getHostname(),
                      'dsPath'    : '%s/%s' % (consumer.getDir(), OPENDSNAME),
                      'backupDir' : '%s/replication/master_backup_%s' \
                                    % (consumerBackupDir,m.hexdigest())
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Start the servers in the topology -->
              <call function="'startServers'">
                [_topologyServerList]
              </call>
              <!-- Check some data was imported into "master" server -->
              <call function="'checkImport'">
                { 'location'        : clientHost,
                  'dsPath'          : clientPath,
                  'dsHost'          : masterHost,
                  'dsPort'          : master.getPort(),
                  'dsAdminPort'     : master.getAdminPort(),
                  'dsDn'            : master.getRootDn(),
                  'dsPswd'          : master.getRootPwd(),
                  'expectedEntries' : ['uid=scarter,ou=People,o=example',
                                       'uid=dmiller, ou=People, o=example',
                                       'uid=rhunt, ou=People, o=example'],
                  'startDS'         : 'no'
               }
              </call>
              <!-- Post-initialise the servers in the topology -->
              <message>
                '+++++ binary copy off-line: end external server initialization'
              </message>
              <call function="'postInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              <!-- Add entry to "master" server -->
              <message>
                '+++++ binary copy off-line: add entry to %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                     % clientDataDir
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Binary Copy Tests
          #@TestName            Replication: Binary Copy: On-line initialisation
          #@TestID              On-line initialisation
          #@TestPurpose         Initialise replicated servers using on-line
                                backup/restore
          #@TestPreamble
          #@TestSteps           Call dsreplication pre-external-initialization
          #@TestSteps           Import data on server A
          #@TestSteps           Back-up server A
          #@TestSteps           Restore back-up on other servers
          #@TestSteps           Call dsreplication post-external-initialization
          #@TestSteps           Add entry on server A
          #@TestPostamble
          #@TestResult          Success if trees synchronized
          -->
          <testcase name="getTestCaseName('On-line initialisation')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <script>
                m = md5_hash()
                m.update(STAXCurrentTestcase)
              </script>
              <message>
                 'Replication: Binary Copy: On-line initialisation. Initialise \
                 replicated servers using on-line backup/restore'
              </message>
              <!-- Pre-initialise the servers in the topology -->
              <message>
                '+++++ binary copy on-line: prepare servers for external \
                initialization'
              </message>
              <call function="'preInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'localOnly'           : False,
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              <!-- Import data into "master" server -->
              <message>
                '+++++ binary copy on-line: import data on %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'ImportLdifWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'ldifFile'       : '%s/replication/Example.ldif' \
                                     % masterDataDir
                }
              </call>
              <!-- Check some data was imported into "master" server -->
              <call function="'checkImport'">
                { 'location'        : clientHost,
                  'dsPath'          : clientPath,
                  'dsHost'          : masterHost,
                  'dsPort'          : master.getPort(),
                  'dsAdminPort'     : master.getAdminPort(),
                  'dsDn'            : master.getRootDn(),
                  'dsPswd'          : master.getRootPwd(),
                  'expectedEntries' : ['uid=scarter,ou=People,o=example',
                                       'uid=dmiller, ou=People, o=example',
                                       'uid=rhunt, ou=People, o=example'],
                  'startDS'         : 'no'
                }
              </call>
              <!-- Backup "master" server -->
              <message>
                '+++++ binary copy on-line: back-up server %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'backupTask'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'taskID'         : 'backup task',
                  'backupDir'      : '%s/replication/master_backup_%s' \
                                     % (masterBackupDir,m.hexdigest())
                }
              </call>
              <!-- Copy backup to "consumer" servers and restore it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <script>
                    consumerBackupDir = '%s' % consumer.getTmpDir()
                  importList=[]
                  importList.append('binarycopy/binarycopy_tests')
                  </script>
                  <call function="'CopyFolderByExtension'">
                    { 'location'   : masterHost,
                      'remotehost' : consumer.getHostname(),
                      'srcfolder'  : '%s/replication/master_backup_%s' \
                                     % (masterBackupDir,m.hexdigest()),
                      'destfolder' : '%s/replication/master_backup_%s' \
                                     % (consumerBackupDir,m.hexdigest()),
                      'extension'  : '*'
                    }
                  </call>
                <!-- Import the files for this test suite -->
                <iterate var="_import" in="importList">
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/%s.xml' % (_groupdir,_import)"/>
                </iterate>
                  
                  <message>
                    '+++++ binary copy on-line: restore back-up on %s:%s' \
                    % (consumer.getHostname(), consumer.getPort())
                  </message>
                  <call function="'restoreTask'">
                    { 'location'       : clientHost,
                      'dsPath'         : clientPath,
                      'dsInstanceHost' : consumer.getHostname(),
                      'dsInstancePort' : consumer.getPort(),
                      'dsInstanceDn'   : consumer.getRootDn(),
                      'dsInstancePswd' : consumer.getRootPwd(),
                      'taskID'         : 'restore task',
                      'backupDir'   : '%s/replication/master_backup_%s' \
                                      % (consumerBackupDir,m.hexdigest())
                    }
                  </call>
                <!-- Specific to replication tests -->
                <script>
                  msg1 = 'Replication: BinaryCopy:'
                </script>
                <!-- List of Test Cases -->
                <script>
                  testsList=[]
                  testsList.append('replication_binarycopy_001')
                  testsList.append('replication_binarycopy_002')
                </script>
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
                  <sequence>
                    <call function="'%s' % (__test)" />
                </sequence>
              </paralleliterate>
                </iterate>
              
              <!-- Post-initialise the servers in the topology -->
              <message>
                '+++++ binary copy on-line: end external server initialization'
              </message>
              <call function="'postInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              <!-- Add entry to "master" server -->
              <message>
                '+++++ binary copy on-line: add entry to %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                     % clientDataDir
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          
              <catch exception="'STAFException.TestSuite.SetupException'">
                <sequence>
                  <message log="1" level="'fatal'">
                    'Setup of test suite failed.'
                  </message>
                  <rethrow/>
                </sequence>
              </catch>
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
            </try>
          </sequence>
          <finally>
            <sequence>
              <!-- Test Suite Cleanup -->
              <message>'Finally: Replication Cleanup.'</message>
              <try>
                <sequence>
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_cleanup.xml' 
                        % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" >
            { 'label'    : 'Replication Binarycopy' }
                    { 'label'    : _label }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
              <catch exception="'STAFException'">
                <sequence>
                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                </sequence>
              </catch>
              <finally>
                <call function="'testSuite_Postamble'"/>
              </finally>
              </try>
            </sequence>
          </finally>
        </try>
      </block>
    </sequence>
  </function>
opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy_tests.xml
New file
@@ -0,0 +1,422 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 ! -->
<stax>
  <!--- Test Case information
  #@TestMarker          Replication Binary Copy Tests
  #@TestName            Replication: Binary Copy: Off-line
                        initialisation
  #@TestID              Off-line initialisation
  #@TestPurpose         Initialise replicated servers using off-line
                        backup/restore
  #@TestPreamble
  #@TestSteps           Call dsreplication pre-external-initialization
  #@TestSteps           Stop servers
  #@TestSteps           Import data on server A
  #@TestSteps           Back-up server A
  #@TestSteps           Restore back-up on other servers
  #@TestSteps           Start servers
  #@TestSteps           Call dsreplication post-external-initialization
  #@TestSteps           Add entry on server A
  #@TestPostamble
  #@TestResult          Success if trees synchronized
  -->
  <function name="replication_binarycopy_001" scope="local">
    <testcase name="getTestCaseName('Off-line initialisation')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <script>
              m = md5_hash()
              m.update(STAXCurrentTestcase)
            </script>
            <call function="'testStep'">
              { 'stepMessage' : '%s Initialise replicated servers using off-line backup/restore.' % msg1 }
            </call>
            <!-- Pre-initialise the servers in the topology -->
            <message>
              '+++++ binary copy off-line: prepare servers for external \
              initialization'
            </message>
            <call function="'preInitializeReplication'">
              { 'location'            : clientHost,
                'dsPath'              : clientPath,
                'dsInstanceHost'      : masterHost,
                'dsInstanceAdminPort' : master.getAdminPort(),
                'localOnly'           : False,
                'replicationDnList'   : [synchroSuffix],
                'adminUID'            : adminUID,
                'adminPswd'           : adminPswd
              }
            </call>
            <!-- Stop the servers in the topology -->
            <call function="'stopServers'">
              [_topologyServerList]
            </call>
            <!-- Import data into "master" server -->
            <message>
              '+++++ binary copy off-line: import data on %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'ImportLdifWithScript'">
              { 'location'   : masterHost,
                'dsPath'     : masterPath,
                'backEnd'    : DIRECTORY_INSTANCE_BE,
                'ldifFile'   : '%s/replication/Example.ldif' % masterDataDir
              }
            </call>
            <!-- Backup "master" server -->
            <message>
              '+++++ binary copy off-line: back-up server %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'backup'">
              { 'location'  : masterHost,
                'dsPath'    : masterPath,
                'backupDir' : '%s/replication/master_backup_%s' \
                                % (masterBackupDir,m.hexdigest())
              }
            </call>
            <!-- Copy backup to "consumer" servers and restore it -->
            <paralleliterate var="consumer" in="consumerList">
              <sequence>
                <script>
                  consumerBackupDir = '%s' % consumer.getTmpDir()
                </script>
                <call function="'CopyFolderByExtension'">
                  { 'location'   : masterHost,
                    'remotehost' : consumer.getHostname(),
                    'srcfolder'  : '%s/replication/master_backup_%s' \
                                   % (masterBackupDir,m.hexdigest()),
                    'destfolder' : '%s/replication/master_backup_%s' \
                                   % (consumerBackupDir,m.hexdigest()),
                    'extension'  : '*'
                  }
                </call>
                <message>
                  '+++++ binary copy off-line: restore back-up on %s:%s' \
                  % (consumer.getHostname(), consumer.getPort())
                </message>
                <call function="'restore'">
                  { 'location'  : consumer.getHostname(),
                    'dsPath'    : '%s/%s' % (consumer.getDir(), OPENDSNAME),
                    'backupDir' : '%s/replication/master_backup_%s' \
                                  % (consumerBackupDir,m.hexdigest())
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Start the servers in the topology -->
            <call function="'startServers'">
              [_topologyServerList]
            </call>
            <!-- Check some data was imported into "master" server -->
            <call function="'checkImport'">
              { 'location'        : clientHost,
                'dsPath'          : clientPath,
                'dsHost'          : masterHost,
                'dsPort'          : master.getPort(),
                'dsAdminPort'     : master.getAdminPort(),
                'dsDn'            : master.getRootDn(),
                'dsPswd'          : master.getRootPwd(),
                'expectedEntries' : ['uid=scarter,ou=People,o=example',
                                     'uid=dmiller, ou=People, o=example',
                                     'uid=rhunt, ou=People, o=example'],
                'startDS'         : 'no'
             }
            </call>
            <!-- Post-initialise the servers in the topology -->
            <message>
              '+++++ binary copy off-line: end external server initialization'
            </message>
            <call function="'postInitializeReplication'">
              { 'location'            : clientHost,
                'dsPath'              : clientPath,
                'dsInstanceHost'      : masterHost,
                'dsInstanceAdminPort' : master.getAdminPort(),
                'replicationDnList'   : [synchroSuffix],
                'adminUID'            : adminUID,
                'adminPswd'           : adminPswd
              }
            </call>
            <!-- Add entry to "master" server -->
            <message>
              '+++++ binary copy off-line: add entry to %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'addEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                   % clientDataDir
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Binary Copy Tests
  #@TestName            Replication: Binary Copy: On-line initialisation
  #@TestID              On-line initialisation
  #@TestPurpose         Initialise replicated servers using on-line
                        backup/restore
  #@TestPreamble
  #@TestSteps           Call dsreplication pre-external-initialization
  #@TestSteps           Import data on server A
  #@TestSteps           Back-up server A
  #@TestSteps           Restore back-up on other servers
  #@TestSteps           Call dsreplication post-external-initialization
  #@TestSteps           Add entry on server A
  #@TestPostamble
  #@TestResult          Success if trees synchronized
  -->
  <function name="replication_binarycopy_002" scope="local">
    <testcase name="getTestCaseName('On-line initialisation')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <script>
              m = md5_hash()
              m.update(STAXCurrentTestcase)
            </script>
            <call function="'testStep'">
              { 'stepMessage' : '%s Initialise replicated servers using on-line backup/restore.' % msg1 }
            </call>
            <!-- Pre-initialise the servers in the topology -->
            <message>
              '+++++ binary copy on-line: prepare servers for external \
              initialization'
            </message>
            <call function="'preInitializeReplication'">
              { 'location'            : clientHost,
                'dsPath'              : clientPath,
                'dsInstanceHost'      : masterHost,
                'dsInstanceAdminPort' : master.getAdminPort(),
                'localOnly'           : False,
                'replicationDnList'   : [synchroSuffix],
                'adminUID'            : adminUID,
                'adminPswd'           : adminPswd
              }
            </call>
            <!-- Import data into "master" server -->
            <message>
              '+++++ binary copy on-line: import data on %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'ImportLdifWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstanceAdminPort' : master.getAdminPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'ldifFile'       : '%s/replication/Example.ldif' \
                                   % masterDataDir
              }
            </call>
            <!-- Check some data was imported into "master" server -->
            <call function="'checkImport'">
              { 'location'        : clientHost,
                'dsPath'          : clientPath,
                'dsHost'          : masterHost,
                'dsPort'          : master.getPort(),
                'dsAdminPort'     : master.getAdminPort(),
                'dsDn'            : master.getRootDn(),
                'dsPswd'          : master.getRootPwd(),
                'expectedEntries' : ['uid=scarter,ou=People,o=example',
                                     'uid=dmiller, ou=People, o=example',
                                     'uid=rhunt, ou=People, o=example'],
                'startDS'         : 'no'
              }
            </call>
            <!-- Backup "master" server -->
            <message>
              '+++++ binary copy on-line: back-up server %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'backupTask'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'taskID'         : 'backup task',
                'backupDir'      : '%s/replication/master_backup_%s' \
                                   % (masterBackupDir,m.hexdigest())
              }
            </call>
            <!-- Copy backup to "consumer" servers and restore it -->
            <paralleliterate var="consumer" in="consumerList">
              <sequence>
                <script>
                  consumerBackupDir = '%s' % consumer.getTmpDir()
                </script>
                <call function="'CopyFolderByExtension'">
                  { 'location'   : masterHost,
                    'remotehost' : consumer.getHostname(),
                    'srcfolder'  : '%s/replication/master_backup_%s' \
                                   % (masterBackupDir,m.hexdigest()),
                    'destfolder' : '%s/replication/master_backup_%s' \
                                   % (consumerBackupDir,m.hexdigest()),
                    'extension'  : '*'
                  }
                </call>
                <message>
                  '+++++ binary copy on-line: restore back-up on %s:%s' \
                  % (consumer.getHostname(), consumer.getPort())
                </message>
                <call function="'restoreTask'">
                  { 'location'       : clientHost,
                    'dsPath'         : clientPath,
                    'dsInstanceHost' : consumer.getHostname(),
                    'dsInstancePort' : consumer.getPort(),
                    'dsInstanceDn'   : consumer.getRootDn(),
                    'dsInstancePswd' : consumer.getRootPwd(),
                    'taskID'         : 'restore task',
                    'backupDir'   : '%s/replication/master_backup_%s' \
                                    % (consumerBackupDir,m.hexdigest())
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Post-initialise the servers in the topology -->
            <message>
              '+++++ binary copy on-line: end external server initialization'
            </message>
            <call function="'postInitializeReplication'">
              { 'location'            : clientHost,
                'dsPath'              : clientPath,
                'dsInstanceHost'      : masterHost,
                'dsInstanceAdminPort' : master.getAdminPort(),
                'replicationDnList'   : [synchroSuffix],
                'adminUID'            : adminUID,
                'adminPswd'           : adminPswd
              }
            </call>
            <!-- Add entry to "master" server -->
            <message>
              '+++++ binary copy on-line: add entry to %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'addEntry'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                   % clientDataDir
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
@@ -9,1452 +9,142 @@
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2008-2009 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 !      Copyright 2012 ForgeRock AS.
 ! -->
<stax>
  <defaultcall function="replication_changelog"/>
  <function name="replication_changelog">
  <function name="replication_changelog" scope="local">
    <sequence>
      <block name="'changelog'">
      <block name="'replication_changelog'">
        <try>
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
              CurrentTestPath['suite'] = 'changelog'
            
          <call function="'testSuite_Preamble'"/>
              _group=CurrentTestPath['group']
              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
              _label = 'Replication Changelog'
            </script>
            
          <!--- Test Suite information
          #@TestSuiteName       Replication Changelog Tests
          #@TestSuitePurpose    Test the accessibility of the changelog through
                                search, export, backup and restore operations.
                                Also, test other replication features using
                                changelog properties.
            #@TestSuitePurpose    Verify that the changelog operations are replicated
                                  correctly between two servers.
          #@TestSuiteID         Changelog Tests
          #@TestSuiteGroup      Changelog
          #@TestGroup           Replication
          #@TestScript          replication_changelog.xml
          #@TestHTMLLink        http://opends.dev.java.net/
            #@TestHTMLLink        http://www.forgerock.org/
          -->
          
            <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_setup.xml' 
                        % (TESTS_DIR)"/>
          <call function="'replication_setup'">
            { 'dataFile' : 'Example.ldif',
              'label'    : 'Replication Changelog' }
                    'label'    : _label }
          </call>         
                <!-- List of Import of Test Functions -->
                <script>
                  importList=[]
                  importList.append('changelog/changelog_tests')
                </script>
                <!-- Import the files for this test suite -->
                <iterate var="_import" in="importList">
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/%s.xml' % (_groupdir,_import)"/>
                </iterate>
                        
          <!--- Test Case information
          #@TestMarker          Replication Changelog Tests
          #@TestName            Replication: Changelog: Search
          #@TestID              Search
          #@TestPurpose         Check replication changelog can be searched and
                                look up changes
          #@TestPreamble
          #@TestSteps           Add entry to server A
          #@TestSteps           Modify entry on server A
          #@TestSteps           Search changelogs and check for made changes
          #@TestPostamble
          #@TestResult          Success if the corresponding changes can be
                                found in the changelog
          -->
          <testcase name="getTestCaseName('Search')">
                <!-- Specific to replication tests -->
                <script>
                  msg1 = 'Replication: Changelog:'
                </script>
                <!-- List of Test Cases -->
                <script>
                  testsList=[]
                  testsList.append('replication_changelog_001')
                  testsList.append('replication_changelog_002')
                  testsList.append('replication_changelog_003')
                  testsList.append('replication_changelog_004')
                  #OOS: testsList.append('replication_changelog_005')
                  testsList.append('replication_changelog_006')
                </script>
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
            <sequence>            
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Changelog: Search. \
                Check replication changelog can be searched and look up changes'
                    <call function="'%s' % (__test)" />
                  </sequence>
                </iterate>
              </sequence>
              <catch exception="'STAFException.TestSuite.SetupException'">
                <sequence>
                  <message log="1" level="'fatal'">
                    'Setup of test suite failed.'
              </message>
                  <rethrow/>
                </sequence>
              </catch>
              <!-- Add entry to "master" server -->
              <script>
                userDn = 'uid=iabizen.0, ou=People, %s' % synchroSuffix
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
                
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.0')
                listAttr.append('sn:Abizen.0')
                listAttr.append('cn:Izen Abizen.0')
                listAttr.append('l:ICNC')
              </script>
            </try>
          
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDn,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
          </sequence>
              <!-- Modify entry on one of the servers -->
              <call function="'modifyAnAttribute'">
                { 'location'          : masterHost,
                  'dsPath'            : masterPath,
                  'dsInstanceHost'    : masterHost,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'      : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'        : userDn,
                  'attributeName'     : 'l',
                  'newAttributeValue' : 'GEC',
                  'changetype'        : 'replace',
                  'expectedRC'        : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Search changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
          <finally>
                <sequence>                    
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.0',
                      'dsAttributes'     : 'dn'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect entry returned => len(searchResult) > 0
                    =====> resultLength = 1 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 1
                    }
                  </call>
                  <!-- Search for entry modify -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'l=GEC',
                      'dsAttributes'     : 'dn'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect entry returned => len(searchResult) > 0
                    =====> resultLength = 1 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 1
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Changelog Tests
          #@TestName            Replication: Changelog: Export (on-line)
          #@TestID              Export (on-line)
          #@TestPurpose         Check replication changelog can be exported
                                on-line and look up changes
          #@TestPreamble
          #@TestSteps           Add entry to server A
          #@TestSteps           Export every changelog to ldif file
          #@TestSteps           Check for added entry in each exported changelog
                                file
          #@TestPostamble
          #@TestResult          Success if the corresponding change can be found
                                in the exported changelog files
          -->
          <testcase name="getTestCaseName('Export (on-line)')">
              <!-- Test Suite Cleanup -->
              <message>'Finally: Replication Cleanup.'</message>
              <try>
            <sequence>            
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Changelog: Export (on-line). \
                Check replication changelog can be exported on-line and look \
                up changes'
              </message>
              <!-- Add entry to "master" server -->
              <script>
                userDn = 'uid=iabizen.2, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.2')
                listAttr.append('sn:Abizen.2')
                listAttr.append('cn:Izen Abizen.2')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDn,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Export changelog in the various replication servers, then
                check for added entry in the exported files -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                    replServerBackupDir = '%s' % replServer.getTmpDir()
                  </script>
                  <!-- Export changelog data from server -->
                  <call function="'exportLdifWithScript'">
                    { 'location'       : replServer.getHostname(),
                      'dsPath'         : replServerPath,
                      'dsInstanceHost' : replServer.getHostname(),
                      'dsInstanceAdminPort' : replServer.getAdminPort(),
                      'dsInstanceDn'   : replServer.getRootDn(),
                      'dsInstancePswd' : replServer.getRootPwd(),
                      'ldifFile'       : '%s/replication/changelog_export_online.ldif' \
                                         % replServerBackupDir,
                      'backEnd'        : 'replicationChanges'
                    }
                  </call>
                  <!-- Check for the added entry inside the exported file -->
                  <call function="'grep'">
                    {
                      'location'   : replServer.getHostname(),
                      'filename'   : '%s/replication/changelog_export_online.ldif' \
                                         % replServerBackupDir,
                      'testString' : 'uid=iabizen.2'
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Changelog Tests
          #@TestName            Replication: Changelog:
                                Backup-restore (off-line)
          #@TestID              Backup-restore (off-line)
          #@TestPurpose         Check replication changelog can be backuped and
                                restored off-line
          #@TestPreamble        Backup server suffix
          #@TestSteps           Add entry A to server
          #@TestSteps           Stop servers
          #@TestSteps           Backup every changelog
          #@TestSteps           Start servers
          #@TestSteps           Add entry B to server
          #@TestSteps           Stop servers
          #@TestSteps           Restore server suffix (without entries A and B)
          #@TestSteps           Restore every changelog
          #@TestSteps           Start servers
          #@TestSteps           Check for added entry A in changelog and server
          #@TestSteps           Check for added entry B in changelog and server
          #@TestPostamble
          #@TestResult          Success if the search for entry A succeeds and
                                the search for entry B fails
          -->
          <testcase name="getTestCaseName('Backup-restore (off-line)')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Changelog: Backup-restore (off-line). \
                Check replication changelog can be backed up and restored \
                off-line'
              </message>
              <!-- Backup "master" server -->
              <message>
                '+++++ binary copy off-line: back-up server %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'backup'">
                { 'location'  : masterHost,
                  'dsPath'    : masterPath,
                  'backupDir' : '%s/replication/master_backup' % masterBackupDir
                }
              </call>
              <!-- Add entry A to "master" server -->
              <script>
                userDnA = 'uid=iabizen.A, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.A')
                listAttr.append('sn:Abizen.A')
                listAttr.append('cn:Izen Abizen.A')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDnA,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Stop the servers in the topology -->
              <script>
                if globalSplitServers:
                  serverList = _topologyReplServerList
                else:
                  serverList = _topologyServerList
              </script>
              <call function="'stopServers'">
                [serverList]
              </call>
              <!-- Backup changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                    replServerDataDir = '%s' % replServer.getDataDir()
                    replServerBackupDir = '%s' % replServer.getTmpDir()
                  </script>
                  <call function="'backup'">
                    { 'location'  : replServer.getHostname(),
                      'dsPath'    : replServerPath,
                      'backupDir' : '%s/replication/changelog_backup' \
                                         % replServerBackupDir,
                      'backEnd'   : 'replicationChanges'
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Start the servers in the topology -->
              <script>
                if globalSplitServers:
                  serverList = _topologyReplServerList
                else:
                  serverList = _topologyServerList
              </script>
              <call function="'startServers'">
                [serverList]
              </call>
              <!-- Add entry B to "master" server -->
              <script>
                userDnB = 'uid=iabizen.B, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.B')
                listAttr.append('sn:Abizen.B')
                listAttr.append('cn:Izen Abizen.B')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDnB,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_splitServerList]
              </call>
              <!-- Restore master_backup in every server, then restore
                changelog_backup in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                    serverBackupDir = '%s' % server.getTmpDir()
                    replServerDataDir = '%s' % replServer.getDataDir()
                    replServerBackupDir = '%s' % replServer.getTmpDir()
                  </script>
                  <!-- Restore master_backup -->
                  <if expr="i != 0">
                    <!-- _topologyServerList[0] corresponds to "master", so
                      no need to copy the files for that case -->
                    <sequence>
                      <!-- TODO: check what schematokens.dat files are? -->
                      <if expr="os.path.exists
                                ('%s/config/schematokens.dat' % dsPath)" >
                        <call function="'copyFile'">
                          { 'location'   : masterHost,
                            'remotehost' : server.getHostname(),
                            'srcfile'    : '%s/config/schematokens.dat' \
                                           % masterPath,
                            'destfile'   : '%s/config/schematokens.dat' \
                                           % serverPath
                          }
                        </call>
                      </if>
                      <call function="'CopyFolderByExtension'">
                        { 'location'   : masterHost,
                          'remotehost' : server.getHostname(),
                          'srcfolder'  : masterBackupDir,
                          'destfolder' : '%s/replication/master_backup' \
                                         % serverBackupDir,
                          'extension'  : '*'
                        }
                      </call>
                    </sequence>
                  </if>
                  <call function="'restore'">
                    { 'location'  : server.getHostname(),
                      'dsPath'    : serverPath,
                      'backupDir' : '%s/replication/master_backup' \
                                    % serverBackupDir
                    }
                  </call>
                  <!-- Restore changelog_backup -->
                  <call function="'restore'">
                    { 'location'  : replServer.getHostname(),
                      'dsPath'    : replServerPath,
                      'backupDir' : '%s/replication/changelog_backup' \
                                         % replServerBackupDir
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Start the servers in the topology -->
              <call function="'startServers'">
                [_splitServerList]
              </call>
              <!-- Search synchroSuffix and changelog in the various servers,
                looking for entries A (should be there) and B (shouldn't be) -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <!-- Search for entry A (should be there) -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : userDnA,
                      'dsFilter'         : 'objectclass=*',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.A',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect entry returned => len(searchResult) > 0
                    =====> resultLength = 1 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 1
                    }
                  </call>
                  <!-- Search for entry B (should NOT be there) -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : userDnB,
                      'dsFilter'         : 'objectclass=*',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 32
                    }
                  </call>
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.B',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect NO entry returned => len(searchResult) = 0
                    =====> resultLength = 0 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 0
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
<if expr="0">
  <!-- Due to the impossibility to ensure all the restore operations (of both
       db and changelogs) are done at the very same time, there's no controlling
       the output of this testcase.
  -->
          <!--- Test Case information
          #@TestMarker          Replication Changelog Tests
          #@TestName            Replication: Changelog: Backup-restore (on-line)
          #@TestID              Backup-restore (on-line)
          #@TestPurpose         Check replication changelog can be backuped and
                                restored on-line
          #@TestPreamble        Backup server suffix (done at the beginning of
                                the test suite)
          #@TestSteps           Add entry AA to server
          #@TestSteps           Backup every changelog
          #@TestSteps           Add entry BB to server
          #@TestSteps           Restore every changelog
          #@TestSteps           Restore server suffix (without entries AA and BB)
          #@TestSteps           Check for added entry AA in changelog and server
          #@TestSteps           Check for added entry BB in changelog and server
          #@TestPostamble
          #@TestResult          Success if the search for entry AA succeeds and
                                the search for entry BB fails
          -->
          <testcase name="getTestCaseName('Backup-restore (on-line)')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Changelog: Backup-restore (on-line). \
                Check replication changelog can be backuped and restored \
                on-line'
              </message>
              <!-- Add entry AA to "master" server -->
              <script>
                userDnAA = 'uid=iabizen.AA, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.AA')
                listAttr.append('sn:Abizen.AA')
                listAttr.append('cn:Izen Abizen.AA')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDnAA,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Backup changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                    replServerBackupDir = '%s' % replServer.getTmpDir()
                  </script>
                  <call function="'backupTask'">
                    { 'location'       : replServer.getHostname(),
                      'dsPath'         : replServerPath,
                      'dsInstanceHost' : replServer.getHostname(),
                      'dsInstancePort' : replServer.getPort(),
                      'dsInstanceDn'   : replServer.getRootDn(),
                      'dsInstancePswd' : replServer.getRootPwd(),
                      'taskID'         : 'changelog backup task',
                      'backupDir'      : '%s/replication/changelog_backup_online' \
                                          % replServerBackupDir,
                      'backEnd'        : 'replicationChanges'
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Add entry BB to "master" server -->
              <script>
                userDnBB = 'uid=iabizen.BB, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.BB')
                listAttr.append('sn:Abizen.BB')
                listAttr.append('cn:Izen Abizen.BB')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDnBB,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Restore changelog_backup_online in the various replication
                servers, then restore master_backup in every server -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                    serverBackupDir = '%s' % server.getTmpDir()
                    replServerBackupDir = '%s' % replServer.getTmpDir()
                  </script>
                  <!-- Restore changelog_backup -->
                  <call function="'restoreTask'">
                    { 'location'       : replServer.getHostname(),
                      'dsPath'         : replServerPath,
                      'dsInstanceHost' : replServer.getHostname(),
                      'dsInstancePort' : replServer.getPort(),
                      'dsInstanceDn'   : replServer.getRootDn(),
                      'dsInstancePswd' : replServer.getRootPwd(),
                      'taskID'         : 'changelog restore task',
                      'backupDir'      : '%s/replication/changelog_backup_online' \
                                          % replServerBackupDir
                    }
                  </call>
                  <!-- Restore master_backup -->
                  <if expr="i != 0">
                    <!-- _topologyServerList[0] corresponds to "master", so
                      no need to copy the files for that case -->
                    <sequence>
                      <if expr="os.path.exists
                                ('%s/config/schematokens.dat' % dsPath)" >
                        <call function="'copyFile'">
                          { 'location'   : masterHost,
                            'remotehost' : server.getHostname(),
                            'srcfile'    : '%s/config/schematokens.dat' \
                                           % masterPath,
                            'destfile'   : '%s/config/schematokens.dat' \
                                           % serverPath
                          }
                        </call>
                      </if>
                      <call function="'CopyFolderByExtension'">
                        { 'location'   : masterHost,
                          'remotehost' : server.getHostname(),
                          'srcfolder'  : masterBackupDir,
                          'destfolder' : '%s/replication/master_backup' \
                                         % serverBackupDir,
                          'extension'  : '*'
                        }
                      </call>
                    </sequence>
                  </if>
                  <call function="'restoreTask'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'taskID'         : 'restore task',
                      'backupDir'      : '%s/replication/master_backup' \
                                         % serverBackupDir
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Search synchroSuffix and changelog in the various servers,
                looking for entries AA (should be there) and BB (shouldn't be)
                -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <!-- Search for entry AA (should be there) -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : userDnAA,
                      'dsFilter'         : 'objectclass=*',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.AA',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect entry returned => len(searchResult) > 0
                    =====> resultLength = 1 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 1
                    }
                  </call>
                  <!-- Search for entry BB (should NOT be there) -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : userDnBB,
                      'dsFilter'         : 'objectclass=*',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 32
                    }
                  </call>
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.BB',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect NO entry returned => len(searchResult) = 0
                    =====> resultLength = 0 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 0
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
</if>
          <!--- Test Case information
          #@TestMarker          Replication Changelog Tests
          #@TestName            Replication: Changelog: Changelog Reset
          #@TestID              Changelog Reset
          #@TestPurpose         Check replication changelog is reset by
                                dsreplication pre/post-external-initialize
          #@TestPreamble
          #@TestSteps           Add entry to server A
          #@TestSteps           Search changelogs and check for made change
          #@TestSteps           Reset changelog (call pre/post-external init)
          #@TestSteps           Search changelogs and check for made change
          #@TestPostamble
          #@TestResult          Success if the corresponding change can be found
                                in the changelog prior to the reset but not any
                                more after the reset
          -->
          <testcase name="getTestCaseName('Changelog Reset')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Changelog: Changelog Reset. \
                Check replication changelog is reset by \
                dsreplication pre/post-external-initialize'
              </message>
              <!-- Add entry to "master" server -->
              <script>
                userDn = 'uid=iabizen.3, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.3')
                listAttr.append('sn:Abizen.3')
                listAttr.append('cn:Izen Abizen.3')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDn,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the change to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Search changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges' ,
                      'dsFilter'         : 'uid=iabizen.3',
                      'dsAttributes'     : 'dn'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect entry returned => len(searchResult) > 0
                    =====> resultLength = 1 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 1
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Reset the changelog (call pre/post-external-init) -->
              <call function="'resetReplicationData'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : masterHost,
                  'sourceInstancePort'      : master.getPort(),
                  'sourceInstanceAdminPort' : master.getAdminPort(),
                  'sourceInstanceDn'        : master.getRootDn(),
                  'sourceInstancePswd'      : master.getRootPwd(),
                  'backupDir'               : masterBackupDir,
                  'suffixDn'                : synchroSuffix
                }
              </call>
              <!-- Search changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <!-- Search for entry in the suffix (should NOT be there) -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : userDn,
                      'dsFilter'         : 'objectclass=*',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 32
                    }
                  </call>
                  <!-- Search for corresponding change in the changelog
                    (should NOT be there) -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.3',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect NO entry returned => len(searchResult) = 0
                    =====> resultLength = 0 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 0
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Changelog Tests
          #@TestName            Replication: Changelog: Changelog Purge
          #@TestID              Changelog Purge
          #@TestPurpose         Check replication changelog is purged after the
                                purge delay specified in the conf expires
          #@TestPreamble
          #@TestSteps           Set purge delay to 20 seconds on server A
          #@TestSteps           Add entry X to server A
          #@TestSteps           Add entry Y to server A
          #@TestSteps           Search changelogs and check for made change
          #@TestSteps           Let purge delay expire (sleep for 30 seconds)
          #@TestSteps           Search changelogs and check for made change
          #@TestPostamble
          #@TestResult          Success if the corresponding change for entry X
                                can be found in every changelog before the purge
                                delay expires but not any more on server A's
                                after the delay expires (entry Y will still be
                                there though since the last change is always
                                kept)
          -->
          <testcase name="getTestCaseName('Changelog Purge')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Changelog: Changelog Purge. \
                Check replication changelog is purged after the purge delay \
                specified in the conf expires'
              </message>
              <script>
                if globalSplitServers:
                  masterReplServer = _topologyReplServerList[0]
                else:
                  masterReplServer = master
                masterReplServerHost = masterReplServer.getHostname()
                masterReplServerPath = '%s/%s' % \
                                       (masterReplServer.getDir(), OPENDSNAME)
              </script>
              <message>
                'Set purge delay to 20 seconds on server %s:%s' \
                % (masterReplServerHost, masterReplServer.getPort())
              </message>
              <!-- Set purge delay to 20s on "master" server -->
              <call function="'dsconfigSet'">
                { 'location'            : masterReplServerHost,
                  'dsPath'              : masterReplServerPath,
                  'dsInstanceHost'      : masterReplServerHost,
                  'dsInstanceAdminPort' : masterReplServer.getAdminPort(),
                  'dsInstanceDn'        : masterReplServer.getRootDn(),
                  'dsInstancePswd'      : masterReplServer.getRootPwd(),
                  'objectName'          : 'replication-server' ,
                  'propertyType'        : 'provider',
                  'propertyName'        : 'Multimaster Synchronization',
                  'attributeName'       : 'replication-purge-delay' ,
                  'attributeValue'      : '20s'
                }
              </call>
              <!-- Add entry X to "master" server -->
              <script>
                userDnX = 'uid=iabizen.X, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.X')
                listAttr.append('sn:Abizen.X')
                listAttr.append('cn:Izen Abizen.X')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDnX,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Add entry Y to "master" server -->
              <script>
                userDnY = 'uid=iabizen.Y, ou=People, %s' % synchroSuffix
                listAttr = []
                listAttr.append('objectclass:top')
                listAttr.append('objectclass:organizationalperson')
                listAttr.append('objectclass:inetorgperson')
                listAttr.append('objectclass:person')
                listAttr.append('givenname:Izen.Y')
                listAttr.append('sn:Abizen.Y')
                listAttr.append('cn:Izen Abizen.Y')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'DNToAdd'        : userDnY,
                  'listAttributes' : listAttr,
                  'expectedRC'     : 0
                }
              </call>
              <!-- Let some time for the changes to propagate -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  2000 }
              </call>
              <!-- Search changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <call function="'ldapSearchWithScript'">
                    {
                      'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges' ,
                      'dsFilter'         : 'uid=iabizen.X',
                      'dsAttributes'     : 'dn'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <!-- expect entry returned => len(searchResult) > 0
                    =====> resultLength = 1 -->
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : 1
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Let the purge delay expire: sleep for 60s -->
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' :  60000 }
              </call>
              <!-- Search changelog in the various replication servers -->
              <paralleliterate var="server"
                               in="_topologyServerList"
                               indexvar="i">
                <sequence>
                  <script>
                    if globalSplitServers:
                      replServer = _topologyReplServerList[i]
                    else:
                      replServer = server
                    replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  </script>
                  <call function="'ldapSearchWithScript'">
                    {
                      'location'         : replServer.getHostname(),
                      'dsPath'           : replServerPath,
                      'dsInstanceHost'   : replServer.getHostname(),
                      'dsInstancePort'   : replServer.getPort(),
                      'dsInstanceDn'     : replServer.getRootDn(),
                      'dsInstancePswd'   : replServer.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=iabizen.X',
                      'dsAttributes'     : 'dn',
                      'expectedRC'       : 0
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                    if i == 0:
                      # index [0] corresponds to "master" repl server
                      # => purge delay expired => changelog purged
                      # => expect NO entry returned
                      # => len(searchResult) = 0 => resultLength = 0
                      myExpectedRC = 0
                      # if entry not purged => we may have run into Issue 3736
                      # (Dynamic purge delay change not taken into account)
                      myKnownIssue = '3736'
                    else:
                      # purge delay not expired (default purge delay: 1 day)
                      # => expect entry returned
                      # => len(searchResult) > 0 => resultLength = 1
                      myExpectedRC = 1
                      myKnownIssue = None
                  </script>
                  <call function="'checktestRC'">
                    { 'returncode' : resultLength ,
                      'result'     : searchResult ,
                      'expected'   : myExpectedRC,
                      'issue'      : myKnownIssue
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_cleanup.xml' 
                        % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" >
            { 'label'    : 'Replication Changelog' }
                    { 'label'    : _label }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
              <catch exception="'STAFException'">
                <sequence>
                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                </sequence>
              </catch>
              <finally>
                <call function="'testSuite_Postamble'"/>
              </finally>
              </try>
            </sequence>
          </finally>
        </try>
      </block>
    </sequence>
  </function>
opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog_tests.xml
New file
@@ -0,0 +1,1529 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2008-2009 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 ! -->
<stax>
  <!--- Test Case information
  #@TestMarker          Replication Changelog Tests
  #@TestName            Replication: Changelog: Search
  #@TestID              Search
  #@TestPurpose         Check replication changelog can be searched and
                        look up changes
  #@TestPreamble
  #@TestSteps           Add entry to server A
  #@TestSteps           Modify entry on server A
  #@TestSteps           Search changelogs and check for made changes
  #@TestPostamble
  #@TestResult          Success if the corresponding changes can be
                        found in the changelog
  -->
  <function name="replication_changelog_001" scope="local">
    <testcase name="getTestCaseName('Search')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check replication changelog can be searched and look up changes.' % msg1 }
            </call>
            <!-- Add entry to "master" server -->
            <script>
              userDn = 'uid=iabizen.0, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.0')
              listAttr.append('sn:Abizen.0')
              listAttr.append('cn:Izen Abizen.0')
              listAttr.append('l:ICNC')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDn,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Modify entry on one of the servers -->
            <call function="'modifyAnAttribute'">
              { 'location'          : masterHost,
                'dsPath'            : masterPath,
                'dsInstanceHost'    : masterHost,
                'dsInstancePort'    : master.getPort(),
                'dsInstanceDn'      : master.getRootDn(),
                'dsInstancePswd'    : master.getRootPwd(),
                'DNToModify'        : userDn,
                'attributeName'     : 'l',
                'newAttributeValue' : 'GEC',
                'changetype'        : 'replace',
                'expectedRC'        : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Search changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <!-- Search for entry add -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.0',
                    'dsAttributes'     : 'dn'
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect entry returned => len(searchResult) > 0
                  =====> resultLength = 1 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                  }
                </call>
                <!-- Search for entry modify -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'l=GEC',
                    'dsAttributes'     : 'dn'
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect entry returned => len(searchResult) > 0
                  =====> resultLength = 1 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Changelog Tests
  #@TestName            Replication: Changelog: Export (on-line)
  #@TestID              Export (on-line)
  #@TestPurpose         Check replication changelog can be exported
                        on-line and look up changes
  #@TestPreamble
  #@TestSteps           Add entry to server A
  #@TestSteps           Export every changelog to ldif file
  #@TestSteps           Check for added entry in each exported changelog
                        file
  #@TestPostamble
  #@TestResult          Success if the corresponding change can be found
                        in the exported changelog files
  -->
  <function name="replication_changelog_002" scope="local">
    <testcase name="getTestCaseName('Export (on-line)')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check replication changelog can be exported on-line and look up changes.' % msg1 }
            </call>
            <!-- Add entry to "master" server -->
            <script>
              userDn = 'uid=iabizen.2, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.2')
              listAttr.append('sn:Abizen.2')
              listAttr.append('cn:Izen Abizen.2')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDn,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Export changelog in the various replication servers, then
              check for added entry in the exported files -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  replServerBackupDir = '%s' % replServer.getTmpDir()
                </script>
                <!-- Export changelog data from server -->
                <call function="'exportLdifWithScript'">
                  { 'location'       : replServer.getHostname(),
                    'dsPath'         : replServerPath,
                    'dsInstanceHost' : replServer.getHostname(),
                    'dsInstanceAdminPort' : replServer.getAdminPort(),
                    'dsInstanceDn'   : replServer.getRootDn(),
                    'dsInstancePswd' : replServer.getRootPwd(),
                    'ldifFile'       : '%s/replication/changelog_export_online.ldif' \
                                       % replServerBackupDir,
                    'backEnd'        : 'replicationChanges'
                  }
                </call>
                <!-- Check for the added entry inside the exported file -->
                <call function="'grep'">
                  {
                    'location'   : replServer.getHostname(),
                    'filename'   : '%s/replication/changelog_export_online.ldif' \
                                       % replServerBackupDir,
                    'testString' : 'uid=iabizen.2'
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Changelog Tests
  #@TestName            Replication: Changelog:
                        Backup-restore (off-line)
  #@TestID              Backup-restore (off-line)
  #@TestPurpose         Check replication changelog can be backuped and
                        restored off-line
  #@TestPreamble        Backup server suffix
  #@TestSteps           Add entry A to server
  #@TestSteps           Stop servers
  #@TestSteps           Backup every changelog
  #@TestSteps           Start servers
  #@TestSteps           Add entry B to server
  #@TestSteps           Stop servers
  #@TestSteps           Restore server suffix (without entries A and B)
  #@TestSteps           Restore every changelog
  #@TestSteps           Start servers
  #@TestSteps           Check for added entry A in changelog and server
  #@TestSteps           Check for added entry B in changelog and server
  #@TestPostamble
  #@TestResult          Success if the search for entry A succeeds and
                        the search for entry B fails
  -->
  <function name="replication_changelog_003" scope="local">
    <testcase name="getTestCaseName('Backup-restore (off-line)')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check replication changelog can be backed up and restored off-line.' % msg1 }
            </call>
            <!-- Backup "master" server -->
            <message>
              '+++++ binary copy off-line: back-up server %s:%s' \
              % (masterHost, master.getPort())
            </message>
            <call function="'backup'">
              { 'location'  : masterHost,
                'dsPath'    : masterPath,
                'backupDir' : '%s/replication/master_backup' % masterBackupDir
              }
            </call>
            <!-- Add entry A to "master" server -->
            <script>
              userDnA = 'uid=iabizen.A, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.A')
              listAttr.append('sn:Abizen.A')
              listAttr.append('cn:Izen Abizen.A')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDnA,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Stop the servers in the topology -->
            <script>
              if globalSplitServers:
                serverList = _topologyReplServerList
              else:
                serverList = _topologyServerList
            </script>
            <call function="'stopServers'">
              [serverList]
            </call>
            <!-- Backup changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  replServerDataDir = '%s' % replServer.getDataDir()
                  replServerBackupDir = '%s' % replServer.getTmpDir()
                </script>
                <call function="'backup'">
                  { 'location'  : replServer.getHostname(),
                    'dsPath'    : replServerPath,
                    'backupDir' : '%s/replication/changelog_backup' \
                                       % replServerBackupDir,
                    'backEnd'   : 'replicationChanges'
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Start the servers in the topology -->
            <script>
              if globalSplitServers:
                serverList = _topologyReplServerList
              else:
                serverList = _topologyServerList
            </script>
            <call function="'startServers'">
              [serverList]
            </call>
            <!-- Add entry B to "master" server -->
            <script>
              userDnB = 'uid=iabizen.B, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.B')
              listAttr.append('sn:Abizen.B')
              listAttr.append('cn:Izen Abizen.B')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDnB,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Stop the servers in the topology -->
            <call function="'stopServers'">
              [_splitServerList]
            </call>
            <!-- Restore master_backup in every server, then restore
              changelog_backup in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  serverBackupDir = '%s' % server.getTmpDir()
                  replServerDataDir = '%s' % replServer.getDataDir()
                  replServerBackupDir = '%s' % replServer.getTmpDir()
                </script>
                <!-- Restore master_backup -->
                <if expr="i != 0">
                  <!-- _topologyServerList[0] corresponds to "master", so
                    no need to copy the files for that case -->
                  <sequence>
                    <!-- TODO: check what schematokens.dat files are? -->
                    <if expr="os.path.exists
                              ('%s/config/schematokens.dat' % dsPath)" >
                      <call function="'copyFile'">
                        { 'location'   : masterHost,
                          'remotehost' : server.getHostname(),
                          'srcfile'    : '%s/config/schematokens.dat' \
                                         % masterPath,
                          'destfile'   : '%s/config/schematokens.dat' \
                                         % serverPath
                        }
                      </call>
                    </if>
                    <call function="'CopyFolderByExtension'">
                      { 'location'   : masterHost,
                        'remotehost' : server.getHostname(),
                        'srcfolder'  : masterBackupDir,
                        'destfolder' : '%s/replication/master_backup' \
                                       % serverBackupDir,
                        'extension'  : '*'
                      }
                    </call>
                  </sequence>
                </if>
                <call function="'restore'">
                  { 'location'  : server.getHostname(),
                    'dsPath'    : serverPath,
                    'backupDir' : '%s/replication/master_backup' \
                                  % serverBackupDir
                  }
                </call>
                <!-- Restore changelog_backup -->
                <call function="'restore'">
                  { 'location'  : replServer.getHostname(),
                    'dsPath'    : replServerPath,
                    'backupDir' : '%s/replication/changelog_backup' \
                                       % replServerBackupDir
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Start the servers in the topology -->
            <call function="'startServers'">
              [_splitServerList]
            </call>
            <!-- Search synchroSuffix and changelog in the various servers,
              looking for entries A (should be there) and B (shouldn't be) -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <!-- Search for entry A (should be there) -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : server.getHostname(),
                    'dsPath'           : serverPath,
                    'dsInstanceHost'   : server.getHostname(),
                    'dsInstancePort'   : server.getPort(),
                    'dsInstanceDn'     : server.getRootDn(),
                    'dsInstancePswd'   : server.getRootPwd(),
                    'dsBaseDN'         : userDnA,
                    'dsFilter'         : 'objectclass=*',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.A',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect entry returned => len(searchResult) > 0
                  =====> resultLength = 1 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                  }
                </call>
                <!-- Search for entry B (should NOT be there) -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : server.getHostname(),
                    'dsPath'           : serverPath,
                    'dsInstanceHost'   : server.getHostname(),
                    'dsInstancePort'   : server.getPort(),
                    'dsInstanceDn'     : server.getRootDn(),
                    'dsInstancePswd'   : server.getRootPwd(),
                    'dsBaseDN'         : userDnB,
                    'dsFilter'         : 'objectclass=*',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 32
                  }
                </call>
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.B',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect NO entry returned => len(searchResult) = 0
                  =====> resultLength = 0 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 0
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!-- Due to the impossibility to ensure all the restore operations (of both
       db and changelogs) are done at the very same time, there's no controlling
       the output of this testcase.
  -->
  <!--- Test Case information
  #@TestMarker          Replication Changelog Tests
  #@TestName            Replication: Changelog: Backup-restore (on-line)
  #@TestID              Backup-restore (on-line)
  #@TestPurpose         Check replication changelog can be backuped and
                        restored on-line
  #@TestPreamble        Backup server suffix (done at the beginning of
                        the test suite)
  #@TestSteps           Add entry AA to server
  #@TestSteps           Backup every changelog
  #@TestSteps           Add entry BB to server
  #@TestSteps           Restore every changelog
  #@TestSteps           Restore server suffix (without entries AA and BB)
  #@TestSteps           Check for added entry AA in changelog and server
  #@TestSteps           Check for added entry BB in changelog and server
  #@TestPostamble
  #@TestResult          Success if the search for entry AA succeeds and
                        the search for entry BB fails
  -->
  <function name="replication_changelog_004" scope="local">
    <testcase name="getTestCaseName('Backup-restore (on-line)')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check replication changelog can be backed up and restored on-line.' % msg1 }
            </call>
            <!-- Add entry AA to "master" server -->
            <script>
              userDnAA = 'uid=iabizen.AA, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.AA')
              listAttr.append('sn:Abizen.AA')
              listAttr.append('cn:Izen Abizen.AA')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDnAA,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Backup changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  replServerBackupDir = '%s' % replServer.getTmpDir()
                </script>
                <call function="'backupTask'">
                  { 'location'       : replServer.getHostname(),
                    'dsPath'         : replServerPath,
                    'dsInstanceHost' : replServer.getHostname(),
                    'dsInstancePort' : replServer.getPort(),
                    'dsInstanceDn'   : replServer.getRootDn(),
                    'dsInstancePswd' : replServer.getRootPwd(),
                    'taskID'         : 'changelog backup task',
                    'backupDir'      : '%s/replication/changelog_backup_online' \
                                        % replServerBackupDir,
                    'backEnd'        : 'replicationChanges'
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Add entry BB to "master" server -->
            <script>
              userDnBB = 'uid=iabizen.BB, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.BB')
              listAttr.append('sn:Abizen.BB')
              listAttr.append('cn:Izen Abizen.BB')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDnBB,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Restore changelog_backup_online in the various replication
              servers, then restore master_backup in every server -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                  serverBackupDir = '%s' % server.getTmpDir()
                  replServerBackupDir = '%s' % replServer.getTmpDir()
                </script>
                <!-- Restore changelog_backup -->
                <call function="'restoreTask'">
                  { 'location'       : replServer.getHostname(),
                    'dsPath'         : replServerPath,
                    'dsInstanceHost' : replServer.getHostname(),
                    'dsInstancePort' : replServer.getPort(),
                    'dsInstanceDn'   : replServer.getRootDn(),
                    'dsInstancePswd' : replServer.getRootPwd(),
                    'taskID'         : 'changelog restore task',
                    'backupDir'      : '%s/replication/changelog_backup_online' \
                                        % replServerBackupDir
                  }
                </call>
                <!-- Restore master_backup -->
                <if expr="i != 0">
                  <!-- _topologyServerList[0] corresponds to "master", so
                    no need to copy the files for that case -->
                  <sequence>
                    <if expr="os.path.exists
                              ('%s/config/schematokens.dat' % dsPath)" >
                      <call function="'copyFile'">
                        { 'location'   : masterHost,
                          'remotehost' : server.getHostname(),
                          'srcfile'    : '%s/config/schematokens.dat' \
                                         % masterPath,
                          'destfile'   : '%s/config/schematokens.dat' \
                                         % serverPath
                        }
                      </call>
                    </if>
                    <call function="'CopyFolderByExtension'">
                      { 'location'   : masterHost,
                        'remotehost' : server.getHostname(),
                        'srcfolder'  : masterBackupDir,
                        'destfolder' : '%s/replication/master_backup' \
                                       % serverBackupDir,
                        'extension'  : '*'
                      }
                    </call>
                  </sequence>
                </if>
                <call function="'restoreTask'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'taskID'         : 'restore task',
                    'backupDir'      : '%s/replication/master_backup' \
                                       % serverBackupDir
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Search synchroSuffix and changelog in the various servers,
              looking for entries AA (should be there) and BB (shouldn't be)
              -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <!-- Search for entry AA (should be there) -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : server.getHostname(),
                    'dsPath'           : serverPath,
                    'dsInstanceHost'   : server.getHostname(),
                    'dsInstancePort'   : server.getPort(),
                    'dsInstanceDn'     : server.getRootDn(),
                    'dsInstancePswd'   : server.getRootPwd(),
                    'dsBaseDN'         : userDnAA,
                    'dsFilter'         : 'objectclass=*',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.AA',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect entry returned => len(searchResult) > 0
                  =====> resultLength = 1 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                  }
                </call>
                <!-- Search for entry BB (should NOT be there) -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : server.getHostname(),
                    'dsPath'           : serverPath,
                    'dsInstanceHost'   : server.getHostname(),
                    'dsInstancePort'   : server.getPort(),
                    'dsInstanceDn'     : server.getRootDn(),
                    'dsInstancePswd'   : server.getRootPwd(),
                    'dsBaseDN'         : userDnBB,
                    'dsFilter'         : 'objectclass=*',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 32
                  }
                </call>
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.BB',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect NO entry returned => len(searchResult) = 0
                  =====> resultLength = 0 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 0
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Changelog Tests
  #@TestName            Replication: Changelog: Changelog Reset
  #@TestID              Changelog Reset
  #@TestPurpose         Check replication changelog is reset by
                        dsreplication pre/post-external-initialize
  #@TestPreamble
  #@TestSteps           Add entry to server A
  #@TestSteps           Search changelogs and check for made change
  #@TestSteps           Reset changelog (call pre/post-external init)
  #@TestSteps           Search changelogs and check for made change
  #@TestPostamble
  #@TestResult          Success if the corresponding change can be found
                        in the changelog prior to the reset but not any
                        more after the reset
  -->
  <function name="replication_changelog_005" scope="local">
    <testcase name="getTestCaseName('Changelog Reset')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check replication changelog is reset by dsreplication pre/post-external-initialize.' % msg1 }
            </call>
            <!-- Add entry to "master" server -->
            <script>
              userDn = 'uid=iabizen.3, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.3')
              listAttr.append('sn:Abizen.3')
              listAttr.append('cn:Izen Abizen.3')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDn,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the change to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Search changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges' ,
                    'dsFilter'         : 'uid=iabizen.3',
                    'dsAttributes'     : 'dn'
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect entry returned => len(searchResult) > 0
                  =====> resultLength = 1 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Reset the changelog (call pre/post-external-init) -->
            <call function="'resetReplicationData'">
              { 'location'                : clientHost,
                'dsPath'                  : clientPath,
                'sourceInstanceHost'      : masterHost,
                'sourceInstancePort'      : master.getPort(),
                'sourceInstanceAdminPort' : master.getAdminPort(),
                'sourceInstanceDn'        : master.getRootDn(),
                'sourceInstancePswd'      : master.getRootPwd(),
                'backupDir'               : masterBackupDir,
                'suffixDn'                : synchroSuffix
              }
            </call>
            <!-- Search changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <!-- Search for entry in the suffix (should NOT be there) -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : server.getHostname(),
                    'dsPath'           : serverPath,
                    'dsInstanceHost'   : server.getHostname(),
                    'dsInstancePort'   : server.getPort(),
                    'dsInstanceDn'     : server.getRootDn(),
                    'dsInstancePswd'   : server.getRootPwd(),
                    'dsBaseDN'         : userDn,
                    'dsFilter'         : 'objectclass=*',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 32
                  }
                </call>
                <!-- Search for corresponding change in the changelog
                  (should NOT be there) -->
                <call function="'ldapSearchWithScript'">
                  { 'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.3',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect NO entry returned => len(searchResult) = 0
                  =====> resultLength = 0 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 0
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Changelog Tests
  #@TestName            Replication: Changelog: Changelog Purge
  #@TestID              Changelog Purge
  #@TestPurpose         Check replication changelog is purged after the
                        purge delay specified in the conf expires
  #@TestPreamble
  #@TestSteps           Set purge delay to 20 seconds on server A
  #@TestSteps           Add entry X to server A
  #@TestSteps           Add entry Y to server A
  #@TestSteps           Search changelogs and check for made change
  #@TestSteps           Let purge delay expire (sleep for 30 seconds)
  #@TestSteps           Search changelogs and check for made change
  #@TestPostamble
  #@TestResult          Success if the corresponding change for entry X
                        can be found in every changelog before the purge
                        delay expires but not any more on server A's
                        after the delay expires (entry Y will still be
                        there though since the last change is always kept)
  -->
  <function name="replication_changelog_006" scope="local">
    <testcase name="getTestCaseName('Changelog Reset')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check replication changelog is purged after purge delay period expires].' % msg1 }
            </call>
            <script>
              if globalSplitServers:
                masterReplServer = _topologyReplServerList[0]
              else:
                masterReplServer = master
              masterReplServerHost = masterReplServer.getHostname()
              masterReplServerPath = '%s/%s' % \
                                     (masterReplServer.getDir(), OPENDSNAME)
            </script>
            <message>
              'Set purge delay to 20 seconds on server %s:%s' \
              % (masterReplServerHost, masterReplServer.getPort())
            </message>
            <!-- Set purge delay to 20s on "master" server -->
            <call function="'dsconfigSet'">
              { 'location'            : masterReplServerHost,
                'dsPath'              : masterReplServerPath,
                'dsInstanceHost'      : masterReplServerHost,
                'dsInstanceAdminPort' : masterReplServer.getAdminPort(),
                'dsInstanceDn'        : masterReplServer.getRootDn(),
                'dsInstancePswd'      : masterReplServer.getRootPwd(),
                'objectName'          : 'replication-server' ,
                'propertyType'        : 'provider',
                'propertyName'        : 'Multimaster Synchronization',
                'attributeName'       : 'replication-purge-delay' ,
                'attributeValue'      : '20s'
              }
            </call>
            <!-- Add entry X to "master" server -->
            <script>
              userDnX = 'uid=iabizen.X, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.X')
              listAttr.append('sn:Abizen.X')
              listAttr.append('cn:Izen Abizen.X')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDnX,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Add entry Y to "master" server -->
            <script>
              userDnY = 'uid=iabizen.Y, ou=People, %s' % synchroSuffix
              listAttr = []
              listAttr.append('objectclass:top')
              listAttr.append('objectclass:organizationalperson')
              listAttr.append('objectclass:inetorgperson')
              listAttr.append('objectclass:person')
              listAttr.append('givenname:Izen.Y')
              listAttr.append('sn:Abizen.Y')
              listAttr.append('cn:Izen Abizen.Y')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : masterHost,
                'dsPath'         : masterPath,
                'dsInstanceHost' : masterHost,
                'dsInstancePort' : master.getPort(),
                'dsInstanceDn'   : master.getRootDn(),
                'dsInstancePswd' : master.getRootPwd(),
                'DNToAdd'        : userDnY,
                'listAttributes' : listAttr,
                'expectedRC'     : 0
              }
            </call>
            <!-- Let some time for the changes to propagate -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  2000 }
            </call>
            <!-- Search changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <call function="'ldapSearchWithScript'">
                  {
                    'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges' ,
                    'dsFilter'         : 'uid=iabizen.X',
                    'dsAttributes'     : 'dn'
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <!-- expect entry returned => len(searchResult) > 0
                  =====> resultLength = 1 -->
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Let the purge delay expire: sleep for 60s -->
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' :  60000 }
            </call>
            <!-- Search changelog in the various replication servers -->
            <paralleliterate var="server"
                             in="_topologyServerList"
                             indexvar="i">
              <sequence>
                <script>
                  if globalSplitServers:
                    replServer = _topologyReplServerList[i]
                  else:
                    replServer = server
                  replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
                </script>
                <call function="'ldapSearchWithScript'">
                  {
                    'location'         : replServer.getHostname(),
                    'dsPath'           : replServerPath,
                    'dsInstanceHost'   : replServer.getHostname(),
                    'dsInstancePort'   : replServer.getPort(),
                    'dsInstanceDn'     : replServer.getRootDn(),
                    'dsInstancePswd'   : replServer.getRootPwd(),
                    'dsBaseDN'         : 'dc=replicationChanges',
                    'dsFilter'         : 'uid=iabizen.X',
                    'dsAttributes'     : 'dn',
                    'expectedRC'       : 0
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                  if i == 0:
                    # index [0] corresponds to "master" repl server
                    # => purge delay expired => changelog purged
                    # => expect NO entry returned
                    # => len(searchResult) = 0 => resultLength = 0
                    myExpectedRC = 0
                    # if entry not purged => we may have run into Issue 3736
                    # (Dynamic purge delay change not taken into account)
                    myKnownIssue = '3736'
                  else:
                    # purge delay not expired (default purge delay: 1 day)
                    # => expect entry returned
                    # => len(searchResult) > 0 => resultLength = 1
                    myExpectedRC = 1
                    myKnownIssue = None
                </script>
                <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : myExpectedRC,
                    'issue'      : myKnownIssue
                  }
                </call>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
@@ -9,54 +9,53 @@
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Portions Copyright 2006-2009 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 !      Copyright 2012 ForgeRock AS.
 ! -->
<stax>
  <defaultcall function="replication_conflict"/>
  <function name="replication_conflict">
  <function name="replication_conflict" scope="local">
    <sequence>
      <block name="'conflict'">
      <block name="'replication_conflict'">
        <try>
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'                 
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
              CurrentTestPath['suite'] = 'conflict'
          <call function="'testSuite_Preamble'"/>
              _group=CurrentTestPath['group']
              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
              _label = 'Replication Conflict'
            </script>
          <!--- Test Suite information
          #@TestSuiteName       Replication Conflict Tests
          #@TestSuitePurpose    Verify that replication handles the conflicts
                                all right
            #@TestSuitePurpose    Verify that the conflict operations are replicated
                                  correctly between two servers.
          #@TestSuiteID         Conflict Tests
          #@TestSuiteGroup      Conflict
          #@TestGroup           Replication
          #@TestScript          replication_failover.xml
          #@TestHTMLLink        http://opends.dev.java.net/
            #@TestScript          replication_conflict.xml
            #@TestHTMLLink        http://www.forgerock.org/
          -->
            
            <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
                                                                        
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_setup.xml' 
@@ -67,12 +66,25 @@
              'dataFile'           : 'Short_Example.ldif',
              'isolateLdapServers' : True,
              'enableDebugLogs'    : False,
              'label'              : 'Replication Conflict'
                    'label'              : _label
            }
          </call>
                                    
                <!-- List of Import of Test Functions -->
          <script>
                  importList=[]
                  importList.append('conflict/conflict_tests')
                </script>
                <!-- Import the files for this test suite -->
                <iterate var="_import" in="importList">
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/%s.xml' % (_groupdir,_import)"/>
                </iterate>
                <!-- Specific to replication tests -->
                <script>
                  msg1 = 'Replication: Conflict:'
            server1 = _topologyServerList[0]
            server2 = _topologyServerList[1]
            server1Host = server1.getHostname()
@@ -116,3452 +128,85 @@
                return self.listAttr
              def addAttr(self, attrType, attrValue):
                self.listAttr.append('%s:%s' % (attrType, attrValue))
          </script>            
          <!-- ============================================== -->
          <!-- ============================================== -->
          <!--- Test Case information
          #@TestMarker          Replication Conflict Tests
          #@TestName            Replication: Conflict: Basic check
          #@TestID              Basic check
          #@TestPurpose         Check replication assures synchronization after
                                a simultaneous conflictuous modify on 2
                                different servers (regardless of the prevailing
                                modify)
          #@TestPreamble
          #@TestSteps           Add entry to server1 with employeeNumber:0
          #@TestSteps           Parallel replace
                                  server1: employeeNumber -> 1
                                  server2: employeeNumber -> 2
          #@TestSteps           Check entry consistent on both servers
          #@TestPostamble
          #@TestResult          Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('Basic check')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: Basic check 0. \
                Check replication assures synchronization after a simultaneous \
                conflictuous modify on 2 different servers (regardless of the \
                prevailing modify)'
              </message>
              <!-- Add entry to server1 -->
                <!-- List of Test Cases -->
              <script>
                myEntry = Entry('uid=tuser-0')
                myEntry.addAttr('employeeNumber', '0')
                  testsList=[]
                  testsList.append('replication_conflict_001')
                  testsList.append('replication_conflict_002')
                  testsList.append('replication_conflict_003')
                  testsList.append('replication_conflict_004')
                  testsList.append('replication_conflict_005')
                  testsList.append('replication_conflict_006')
                  testsList.append('replication_conflict_007')
                  testsList.append('replication_conflict_008')
                  testsList.append('replication_conflict_009')
                  testsList.append('replication_conflict_010')
                  testsList.append('replication_conflict_011')
                  testsList.append('replication_conflict_012')
                  testsList.append('replication_conflict_013')
                  testsList.append('replication_conflict_014')
                  testsList.append('replication_conflict_015')
                  testsList.append('replication_conflict_016')
                  testsList.append('replication_conflict_017')
                  testsList.append('replication_conflict_018')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <call function="'Sleep'">
                { 'sleepForMilliSeconds' : 2000 }
              </call>
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : '%s/%s' \
                                          % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : server.getRootDn(),
                    'dsInstancePswd'    : server.getRootPwd(),
                    'DNToModify'        : myEntry.getDn(),
                    'attributeName'     : 'employeeNumber',
                    'newAttributeValue' : '%i' % (i + 1),
                    'changetype'        : 'replace'
                  }
                </call>
              </paralleliterate>
              <paralleliterate var="server" in="[server1, server2]">
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Conflict Tests
          #@TestName            Replication: Conflict: double_replace_multi
          #@TestID              double_replace_multi
          #@TestPurpose         Double replace a multi-valued attribute
          #@TestPreamble
          #@TestSteps           Add entry to server1 with description:{1 2}
          #@TestSteps           Disconnect Replication Servers
          #@TestSteps           server1: replace description -> {3 4}
          #@TestSteps           server2: replace description -> {5 6}
          #@TestSteps           Re-connect Replication Servers
          #@TestSteps           Check description={5 6} on both servers
          #@TestPostamble
          #@TestResult          Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_replace_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_replace_multi. \
                Double replace a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=A1')
                myEntry.addAttr('description', '1')
                myEntry.addAttr('description', '2')
                server1mods = ['description:3', 'description:4']
                server2mods = ['description:5', 'description:6']
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i],
                    'changetype'     : 'replace'
                  }
                </call>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Conflict Tests
          #@TestName            Replication: Conflict: double_replace_single
          #@TestID              double_replace_single
          #@TestPurpose         Double replace a single-valued attribute
          #@TestPreamble
          #@TestSteps           Add entry to server1 with employeeNumber:0
          #@TestSteps           Disconnect Replication Servers
          #@TestSteps           server1: replace employeeNumber -> 1
          #@TestSteps           server2: replace employeeNumber -> 2
          #@TestSteps           Re-connect Replication Servers
          #@TestSteps           Check employeeNumber=2 on both servers
          #@TestPostamble
          #@TestResult          Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_replace_single')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_replace_single. \
                Double replace a single-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=A4')
                myEntry.addAttr('employeeNumber', '0')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : '%s/%s' \
                                          % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : server.getRootDn(),
                    'dsInstancePswd'    : server.getRootPwd(),
                    'DNToModify'        : myEntry.getDn(),
                    'attributeName'     : 'employeeNumber',
                    'newAttributeValue' : '%i' % (i + 1),
                    'changetype'        : 'replace'
                  }
                </call>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_mod_del_add_multi_1
          #@TestID             double_mod_del_add_multi_1
          #@TestPurpose        Double replace (del+add) same value with any
                               value of a multi-valued attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with
                               description:{1 2 3 4 5 6 7 8 9 10}
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: del description=1 + add description=11
          #@TestSteps          server2: del description=1 + add description=12
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={2 3 4 5 6 7 8 9 10 11 12}
                               on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_mod_del_add_multi_1')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_mod_del_add_multi_1. \
                Double replace (del+add) same value with any value of a \
                multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=A2')
                for x in range(10):
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = ['description:1']
                server1add = ['description:11']
                server2del = ['description:1']
                server2add = ['description:12']
                server1mods = [server1del, server1add]
                server2mods = [server2del, server2add]
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
                  </call>
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][1],
                      'changetype'     : 'add'
                    }
                  </call>
                    <call function="'%s' % (__test)" />
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
              </sequence>
              <catch exception="'STAFException.TestSuite.SetupException'">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                  <message log="1" level="'fatal'">
                    'Setup of test suite failed.'
                      </message>
                  <rethrow/>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              </catch>
                
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
            </try>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_mod_del_add_multi_2
          #@TestID             double_mod_del_add_multi_2
          #@TestPurpose        Double replace (del+add) any value with same
                               value of a multi-valued attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with
                               description:{1 2 3 4 5 6 7 8 9 10}
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: del description=1 + add description=11
          #@TestSteps          server2: del description=10 + add description=11
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={2 3 4 5 6 7 8 9 11}
                               on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_mod_del_add_multi_2')">
          <finally>
            <sequence>            
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_mod_del_add_multi_2. \
                Double replace (del+add) any value with same value of a \
                multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=A3')
                for x in range(10):
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = ['description:1']
                server1add = ['description:11']
                server2del = ['description:10']
                server2add = ['description:11']
                server1mods = [server1del, server1add]
                server2mods = [server2del, server2add]
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
                  </call>
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][1],
                      'changetype'     : 'add'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_mod_add_multi
          #@TestID             double_mod_add_multi
          #@TestPurpose        Double mod_add a multi-valued attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: add description=1
          #@TestSteps          server2: add description={1 2}
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={1 2} on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_mod_add_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_mod_add_multi. \
                Double mod_add a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=B1')
                server1add = ['description:1']
                server2add = ['description:1', 'description:2']
                server1mods = [server1add]
                server2mods = [server2add]
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'add'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_mod_add_single
          #@TestID             double_mod_add_single
          #@TestPurpose        Double mod_add a single-valued attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: add employeeNumber=1
          #@TestSteps          server2: add employeeNumber=2
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check employeeNumber=1 on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_mod_add_single')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_mod_add_single. \
                Double mod_add a single-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=B2')
                server1add = ['employeeNumber:1']
                server2add = ['employeeNumber:2']
                server1mods = [server1add]
                server2mods = [server2add]
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'add'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_mod_del_multi
          #@TestID             double_mod_del_multi
          #@TestPurpose        Double mod_delete a multi-valued attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with
                               description:{1 2 3 4 5 6 7 8 9 10}
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: delete description={1 2 3 4 5}
          #@TestSteps          server2: delete description={4 5 6 7 8}
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={9 10} on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_mod_del_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_mod_del_multi. \
                Double mod_delete a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=C1')
                for x in range(10):
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = []
                for y in range(1,6):
                  server1del.append('description:%i' % y)
                server2del = []
                for z in range(4,9):
                  server2del.append('description:%i' % z)
                server1mods = [server1del]
                server2mods = [server2del]
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_mod_del_single
          #@TestID             double_mod_del_single
          #@TestPurpose        Double mod_delete a single-valued attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with employeeNumber=1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: delete employeeNumber
          #@TestSteps          server2: delete employeeNumber=1
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check employeeNumber no longer exists on either
                               server
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_mod_del_single')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_mod_del_single. \
                Double mod_delete a single-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=C2')
                myEntry.addAttr('employeeNumber', '1')
                server1del = ['employeeNumber:']
                server2del = ['employeeNumber:1']
                server1mods = [server1del]
                server2mods = [server2del]
                mods = [server1mods, server2mods]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict:
                               mod_del_add_vs_mod_add_del_multi
          #@TestID             mod_del_add_vs_mod_add_del_multi
          #@TestPurpose        Modify: Delete+Add then Add+Delete on 2
                               multi-valued attributes
          #@TestPreamble
          #@TestSteps          Add entry to server1 with
                               description=1 , telephoneNumber=1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: add description=2 ,
                               delete telephoneNumber
          #@TestSteps          server2: delete description ,
                               add telephoneNumber=2
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description no longer exists and
                               telephoneNumber=2 on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('mod_del_add_vs_mod_add_del_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \
                Modify: Delete+Add then Add+Delete on 2 multi-valued attributes'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=D1')
                myEntry.addAttr('description', '1')
                myEntry.addAttr('telephoneNumber', '1')
                server1add = ['description:2']
                server1del = ['telephoneNumber:']
                server2del = ['description:']
                server2add = ['telephoneNumber:2']
                server1mods = [server1add, server1del]
                server2mods = [server2del, server2add]
                mods = [server1mods, server2mods]
                server1changetypes = ['add', 'delete']
                server2changetypes = ['delete', 'add']
                changetypes = [server1changetypes, server2changetypes]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
                  </call>
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][1],
                      'changetype'     : changetypes[i][1]
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description telephoneNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description telephoneNumber',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict:
                               mod_add_vs_mod_replace_multi
          #@TestID             mod_add_vs_mod_replace_multi
          #@TestPurpose        mod_add vs mod_replace on a multi-valued
                               attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with description=1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: add description={2 3}
          #@TestSteps          server2: replace description -> {4 5}
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={4 5} on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('mod_add_vs_mod_replace_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: mod_add_vs_mod_replace_multi. \
                mod_add vs mod_replace on a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=E1')
                myEntry.addAttr('description', '1')
                server1add = ['description:2', 'description:3']
                server2replace = ['description:4', 'description:5']
                server1mods = [server1add]
                server2mods = [server2replace]
                mods = [server1mods, server2mods]
                server1changetypes = ['add']
                server2changetypes = ['replace']
                changetypes = [server1changetypes, server2changetypes]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict:
                               mod_replace_vs_mod_add_multi
          #@TestID             mod_replace_vs_mod_add_multi
          #@TestPurpose        mod_replace vs mod_add on a multi-valued
                               attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with description=1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: replace description -> {2 3}
          #@TestSteps          server2: add description={4 5}
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={2 3 4 5} on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('mod_replace_vs_mod_add_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: mod_replace_vs_mod_add_multi. \
                mod_replace vs mod_add on a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=E2')
                myEntry.addAttr('description', '1')
                server1replace = ['description:2', 'description:3']
                server2add = ['description:4', 'description:5']
                server1mods = [server1replace]
                server2mods = [server2add]
                mods = [server1mods, server2mods]
                server1changetypes = ['replace']
                server2changetypes = ['add']
                changetypes = [server1changetypes, server2changetypes]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict:
                               mod_del_vs_mod_replace_multi
          #@TestID             mod_del_vs_mod_replace_multi
          #@TestPurpose        mod_del vs mod_replace on a multi-valued
                               attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with
                               description={1 2 3 4}
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: delete description={2 3}
          #@TestSteps          server2: replace description -> {6 7 8 9 10}
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={6 7 8 9 10} on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('mod_del_vs_mod_replace_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: mod_del_vs_mod_replace_multi. \
                mod_del vs mod_replace on a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=F1')
                for x in range(4):
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = ['description:2', 'description:3']
                server2replace = []
                for y in range(6,11):
                  server2replace.append('description:%i' % y)
                server1mods = [server1del]
                server2mods = [server2replace]
                mods = [server1mods, server2mods]
                server1changetypes = ['delete']
                server2changetypes = ['replace']
                changetypes = [server1changetypes, server2changetypes]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict:
                               mod_replace_vs_mod_del_multi
          #@TestID             mod_replace_vs_mod_del_multi
          #@TestPurpose        mod_replace vs mod_del on a multi-valued
                               attribute
          #@TestPreamble
          #@TestSteps          Add entry to server1 with
                               description={1 2 3 4}
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: replace description -> {1 2 3}
          #@TestSteps          server2: delete description={3 4}
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check description={1 2} on both servers
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('mod_replace_vs_mod_del_multi')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: mod_replace_vs_mod_del_multi. \
                mod_replace vs mod_del on a multi-valued attribute'
              </message>
              <!-- Add entry to server1 -->
              <script>
                myEntry = Entry('cn=F2')
                for x in range(4):
                  myEntry.addAttr('description', '%i' % (x+1))
                server1replace = ['description:1', 'description:2',
                                  'description:3']
                server2del = ['description:3', 'description:4']
                server1mods = [server1replace]
                server2mods = [server2del]
                mods = [server1mods, server2mods]
                server1changetypes = ['replace']
                server2changetypes = ['delete']
                changetypes = [server1changetypes, server2changetypes]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
              </call>
              <!-- Delete added entry -->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: add_child_del_parent
          #@TestID             add_child_del_parent
          #@TestPurpose        Add a child vs delete his parent
          #@TestPreamble
          #@TestSteps          Add entry cn=P1 to server1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server2: add child cn=C1,cn=P1
          #@TestSteps          server1: delete parent cn=P1
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check servers are synchronised
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('add_child_del_parent')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: add_child_del_parent. \
                Add a child vs delete his parent'
              </message>
              <!-- Add entry to server1 -->
              <script>
                parentEntry = Entry('cn=P1')
                parentEntry.addAttr('givenname', 'DUMMY ENTRY')
                childEntry = Entry('cn=C1,cn=P1')
                childEntry.addAttr('givenname', 'DUMMY ENTRY')
                # addedEntries = [[], []]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : parentEntry.getDn(),
                  'listAttributes' : parentEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Add child entry on server2 -->
              <call function="'addAnEntry'">
                { 'location'       : server2Host,
                  'dsPath'         : server2Path,
                  'dsInstanceHost' : server2Host,
                  'dsInstancePort' : server2.getPort(),
                  'dsInstanceDn'   : server2.getRootDn(),
                  'dsInstancePswd' : server2.getRootPwd(),
                  'DNToAdd'        : childEntry.getDn(),
                  'listAttributes' : childEntry.getAttrList()
                }
              </call>
              <!-- Delete parent entry on server1-->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [parentEntry.getDn()]
                }
              </call>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                      <script>
                        resultDnList = []
                        for line in searchResult.splitlines():
                          if line.find('dn: ') != -1:
                            resultDn = line[len('dn: '):]
                            resultDnList.append(resultDn)
                        addedEntries[i] = resultDnList
                      </script>
                    </sequence>
                    <else>
                      <script>
                        addedEntries[i] = []
                      </script>
                    </else>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <!-- If the trees don't match, we may have come across Issue 3891
               (Replication conflict: add child , delete parent) -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix,
                  '3891' ]
              </call>
              <!-- Delete added entries -->
              <script>
                list1 = addedEntries[0]
                list2 = addedEntries[1]
                toRemove = []
                # remove potential redundancies, to avoid deleting them twice
                for addedEntry in list2:
                  if addedEntry in list1:
                    toRemove.append(addedEntry)
                for ent in toRemove:
                  list2.remove(ent)
              </script>
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <if expr="len(addedEntries[i]) != 0">
                  <paralleliterate var="entryToDelete" in="addedEntries[i]">
                    <call function="'ldapDeleteWithScript'">
                      { 'location'       : clientHost,
                        'dsPath'         : clientPath,
                        'dsInstanceHost' : server.getHostname(),
                        'dsInstancePort' : server.getPort(),
                        'dsInstanceDn'   : server.getRootDn(),
                        'dsInstancePswd' : server.getRootPwd(),
                        'dsDn'           : [entryToDelete]
                      }
                    </call>
                  </paralleliterate>
                </if>
              </paralleliterate>
              <!-- Issue visible in the conflict counters, so not automatically
               !   detectable so far.
              <call function="'setKnownIssue'">
                { 'issueId' : '3400' }
              </call>
              -->
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: del_parent_add_child
          #@TestID             del_parent_add_child
          #@TestPurpose        Delete a parent vs add his child
          #@TestPreamble
          #@TestSteps          Add entry cn=P2 to server1
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: delete parent cn=P2
          #@TestSteps          server2: add child cn=C2,cn=P2
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check servers are synchronised
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('del_parent_add_child')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: del_parent_add_child. \
                Delete a parent vs add his child'
              </message>
              <!-- Add entry to server1 -->
              <script>
                parentEntry = Entry('cn=P2')
                parentEntry.addAttr('givenname', 'DUMMY ENTRY')
                childEntry = Entry('cn=C2,cn=P2')
                childEntry.addAttr('givenname', 'DUMMY ENTRY')
                # addedEntries = [[], []]
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
                  'dsPath'         : server1Path,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : parentEntry.getDn(),
                  'listAttributes' : parentEntry.getAttrList()
                }
              </call>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Delete parent entry on server1-->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [parentEntry.getDn()]
                }
              </call>
              <!-- Add child entry on server2 -->
              <call function="'addAnEntry'">
                { 'location'       : server2Host,
                  'dsPath'         : server2Path,
                  'dsInstanceHost' : server2Host,
                  'dsInstancePort' : server2.getPort(),
                  'dsInstanceDn'   : server2.getRootDn(),
                  'dsInstancePswd' : server2.getRootPwd(),
                  'DNToAdd'        : childEntry.getDn(),
                  'listAttributes' : childEntry.getAttrList()
                }
              </call>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                      <script>
                        resultDnList = []
                        for line in searchResult.splitlines():
                          if line.find('dn: ') != -1:
                            resultDn = line[len('dn: '):]
                            resultDnList.append(resultDn)
                        addedEntries[i] = resultDnList
                      </script>
                    </sequence>
                    <else>
                      <script>
                        addedEntries[i] = []
                      </script>
                    </else>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <!-- If the trees don't match, we may have come across Issue 4071
               (Replication conflict: delete parent, add child) -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix,
                  '4071' ]
              </call>
              <!-- Delete added entries -->
              <script>
                list1 = addedEntries[0]
                list2 = addedEntries[1]
                toRemove = []
                # remove potential redundancies, to avoid deleting them twice
                for addedEntry in list2:
                  if addedEntry in list1:
                    toRemove.append(addedEntry)
                for ent in toRemove:
                  list2.remove(ent)
              </script>
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <if expr="len(addedEntries[i]) != 0">
                  <paralleliterate var="entryToDelete" in="addedEntries[i]">
                    <call function="'ldapDeleteWithScript'">
                      { 'location'       : clientHost,
                        'dsPath'         : clientPath,
                        'dsInstanceHost' : server.getHostname(),
                        'dsInstancePort' : server.getPort(),
                        'dsInstanceDn'   : server.getRootDn(),
                        'dsInstancePswd' : server.getRootPwd(),
                        'dsDn'           : [entryToDelete]
                      }
                    </call>
                  </paralleliterate>
                </if>
              </paralleliterate>
              <!-- Issue visible in the conflict counters, so not automatically
               !   detectable so far.
              <call function="'setKnownIssue'">
                { 'issueId' : '3400' }
              </call>
              -->
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_add
          #@TestID             double_add
          #@TestPurpose        Double add (same dn, different uid)
          #@TestPreamble
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: add entry cn=F with uid=1
          #@TestSteps          server2: add entry cn=F with uid=2
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          Check servers are synchronised
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_add')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_add. \
                Double add (same dn, different uid)'
              </message>
              <script>
                entry1 = Entry('cn=F')
                entry1.addAttr('uid', '1')
                entry1.addAttr('givenname', 'DUMMY ENTRY')
                entry2 = Entry('cn=F')
                entry2.addAttr('uid', '2')
                entry2.addAttr('givenname', 'DUMMY ENTRY')
                entriesToAdd = [entry1, entry2]
              </script>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Add entry on one of the servers -->
                  <call function="'addAnEntry'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToAdd'        : entriesToAdd[i].getDn(),
                      'listAttributes' : entriesToAdd[i].getAttrList()
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict uid cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict uid cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                      <script>
                        resultDnList = []
                        for line in searchResult.splitlines():
                          if line.find('dn: ') != -1:
                            resultDn = line[len('dn: '):]
                            resultDnList.append(resultDn)
                        addedEntries[i] = resultDnList
                      </script>
                    </sequence>
                    <else>
                      <script>
                        addedEntries[i] = []
                      </script>
                    </else>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <!-- If the trees don't match, we may have come across Issue OPENDJ-454
               (RFE: Solve naming conflict of 2 adds with same dn, different
               attr value) -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix,
                  'OPENDJ-454' ]
              </call>
              <!-- Delete added entries -->
              <script>
                list1 = addedEntries[0]
                list2 = addedEntries[1]
                toRemove = []
                # remove potential redundancies, to avoid deleting them twice
                for addedEntry in list2:
                  if addedEntry in list1:
                    toRemove.append(addedEntry)
                for ent in toRemove:
                  list2.remove(ent)
              </script>
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <if expr="len(addedEntries[i]) != 0">
                  <paralleliterate var="entryToDelete" in="addedEntries[i]">
                    <call function="'ldapDeleteWithScript'">
                      { 'location'       : clientHost,
                        'dsPath'         : clientPath,
                        'dsInstanceHost' : server.getHostname(),
                        'dsInstancePort' : server.getPort(),
                        'dsInstanceDn'   : server.getRootDn(),
                        'dsInstancePswd' : server.getRootPwd(),
                        'dsDn'           : [entryToDelete]
                      }
                    </call>
                  </paralleliterate>
                </if>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker         Replication Conflict Tests
          #@TestName           Replication: Conflict: double_add_single_del_1
          #@TestID             double_add_single_del_1
          #@TestPurpose        Add twice same dn, then delete it in one server
          #@TestPreamble
          #@TestSteps          Disconnect Replication Servers
          #@TestSteps          server1: add entry cn=DN1 with uid=1
          #@TestSteps          server2: add entry cn=DN1 with uid=2
          #@TestSteps          Re-connect Replication Servers
          #@TestSteps          server1: delete entry cn=DN1
          #@TestSteps          Check servers are synchronised
          #@TestPostamble
          #@TestResult         Success if trees are synchronised
          -->
          <testcase name="getTestCaseName
                          ('double_add_single_del_1')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Conflict: double_add_single_del_1. \
                Add twice same dn, then delete it in one server'
              </message>
              <script>
                entry1 = Entry('cn=DN1')
                entry1.addAttr('uid', '1')
                entry1.addAttr('givenname', 'DUMMY ENTRY')
                entry2 = Entry('cn=DN1')
                entry2.addAttr('uid', '2')
                entry2.addAttr('givenname', 'DUMMY ENTRY')
                entriesToAdd = [entry1, entry2]
              </script>
              <!-- Disconnect Replication Servers -->
              <call function="'disconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <iterate var="server"
                       in="[server1, server2]"
                       indexvar="i">
                <sequence>
                  <!-- Add entry on one of the servers -->
                  <call function="'addAnEntry'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToAdd'        : entriesToAdd[i].getDn(),
                      'listAttributes' : entriesToAdd[i].getAttrList()
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Check modifies have not been propagated -->
              <paralleliterate var="server" in="[server1, server2]">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict uid cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Reconnect Replication Servers -->
              <call function="'reconnectReplicationServers'">
                [ clientHost, clientPath, [replServer1, replServer2] ]
              </call>
              <!-- Delete entry on server1-->
              <call function="'ldapDeleteWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1Host,
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry1.getDn()]
                }
              </call>
              <!-- Check conflict is resolved -->
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <sequence>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : synchroSuffix,
                      'dsFilter'       : 'givenname=DUMMY ENTRY',
                      'dsAttributes'   : 'ds-sync-conflict uid cn',
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                      <script>
                        resultDnList = []
                        for line in searchResult.splitlines():
                          if line.find('dn: ') != -1:
                            resultDn = line[len('dn: '):]
                            resultDnList.append(resultDn)
                        addedEntries[i] = resultDnList
                      </script>
                    </sequence>
                    <else>
                      <script>
                        addedEntries[i] = []
                      </script>
                    </else>
                  </if>
                  <call function="'ldapSearchWithScript'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : '%s/%s' \
                                         % (server.getDir(), OPENDSNAME),
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : 'cn=monitor',
                      'dsFilter'       : monitorFilter,
                      'dsAttributes'   : monitorCounters,
                      'logStderr'      : False
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <if expr="resultLength != 0">
              <!-- Test Suite Cleanup -->
              <message>'Finally: Replication Cleanup.'</message>
              <try>
                    <sequence>
                      <message>
                        '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                        % (server.getHostname(), server.getPort(), searchResult)
                      </message>
                    </sequence>
                  </if>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <!-- If the trees don't match, we may have come across Issue OPENDJ-454
               (RFE: Solve naming conflict of 2 adds with same dn, different
               attr value) -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix,
                  'OPENDJ-454' ]
              </call>
              <!-- Delete added entries -->
              <script>
                list1 = addedEntries[0]
                list2 = addedEntries[1]
                toRemove = []
                # remove potential redundancies, to avoid deleting them twice
                for addedEntry in list2:
                  if addedEntry in list1:
                    toRemove.append(addedEntry)
                for ent in toRemove:
                  list2.remove(ent)
              </script>
              <paralleliterate var="server"
                               in="[server1, server2]"
                               indexvar="i">
                <if expr="len(addedEntries[i]) != 0">
                  <paralleliterate var="entryToDelete" in="addedEntries[i]">
                    <call function="'ldapDeleteWithScript'">
                      { 'location'       : clientHost,
                        'dsPath'         : clientPath,
                        'dsInstanceHost' : server.getHostname(),
                        'dsInstancePort' : server.getPort(),
                        'dsInstanceDn'   : server.getRootDn(),
                        'dsInstancePswd' : server.getRootPwd(),
                        'dsDn'           : [entryToDelete]
                      }
                    </call>
                  </paralleliterate>
                </if>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_cleanup.xml' 
                  % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" >
            { 'label'    : 'Replication Conflict' }
                    { 'label'    : _label }
          </call>
              </sequence>
              <catch exception="'STAFException'">
                <sequence>
                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                </sequence>
              </catch>
              <finally>
          <call function="'testSuite_Postamble'"/>
              </finally>
              </try>
        </sequence>
          </finally>
        </try>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml
New file
@@ -0,0 +1,3820 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Portions Copyright 2006-2009 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 ! -->
<stax>
  <!--- Test Case information
  #@TestMarker          Replication Conflict Tests
  #@TestName            Replication: Conflict: Basic check
  #@TestID              Basic check
  #@TestPurpose         Check replication assures synchronization after
                        a simultaneous conflictuous modify on 2
                        different servers (regardless of the prevailing
                        modify)
  #@TestPreamble
  #@TestSteps           Add entry to server1 with employeeNumber:0
  #@TestSteps           Parallel replace
                          server1: employeeNumber -> 1
                          server2: employeeNumber -> 2
  #@TestSteps           Check entry consistent on both servers
  #@TestPostamble
  #@TestResult          Success if trees are synchronised
  -->
  <function name="replication_conflict_001" scope="local">
    <testcase name="getTestCaseName('Basic check')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: Basic check 0. \
              Check replication assures synchronization after a simultaneous \
              conflictuous modify on 2 different servers (regardless of the \
              prevailing modify)'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('uid=tuser-0')
              myEntry.addAttr('employeeNumber', '0')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <call function="'Sleep'">
              { 'sleepForMilliSeconds' : 2000 }
            </call>
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <!-- Modify entry on one of the servers -->
              <call function="'modifyAnAttribute'">
                { 'location'          : server.getHostname(),
                  'dsPath'            : '%s/%s' \
                                        % (server.getDir(), OPENDSNAME),
                  'dsInstanceHost'    : server.getHostname(),
                  'dsInstancePort'    : server.getPort(),
                  'dsInstanceDn'      : server.getRootDn(),
                  'dsInstancePswd'    : server.getRootPwd(),
                  'DNToModify'        : myEntry.getDn(),
                  'attributeName'     : 'employeeNumber',
                  'newAttributeValue' : '%i' % (i + 1),
                  'changetype'        : 'replace'
                }
              </call>
            </paralleliterate>
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Conflict Tests
  #@TestName            Replication: Conflict: double_replace_multi
  #@TestID              double_replace_multi
  #@TestPurpose         Double replace a multi-valued attribute
  #@TestPreamble
  #@TestSteps           Add entry to server1 with description:{1 2}
  #@TestSteps           Disconnect Replication Servers
  #@TestSteps           server1: replace description -> {3 4}
  #@TestSteps           server2: replace description -> {5 6}
  #@TestSteps           Re-connect Replication Servers
  #@TestSteps           Check description={5 6} on both servers
  #@TestPostamble
  #@TestResult          Success if trees are synchronised
  -->
  <function name="replication_conflict_002" scope="local">
    <testcase name="getTestCaseName('double_replace_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_replace_multi. \
              Double replace a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=A1')
              myEntry.addAttr('description', '1')
              myEntry.addAttr('description', '2')
              server1mods = ['description:3', 'description:4']
              server2mods = ['description:5', 'description:6']
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <!-- Modify entry on one of the servers -->
              <call function="'modifyAnAttribute'">
                { 'location'       : server.getHostname(),
                  'dsPath'         : '%s/%s' \
                                     % (server.getDir(), OPENDSNAME),
                  'dsInstanceHost' : server.getHostname(),
                  'dsInstancePort' : server.getPort(),
                  'dsInstanceDn'   : server.getRootDn(),
                  'dsInstancePswd' : server.getRootPwd(),
                  'DNToModify'     : myEntry.getDn(),
                  'listAttributes' : mods[i],
                  'changetype'     : 'replace'
                }
              </call>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Conflict Tests
  #@TestName            Replication: Conflict: double_replace_single
  #@TestID              double_replace_single
  #@TestPurpose         Double replace a single-valued attribute
  #@TestPreamble
  #@TestSteps           Add entry to server1 with employeeNumber:0
  #@TestSteps           Disconnect Replication Servers
  #@TestSteps           server1: replace employeeNumber -> 1
  #@TestSteps           server2: replace employeeNumber -> 2
  #@TestSteps           Re-connect Replication Servers
  #@TestSteps           Check employeeNumber=2 on both servers
  #@TestPostamble
  #@TestResult          Success if trees are synchronised
  -->
  <function name="replication_conflict_003" scope="local">
    <testcase name="getTestCaseName('double_replace_single')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_replace_single. \
              Double replace a single-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=A4')
              myEntry.addAttr('employeeNumber', '0')
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <!-- Modify entry on one of the servers -->
              <call function="'modifyAnAttribute'">
                { 'location'          : server.getHostname(),
                  'dsPath'            : '%s/%s' \
                                        % (server.getDir(), OPENDSNAME),
                  'dsInstanceHost'    : server.getHostname(),
                  'dsInstancePort'    : server.getPort(),
                  'dsInstanceDn'      : server.getRootDn(),
                  'dsInstancePswd'    : server.getRootPwd(),
                  'DNToModify'        : myEntry.getDn(),
                  'attributeName'     : 'employeeNumber',
                  'newAttributeValue' : '%i' % (i + 1),
                  'changetype'        : 'replace'
                }
              </call>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_mod_del_add_multi_1
  #@TestID             double_mod_del_add_multi_1
  #@TestPurpose        Double replace (del+add) same value with any
                       value of a multi-valued attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with
                       description:{1 2 3 4 5 6 7 8 9 10}
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: del description=1 + add description=11
  #@TestSteps          server2: del description=1 + add description=12
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={2 3 4 5 6 7 8 9 10 11 12}
                       on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_004" scope="local">
    <testcase name="getTestCaseName('double_mod_del_add_multi_1')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_mod_del_add_multi_1. \
              Double replace (del+add) same value with any value of a \
              multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=A2')
              for x in range(10):
                myEntry.addAttr('description', '%i' % (x+1))
              server1del = ['description:1']
              server1add = ['description:11']
              server2del = ['description:1']
              server2add = ['description:12']
              server1mods = [server1del, server1add]
              server2mods = [server2del, server2add]
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : 'delete'
                  }
                </call>
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][1],
                    'changetype'     : 'add'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_mod_del_add_multi_2
  #@TestID             double_mod_del_add_multi_2
  #@TestPurpose        Double replace (del+add) any value with same
                       value of a multi-valued attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with
                       description:{1 2 3 4 5 6 7 8 9 10}
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: del description=1 + add description=11
  #@TestSteps          server2: del description=10 + add description=11
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={2 3 4 5 6 7 8 9 11}
                       on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_005" scope="local">
    <testcase name="getTestCaseName('double_mod_del_add_multi_2')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_mod_del_add_multi_2. \
              Double replace (del+add) any value with same value of a \
              multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=A3')
              for x in range(10):
                myEntry.addAttr('description', '%i' % (x+1))
              server1del = ['description:1']
              server1add = ['description:11']
              server2del = ['description:10']
              server2add = ['description:11']
              server1mods = [server1del, server1add]
              server2mods = [server2del, server2add]
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : 'delete'
                  }
                </call>
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][1],
                    'changetype'     : 'add'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_mod_add_multi
  #@TestID             double_mod_add_multi
  #@TestPurpose        Double mod_add a multi-valued attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: add description=1
  #@TestSteps          server2: add description={1 2}
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={1 2} on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_006" scope="local">
    <testcase name="getTestCaseName('double_mod_add_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_mod_add_multi. \
              Double mod_add a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=B1')
              server1add = ['description:1']
              server2add = ['description:1', 'description:2']
              server1mods = [server1add]
              server2mods = [server2add]
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : 'add'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_mod_add_single
  #@TestID             double_mod_add_single
  #@TestPurpose        Double mod_add a single-valued attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: add employeeNumber=1
  #@TestSteps          server2: add employeeNumber=2
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check employeeNumber=1 on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_007" scope="local">
    <testcase name="getTestCaseName('double_mod_add_single')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_mod_add_single. \
              Double mod_add a single-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=B2')
              server1add = ['employeeNumber:1']
              server2add = ['employeeNumber:2']
              server1mods = [server1add]
              server2mods = [server2add]
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : 'add'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_mod_del_multi
  #@TestID             double_mod_del_multi
  #@TestPurpose        Double mod_delete a multi-valued attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with
                       description:{1 2 3 4 5 6 7 8 9 10}
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: delete description={1 2 3 4 5}
  #@TestSteps          server2: delete description={4 5 6 7 8}
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={9 10} on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_008" scope="local">
    <testcase name="getTestCaseName('double_mod_del_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_mod_del_multi. \
              Double mod_delete a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=C1')
              for x in range(10):
                myEntry.addAttr('description', '%i' % (x+1))
              server1del = []
              for y in range(1,6):
                server1del.append('description:%i' % y)
              server2del = []
              for z in range(4,9):
                server2del.append('description:%i' % z)
              server1mods = [server1del]
              server2mods = [server2del]
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : 'delete'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_mod_del_single
  #@TestID             double_mod_del_single
  #@TestPurpose        Double mod_delete a single-valued attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with employeeNumber=1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: delete employeeNumber
  #@TestSteps          server2: delete employeeNumber=1
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check employeeNumber no longer exists on either
                       server
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_009" scope="local">
    <testcase name="getTestCaseName('double_mod_del_single')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_mod_del_single. \
              Double mod_delete a single-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=C2')
              myEntry.addAttr('employeeNumber', '1')
              server1del = ['employeeNumber:']
              server2del = ['employeeNumber:1']
              server1mods = [server1del]
              server2mods = [server2del]
              mods = [server1mods, server2mods]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : 'delete'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'employeeNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict:
                       mod_del_add_vs_mod_add_del_multi
  #@TestID             mod_del_add_vs_mod_add_del_multi
  #@TestPurpose        Modify: Delete+Add then Add+Delete on 2
                       multi-valued attributes
  #@TestPreamble
  #@TestSteps          Add entry to server1 with
                       description=1 , telephoneNumber=1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: add description=2 ,
                       delete telephoneNumber
  #@TestSteps          server2: delete description ,
                       add telephoneNumber=2
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description no longer exists and
                       telephoneNumber=2 on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_010" scope="local">
    <testcase name="getTestCaseName('mod_del_add_vs_mod_add_del_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \
              Modify: Delete+Add then Add+Delete on 2 multi-valued attributes'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=D1')
              myEntry.addAttr('description', '1')
              myEntry.addAttr('telephoneNumber', '1')
              server1add = ['description:2']
              server1del = ['telephoneNumber:']
              server2del = ['description:']
              server2add = ['telephoneNumber:2']
              server1mods = [server1add, server1del]
              server2mods = [server2del, server2add]
              mods = [server1mods, server2mods]
              server1changetypes = ['add', 'delete']
              server2changetypes = ['delete', 'add']
              changetypes = [server1changetypes, server2changetypes]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : changetypes[i][0]
                  }
                </call>
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][1],
                    'changetype'     : changetypes[i][1]
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description telephoneNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description telephoneNumber',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict:
                       mod_add_vs_mod_replace_multi
  #@TestID             mod_add_vs_mod_replace_multi
  #@TestPurpose        mod_add vs mod_replace on a multi-valued
                       attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with description=1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: add description={2 3}
  #@TestSteps          server2: replace description -> {4 5}
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={4 5} on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_011" scope="local">
    <testcase name="getTestCaseName('mod_add_vs_mod_replace_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: mod_add_vs_mod_replace_multi. \
              mod_add vs mod_replace on a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=E1')
              myEntry.addAttr('description', '1')
              server1add = ['description:2', 'description:3']
              server2replace = ['description:4', 'description:5']
              server1mods = [server1add]
              server2mods = [server2replace]
              mods = [server1mods, server2mods]
              server1changetypes = ['add']
              server2changetypes = ['replace']
              changetypes = [server1changetypes, server2changetypes]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : changetypes[i][0]
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict:
                       mod_replace_vs_mod_add_multi
  #@TestID             mod_replace_vs_mod_add_multi
  #@TestPurpose        mod_replace vs mod_add on a multi-valued
                       attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with description=1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: replace description -> {2 3}
  #@TestSteps          server2: add description={4 5}
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={2 3 4 5} on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_012" scope="local">
    <testcase name="getTestCaseName('mod_replace_vs_mod_add_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: mod_replace_vs_mod_add_multi. \
              mod_replace vs mod_add on a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=E2')
              myEntry.addAttr('description', '1')
              server1replace = ['description:2', 'description:3']
              server2add = ['description:4', 'description:5']
              server1mods = [server1replace]
              server2mods = [server2add]
              mods = [server1mods, server2mods]
              server1changetypes = ['replace']
              server2changetypes = ['add']
              changetypes = [server1changetypes, server2changetypes]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : changetypes[i][0]
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict:
                       mod_del_vs_mod_replace_multi
  #@TestID             mod_del_vs_mod_replace_multi
  #@TestPurpose        mod_del vs mod_replace on a multi-valued
                       attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with
                       description={1 2 3 4}
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: delete description={2 3}
  #@TestSteps          server2: replace description -> {6 7 8 9 10}
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={6 7 8 9 10} on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_013" scope="local">
    <testcase name="getTestCaseName('mod_del_vs_mod_replace_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: mod_del_vs_mod_replace_multi. \
              mod_del vs mod_replace on a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=F1')
              for x in range(4):
                myEntry.addAttr('description', '%i' % (x+1))
              server1del = ['description:2', 'description:3']
              server2replace = []
              for y in range(6,11):
                server2replace.append('description:%i' % y)
              server1mods = [server1del]
              server2mods = [server2replace]
              mods = [server1mods, server2mods]
              server1changetypes = ['delete']
              server2changetypes = ['replace']
              changetypes = [server1changetypes, server2changetypes]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : changetypes[i][0]
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict:
                       mod_replace_vs_mod_del_multi
  #@TestID             mod_replace_vs_mod_del_multi
  #@TestPurpose        mod_replace vs mod_del on a multi-valued
                       attribute
  #@TestPreamble
  #@TestSteps          Add entry to server1 with
                       description={1 2 3 4}
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: replace description -> {1 2 3}
  #@TestSteps          server2: delete description={3 4}
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check description={1 2} on both servers
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_014" scope="local">
    <testcase name="getTestCaseName('mod_replace_vs_mod_del_multi')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: mod_replace_vs_mod_del_multi. \
              mod_replace vs mod_del on a multi-valued attribute'
            </message>
            <!-- Add entry to server1 -->
            <script>
              myEntry = Entry('cn=F2')
              for x in range(4):
                myEntry.addAttr('description', '%i' % (x+1))
              server1replace = ['description:1', 'description:2',
                                'description:3']
              server2del = ['description:3', 'description:4']
              server1mods = [server1replace]
              server2mods = [server2del]
              mods = [server1mods, server2mods]
              server1changetypes = ['replace']
              server2changetypes = ['delete']
              changetypes = [server1changetypes, server2changetypes]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : myEntry.getDn(),
                'listAttributes' : myEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i][0],
                    'changetype'     : changetypes[i][0]
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : myEntry.getDn(),
                    'dsFilter'       : 'objectclass=*',
                    'dsAttributes'   : 'description',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix ]
            </call>
            <!-- Delete added entry -->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [myEntry.getDn()]
              }
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: add_child_del_parent
  #@TestID             add_child_del_parent
  #@TestPurpose        Add a child vs delete his parent
  #@TestPreamble
  #@TestSteps          Add entry cn=P1 to server1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server2: add child cn=C1,cn=P1
  #@TestSteps          server1: delete parent cn=P1
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check servers are synchronised
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_015" scope="local">
    <testcase name="getTestCaseName('add_child_del_parent')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: add_child_del_parent. \
              Add a child vs delete his parent'
            </message>
            <!-- Add entry to server1 -->
            <script>
              parentEntry = Entry('cn=P1')
              parentEntry.addAttr('givenname', 'DUMMY ENTRY')
              childEntry = Entry('cn=C1,cn=P1')
              childEntry.addAttr('givenname', 'DUMMY ENTRY')
              # addedEntries = [[], []]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : parentEntry.getDn(),
                'listAttributes' : parentEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Add child entry on server2 -->
            <call function="'addAnEntry'">
              { 'location'       : server2Host,
                'dsPath'         : server2Path,
                'dsInstanceHost' : server2Host,
                'dsInstancePort' : server2.getPort(),
                'dsInstanceDn'   : server2.getRootDn(),
                'dsInstancePswd' : server2.getRootPwd(),
                'DNToAdd'        : childEntry.getDn(),
                'listAttributes' : childEntry.getAttrList()
              }
            </call>
            <!-- Delete parent entry on server1-->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [parentEntry.getDn()]
              }
            </call>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                    <script>
                      resultDnList = []
                      for line in searchResult.splitlines():
                        if line.find('dn: ') != -1:
                          resultDn = line[len('dn: '):]
                          resultDnList.append(resultDn)
                      addedEntries[i] = resultDnList
                    </script>
                  </sequence>
                  <else>
                    <script>
                      addedEntries[i] = []
                    </script>
                  </else>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <!-- If the trees don't match, we may have come across Issue 3891
             (Replication conflict: add child , delete parent) -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix,
                '3891' ]
            </call>
            <!-- Delete added entries -->
            <script>
              list1 = addedEntries[0]
              list2 = addedEntries[1]
              toRemove = []
              # remove potential redundancies, to avoid deleting them twice
              for addedEntry in list2:
                if addedEntry in list1:
                  toRemove.append(addedEntry)
              for ent in toRemove:
                list2.remove(ent)
            </script>
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <if expr="len(addedEntries[i]) != 0">
                <paralleliterate var="entryToDelete" in="addedEntries[i]">
                  <call function="'ldapDeleteWithScript'">
                    { 'location'       : clientHost,
                      'dsPath'         : clientPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsDn'           : [entryToDelete]
                    }
                  </call>
                </paralleliterate>
              </if>
            </paralleliterate>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: del_parent_add_child
  #@TestID             del_parent_add_child
  #@TestPurpose        Delete a parent vs add his child
  #@TestPreamble
  #@TestSteps          Add entry cn=P2 to server1
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: delete parent cn=P2
  #@TestSteps          server2: add child cn=C2,cn=P2
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check servers are synchronised
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_016" scope="local">
    <testcase name="getTestCaseName('del_parent_add_child')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: del_parent_add_child. \
              Delete a parent vs add his child'
            </message>
            <!-- Add entry to server1 -->
            <script>
              parentEntry = Entry('cn=P2')
              parentEntry.addAttr('givenname', 'DUMMY ENTRY')
              childEntry = Entry('cn=C2,cn=P2')
              childEntry.addAttr('givenname', 'DUMMY ENTRY')
              # addedEntries = [[], []]
            </script>
            <call function="'addAnEntry'">
              { 'location'       : server1Host,
                'dsPath'         : server1Path,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'DNToAdd'        : parentEntry.getDn(),
                'listAttributes' : parentEntry.getAttrList()
              }
            </call>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Delete parent entry on server1-->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [parentEntry.getDn()]
              }
            </call>
            <!-- Add child entry on server2 -->
            <call function="'addAnEntry'">
              { 'location'       : server2Host,
                'dsPath'         : server2Path,
                'dsInstanceHost' : server2Host,
                'dsInstancePort' : server2.getPort(),
                'dsInstanceDn'   : server2.getRootDn(),
                'dsInstancePswd' : server2.getRootPwd(),
                'DNToAdd'        : childEntry.getDn(),
                'listAttributes' : childEntry.getAttrList()
              }
            </call>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                    <script>
                      resultDnList = []
                      for line in searchResult.splitlines():
                        if line.find('dn: ') != -1:
                          resultDn = line[len('dn: '):]
                          resultDnList.append(resultDn)
                      addedEntries[i] = resultDnList
                    </script>
                  </sequence>
                  <else>
                    <script>
                      addedEntries[i] = []
                    </script>
                  </else>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <!-- If the trees don't match, we may have come across Issue 4071
             (Replication conflict: delete parent, add child) -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix,
                '4071' ]
            </call>
            <!-- Delete added entries -->
            <script>
              list1 = addedEntries[0]
              list2 = addedEntries[1]
              toRemove = []
              # remove potential redundancies, to avoid deleting them twice
              for addedEntry in list2:
                if addedEntry in list1:
                  toRemove.append(addedEntry)
              for ent in toRemove:
                list2.remove(ent)
            </script>
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <if expr="len(addedEntries[i]) != 0">
                <paralleliterate var="entryToDelete" in="addedEntries[i]">
                  <call function="'ldapDeleteWithScript'">
                    { 'location'       : clientHost,
                      'dsPath'         : clientPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsDn'           : [entryToDelete]
                    }
                  </call>
                </paralleliterate>
              </if>
            </paralleliterate>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_add
  #@TestID             double_add
  #@TestPurpose        Double add (same dn, different uid)
  #@TestPreamble
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: add entry cn=F with uid=1
  #@TestSteps          server2: add entry cn=F with uid=2
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          Check servers are synchronised
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_017" scope="local">
    <testcase name="getTestCaseName('double_add')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_add. \
              Double add (same dn, different uid)'
            </message>
            <script>
              entry1 = Entry('cn=F')
              entry1.addAttr('uid', '1')
              entry1.addAttr('givenname', 'DUMMY ENTRY')
              entry2 = Entry('cn=F')
              entry2.addAttr('uid', '2')
              entry2.addAttr('givenname', 'DUMMY ENTRY')
              entriesToAdd = [entry1, entry2]
            </script>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Add entry on one of the servers -->
                <call function="'addAnEntry'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToAdd'        : entriesToAdd[i].getDn(),
                    'listAttributes' : entriesToAdd[i].getAttrList()
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict uid cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict uid cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                    <script>
                      resultDnList = []
                      for line in searchResult.splitlines():
                        if line.find('dn: ') != -1:
                          resultDn = line[len('dn: '):]
                          resultDnList.append(resultDn)
                      addedEntries[i] = resultDnList
                    </script>
                  </sequence>
                  <else>
                    <script>
                      addedEntries[i] = []
                    </script>
                  </else>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <!-- If the trees don't match, we may have come across Issue OPENDJ-454
             (RFE: Solve naming conflict of 2 adds with same dn, different
             attr value) -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix,
                'OPENDJ-454' ]
            </call>
            <!-- Delete added entries -->
            <script>
              list1 = addedEntries[0]
              list2 = addedEntries[1]
              toRemove = []
              # remove potential redundancies, to avoid deleting them twice
              for addedEntry in list2:
                if addedEntry in list1:
                  toRemove.append(addedEntry)
              for ent in toRemove:
                list2.remove(ent)
            </script>
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <if expr="len(addedEntries[i]) != 0">
                <paralleliterate var="entryToDelete" in="addedEntries[i]">
                  <call function="'ldapDeleteWithScript'">
                    { 'location'       : clientHost,
                      'dsPath'         : clientPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsDn'           : [entryToDelete]
                    }
                  </call>
                </paralleliterate>
              </if>
            </paralleliterate>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker         Replication Conflict Tests
  #@TestName           Replication: Conflict: double_add_single_del_1
  #@TestID             double_add_single_del_1
  #@TestPurpose        Add twice same dn, then delete it in one server
  #@TestPreamble
  #@TestSteps          Disconnect Replication Servers
  #@TestSteps          server1: add entry cn=DN1 with uid=1
  #@TestSteps          server2: add entry cn=DN1 with uid=2
  #@TestSteps          Re-connect Replication Servers
  #@TestSteps          server1: delete entry cn=DN1
  #@TestSteps          Check servers are synchronised
  #@TestPostamble
  #@TestResult         Success if trees are synchronised
  -->
  <function name="replication_conflict_018" scope="local">
    <testcase name="getTestCaseName('double_add_single_del_1')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <message>
              'Replication: Conflict: double_add_single_del_1. \
              Add twice same dn, then delete it in one server'
            </message>
            <script>
              entry1 = Entry('cn=DN1')
              entry1.addAttr('uid', '1')
              entry1.addAttr('givenname', 'DUMMY ENTRY')
              entry2 = Entry('cn=DN1')
              entry2.addAttr('uid', '2')
              entry2.addAttr('givenname', 'DUMMY ENTRY')
              entriesToAdd = [entry1, entry2]
            </script>
            <!-- Disconnect Replication Servers -->
            <call function="'disconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <iterate var="server"
                     in="[server1, server2]"
                     indexvar="i">
              <sequence>
                <!-- Add entry on one of the servers -->
                <call function="'addAnEntry'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToAdd'        : entriesToAdd[i].getDn(),
                    'listAttributes' : entriesToAdd[i].getAttrList()
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Check modifies have not been propagated -->
            <paralleliterate var="server" in="[server1, server2]">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict uid cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Reconnect Replication Servers -->
            <call function="'reconnectReplicationServers'">
              [ clientHost, clientPath, [replServer1, replServer2] ]
            </call>
            <!-- Delete entry on server1-->
            <call function="'ldapDeleteWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : server1Host,
                'dsInstancePort' : server1.getPort(),
                'dsInstanceDn'   : server1.getRootDn(),
                'dsInstancePswd' : server1.getRootPwd(),
                'dsDn'           : [entry1.getDn()]
              }
            </call>
            <!-- Check conflict is resolved -->
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <sequence>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : synchroSuffix,
                    'dsFilter'       : 'givenname=DUMMY ENTRY',
                    'dsAttributes'   : 'ds-sync-conflict uid cn',
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                    <script>
                      resultDnList = []
                      for line in searchResult.splitlines():
                        if line.find('dn: ') != -1:
                          resultDn = line[len('dn: '):]
                          resultDnList.append(resultDn)
                      addedEntries[i] = resultDnList
                    </script>
                  </sequence>
                  <else>
                    <script>
                      addedEntries[i] = []
                    </script>
                  </else>
                </if>
                <call function="'ldapSearchWithScript'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : '%s/%s' \
                                       % (server.getDir(), OPENDSNAME),
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'dsBaseDN'       : 'cn=monitor',
                    'dsFilter'       : monitorFilter,
                    'dsAttributes'   : monitorCounters,
                    'logStderr'      : False
                  }
                </call>
                <script>
                  searchRC = STAXResult[0][0]
                  searchResult = STAXResult[0][1]
                  resultLength = len(searchResult) > 0
                </script>
                <if expr="resultLength != 0">
                  <sequence>
                    <message>
                      '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                      % (server.getHostname(), server.getPort(), searchResult)
                    </message>
                  </sequence>
                </if>
              </sequence>
            </paralleliterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <!-- If the trees don't match, we may have come across Issue OPENDJ-454
             (RFE: Solve naming conflict of 2 adds with same dn, different
             attr value) -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, server1, [server2], synchroSuffix,
                'OPENDJ-454' ]
            </call>
            <!-- Delete added entries -->
            <script>
              list1 = addedEntries[0]
              list2 = addedEntries[1]
              toRemove = []
              # remove potential redundancies, to avoid deleting them twice
              for addedEntry in list2:
                if addedEntry in list1:
                  toRemove.append(addedEntry)
              for ent in toRemove:
                list2.remove(ent)
            </script>
            <paralleliterate var="server"
                             in="[server1, server2]"
                             indexvar="i">
              <if expr="len(addedEntries[i]) != 0">
                <paralleliterate var="entryToDelete" in="addedEntries[i]">
                  <call function="'ldapDeleteWithScript'">
                    { 'location'       : clientHost,
                      'dsPath'         : clientPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsDn'           : [entryToDelete]
                    }
                  </call>
                </paralleliterate>
              </if>
            </paralleliterate>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
@@ -9,54 +9,53 @@
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
 ! or http://forgerock.org/license/CDDLv1.0.html.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 !      Copyright 2012 ForgeRock AS.
 ! -->
<stax>
  <defaultcall function="replication_encryption"/>
  <function name="replication_encryption">
  <function name="replication_encryption" scope="local">
    <sequence>
      <block name="'encryption'">
      <block name="'replication_encryption'">
        <try>
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'                 
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
              CurrentTestPath['suite'] = 'encryption'
          <call function="'testSuite_Preamble'"/>
              _group=CurrentTestPath['group']
              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
              _label = 'Replication Encryption'
            </script>
          <!--- Test Suite information
          #@TestSuiteName       Replication Encryption Tests
          #@TestSuitePurpose    Verify that replication can use an encrypted
                                channel.
            #@TestSuitePurpose    Verify that the encrypted operations are replicated
                                  correctly between two servers.
          #@TestSuiteID         Encryption Tests
          #@TestSuiteGroup      Encryption
          #@TestGroup           Replication
          #@TestScript          replication_encryption.xml
          #@TestHTMLLink        http://opends.dev.java.net/
            #@TestHTMLLink        http://www.forgerock.org/
          -->
            
            <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
                                                                        
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_setup.xml'
@@ -70,890 +69,92 @@
            }
          </call>
                                    
                <!-- List of Import of Test Functions -->
          <script>
                  importList=[]
                  importList.append('encryption/encryption_tests')
                </script>
                <!-- Import the files for this test suite -->
                <iterate var="_import" in="importList">
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/%s.xml' % (_groupdir,_import)"/>
                </iterate>
                <!-- Specific to replication tests -->
                <script>
                  msg1 = 'Replication: Encryption:'
            consumer = consumerList[0]
          </script>        
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Add entry
          #@TestID                  Add entry
          #@TestPurpose        Check entry add over secured replication
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName('Add entry')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Add entry. Check entry add over \
                 secured replication'
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                <!-- List of Test Cases -->
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
                  testsList=[]
                  testsList.append('replication_encryption_001')
                  testsList.append('replication_encryption_002')
                  testsList.append('replication_encryption_003')
                  testsList.append('replication_encryption_004')
                  testsList.append('replication_encryption_005')
                  testsList.append('replication_encryption_006')
                  testsList.append('replication_encryption_007')
                  testsList.append('replication_encryption_008')
                  testsList.append('replication_encryption_009')
                  testsList.append('replication_encryption_010')
                  </script>
                    
                  <!-- Add entry to one of the other servers -->
                  <script>
                    listAttr = []
                    listAttr.append('objectclass:top')
                    listAttr.append('objectclass:organizationalperson')
                    listAttr.append('objectclass:inetorgperson')
                    listAttr.append('objectclass:person')
                    listAttr.append('givenname:Izen-%s' % i)
                    listAttr.append('sn:Abizen-%s' % i)
                    listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
                    listAttr.append('l:ICNC')
                  </script>
                  <call function="'addAnEntry'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToAdd'        : userDn,
                      'listAttributes' : listAttr
                    }
                  </call>
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
                  <sequence>
                    <call function="'%s' % (__test)" />
                </sequence>
              </iterate>
                
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Add entry after restart
          #@TestID              Add entry after restart
          #@TestPurpose         Check entry add over secured replication after
                                server restart
          #@TestPreamble
          #@TestSteps           Restart servers
          #@TestSteps           Add entry
          #@TestPostamble
          #@TestResult          Success if trees synchronised over the topology
          -->
          <testcase name="getTestCaseName('Add entry after restart')">
              <catch exception="'STAFException.TestSuite.SetupException'">
            <sequence>            
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Encryption: Add entry after restart. \
                Check entry add over secured replication after server restart'
                  <message log="1" level="'fatal'">
                    'Setup of test suite failed.'
              </message>
                  <rethrow/>
                </sequence>
              </catch>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_splitServerList]
              </call>
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
              
              <!-- Start the servers in the topology -->
              <call function="'startServers'">
                [_splitServerList]
              </call>
            </try>
              
              <iterate var="server" in="_topologyServerList" indexvar="i">
          </sequence>
          <finally>
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    userDn = 'uid=RESTART-iabizen-%s, ou=People, %s' % \
                             (i,synchroSuffix)
                  </script>
                  <!-- Add entry to one of the other servers -->
                  <script>
                    listAttr = []
                    listAttr.append('objectclass:top')
                    listAttr.append('objectclass:organizationalperson')
                    listAttr.append('objectclass:inetorgperson')
                    listAttr.append('objectclass:person')
                    listAttr.append('givenname:Izen-%s' % i)
                    listAttr.append('sn:Abizen-%s' % i)
                    listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
                    listAttr.append('l:ICNC')
                  </script>
                  <call function="'addAnEntry'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToAdd'        : userDn,
                      'listAttributes' : listAttr
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Modify entry
          #@TestID                  Modify entry
          #@TestPurpose        Check entry modify over secured replication
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName('Modify entry')">
              <!-- Test Suite Cleanup -->
              <message>'Finally: Replication Cleanup.'</message>
              <try>
            <sequence>            
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Modify entry. Check entry modify \
                 over secured replication'
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
                  </script>
                  <!-- Modify entry on one of the servers -->
                  <call function="'modifyAnAttribute'">
                    { 'location'          : server.getHostname(),
                      'dsPath'            : serverPath,
                      'dsInstanceHost'    : server.getHostname(),
                      'dsInstancePort'    : server.getPort(),
                      'dsInstanceDn'      : server.getRootDn(),
                      'dsInstancePswd'    : server.getRootPwd(),
                      'DNToModify'        : userDn,
                      'attributeName'     : 'l',
                      'newAttributeValue' : 'GEC',
                      'changetype'        : 'replace'
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Delete entry
          #@TestID              Delete entry
          #@TestPurpose         Check entry delete over secured replication
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName('Delete entry')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Delete entry. Check delete modify \
                 over secured replication'
              </message>
              <iterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                    userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
                  </script>
                  <!-- Delete entry on one of the servers -->
                  <call function="'DeleteEntry'">
                    { 'location'       : server.getHostname(),
                      'dsPath'         : serverPath,
                      'dsInstanceHost' : server.getHostname(),
                      'dsInstancePort' : server.getPort() ,
                      'dsInstanceDn'   : server.getRootDn() ,
                      'dsInstancePswd' : server.getRootPwd() ,
                      'dsBaseDN'       : userDn
                    }
                  </call>
                </sequence>
              </iterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Modify Entry - add
                                binary attribute
          #@TestID              Modify Entry - add binary attribute
          #@TestPurpose         Check that an entry modify is well propagated
                                by secured replication.
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - add binary attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Encryption: Modify Entry - add binary attribute. \
                Check that an entry modify is well propagated by secured \
                replication.'
              </message>
              <script>
                filename = 'replication_mod_add_binary.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                binaryFilePath = '%s/replication/photo1.uu' % source.data
                dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
                modif = 'add'
                attrType = 'jpegPhoto'
                write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                       attrType, binaryFilePath)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' % (filename,local.temp,
                                                client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname() }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'        : clientHost,
                  'dsPath'          : clientPath,
                  'dsInstanceHost'  : masterHost ,
                  'dsInstancePort'  : master.getPort() ,
                  'dsInstanceDn'    : master.getRootDn() ,
                  'dsInstancePswd'  : master.getRootPwd() ,
                  'dsBaseDN'        : 'uid=hmiller, ou=People,%s' \
                                       % synchroSuffix,
                  'dsFilter'        : 'jpegPhoto=*',
                  'expectedRC'      :  0
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                  { 'returncode' : resultLength ,
                    'result'     : searchResult ,
                    'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Modify Entry -
                                replace binary attribute
          #@TestID                  Modify Entry - replace binary attribute
          #@TestPurpose         Check that an entry modify is well propagated
                                by secured replication.
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - replace binary attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Modify Entry - replace binary \
                 attribute. \
                 Check that an entry modify is well propagated by secured \
                 replication.'
              </message>
              <script>
                filename = 'replication_mod_replace_binary.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                binaryFilePath = '%s/replication/photo2.uu' % source.data
                dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
                modif = 'replace'
                attrType = 'jpegPhoto'
                write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                       attrType,
                                                       binaryFilePath)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' % (filename,local.temp,
                                                client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                      % synchroSuffix,
                  'dsFilter'       : 'jpegPhoto=*',
                  'expectedRC'     :  0
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Modify Entry -
                                delete binary attribute
          #@TestID                  Modify Entry - delete binary attribute
          #@TestPurpose         Check that an entry modify is well propagated
                                by secured replication.
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName
                          ('Modify Entry - delete binary attribute')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Modify Entry - delete binary \
                 attribute. \
                 Check that an entry modify is well propagated by secured \
                 replication.'
              </message>
              <script>
                filename = 'replication_mod_delete_binary.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
                modif = 'delete'
                attrType = 'jpegPhoto'
                attrValue = None
                write_replication_mod_ldif_file(filePath, dn, modif, attrType,
                                                attrValue)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' % (filename,local.temp,
                                                client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname() }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                      % synchroSuffix,
                  'dsFilter'       : 'jpegPhoto=*',
                  'expectedRC'     :  0
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 0
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Rename Entry
          #@TestID                  Rename Entry
          #@TestPurpose         Check that a rename (modrdn) operation is well
                                propagated by secured replication.
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName('Rename Entry')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Rename Entry. Check that a rename \
                 (modrdn) operation is well propagated by secured replication.'
              </message>
              <script>
                filename = 'replication_modrdn.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
                newrdn = 'uid=kvaughan2'
                newsuperior = None
                deleteoldrdn = 1
                write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                  newsuperior, deleteoldrdn)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' % (filename,local.temp,
                                                client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}"
                does NOT exist anymore -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=kvaughan, ou=People,%s' \
                                      % synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 32
                }
              </call>
              <!-- check that new entry "uid=kvaughan2, ou=People,
                ${DIRECTORY_BASE}" exists -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=kvaughan2, ou=People,%s' \
                                      % synchroSuffix,
                  'dsFilter'       : 'objectclass=*'
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Rename Entry
                                (preserving old rdn)
          #@TestID                  Rename Entry (preserving old rdn)
          #@TestPurpose         Check that a rename (modrdn) operation is well
                                propagated by secured replication.
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName
                          ('Rename Entry (preserving old rdn)')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Rename Entry (preserving old rdn). \
                 Check that a rename (modrdn) operation is well propagated by \
                 secured replication.'
              </message>
              <script>
                filename = 'replication_modrdn_preserve.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
                newrdn = 'uid=igueye'
                newsuperior = None
                deleteoldrdn = 0
                write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                  newsuperior, deleteoldrdn)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' % (filename,local.temp,
                                                client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname()
                }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}"
                does NOT exist anymore -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                      % synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 32
                }
              </call>
              <!-- check that new entry "uid=igueye, ou=People,
                ${DIRECTORY_BASE}" exists -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=igueye, ou=People,%s' % synchroSuffix,
                  'dsFilter'       : 'uid=jwallace'
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 1
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Encryption Tests
          #@TestName            Replication: Encryption: Rename Subtree
          #@TestID                  Rename Subtree
          #@TestPurpose         Check that a subtree rename (moddn) operation
                                is well propagated by secured replication.
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="getTestCaseName('Rename Subtree')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Encryption: Rename Subtree. Check that a \
                 subtree rename (moddn) operation is well propagated by \
                 secured replication.'
              </message>
              <script>
                filename = 'replication_moddn.ldif'
                filePath = '%s/%s' % (local.temp,filename)
                dn = 'ou=People,%s' % synchroSuffix
                newrdn = 'ou=Special People'
                newsuperior = 'ou=Special Users,%s' % synchroSuffix
                deleteoldrdn = 0
                write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                  newsuperior, deleteoldrdn)
              </script>
              <!-- Copy the replication_mod ldif to client host -->
              <message>
                'Copy %s file from %s to %s' % (filename,local.temp,
                                                client.getTmpDir())
              </message>
              <call function="'copyFile'">
                { 'srcfile'    : filePath,
                  'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                  'remotehost' : client.getHostname() }
              </call>
              <!-- Modify "master" server -->
              <call function="'ldapModifyWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
                }
              </call>
              <!-- Check modify worked on "master" server -->
              <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}"
                does NOT exist anymore -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=gfarmer, ou=People,%s' \
                                      % synchroSuffix,
                  'dsFilter'       : 'objectclass=*',
                  'expectedRC'     : 32
                }
              </call>
              <!-- check that new entry "uid=gfarmer, ou=Special People,
                ou=Special Users, ${DIRECTORY_BASE}" exists -->
              <call function="'ldapSearchWithScript'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost ,
                  'dsInstancePort' : master.getPort() ,
                  'dsInstanceDn'   : master.getRootDn() ,
                  'dsInstancePswd' : master.getRootPwd() ,
                  'dsBaseDN'       : 'uid=gfarmer, ou=Special People, \
                                     ou=Special Users,%s' % synchroSuffix,
                  'dsFilter'       : 'objectclass=*'
                }
              </call>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_cleanup.xml' 
                  % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" >
            { 'label'    : 'Replication Encryption' }
                    { 'label'    : _label }
          </call>
              </sequence>
              <catch exception="'STAFException'">
                <sequence>
                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                </sequence>
              </catch>
              <finally>
          <call function="'testSuite_Postamble'"/>
              </finally>
              </try>
        </sequence>
          </finally>
        </try>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption_tests.xml
New file
@@ -0,0 +1,1088 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2010 Sun Microsystems, Inc.
 !      Portions Copyright 2011-2012 ForgeRock AS.
 ! -->
<stax>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Add entry
  #@TestID                  Add entry
  #@TestPurpose        Check entry add over secured replication
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_001" scope="local">
    <testcase name="getTestCaseName('Add entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check entry add over secured replication.' % msg1 }
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
                </script>
                <!-- Add entry to one of the other servers -->
                <script>
                  listAttr = []
                  listAttr.append('objectclass:top')
                  listAttr.append('objectclass:organizationalperson')
                  listAttr.append('objectclass:inetorgperson')
                  listAttr.append('objectclass:person')
                  listAttr.append('givenname:Izen-%s' % i)
                  listAttr.append('sn:Abizen-%s' % i)
                  listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
                  listAttr.append('l:ICNC')
                </script>
                <call function="'addAnEntry'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToAdd'        : userDn,
                    'listAttributes' : listAttr
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Add entry after restart
  #@TestID              Add entry after restart
  #@TestPurpose         Check entry add over secured replication after
                        server restart
  #@TestPreamble
  #@TestSteps           Restart servers
  #@TestSteps           Add entry
  #@TestPostamble
  #@TestResult          Success if trees synchronised over the topology
  -->
  <function name="replication_encryption_002" scope="local">
    <testcase name="getTestCaseName('Add entry after restart')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check entry add over secured replication after server restart.' % msg1 }
            </call>
            <!-- Stop the servers in the topology -->
            <call function="'stopServers'">
              [_splitServerList]
            </call>
            <!-- Start the servers in the topology -->
            <call function="'startServers'">
              [_splitServerList]
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  userDn = 'uid=RESTART-iabizen-%s, ou=People, %s' % \
                           (i,synchroSuffix)
                </script>
                <!-- Add entry to one of the other servers -->
                <script>
                  listAttr = []
                  listAttr.append('objectclass:top')
                  listAttr.append('objectclass:organizationalperson')
                  listAttr.append('objectclass:inetorgperson')
                  listAttr.append('objectclass:person')
                  listAttr.append('givenname:Izen-%s' % i)
                  listAttr.append('sn:Abizen-%s' % i)
                  listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
                  listAttr.append('l:ICNC')
                </script>
                <call function="'addAnEntry'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToAdd'        : userDn,
                    'listAttributes' : listAttr
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Modify entry
  #@TestID                  Modify entry
  #@TestPurpose        Check entry modify over secured replication
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_003" scope="local">
    <testcase name="getTestCaseName('Modify entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check entry modify secured replication.' % msg1 }
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
                </script>
                <!-- Modify entry on one of the servers -->
                <call function="'modifyAnAttribute'">
                  { 'location'          : server.getHostname(),
                    'dsPath'            : serverPath,
                    'dsInstanceHost'    : server.getHostname(),
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : server.getRootDn(),
                    'dsInstancePswd'    : server.getRootPwd(),
                    'DNToModify'        : userDn,
                    'attributeName'     : 'l',
                    'newAttributeValue' : 'GEC',
                    'changetype'        : 'replace'
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
            </call>
           </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Delete entry
  #@TestID              Delete entry
  #@TestPurpose         Check entry delete over secured replication
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_004" scope="local">
    <testcase name="getTestCaseName('Delete entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check delete entry secured replication.' % msg1 }
            </call>
            <iterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
                </script>
                <!-- Delete entry on one of the servers -->
                <call function="'DeleteEntry'">
                  { 'location'       : server.getHostname(),
                    'dsPath'         : serverPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort() ,
                    'dsInstanceDn'   : server.getRootDn() ,
                    'dsInstancePswd' : server.getRootPwd() ,
                    'dsBaseDN'       : userDn
                  }
                </call>
              </sequence>
            </iterate>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Modify Entry - add
                        binary attribute
  #@TestID              Modify Entry - add binary attribute
  #@TestPurpose         Check that an entry modify is well propagated
                        by secured replication.
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_005" scope="local">
    <testcase name="getTestCaseName('Modify Entry - add binary attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that an entry modify is well propagated by secured replication.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_add_binary.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              binaryFilePath = '%s/replication/photo1.uu' % source.data
              dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
              modif = 'add'
              attrType = 'jpegPhoto'
              write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                     attrType, binaryFilePath)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' % (filename,local.temp,
                                              client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname() }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'        : clientHost,
                'dsPath'          : clientPath,
                'dsInstanceHost'  : masterHost ,
                'dsInstancePort'  : master.getPort() ,
                'dsInstanceDn'    : master.getRootDn() ,
                'dsInstancePswd'  : master.getRootPwd() ,
                'dsBaseDN'        : 'uid=hmiller, ou=People,%s' \
                                     % synchroSuffix,
                'dsFilter'        : 'jpegPhoto=*',
                'expectedRC'      :  0
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
                { 'returncode' : resultLength ,
                  'result'     : searchResult ,
                  'expected'   : 1
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Modify Entry -
                        replace binary attribute
  #@TestID                  Modify Entry - replace binary attribute
  #@TestPurpose         Check that an entry modify is well propagated
                        by secured replication.
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_006" scope="local">
    <testcase name="getTestCaseName('Modify Entry - replace binary attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that an entry modify is well propagated by secured replication.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_replace_binary.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              binaryFilePath = '%s/replication/photo2.uu' % source.data
              dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
              modif = 'replace'
              attrType = 'jpegPhoto'
              write_replication_mod_binary_ldif_file(filePath, dn, modif,
                                                     attrType,
                                                     binaryFilePath)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' % (filename,local.temp,
                                              client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                    % synchroSuffix,
                'dsFilter'       : 'jpegPhoto=*',
                'expectedRC'     :  0
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength ,
                'result'     : searchResult ,
                'expected'   : 1
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Modify Entry -
                        delete binary attribute
  #@TestID                  Modify Entry - delete binary attribute
  #@TestPurpose         Check that an entry modify is well propagated
                        by secured replication.
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_007" scope="local">
    <testcase name="getTestCaseName('Modify Entry - delete binary attribute')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that an entry modify is well propagated by secured secured replication.' % msg1 }
            </call>
            <script>
              filename = 'replication_mod_delete_binary.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
              modif = 'delete'
              attrType = 'jpegPhoto'
              attrValue = None
              write_replication_mod_ldif_file(filePath, dn, modif, attrType,
                                              attrValue)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' % (filename,local.temp,
                                              client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname() }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=hmiller, ou=People,%s' \
                                    % synchroSuffix,
                'dsFilter'       : 'jpegPhoto=*',
                'expectedRC'     :  0
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength ,
                'result'     : searchResult ,
                'expected'   : 0
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Rename Entry
  #@TestID                  Rename Entry
  #@TestPurpose         Check that a rename (modrdn) operation is well
                        propagated by secured replication.
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_008" scope="local">
    <testcase name="getTestCaseName('Rename Entry')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%sCheck that a rename entry (modrdn) operation is well propagated by secured replication.' % msg1 }
            </call>
            <script>
              filename = 'replication_modrdn.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
              newrdn = 'uid=kvaughan2'
              newsuperior = None
              deleteoldrdn = 1
              write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                newsuperior, deleteoldrdn)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' % (filename,local.temp,
                                              client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}"
              does NOT exist anymore -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=kvaughan, ou=People,%s' \
                                    % synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 32
              }
            </call>
            <!-- check that new entry "uid=kvaughan2, ou=People,
              ${DIRECTORY_BASE}" exists -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=kvaughan2, ou=People,%s' \
                                    % synchroSuffix,
                'dsFilter'       : 'objectclass=*'
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Rename Entry
                        (preserving old rdn)
  #@TestID                  Rename Entry (preserving old rdn)
  #@TestPurpose         Check that a rename (modrdn) operation is well
                        propagated by secured replication.
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_009" scope="local">
    <testcase name="getTestCaseName('Rename Entry (preserving old rdn)')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a rename (modrdn) operation is well propagated by secured replication.' % msg1 }
            </call>
            <script>
              filename = 'replication_modrdn_preserve.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
              newrdn = 'uid=igueye'
              newsuperior = None
              deleteoldrdn = 0
              write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                newsuperior, deleteoldrdn)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' % (filename,local.temp,
                                              client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname()
              }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}"
              does NOT exist anymore -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=jwallace, ou=People,%s' \
                                    % synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 32
              }
            </call>
            <!-- check that new entry "uid=igueye, ou=People,
              ${DIRECTORY_BASE}" exists -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=igueye, ou=People,%s' % synchroSuffix,
                'dsFilter'       : 'uid=jwallace'
              }
            </call>
            <script>
              searchRC = STAXResult[0][0]
              searchResult = STAXResult[0][1]
              resultLength = len(searchResult) > 0
            </script>
            <call function="'checktestRC'">
              { 'returncode' : resultLength ,
                'result'     : searchResult ,
                'expected'   : 1
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
  <!--- Test Case information
  #@TestMarker          Replication Encryption Tests
  #@TestName            Replication: Encryption: Rename Subtree
  #@TestID                  Rename Subtree
  #@TestPurpose         Check that a subtree rename (moddn) operation
                        is well propagated by secured replication.
  #@TestPreamble
  #@TestSteps
  #@TestPostamble
  #@TestResult
  -->
  <function name="replication_encryption_010" scope="local">
    <testcase name="getTestCaseName('Rename Subtree')">
      <sequence>
        <try>
          <sequence>
            <call function="'testCase_Preamble'"/>
            <message>
               'Test Name = %s' % STAXCurrentTestcase
            </message>
            <call function="'testStep'">
              { 'stepMessage' : '%s Check that a subtree rename (moddn) operation is well propagated by secured replication.' % msg1 }
            </call>
            <script>
              filename = 'replication_moddn.ldif'
              filePath = '%s/%s' % (local.temp,filename)
              dn = 'ou=People,%s' % synchroSuffix
              newrdn = 'ou=Special People'
              newsuperior = 'ou=Special Users,%s' % synchroSuffix
              deleteoldrdn = 0
              write_replication_moddn_ldif_file(filePath, dn, newrdn,
                                                newsuperior, deleteoldrdn)
            </script>
            <!-- Copy the replication_mod ldif to client host -->
            <message>
              'Copy %s file from %s to %s' % (filename,local.temp,
                                              client.getTmpDir())
            </message>
            <call function="'copyFile'">
              { 'srcfile'    : filePath,
                'destfile'   : '%s/%s' % (client.getTmpDir(),filename),
                'remotehost' : client.getHostname() }
            </call>
            <!-- Modify "master" server -->
            <call function="'ldapModifyWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsFilename'     : '%s/%s' % (client.getTmpDir(), filename)
              }
            </call>
            <!-- Check modify worked on "master" server -->
            <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}"
              does NOT exist anymore -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=gfarmer, ou=People,%s' \
                                    % synchroSuffix,
                'dsFilter'       : 'objectclass=*',
                'expectedRC'     : 32
              }
            </call>
            <!-- check that new entry "uid=gfarmer, ou=Special People,
              ou=Special Users, ${DIRECTORY_BASE}" exists -->
            <call function="'ldapSearchWithScript'">
              { 'location'       : clientHost,
                'dsPath'         : clientPath,
                'dsInstanceHost' : masterHost ,
                'dsInstancePort' : master.getPort() ,
                'dsInstanceDn'   : master.getRootDn() ,
                'dsInstancePswd' : master.getRootPwd() ,
                'dsBaseDN'       : 'uid=gfarmer, ou=Special People, \
                                   ou=Special Users,%s' % synchroSuffix,
                'dsFilter'       : 'objectclass=*'
              }
            </call>
            <!-- Verify the synchronization of the trees among the servers in
              the topology -->
            <call function="'verifyTrees'">
              [ clientHost, clientPath, master, consumerList, synchroSuffix ]
            </call>
          </sequence>
          <catch exception="'STAXException'" typevar="eType" var="eInfo">
            <message log="1" level="'fatal'">
              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
            </message>
          </catch>
          <finally>
            <sequence>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </finally>
        </try>
      </sequence>
    </testcase>
  </function>
</stax>
Diff truncated after the above file
opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml