From 2aa8aee407d3ba221e1fd24e143b916b2d0be3c0 Mon Sep 17 00:00:00 2001
From: Gary Williams <gary.williams@forgerock.com>
Date: Wed, 28 Mar 2012 14:02:43 +0000
Subject: [PATCH] refactor replication functional tests to be one test per function

---
 opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml | 3715 ++---------------------------------------------------------
 1 files changed, 180 insertions(+), 3,535 deletions(-)

diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
index 4de257a..9afe7ff 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
@@ -7,3561 +7,206 @@
  ! 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.
+ ! 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="'replication_conflict'">
+        <try>
+          <sequence>
+            <script>
+              CurrentTestPath['group'] = 'replication'        
+              CurrentTestPath['suite'] = 'conflict'
+              
+              _group=CurrentTestPath['group']
+              _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+              _label = 'Replication Conflict'
+            </script>
 
-      <block name="'conflict'">
-
-        <sequence>
-            
-          <script>
-            if not CurrentTestPath.has_key('group'):
-              CurrentTestPath['group']='replication'                 
-            CurrentTestPath['suite']=STAXCurrentBlock
-          </script>            
-
-          <call function="'testSuite_Preamble'"/>
-
-          <!--- Test Suite information
-          #@TestSuiteName       Replication Conflict Tests
-          #@TestSuitePurpose    Verify that replication handles the conflicts
-                                all right
-          #@TestSuiteID         Conflict Tests
-          #@TestSuiteGroup      Conflict
-          #@TestGroup           Replication
-          #@TestScript          replication_failover.xml
-          #@TestHTMLLink        http://opends.dev.java.net/
-          -->
-            
-                                                                        
-          <import machine="STAF_LOCAL_HOSTNAME"
-            file="'%s/testcases/replication/replication_setup.xml' 
-                  % (TESTS_DIR)"/>
-          <call function="'replication_setup'">
-            { 'topologyFile'       : '%s/basic_topology.txt' \
-                                      % REPLICATION_CONFIG_DIR,
-              'dataFile'           : 'Short_Example.ldif',
-              'isolateLdapServers' : True,
-              'enableDebugLogs'    : False,
-              'label'              : 'Replication Conflict'
-            }
-          </call>
-                                    
-
-          <script>
-            server1 = _topologyServerList[0]
-            server2 = _topologyServerList[1]
-            server1Host = server1.getHostname()
-            server2Host = server2.getHostname()
-            server1Path = '%s/%s' % (server1.getDir(), OPENDSNAME)
-            server2Path = '%s/%s' % (server2.getDir(), OPENDSNAME)
-            server1name = '%s:%s' % (server1Host, server1.getPort())
-            server2name = '%s:%s' % (server2Host, server2.getPort())
-            
-            if globalSplitServers:
-              replServer1 = _topologyReplServerList[0]
-              replServer2 = _topologyReplServerList[1]
-            else:
-              replServer1 = server1
-              replServer2 = server2
-
-            # Filter used for retrieving conflict counters from cn=monitor              
-            filter0 = '(base-dn=%s)' % synchroSuffix
-            filter1 = '(cn=Replication Plugin*)'
-            monitorFilter = '&amp;%s%s' % (filter0, filter1)
-            monitorCounters = 'resolved-naming-conflicts \
-                               unresolved-naming-conflicts \
-                               resolved-modify-conflicts'
-
-            addedEntries = STAXGlobal( [[], []] )
-                                        
-            class Entry:
-              def __init__(self, rdn):
-                self.userDn = '%s, ou=People, %s' \
-                              % (rdn, synchroSuffix)     
-                self.listAttr = []
-                self.listAttr.append('objectclass:top')
-                self.listAttr.append('objectclass:organizationalperson')
-                self.listAttr.append('objectclass:inetorgperson')
-                self.listAttr.append('objectclass:person')
-                self.listAttr.append('sn:User')
-                self.listAttr.append('cn:Test User')     
-              def getDn(self):
-                return self.userDn              
-              def getAttrList(self):
-                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 -->
-              <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>
-  
-              <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>
-                </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_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')">
-            <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>
+            <!--- Test Suite information
+            #@TestSuiteName       Replication Conflict Tests
+            #@TestSuitePurpose    Verify that the conflict operations are replicated
+                                  correctly between two servers.
+            #@TestSuiteID         Conflict Tests
+            #@TestSuiteGroup      Conflict
+            #@TestGroup           Replication
+            #@TestScript          replication_conflict.xml
+            #@TestHTMLLink        http://www.forgerock.org/
               -->
-
-              <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">
-                    <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' }
-          </call>
-                          
-          <call function="'testSuite_Postamble'"/>
                   
-        </sequence>
+            <call function="'testSuite_Preamble'"/>
 
+            <try>
+              <sequence> 
+
+                <import machine="STAF_LOCAL_HOSTNAME"
+                  file="'%s/testcases/replication/replication_setup.xml' 
+                        % (TESTS_DIR)"/>
+                <call function="'replication_setup'">
+                  { 'topologyFile'       : '%s/basic_topology.txt' \
+                                            % REPLICATION_CONFIG_DIR,
+                    'dataFile'           : 'Short_Example.ldif',
+                    'isolateLdapServers' : True,
+                    'enableDebugLogs'    : False,
+                    '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()
+                  server2Host = server2.getHostname()
+                  server1Path = '%s/%s' % (server1.getDir(), OPENDSNAME)
+                  server2Path = '%s/%s' % (server2.getDir(), OPENDSNAME)
+                  server1name = '%s:%s' % (server1Host, server1.getPort())
+                  server2name = '%s:%s' % (server2Host, server2.getPort())
+                  
+                  if globalSplitServers:
+                    replServer1 = _topologyReplServerList[0]
+                    replServer2 = _topologyReplServerList[1]
+                  else:
+                    replServer1 = server1
+                    replServer2 = server2
+        
+                  # Filter used for retrieving conflict counters from cn=monitor              
+                  filter0 = '(base-dn=%s)' % synchroSuffix
+                  filter1 = '(cn=Replication Plugin*)'
+                  monitorFilter = '&amp;%s%s' % (filter0, filter1)
+                  monitorCounters = 'resolved-naming-conflicts \
+                                     unresolved-naming-conflicts \
+                                     resolved-modify-conflicts'
+        
+                  addedEntries = STAXGlobal( [[], []] )
+                                              
+                  class Entry:
+                    def __init__(self, rdn):
+                      self.userDn = '%s, ou=People, %s' \
+                                    % (rdn, synchroSuffix)     
+                      self.listAttr = []
+                      self.listAttr.append('objectclass:top')
+                      self.listAttr.append('objectclass:organizationalperson')
+                      self.listAttr.append('objectclass:inetorgperson')
+                      self.listAttr.append('objectclass:person')
+                      self.listAttr.append('sn:User')
+                      self.listAttr.append('cn:Test User')     
+                    def getDn(self):
+                      return self.userDn              
+                    def getAttrList(self):
+                      return self.listAttr
+                    def addAttr(self, attrType, attrValue):
+                      self.listAttr.append('%s:%s' % (attrType, attrValue))
+
+                </script>
+                                                    
+                <!-- List of Test Cases -->
+                <script>
+                  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>
+
+                <!-- Execute the Tests -->
+                <iterate var="__test" in="testsList">
+                  <sequence>
+                    <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>
+  
+              <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'    : _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>

--
Gitblit v1.10.0