5826N/A<?xml version="1.0" encoding="UTF-8" standalone="no"?>
5826N/A<!DOCTYPE stax SYSTEM "/shared/stax.dtd">
5826N/A<!--
5826N/A ! CDDL HEADER START
5826N/A !
5826N/A ! The contents of this file are subject to the terms of the
5826N/A ! Common Development and Distribution License, Version 1.0 only
5826N/A ! (the "License"). You may not use this file except in compliance
5826N/A ! with the License.
5826N/A !
5826N/A ! You can obtain a copy of the license at
5826N/A ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
5826N/A ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
5826N/A ! See the License for the specific language governing permissions
5826N/A ! and limitations under the License.
5826N/A !
5826N/A ! When distributing Covered Code, include this CDDL HEADER in each
5826N/A ! file and include the License file at
5826N/A ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
5826N/A ! add the following below this CDDL HEADER, with the fields enclosed
5826N/A ! by brackets "[]" replaced with your own identifying information:
5826N/A ! Portions Copyright [yyyy] [name of copyright owner]
5826N/A !
5826N/A ! CDDL HEADER END
5826N/A !
5826N/A ! Portions Copyright 2006-2009 Sun Microsystems, Inc.
6211N/A ! Portions Copyright 2011-2013 ForgeRock AS.
5826N/A ! -->
5826N/A<stax>
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: Basic check
5826N/A #@TestID Basic check
5826N/A #@TestPurpose Check replication assures synchronization after
5826N/A a simultaneous conflictuous modify on 2
5826N/A different servers (regardless of the prevailing
5826N/A modify)
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with employeeNumber:0
5826N/A #@TestSteps Parallel replace
5826N/A server1: employeeNumber -> 1
5826N/A server2: employeeNumber -> 2
5826N/A #@TestSteps Check entry consistent on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_001" scope="local">
5826N/A <testcase name="getTestCaseName('Basic check')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: Basic check 0. \
5826N/A Check replication assures synchronization after a simultaneous \
5826N/A conflictuous modify on 2 different servers (regardless of the \
5826N/A prevailing modify)'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('uid=tuser-0')
5826N/A myEntry.addAttr('employeeNumber', '0')
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <call function="'Sleep'">
5826N/A { 'sleepForMilliSeconds' : 2000 }
5826N/A </call>
5826N/A
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'attributeName' : 'employeeNumber',
5826N/A 'newAttributeValue' : '%i' % (i + 1),
5826N/A 'changetype' : 'replace'
5826N/A }
5826N/A </call>
5826N/A </paralleliterate>
5826N/A
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_replace_multi
5826N/A #@TestID double_replace_multi
5826N/A #@TestPurpose Double replace a multi-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with description:{1 2}
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: replace description -> {3 4}
5826N/A #@TestSteps server2: replace description -> {5 6}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={5 6} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_002" scope="local">
5826N/A <testcase name="getTestCaseName('double_replace_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_replace_multi. \
5826N/A Double replace a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=A1')
5826N/A myEntry.addAttr('description', '1')
5826N/A myEntry.addAttr('description', '2')
5826N/A server1mods = ['description:3', 'description:4']
5826N/A server2mods = ['description:5', 'description:6']
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i],
5826N/A 'changetype' : 'replace'
5826N/A }
5826N/A </call>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_replace_single
5826N/A #@TestID double_replace_single
5826N/A #@TestPurpose Double replace a single-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with employeeNumber:0
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: replace employeeNumber -> 1
5826N/A #@TestSteps server2: replace employeeNumber -> 2
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check employeeNumber=2 on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_003" scope="local">
5826N/A <testcase name="getTestCaseName('double_replace_single')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_replace_single. \
5826N/A Double replace a single-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=A4')
5826N/A myEntry.addAttr('employeeNumber', '0')
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'attributeName' : 'employeeNumber',
5826N/A 'newAttributeValue' : '%i' % (i + 1),
5826N/A 'changetype' : 'replace'
5826N/A }
5826N/A </call>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_mod_del_add_multi_1
5826N/A #@TestID double_mod_del_add_multi_1
5826N/A #@TestPurpose Double replace (del+add) same value with any
5826N/A value of a multi-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with
5826N/A description:{1 2 3 4 5 6 7 8 9 10}
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: del description=1 + add description=11
5826N/A #@TestSteps server2: del description=1 + add description=12
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={2 3 4 5 6 7 8 9 10 11 12}
5826N/A on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_004" scope="local">
5826N/A <testcase name="getTestCaseName('double_mod_del_add_multi_1')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_mod_del_add_multi_1. \
5826N/A Double replace (del+add) same value with any value of a \
5826N/A multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=A2')
5826N/A for x in range(10):
5826N/A myEntry.addAttr('description', '%i' % (x+1))
5826N/A server1del = ['description:1']
5826N/A server1add = ['description:11']
5826N/A server2del = ['description:1']
5826N/A server2add = ['description:12']
5826N/A server1mods = [server1del, server1add]
5826N/A server2mods = [server2del, server2add]
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : 'delete'
5826N/A }
5826N/A </call>
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][1],
5826N/A 'changetype' : 'add'
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_mod_del_add_multi_2
5826N/A #@TestID double_mod_del_add_multi_2
5826N/A #@TestPurpose Double replace (del+add) any value with same
5826N/A value of a multi-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with
5826N/A description:{1 2 3 4 5 6 7 8 9 10}
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: del description=1 + add description=11
5826N/A #@TestSteps server2: del description=10 + add description=11
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={2 3 4 5 6 7 8 9 11}
5826N/A on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_005" scope="local">
5826N/A <testcase name="getTestCaseName('double_mod_del_add_multi_2')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_mod_del_add_multi_2. \
5826N/A Double replace (del+add) any value with same value of a \
5826N/A multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=A3')
5826N/A for x in range(10):
5826N/A myEntry.addAttr('description', '%i' % (x+1))
5826N/A server1del = ['description:1']
5826N/A server1add = ['description:11']
5826N/A server2del = ['description:10']
5826N/A server2add = ['description:11']
5826N/A server1mods = [server1del, server1add]
5826N/A server2mods = [server2del, server2add]
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : 'delete'
5826N/A }
5826N/A </call>
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][1],
5826N/A 'changetype' : 'add'
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_mod_add_multi
5826N/A #@TestID double_mod_add_multi
5826N/A #@TestPurpose Double mod_add a multi-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: add description=1
5826N/A #@TestSteps server2: add description={1 2}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={1 2} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_006" scope="local">
5826N/A <testcase name="getTestCaseName('double_mod_add_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_mod_add_multi. \
5826N/A Double mod_add a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=B1')
5826N/A server1add = ['description:1']
5826N/A server2add = ['description:1', 'description:2']
5826N/A server1mods = [server1add]
5826N/A server2mods = [server2add]
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : 'add'
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_mod_add_single
5826N/A #@TestID double_mod_add_single
5826N/A #@TestPurpose Double mod_add a single-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: add employeeNumber=1
5826N/A #@TestSteps server2: add employeeNumber=2
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check employeeNumber=1 on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_007" scope="local">
5826N/A <testcase name="getTestCaseName('double_mod_add_single')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_mod_add_single. \
5826N/A Double mod_add a single-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=B2')
5826N/A server1add = ['employeeNumber:1']
5826N/A server2add = ['employeeNumber:2']
5826N/A server1mods = [server1add]
5826N/A server2mods = [server2add]
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : 'add'
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_mod_del_multi
5826N/A #@TestID double_mod_del_multi
5826N/A #@TestPurpose Double mod_delete a multi-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with
5826N/A description:{1 2 3 4 5 6 7 8 9 10}
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: delete description={1 2 3 4 5}
5826N/A #@TestSteps server2: delete description={4 5 6 7 8}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={9 10} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_008" scope="local">
5826N/A <testcase name="getTestCaseName('double_mod_del_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_mod_del_multi. \
5826N/A Double mod_delete a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=C1')
5826N/A for x in range(10):
5826N/A myEntry.addAttr('description', '%i' % (x+1))
5826N/A server1del = []
5826N/A for y in range(1,6):
5826N/A server1del.append('description:%i' % y)
5826N/A server2del = []
5826N/A for z in range(4,9):
5826N/A server2del.append('description:%i' % z)
5826N/A server1mods = [server1del]
5826N/A server2mods = [server2del]
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : 'delete'
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_mod_del_single
5826N/A #@TestID double_mod_del_single
5826N/A #@TestPurpose Double mod_delete a single-valued attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with employeeNumber=1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: delete employeeNumber
5826N/A #@TestSteps server2: delete employeeNumber=1
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check employeeNumber no longer exists on either
5826N/A server
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_009" scope="local">
5826N/A <testcase name="getTestCaseName('double_mod_del_single')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_mod_del_single. \
5826N/A Double mod_delete a single-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=C2')
5826N/A myEntry.addAttr('employeeNumber', '1')
5826N/A server1del = ['employeeNumber:']
5826N/A server2del = ['employeeNumber:1']
5826N/A server1mods = [server1del]
5826N/A server2mods = [server2del]
5826N/A mods = [server1mods, server2mods]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : 'delete'
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'employeeNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict:
5826N/A mod_del_add_vs_mod_add_del_multi
5826N/A #@TestID mod_del_add_vs_mod_add_del_multi
5826N/A #@TestPurpose Modify: Delete+Add then Add+Delete on 2
5826N/A multi-valued attributes
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with
5826N/A description=1 , telephoneNumber=1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: add description=2 ,
5826N/A delete telephoneNumber
5826N/A #@TestSteps server2: delete description ,
5826N/A add telephoneNumber=2
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description no longer exists and
5826N/A telephoneNumber=2 on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_010" scope="local">
5826N/A <testcase name="getTestCaseName('mod_del_add_vs_mod_add_del_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \
5826N/A Modify: Delete+Add then Add+Delete on 2 multi-valued attributes'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=D1')
5826N/A myEntry.addAttr('description', '1')
5826N/A myEntry.addAttr('telephoneNumber', '1')
5826N/A server1add = ['description:2']
5826N/A server1del = ['telephoneNumber:']
5826N/A server2del = ['description:']
5826N/A server2add = ['telephoneNumber:2']
5826N/A server1mods = [server1add, server1del]
5826N/A server2mods = [server2del, server2add]
5826N/A mods = [server1mods, server2mods]
5826N/A server1changetypes = ['add', 'delete']
5826N/A server2changetypes = ['delete', 'add']
5826N/A changetypes = [server1changetypes, server2changetypes]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : changetypes[i][0]
5826N/A }
5826N/A </call>
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][1],
5826N/A 'changetype' : changetypes[i][1]
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description telephoneNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description telephoneNumber',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict:
5826N/A mod_add_vs_mod_replace_multi
5826N/A #@TestID mod_add_vs_mod_replace_multi
5826N/A #@TestPurpose mod_add vs mod_replace on a multi-valued
5826N/A attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with description=1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: add description={2 3}
5826N/A #@TestSteps server2: replace description -> {4 5}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={4 5} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_011" scope="local">
5826N/A <testcase name="getTestCaseName('mod_add_vs_mod_replace_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: mod_add_vs_mod_replace_multi. \
5826N/A mod_add vs mod_replace on a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=E1')
5826N/A myEntry.addAttr('description', '1')
5826N/A server1add = ['description:2', 'description:3']
5826N/A server2replace = ['description:4', 'description:5']
5826N/A server1mods = [server1add]
5826N/A server2mods = [server2replace]
5826N/A mods = [server1mods, server2mods]
5826N/A server1changetypes = ['add']
5826N/A server2changetypes = ['replace']
5826N/A changetypes = [server1changetypes, server2changetypes]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : changetypes[i][0]
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict:
5826N/A mod_replace_vs_mod_add_multi
5826N/A #@TestID mod_replace_vs_mod_add_multi
5826N/A #@TestPurpose mod_replace vs mod_add on a multi-valued
5826N/A attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with description=1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: replace description -> {2 3}
5826N/A #@TestSteps server2: add description={4 5}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={2 3 4 5} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_012" scope="local">
5826N/A <testcase name="getTestCaseName('mod_replace_vs_mod_add_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: mod_replace_vs_mod_add_multi. \
5826N/A mod_replace vs mod_add on a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=E2')
5826N/A myEntry.addAttr('description', '1')
5826N/A server1replace = ['description:2', 'description:3']
5826N/A server2add = ['description:4', 'description:5']
5826N/A server1mods = [server1replace]
5826N/A server2mods = [server2add]
5826N/A mods = [server1mods, server2mods]
5826N/A server1changetypes = ['replace']
5826N/A server2changetypes = ['add']
5826N/A changetypes = [server1changetypes, server2changetypes]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : changetypes[i][0]
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict:
5826N/A mod_del_vs_mod_replace_multi
5826N/A #@TestID mod_del_vs_mod_replace_multi
5826N/A #@TestPurpose mod_del vs mod_replace on a multi-valued
5826N/A attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with
5826N/A description={1 2 3 4}
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: delete description={2 3}
5826N/A #@TestSteps server2: replace description -> {6 7 8 9 10}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={6 7 8 9 10} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_013" scope="local">
5826N/A <testcase name="getTestCaseName('mod_del_vs_mod_replace_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: mod_del_vs_mod_replace_multi. \
5826N/A mod_del vs mod_replace on a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=F1')
5826N/A for x in range(4):
5826N/A myEntry.addAttr('description', '%i' % (x+1))
5826N/A server1del = ['description:2', 'description:3']
5826N/A server2replace = []
5826N/A for y in range(6,11):
5826N/A server2replace.append('description:%i' % y)
5826N/A server1mods = [server1del]
5826N/A server2mods = [server2replace]
5826N/A mods = [server1mods, server2mods]
5826N/A server1changetypes = ['delete']
5826N/A server2changetypes = ['replace']
5826N/A changetypes = [server1changetypes, server2changetypes]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : changetypes[i][0]
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict:
5826N/A mod_replace_vs_mod_del_multi
5826N/A #@TestID mod_replace_vs_mod_del_multi
5826N/A #@TestPurpose mod_replace vs mod_del on a multi-valued
5826N/A attribute
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry to server1 with
5826N/A description={1 2 3 4}
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: replace description -> {1 2 3}
5826N/A #@TestSteps server2: delete description={3 4}
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check description={1 2} on both servers
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_014" scope="local">
5826N/A <testcase name="getTestCaseName('mod_replace_vs_mod_del_multi')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: mod_replace_vs_mod_del_multi. \
5826N/A mod_replace vs mod_del on a multi-valued attribute'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A myEntry = Entry('cn=F2')
5826N/A for x in range(4):
5826N/A myEntry.addAttr('description', '%i' % (x+1))
5826N/A server1replace = ['description:1', 'description:2',
5826N/A 'description:3']
5826N/A server2del = ['description:3', 'description:4']
5826N/A server1mods = [server1replace]
5826N/A server2mods = [server2del]
5826N/A mods = [server1mods, server2mods]
5826N/A server1changetypes = ['replace']
5826N/A server2changetypes = ['delete']
5826N/A changetypes = [server1changetypes, server2changetypes]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : myEntry.getDn(),
5826N/A 'listAttributes' : myEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Modify entry on one of the servers -->
5826N/A <call function="'modifyAnAttribute'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToModify' : myEntry.getDn(),
5826N/A 'listAttributes' : mods[i][0],
5826N/A 'changetype' : changetypes[i][0]
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : myEntry.getDn(),
5826N/A 'dsFilter' : 'objectclass=*',
5826N/A 'dsAttributes' : 'description',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entry -->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [myEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: add_child_del_parent
5826N/A #@TestID add_child_del_parent
5826N/A #@TestPurpose Add a child vs delete his parent
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry cn=P1 to server1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server2: add child cn=C1,cn=P1
5826N/A #@TestSteps server1: delete parent cn=P1
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check servers are synchronised
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_015" scope="local">
5826N/A <testcase name="getTestCaseName('add_child_del_parent')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: add_child_del_parent. \
5826N/A Add a child vs delete his parent'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A parentEntry = Entry('cn=P1')
5826N/A parentEntry.addAttr('givenname', 'DUMMY ENTRY')
5826N/A childEntry = Entry('cn=C1,cn=P1')
5826N/A childEntry.addAttr('givenname', 'DUMMY ENTRY')
5826N/A # addedEntries = [[], []]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : parentEntry.getDn(),
5826N/A 'listAttributes' : parentEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Add child entry on server2 -->
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server2Host,
5826N/A 'dsPath' : server2Path,
5826N/A 'dsInstanceHost' : server2Host,
5826N/A 'dsInstancePort' : server2.getPort(),
5826N/A 'dsInstanceDn' : server2.getRootDn(),
5826N/A 'dsInstancePswd' : server2.getRootPwd(),
5826N/A 'DNToAdd' : childEntry.getDn(),
5826N/A 'listAttributes' : childEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Delete parent entry on server1-->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [parentEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A <script>
5826N/A resultDnList = []
5826N/A for line in searchResult.splitlines():
5826N/A if line.find('dn: ') != -1:
5826N/A resultDn = line[len('dn: '):]
5826N/A resultDnList.append(resultDn)
5826N/A addedEntries[i] = resultDnList
5826N/A </script>
5826N/A </sequence>
5826N/A <else>
5826N/A <script>
5826N/A addedEntries[i] = []
5826N/A </script>
5826N/A </else>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
6211N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entries -->
5826N/A <script>
5826N/A list1 = addedEntries[0]
5826N/A list2 = addedEntries[1]
5826N/A toRemove = []
5826N/A # remove potential redundancies, to avoid deleting them twice
5826N/A for addedEntry in list2:
5826N/A if addedEntry in list1:
5826N/A toRemove.append(addedEntry)
5826N/A for ent in toRemove:
5826N/A list2.remove(ent)
5826N/A </script>
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <if expr="len(addedEntries[i]) != 0">
5826N/A <paralleliterate var="entryToDelete" in="addedEntries[i]">
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsDn' : [entryToDelete]
5826N/A }
5826N/A </call>
5826N/A </paralleliterate>
5826N/A </if>
5826N/A </paralleliterate>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: del_parent_add_child
5826N/A #@TestID del_parent_add_child
5826N/A #@TestPurpose Delete a parent vs add his child
5826N/A #@TestPreamble
5826N/A #@TestSteps Add entry cn=P2 to server1
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: delete parent cn=P2
5826N/A #@TestSteps server2: add child cn=C2,cn=P2
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check servers are synchronised
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_016" scope="local">
5826N/A <testcase name="getTestCaseName('del_parent_add_child')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: del_parent_add_child. \
5826N/A Delete a parent vs add his child'
5826N/A </message>
5826N/A
5826N/A <!-- Add entry to server1 -->
5826N/A <script>
5826N/A parentEntry = Entry('cn=P2')
5826N/A parentEntry.addAttr('givenname', 'DUMMY ENTRY')
5826N/A childEntry = Entry('cn=C2,cn=P2')
5826N/A childEntry.addAttr('givenname', 'DUMMY ENTRY')
5826N/A # addedEntries = [[], []]
5826N/A </script>
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server1Host,
5826N/A 'dsPath' : server1Path,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'DNToAdd' : parentEntry.getDn(),
5826N/A 'listAttributes' : parentEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete parent entry on server1-->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [parentEntry.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Add child entry on server2 -->
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server2Host,
5826N/A 'dsPath' : server2Path,
5826N/A 'dsInstanceHost' : server2Host,
5826N/A 'dsInstancePort' : server2.getPort(),
5826N/A 'dsInstanceDn' : server2.getRootDn(),
5826N/A 'dsInstancePswd' : server2.getRootPwd(),
5826N/A 'DNToAdd' : childEntry.getDn(),
5826N/A 'listAttributes' : childEntry.getAttrList()
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A <script>
5826N/A resultDnList = []
5826N/A for line in searchResult.splitlines():
5826N/A if line.find('dn: ') != -1:
5826N/A resultDn = line[len('dn: '):]
5826N/A resultDnList.append(resultDn)
5826N/A addedEntries[i] = resultDnList
5826N/A </script>
5826N/A </sequence>
5826N/A <else>
5826N/A <script>
5826N/A addedEntries[i] = []
5826N/A </script>
5826N/A </else>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <call function="'verifyTrees'">
6211N/A [ clientHost, clientPath, server1, [server2], synchroSuffix ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entries -->
5826N/A <script>
5826N/A list1 = addedEntries[0]
5826N/A list2 = addedEntries[1]
5826N/A toRemove = []
5826N/A # remove potential redundancies, to avoid deleting them twice
5826N/A for addedEntry in list2:
5826N/A if addedEntry in list1:
5826N/A toRemove.append(addedEntry)
5826N/A for ent in toRemove:
5826N/A list2.remove(ent)
5826N/A </script>
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <if expr="len(addedEntries[i]) != 0">
5826N/A <paralleliterate var="entryToDelete" in="addedEntries[i]">
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsDn' : [entryToDelete]
5826N/A }
5826N/A </call>
5826N/A </paralleliterate>
5826N/A </if>
5826N/A </paralleliterate>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_add
5826N/A #@TestID double_add
5826N/A #@TestPurpose Double add (same dn, different uid)
5826N/A #@TestPreamble
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: add entry cn=F with uid=1
5826N/A #@TestSteps server2: add entry cn=F with uid=2
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps Check servers are synchronised
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_017" scope="local">
5826N/A <testcase name="getTestCaseName('double_add')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_add. \
5826N/A Double add (same dn, different uid)'
5826N/A </message>
5826N/A
5826N/A <script>
5826N/A entry1 = Entry('cn=F')
5826N/A entry1.addAttr('uid', '1')
5826N/A entry1.addAttr('givenname', 'DUMMY ENTRY')
5826N/A entry2 = Entry('cn=F')
5826N/A entry2.addAttr('uid', '2')
5826N/A entry2.addAttr('givenname', 'DUMMY ENTRY')
5826N/A
5826N/A entriesToAdd = [entry1, entry2]
5826N/A </script>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Add entry on one of the servers -->
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToAdd' : entriesToAdd[i].getDn(),
5826N/A 'listAttributes' : entriesToAdd[i].getAttrList()
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict uid cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict uid cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A <script>
5826N/A resultDnList = []
5826N/A for line in searchResult.splitlines():
5826N/A if line.find('dn: ') != -1:
5826N/A resultDn = line[len('dn: '):]
5826N/A resultDnList.append(resultDn)
5826N/A addedEntries[i] = resultDnList
5826N/A </script>
5826N/A </sequence>
5826N/A <else>
5826N/A <script>
5826N/A addedEntries[i] = []
5826N/A </script>
5826N/A </else>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <!-- If the trees don't match, we may have come across Issue OPENDJ-454
5826N/A (RFE: Solve naming conflict of 2 adds with same dn, different
5826N/A attr value) -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix,
5826N/A 'OPENDJ-454' ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entries -->
5826N/A <script>
5826N/A list1 = addedEntries[0]
5826N/A list2 = addedEntries[1]
5826N/A toRemove = []
5826N/A # remove potential redundancies, to avoid deleting them twice
5826N/A for addedEntry in list2:
5826N/A if addedEntry in list1:
5826N/A toRemove.append(addedEntry)
5826N/A for ent in toRemove:
5826N/A list2.remove(ent)
5826N/A </script>
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <if expr="len(addedEntries[i]) != 0">
5826N/A <paralleliterate var="entryToDelete" in="addedEntries[i]">
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsDn' : [entryToDelete]
5826N/A }
5826N/A </call>
5826N/A </paralleliterate>
5826N/A </if>
5826N/A </paralleliterate>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A
5826N/A
5826N/A <!--- Test Case information
5826N/A #@TestMarker Replication Conflict Tests
5826N/A #@TestName Replication: Conflict: double_add_single_del_1
5826N/A #@TestID double_add_single_del_1
5826N/A #@TestPurpose Add twice same dn, then delete it in one server
5826N/A #@TestPreamble
5826N/A #@TestSteps Disconnect Replication Servers
5826N/A #@TestSteps server1: add entry cn=DN1 with uid=1
5826N/A #@TestSteps server2: add entry cn=DN1 with uid=2
5826N/A #@TestSteps Re-connect Replication Servers
5826N/A #@TestSteps server1: delete entry cn=DN1
5826N/A #@TestSteps Check servers are synchronised
5826N/A #@TestPostamble
5826N/A #@TestResult Success if trees are synchronised
5826N/A -->
5826N/A <function name="replication_conflict_018" scope="local">
5826N/A <testcase name="getTestCaseName('double_add_single_del_1')">
5826N/A <sequence>
5826N/A <try>
5826N/A <sequence>
5826N/A
5826N/A <call function="'testCase_Preamble'"/>
5826N/A
5826N/A <message>
5826N/A 'Test Name = %s' % STAXCurrentTestcase
5826N/A </message>
5826N/A
5826N/A <message>
5826N/A 'Replication: Conflict: double_add_single_del_1. \
5826N/A Add twice same dn, then delete it in one server'
5826N/A </message>
5826N/A
5826N/A <script>
5826N/A entry1 = Entry('cn=DN1')
5826N/A entry1.addAttr('uid', '1')
5826N/A entry1.addAttr('givenname', 'DUMMY ENTRY')
5826N/A entry2 = Entry('cn=DN1')
5826N/A entry2.addAttr('uid', '2')
5826N/A entry2.addAttr('givenname', 'DUMMY ENTRY')
5826N/A
5826N/A entriesToAdd = [entry1, entry2]
5826N/A </script>
5826N/A
5826N/A <!-- Disconnect Replication Servers -->
5826N/A <call function="'disconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <iterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <!-- Add entry on one of the servers -->
5826N/A <call function="'addAnEntry'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'DNToAdd' : entriesToAdd[i].getDn(),
5826N/A 'listAttributes' : entriesToAdd[i].getAttrList()
5826N/A }
5826N/A </call>
5826N/A </sequence>
5826N/A </iterate>
5826N/A
5826N/A <!-- Check modifies have not been propagated -->
5826N/A <paralleliterate var="server" in="[server1, server2]">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict uid cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Reconnect Replication Servers -->
5826N/A <call function="'reconnectReplicationServers'">
5826N/A [ clientHost, clientPath, [replServer1, replServer2] ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete entry on server1-->
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server1Host,
5826N/A 'dsInstancePort' : server1.getPort(),
5826N/A 'dsInstanceDn' : server1.getRootDn(),
5826N/A 'dsInstancePswd' : server1.getRootPwd(),
5826N/A 'dsDn' : [entry1.getDn()]
5826N/A }
5826N/A </call>
5826N/A
5826N/A <!-- Check conflict is resolved -->
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <sequence>
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : synchroSuffix,
5826N/A 'dsFilter' : 'givenname=DUMMY ENTRY',
5826N/A 'dsAttributes' : 'ds-sync-conflict uid cn',
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A <script>
5826N/A resultDnList = []
5826N/A for line in searchResult.splitlines():
5826N/A if line.find('dn: ') != -1:
5826N/A resultDn = line[len('dn: '):]
5826N/A resultDnList.append(resultDn)
5826N/A addedEntries[i] = resultDnList
5826N/A </script>
5826N/A </sequence>
5826N/A <else>
5826N/A <script>
5826N/A addedEntries[i] = []
5826N/A </script>
5826N/A </else>
5826N/A </if>
5826N/A
5826N/A <call function="'ldapSearchWithScript'">
5826N/A { 'location' : server.getHostname(),
5826N/A 'dsPath' : '%s/%s' \
5826N/A % (server.getDir(), OPENDSNAME),
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsBaseDN' : 'cn=monitor',
5826N/A 'dsFilter' : monitorFilter,
5826N/A 'dsAttributes' : monitorCounters,
5826N/A 'logStderr' : False
5826N/A }
5826N/A </call>
5826N/A <script>
5826N/A searchRC = STAXResult[0][0]
5826N/A searchResult = STAXResult[0][1]
5826N/A resultLength = len(searchResult) > 0
5826N/A </script>
5826N/A <if expr="resultLength != 0">
5826N/A <sequence>
5826N/A <message>
5826N/A '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
5826N/A % (server.getHostname(), server.getPort(), searchResult)
5826N/A </message>
5826N/A </sequence>
5826N/A </if>
5826N/A </sequence>
5826N/A </paralleliterate>
5826N/A
5826N/A <!-- Verify the synchronization of the trees among the servers in
5826N/A the topology -->
5826N/A <!-- If the trees don't match, we may have come across Issue OPENDJ-454
5826N/A (RFE: Solve naming conflict of 2 adds with same dn, different
5826N/A attr value) -->
5826N/A <call function="'verifyTrees'">
5826N/A [ clientHost, clientPath, server1, [server2], synchroSuffix,
5826N/A 'OPENDJ-454' ]
5826N/A </call>
5826N/A
5826N/A <!-- Delete added entries -->
5826N/A <script>
5826N/A list1 = addedEntries[0]
5826N/A list2 = addedEntries[1]
5826N/A toRemove = []
5826N/A # remove potential redundancies, to avoid deleting them twice
5826N/A for addedEntry in list2:
5826N/A if addedEntry in list1:
5826N/A toRemove.append(addedEntry)
5826N/A for ent in toRemove:
5826N/A list2.remove(ent)
5826N/A </script>
5826N/A <paralleliterate var="server"
5826N/A in="[server1, server2]"
5826N/A indexvar="i">
5826N/A <if expr="len(addedEntries[i]) != 0">
5826N/A <paralleliterate var="entryToDelete" in="addedEntries[i]">
5826N/A <call function="'ldapDeleteWithScript'">
5826N/A { 'location' : clientHost,
5826N/A 'dsPath' : clientPath,
5826N/A 'dsInstanceHost' : server.getHostname(),
5826N/A 'dsInstancePort' : server.getPort(),
5826N/A 'dsInstanceDn' : server.getRootDn(),
5826N/A 'dsInstancePswd' : server.getRootPwd(),
5826N/A 'dsDn' : [entryToDelete]
5826N/A }
5826N/A </call>
5826N/A </paralleliterate>
5826N/A </if>
5826N/A </paralleliterate>
5826N/A
5826N/A </sequence>
5826N/A
5826N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
5826N/A <message log="1" level="'fatal'">
5826N/A '%s: Test failed. eInfo(%s)' % (eType,eInfo)
5826N/A </message>
5826N/A </catch>
5826N/A <finally>
5826N/A <sequence>
5826N/A <call function="'testCase_Postamble'"/>
5826N/A </sequence>
5826N/A </finally>
5826N/A </try>
5826N/A </sequence>
5826N/A </testcase>
5826N/A </function>
5826N/A
5826N/A</stax>