From 192c04ec225f2620af6228b2b52e9ed1b82013f8 Mon Sep 17 00:00:00 2001
From: ugaston <ugaston@localhost>
Date: Tue, 26 Aug 2008 18:10:32 +0000
Subject: [PATCH] New repl conflict testcases + fixes + style update

---
 opendj-sdk/opends/tests/functional-tests/testcases/replication/conflict/conflict.xml |  857 +++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 685 insertions(+), 172 deletions(-)

diff --git a/opendj-sdk/opends/tests/functional-tests/testcases/replication/conflict/conflict.xml b/opendj-sdk/opends/tests/functional-tests/testcases/replication/conflict/conflict.xml
index 1ff94ed..10905b3 100644
--- a/opendj-sdk/opends/tests/functional-tests/testcases/replication/conflict/conflict.xml
+++ b/opendj-sdk/opends/tests/functional-tests/testcases/replication/conflict/conflict.xml
@@ -112,7 +112,6 @@
           <!-- ============================================== -->
           <!-- ============================================== -->
 
-
           <!--- Test Case information
           #@TestMarker          Replication Conflict Tests
           #@TestName            Replication: Conflict: Basic check
@@ -295,16 +294,16 @@
                        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'        : entry.getDn(),
-                    'listAttributes'    : mods[i],
-                    'changetype'        : 'replace'
+                  { 'location'       : server.getHostname(),
+                    'dsPath'         : '%s/%s' \
+                                       % (server.getDir(), OPENDSNAME),
+                    'dsInstanceHost' : server.getHostname(),
+                    'dsInstancePort' : server.getPort(),
+                    'dsInstanceDn'   : server.getRootDn(),
+                    'dsInstancePswd' : server.getRootPwd(),
+                    'DNToModify'     : entry.getDn(),
+                    'listAttributes' : mods[i],
+                    'changetype'     : 'replace'
                   }
                 </call>
               </iterate>
@@ -628,29 +627,29 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : 'delete'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][1],
-                      'changetype'        : 'add'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][1],
+                      'changetype'     : 'add'
                     }
                   </call>
                 </sequence>
@@ -819,29 +818,29 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : 'delete'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][1],
-                      'changetype'        : 'add'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][1],
+                      'changetype'     : 'add'
                     }
                   </call>
                 </sequence>
@@ -998,16 +997,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : 'add'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : 'add'
                     }
                   </call>
                 </sequence>
@@ -1168,16 +1167,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : 'add'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : 'add'
                     }
                   </call>
                 </sequence>
@@ -1341,16 +1340,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : 'delete'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : 'delete'
                     }
                   </call>
                 </sequence>
@@ -1513,16 +1512,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : 'delete'
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : 'delete'
                     }
                   </call>
                 </sequence>
@@ -1697,29 +1696,29 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : changetypes[i][0]
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][1],
-                      'changetype'        : changetypes[i][1]
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][1],
+                      'changetype'     : changetypes[i][1]
                     }
                   </call>
                 </sequence>
@@ -1882,16 +1881,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : changetypes[i][0]
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : changetypes[i][0]
                     }
                   </call>
                 </sequence>
@@ -2054,16 +2053,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : changetypes[i][0]
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : changetypes[i][0]
                     }
                   </call>
                 </sequence>
@@ -2230,16 +2229,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : changetypes[i][0]
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : changetypes[i][0]
                     }
                   </call>
                 </sequence>
@@ -2405,16 +2404,16 @@
                 <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'        : entry.getDn(),
-                      'listAttributes'    : mods[i][0],
-                      'changetype'        : changetypes[i][0]
+                    { 'location'       : server.getHostname(),
+                      'dsPath'         : '%s/%s' \
+                                         % (server.getDir(), OPENDSNAME),
+                      'dsInstanceHost' : server.getHostname(),
+                      'dsInstancePort' : server.getPort(),
+                      'dsInstanceDn'   : server.getRootDn(),
+                      'dsInstancePswd' : server.getRootPwd(),
+                      'DNToModify'     : entry.getDn(),
+                      'listAttributes' : mods[i][0],
+                      'changetype'     : changetypes[i][0]
                     }
                   </call>
                 </sequence>
@@ -2756,16 +2755,18 @@
                                in="[server1, server2]" 
                                indexvar="i">
                 <if expr="len(addedEntries[i]) != 0">
-                  <call function="'ldapDeleteWithScript'">
-                    { 'location'       : clientHost,
-                      'dsPath'         : clientPath,
-                      'dsInstanceHost' : server.getHostname(),
-                      'dsInstancePort' : server.getPort(),
-                      'dsInstanceDn'   : server.getRootDn(),
-                      'dsInstancePswd' : server.getRootPwd(),
-                      'dsDn'           : addedEntries[i]
-                    }
-                  </call>
+                  <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>
 
@@ -3019,16 +3020,18 @@
                                in="[server1, server2]" 
                                indexvar="i">
                 <if expr="len(addedEntries[i]) != 0">
-                  <call function="'ldapDeleteWithScript'">
-                    { 'location'       : clientHost,
-                      'dsPath'         : clientPath,
-                      'dsInstanceHost' : server.getHostname(),
-                      'dsInstancePort' : server.getPort(),
-                      'dsInstanceDn'   : server.getRootDn(),
-                      'dsInstancePswd' : server.getRootPwd(),
-                      'dsDn'           : addedEntries[i]
-                    }
-                  </call>
+                  <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>
 
@@ -3041,7 +3044,517 @@
 
               <call function="'testCase_Postamble'"/>
             </sequence>
-          </testcase>            
+          </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, [server1, server2] ]
+              </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, [server1, server2] ]
+              </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 -->
+              <call function="'verifyTrees'">
+                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+              </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>
+
+              <script>
+                knownIssue(3401)
+              </script>
+
+              <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')">
+            <sequence>            
+              <call function="'testCase_Preamble'"/>
+              <message>
+                'Replication: Conflict: double_add. \
+                Double add (same dn, different uid)'
+              </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, [server1, server2] ]
+              </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, [server1, server2] ]
+              </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 -->
+              <call function="'verifyTrees'">
+                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+              </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>
+
+              <script>
+                knownIssue(3401)
+              </script>
+
+              <call function="'testCase_Postamble'"/>
+            </sequence>
+          </testcase>
+
+
 
           <import machine="STAF_LOCAL_HOSTNAME"
             file="'%s/testcases/replication/replication_cleanup.xml' 

--
Gitblit v1.10.0