From 8318d88bbe9453debdd86bdc7f96a9808c0874a8 Mon Sep 17 00:00:00 2001
From: Christophe Sovant <christophe.sovant@forgerock.com>
Date: Thu, 05 Dec 2013 22:44:37 +0000
Subject: [PATCH] Added testcase for issue OPENDJ-1192

---
 opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml |  206 +++++++++++++++++++++++++++++++++++++++++++++++++++
 opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml       |    1 
 2 files changed, 207 insertions(+), 0 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 f96fcbc..cb2f421 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
@@ -152,6 +152,7 @@
                   testsList.append('replication_conflict_016')
                   testsList.append('replication_conflict_017')
                   testsList.append('replication_conflict_018')
+                  testsList.append('replication_conflict_019')
                 </script>
 
                 <!-- Execute the Tests -->
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml
index 19a8f0b..a7a500a 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml
@@ -3811,4 +3811,210 @@
     </testcase>
   </function>
 
+  <!--- Test Case information
+  #@TestMarker         Replication Conflict Tests
+  #@TestName           Replication: Conflict: double_mod_add_del_single
+  #@TestID             double_mod_add_del_single
+  #@TestPurpose        Double mod_add_del a single-valued attribute
+  #@TestPreamble
+  #@TestSteps          Add entry to server1 (employeeNumber=0)
+  #@TestSteps          Disconnect Replication Servers
+  #@TestSteps          server1: add employeeNumber=2, del employeeNumber=1
+  #@TestSteps          server2: add employeeNumber=3, del employeeNumber=1
+  #@TestSteps          Re-connect Replication Servers
+  #@TestSteps          Check employeeNumber=3 on both servers
+  #@TestPostamble
+  #@TestResult         Success if trees are synchronised
+  -->
+  <function name="replication_conflict_019" scope="local">
+    <testcase name="getTestCaseName('double_mod_add_del_single')">                     
+      <sequence> 
+        <try>
+          <sequence>
+       
+            <call function="'testCase_Preamble'"/>
+
+            <message>
+               'Test Name = %s' % STAXCurrentTestcase
+            </message>
+
+            <message>
+              'Replication: Conflict: double_mod_add_del_single. \
+              Double mod_add_del a single-valued attribute'
+            </message>
+                                                              
+            <!-- Operation -->
+            <script>
+              server1del = ['employeeNumber:1']
+              server1add = ['employeeNumber:2']
+              server2del = ['employeeNumber:1']
+              server2add = ['employeeNumber:3']
+              server1mods = [server1del, server1add]
+              server2mods = [server2del, server2add]
+              mods = [server1mods, server2mods]
+            </script>
+            
+            <!-- Add entry to server1 -->
+            <script>
+              myEntry = Entry('cn=A4')
+              myEntry.addAttr('employeeNumber', '1')
+            </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'   : '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,
+                'OPENDJ-1192' ]
+            </call> 
+
+            <!-- Delete added entry -->
+            <call function="'ldapDeleteWithScript'">
+              { 'location'       : clientHost,
+                'dsPath'         : clientPath,
+                'dsInstanceHost' : server1Host,
+                'dsInstancePort' : server1.getPort(),
+                'dsInstanceDn'   : server1.getRootDn(),
+                'dsInstancePswd' : server1.getRootPwd(),
+                'dsDn'           : [myEntry.getDn()]
+              }
+            </call>
+
+          </sequence>
+  
+          <catch exception="'STAXException'" typevar="eType" var="eInfo">
+            <message log="1" level="'fatal'">
+              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+            </message>
+          </catch>
+          <finally>
+            <sequence>
+              <call function="'testCase_Postamble'"/>
+            </sequence>
+          </finally>
+        </try>
+      </sequence>
+    </testcase>
+  </function>
+
 </stax>

--
Gitblit v1.10.0